*** empty log message ***
[gnus] / texi / gnus.texi
1 \input texinfo                  @c -*-texinfo-*-
2
3 @setfilename gnus
4 @settitle Red Gnus 0.64 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{pagestyle}
18 \usepackage{epsfig}
19 \fontfamily{bembo}\selectfont
20
21 \makeindex
22 \begin{document}
23
24 \newcommand{\gnuschaptername}{}
25 \newcommand{\gnussectionname}{}
26
27 \newcommand{\gnusbackslash}{/}
28
29 \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
30 \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
31
32 \newcommand{\gnuskindex}[1]{\index{#1}}
33 \newcommand{\gnusindex}[1]{\index{#1}}
34
35 \newcommand{\gnustt}[1]{{\textbf{\textsf{#1}}}}
36 \newcommand{\gnuscode}[1]{\gnustt{#1}}
37 \newcommand{\gnussamp}[1]{``\gnustt{#1}''}
38 \newcommand{\gnuslisp}[1]{\gnustt{#1}}
39 \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
40 \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
41 \newcommand{\gnusdfn}[1]{\textit{#1}}
42 \newcommand{\gnusi}[1]{\textit{#1}}
43 \newcommand{\gnusstrong}[1]{\textbf{#1}}
44 \newcommand{\gnusemph}[1]{\textit{#1}}
45 \newcommand{\gnusvar}[1]{\textsl{\textsf{#1}}}
46 \newcommand{\gnussc}[1]{\textsc{#1}}
47 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
48 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
49
50 \newcommand{\gnusbullet}{{${\bullet}$}}
51 \newcommand{\gnusdollar}{\$}
52 \newcommand{\gnusampersand}{\&}
53 \newcommand{\gnuspercent}{\%}
54 \newcommand{\gnushash}{\#}
55 \newcommand{\gnushat}{\symbol{"5E}}
56 \newcommand{\gnusunderline}{\symbol{"5F}}
57 \newcommand{\gnusnot}{$\neg$}
58 \newcommand{\gnustilde}{\symbol{"7E}}
59 \newcommand{\gnusless}{{$<$}}
60 \newcommand{\gnusgreater}{{$>$}}
61
62 \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=gnus-head.eps,height=1cm}}}
63 \newcommand{\gnusinteresting}{
64 \marginpar[\hspace{2.5cm}\gnushead]{\gnushead}
65 }
66
67 \newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
68
69 \newcommand{\gnuspagechapter}[1]{
70 {\mbox{}}
71 }
72
73 \newdimen{\gnusdimen}
74 \gnusdimen 0pt
75
76 \newcommand{\gnuschapter}[2]{
77 \gnuscleardoublepage
78 \ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
79 \chapter{#2}
80 \renewcommand{\gnussectionname}{}
81 \renewcommand{\gnuschaptername}{#2}
82 \thispagestyle{empty}
83 \hspace*{-2cm}
84 \begin{picture}(500,500)(0,0)
85 \put(0,0){\makebox(480,350)[tr]{#1}}
86 \put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
87 \end{picture}
88 \clearpage
89 }
90
91 \newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
92
93 \newcommand{\gnussection}[1]{
94 \renewcommand{\gnussectionname}{#1}
95 \section{#1}
96 }
97
98 \newenvironment{codelist}%
99 {\begin{list}{}{
100 }
101 }{\end{list}}
102
103 \newenvironment{kbdlist}%
104 {\begin{list}{}{
105 \labelwidth=0cm
106 }
107 }{\end{list}}
108
109 \newenvironment{dfnlist}%
110 {\begin{list}{}{
111 }
112 }{\end{list}}
113
114 \newenvironment{stronglist}%
115 {\begin{list}{}{
116 }
117 }{\end{list}}
118
119 \newenvironment{samplist}%
120 {\begin{list}{}{
121 }
122 }{\end{list}}
123
124 \newenvironment{varlist}%
125 {\begin{list}{}{
126 }
127 }{\end{list}}
128
129 \newenvironment{emphlist}%
130 {\begin{list}{}{
131 }
132 }{\end{list}}
133
134 \newlength\gnusheadtextwidth
135 \setlength{\gnusheadtextwidth}{\headtextwidth}
136 \addtolength{\gnusheadtextwidth}{1cm}
137
138 \newpagestyle{gnuspreamble}%
139 {
140 {
141 \ifodd\count0
142 {
143 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
144 }
145 \else
146 {
147 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
148 }
149 }
150 \fi
151 }
152 }
153 {
154 \ifodd\count0
155 \mbox{} \hfill 
156 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
157 \else
158 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
159 \hfill \mbox{}
160 \fi
161 }
162
163 \newpagestyle{gnusindex}%
164 {
165 {
166 \ifodd\count0
167 {
168 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
169 }
170 \else
171 {
172 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
173 }
174 \fi
175 }
176 }
177 {
178 \ifodd\count0
179 \mbox{} \hfill 
180 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
181 \else
182 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
183 \hfill \mbox{}
184 \fi
185 }
186
187 \newpagestyle{gnus}%
188 {
189 {
190 \ifodd\count0
191 {
192 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}
193 }
194 \else
195 {
196 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
197 }
198 \fi
199 }
200 }
201 {
202 \ifodd\count0
203 \mbox{} \hfill 
204 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
205 \else
206 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
207 \hfill \mbox{}
208 \fi
209 }
210
211 \pagenumbering{roman}
212 \pagestyle{gnuspreamble}
213
214 @end iflatex
215 @end iftex
216
217 @iftex
218 @iflatex
219 \begin{titlepage}
220 {
221
222 %\addtolength{\oddsidemargin}{-5cm}
223 %\addtolength{\evensidemargin}{-5cm}
224 \parindent=0cm
225 \addtolength{\textheight}{2cm}
226
227 \gnustitle{\gnustitlename}\\
228 \rule{15cm}{1mm}\\
229 \vfill
230 \hspace*{-1cm}\epsfig{figure=gnus-big-logo.eps,height=15cm}
231 \vfill
232 \rule{15cm}{1mm}\\
233 \gnusauthor{by Lars Magne Ingebrigtsen}
234 \newpage
235 }
236
237 \mbox{}
238 \vfill
239
240 \thispagestyle{empty}
241
242 Copyright \copyright{} 1995,96 Free Software Foundation, Inc. 
243
244 Permission is granted to make and distribute verbatim copies of
245 this manual provided the copyright notice and this permission notice
246 are preserved on all copies.
247
248 Permission is granted to copy and distribute modified versions of this
249 manual under the conditions for verbatim copying, provided that the
250 entire resulting derived work is distributed under the terms of a
251 permission notice identical to this one.
252
253 Permission is granted to copy and distribute translations of this manual
254 into another language, under the above conditions for modified versions.
255
256 \newpage
257 \end{titlepage}
258 @end iflatex
259 @end iftex
260
261 @ifinfo
262
263 This file documents Gnus, the GNU Emacs newsreader.
264
265 Copyright (C) 1995,96 Free Software Foundation, Inc.
266
267 Permission is granted to make and distribute verbatim copies of
268 this manual provided the copyright notice and this permission notice
269 are preserved on all copies.
270
271 @ignore
272 Permission is granted to process this file through Tex and print the
273 results, provided the printed document carries copying permission
274 notice identical to this one except for the removal of this paragraph
275 (this paragraph not being relevant to the printed manual).
276
277 @end ignore
278 Permission is granted to copy and distribute modified versions of this
279 manual under the conditions for verbatim copying, provided also that the
280 entire resulting derived work is distributed under the terms of a
281 permission notice identical to this one.
282
283 Permission is granted to copy and distribute translations of this manual
284 into another language, under the above conditions for modified versions.
285 @end ifinfo
286
287 @tex
288
289 @titlepage
290 @title Red Gnus 0.64 Manual
291
292 @author by Lars Magne Ingebrigtsen
293 @page
294
295 @vskip 0pt plus 1filll
296 Copyright @copyright{} 1995,96 Free Software Foundation, Inc. 
297
298 Permission is granted to make and distribute verbatim copies of
299 this manual provided the copyright notice and this permission notice
300 are preserved on all copies.
301
302 Permission is granted to copy and distribute modified versions of this
303 manual under the conditions for verbatim copying, provided that the
304 entire resulting derived work is distributed under the terms of a
305 permission notice identical to this one.
306
307 Permission is granted to copy and distribute translations of this manual
308 into another language, under the above conditions for modified versions.
309
310 @end titlepage
311 @page
312
313 @end tex
314
315
316 @node Top
317 @top The Red Gnus Newsreader
318
319 @ifinfo
320
321 You can read news (and mail) from within Emacs by using Gnus.  The news
322 can be gotten by any nefarious means you can think of---@sc{nntp}, local
323 spool or your mbox file.  All at the same time, if you want to push your
324 luck.
325
326 This manual corresponds to Red Gnus 0.64
327
328 @end ifinfo
329
330 @iftex
331
332 @iflatex
333 \tableofcontents
334 \gnuscleardoublepage
335 @end iflatex
336
337 Gnus is the advanced, self-documenting, customizable, extensible
338 unreal-time newsreader for GNU Emacs.  
339
340 Oops.  That sounds oddly familiar, so let's start over again to avoid
341 being accused of plagiarism:
342
343 Gnus is a message-reading laboratory.  It will let you look at just
344 about anything as if it were a newsgroup.  You can read mail with it,
345 you can browse directories with it, you can @code{ftp} with it---you can
346 even read news with it!
347
348 Gnus tries to empower people who read news the same way Emacs empowers
349 people who edit text.  Gnus sets no limits to what the user should be
350 allowed to do.  Users are encouraged to extend Gnus to make it behave
351 like they want it to behave.  A program should not control people;
352 people should be empowered to do what they want by using (or abusing)
353 the program.
354
355 @end iftex
356
357
358 @menu
359 * Starting Up::           Finding news can be a pain.
360 * The Group Buffer::      Selecting, subscribing and killing groups.
361 * The Summary Buffer::    Reading, saving and posting articles.
362 * The Article Buffer::    Displaying and handling articles.
363 * Composing Messages::    Information on sending mail and news.
364 * Select Methods::        Gnus reads all messages from various select methods.
365 * Scoring::               Assigning values to articles.
366 * Various::               General purpose settings.
367 * The End::               Farewell and goodbye.
368 * Appendices::            Terminology, Emacs intro, FAQ, History, Internals.
369 * Index::                 Variable, function and concept index.
370 * Key Index::             Key Index.
371 @end menu
372
373 @node Starting Up
374 @chapter Starting Gnus
375 @cindex starting up
376
377 @kindex M-x gnus
378 @findex gnus
379 If your system administrator has set things up properly, starting Gnus
380 and reading news is extremely easy---you just type @kbd{M-x gnus} in
381 your Emacs. 
382
383 @findex gnus-other-frame
384 @kindex M-x gnus-other-frame
385 If you want to start Gnus in a different frame, you can use the command
386 @kbd{M-x gnus-other-frame} instead.
387
388 If things do not go smoothly at startup, you have to twiddle some
389 variables. 
390
391 @menu
392 * Finding the News::    Choosing a method for getting news.
393 * The First Time::      What does Gnus do the first time you start it?
394 * The Server is Down::  How can I read my mail then?
395 * Slave Gnusae::        You can have more than one Gnus active at a time.
396 * Fetching a Group::    Starting Gnus just to read a group.
397 * New Groups::          What is Gnus supposed to do with new groups?
398 * Startup Files::       Those pesky startup files---@file{.newsrc}.
399 * Auto Save::           Recovering from a crash.
400 * The Active File::     Reading the active file over a slow line Takes Time.
401 * Changing Servers::    You may want to move from one server to another.
402 * Startup Variables::   Other variables you might change.
403 @end menu
404
405
406 @node Finding the News
407 @section Finding the News
408 @cindex finding news
409
410 @vindex gnus-select-method
411 @c @head
412 The @code{gnus-select-method} variable says where Gnus should look for
413 news.  This variable should be a list where the first element says
414 @dfn{how} and the second element says @dfn{where}.  This method is your
415 native method.  All groups that are not fetched with this method are
416 foreign groups.
417
418 For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
419 you want to get your daily dosage of news from, you'd say:
420
421 @lisp
422 (setq gnus-select-method '(nntp "news.somewhere.edu"))
423 @end lisp
424
425 If you want to read directly from the local spool, say:
426
427 @lisp
428 (setq gnus-select-method '(nnspool ""))
429 @end lisp
430
431 If you can use a local spool, you probably should, as it will almost
432 certainly be much faster.
433
434 @vindex gnus-nntpserver-file
435 @cindex NNTPSERVER
436 @cindex @sc{nntp} server
437 If this variable is not set, Gnus will take a look at the
438 @code{NNTPSERVER} environment variable.  If that variable isn't set,
439 Gnus will see whether @code{gnus-nntpserver-file}
440 (@file{/etc/nntpserver} by default) has any opinions on the matter.  If
441 that fails as well, Gnus will will try to use the machine that is
442 running Emacs as an @sc{nntp} server.  That's a long shot, though.
443
444 @vindex gnus-nntp-server
445 If @code{gnus-nntp-server} is set, this variable will override
446 @code{gnus-select-method}.  You should therefore set
447 @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
448
449 @vindex gnus-secondary-servers
450 You can also make Gnus prompt you interactively for the name of an
451 @sc{nntp} server.  If you give a non-numerical prefix to @code{gnus}
452 (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
453 in the @code{gnus-secondary-servers} list (if any).  You can also just
454 type in the name of any server you feel like visiting.
455
456 @findex gnus-group-browse-foreign-server
457 @kindex B (Group)
458 However, if you use one @sc{nntp} server regularly and are just
459 interested in a couple of groups from a different server, you would be
460 better served by using the @kbd{B} command in the group buffer.  It will
461 let you have a look at what groups are available, and you can subscribe
462 to any of the groups you want to.  This also makes @file{.newsrc}
463 maintenance much tidier.  @xref{Foreign Groups}.
464
465 @vindex gnus-secondary-select-methods
466 @c @head
467 A slightly different approach to foreign groups is to set the
468 @code{gnus-secondary-select-methods} variable.  The select methods
469 listed in this variable are in many ways just as native as the
470 @code{gnus-select-method} server.  They will also be queried for active
471 files during startup (if that's required), and new newsgroups that
472 appear on these servers will be subscribed (or not) just as native
473 groups are.
474
475 For instance, if you use the @code{nnmbox} backend to read your mail, you
476 would typically set this variable to
477
478 @lisp
479 (setq gnus-secondary-select-methods '((nnmbox "")))
480 @end lisp
481
482
483 @node The First Time
484 @section The First Time
485 @cindex first time usage
486
487 If no startup files exist, Gnus will try to determine what groups should
488 be subscribed by default.
489
490 @vindex gnus-default-subscribed-newsgroups
491 If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
492 will subscribe you to just those groups in that list, leaving the rest
493 killed.  Your system administrator should have set this variable to
494 something useful.
495
496 Since she hasn't, Gnus will just subscribe you to a few arbitrarily
497 picked groups (i.e., @samp{*.newusers}).  (@dfn{Arbitrary} is here
498 defined as @dfn{whatever Lars thinks you should read}.)
499
500 You'll also be subscribed to the Gnus documentation group, which should
501 help you with most common problems.  
502
503 If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
504 use the normal functions for handling new groups, and not do anything
505 special.
506
507
508 @node The Server is Down
509 @section The Server is Down
510 @cindex server errors
511
512 If the default server is down, Gnus will understandably have some
513 problems starting.  However, if you have some mail groups in addition to
514 the news groups, you may want to start Gnus anyway.
515
516 Gnus, being the trusting sort of program, will ask whether to proceed
517 without a native select method if that server can't be contacted.  This
518 will happen whether the server doesn't actually exist (i.e., you have
519 given the wrong address) or the server has just momentarily taken ill
520 for some reason or other.  If you decide to continue and have no foreign
521 groups, you'll find it difficult to actually do anything in the group
522 buffer.  But, hey, that's your problem.  Blllrph!
523
524 @findex gnus-no-server
525 @kindex M-x gnus-no-server
526 @c @head
527 If you know that the server is definitely down, or you just want to read
528 your mail without bothering with the server at all, you can use the
529 @code{gnus-no-server} command to start Gnus.  That might come in handy
530 if you're in a hurry as well.  This command will not attempt to contact
531 your primary server---instead, it will just activate all groups on level
532 1 and 2.  (You should preferably keep no native groups on those two
533 levels.)
534
535
536 @node Slave Gnusae
537 @section Slave Gnusae
538 @cindex slave
539
540 You might want to run more than one Emacs with more than one Gnus at the
541 same time.  If you are using different @file{.newsrc} files (e.g., if you
542 are using the two different Gnusae to read from two different servers),
543 that is no problem whatsoever.  You just do it.
544
545 The problem appears when you want to run two Gnusae that use the same
546 @code{.newsrc} file.
547
548 To work around that problem some, we here at the Think-Tank at the Gnus
549 Towers have come up with a new concept: @dfn{Masters} and
550 @dfn{slaves}.  (We have applied for a patent on this concept, and have
551 taken out a copyright on those words.  If you wish to use those words in
552 conjunction with each other, you have to send $1 per usage instance to
553 me.  Usage of the patent (@dfn{Master/Slave Relationships In Computer
554 Applications}) will be much more expensive, of course.)
555
556 Anyways, you start one Gnus up the normal way with @kbd{M-x gnus} (or
557 however you do it).  Each subsequent slave Gnusae should be started with
558 @kbd{M-x gnus-slave}.  These slaves won't save normal @file{.newsrc}
559 files, but instead save @dfn{slave files} that contain information only
560 on what groups have been read in the slave session.  When a master Gnus
561 starts, it will read (and delete) these slave files, incorporating all
562 information from them.  (The slave files will be read in the sequence
563 they were created, so the latest changes will have precedence.)
564
565 Information from the slave files has, of course, precedence over the
566 information in the normal (i.e., master) @code{.newsrc} file.
567
568
569 @node Fetching a Group
570 @section Fetching a Group
571 @cindex fetching a group
572
573 @findex gnus-fetch-group
574 It it sometimes convenient to be able to just say ``I want to read this
575 group and I don't care whether Gnus has been started or not''.  This is
576 perhaps more useful for people who write code than for users, but the
577 command @code{gnus-fetch-group} provides this functionality in any case.
578 It takes the group name as a parameter.
579
580
581 @node New Groups
582 @section New Groups
583 @cindex new groups
584 @cindex subscription
585
586 @vindex gnus-check-new-newsgroups
587 If you are satisfied that you really never want to see any new groups,
588 you can set @code{gnus-check-new-newsgroups} to @code{nil}.  This will
589 also save you some time at startup.  Even if this variable is
590 @code{nil}, you can always subscribe to the new groups just by pressing
591 @kbd{U} in the group buffer (@pxref{Group Maintenance}).  This variable
592 is @code{t} by default.
593
594 @menu
595 * Checking New Groups::      Determining what groups are new.
596 * Subscription Methods::     What Gnus should do with new groups.
597 * Filtering New Groups::     Making Gnus ignore certain new groups.
598 @end menu
599
600
601 @node Checking New Groups
602 @subsection Checking New Groups
603
604 Gnus normally determines whether a group is new or not by comparing the
605 list of groups from the active file(s) with the lists of subscribed and
606 dead groups.  This isn't a particularly fast method.  If
607 @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
608 server for new groups since the last time.  This is both faster and
609 cheaper.  This also means that you can get rid of the list of killed
610 groups altogether, so you may set @code{gnus-save-killed-list} to
611 @code{nil}, which will save time both at startup, at exit, and all over.
612 Saves disk space, too.  Why isn't this the default, then?
613 Unfortunately, not all servers support this command. 
614
615 I bet I know what you're thinking now: How do I find out whether my
616 server supports @code{ask-server}?  No?  Good, because I don't have a
617 fail-safe answer.  I would suggest just setting this variable to
618 @code{ask-server} and see whether any new groups appear within the next
619 few days.  If any do, then it works.  If none do, then it doesn't
620 work.  I could write a function to make Gnus guess whether the server
621 supports @code{ask-server}, but it would just be a guess.  So I won't.
622 You could @code{telnet} to the server and say @code{HELP} and see
623 whether it lists @samp{NEWGROUPS} among the commands it understands.  If
624 it does, then it might work.  (But there are servers that lists
625 @samp{NEWGROUPS} without supporting the function properly.)
626
627 This variable can also be a list of select methods.  If so, Gnus will
628 issue an @code{ask-server} command to each of the select methods, and
629 subscribe them (or not) using the normal methods.  This might be handy
630 if you are monitoring a few servers for new groups.  A side effect is
631 that startup will take much longer, so you can meditate while waiting.
632 Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
633
634
635 @node Subscription Methods
636 @subsection Subscription Methods
637
638 @vindex gnus-subscribe-newsgroup-method
639 What Gnus does when it encounters a new group is determined by the
640 @code{gnus-subscribe-newsgroup-method} variable.
641
642 This variable should contain a function.  Some handy pre-fab values
643 are:
644
645 @table @code
646
647 @item gnus-subscribe-zombies
648 @vindex gnus-subscribe-zombies
649 Make all new groups zombies.  This is the default.  You can browse the
650 zombies later (with @kbd{A z}) and either kill them all off properly
651 (with @kbd{S z}), or subscribe to them (with @kbd{u}).
652
653 @item gnus-subscribe-randomly
654 @vindex gnus-subscribe-randomly
655 Subscribe all new groups randomly.
656
657 @item gnus-subscribe-alphabetically
658 @vindex gnus-subscribe-alphabetically
659 Subscribe all new groups alphabetically.
660
661 @item gnus-subscribe-hierarchically
662 @vindex gnus-subscribe-hierarchically
663 Subscribe all new groups hierarchically.  The difference between this
664 function and @code{gnus-subscribe-alphabetically} is slight.
665 @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
666 alphabetical fashion, while this function will enter groups into it's
667 hierarchy.  So if you want to have the @samp{rec} hierarchy before the
668 @samp{comp} hierarchy, this function will not mess that configuration
669 up.  Or something like that.
670
671 @item gnus-subscribe-interactively
672 @vindex gnus-subscribe-interactively
673 Subscribe new groups interactively.  This means that Gnus will ask
674 you about @strong{all} new groups.
675
676 @item gnus-subscribe-killed
677 @vindex gnus-subscribe-killed
678 Kill all new groups.
679
680 @end table
681
682 @vindex gnus-subscribe-hierarchical-interactive
683 A closely related variable is
684 @code{gnus-subscribe-hierarchical-interactive}.  (That's quite a
685 mouthful.)  If this variable is non-@code{nil}, Gnus will ask you in a
686 hierarchical fashion whether to subscribe to new groups or not.  Gnus
687 will ask you for each sub-hierarchy whether you want to descend the
688 hierarchy or not.  
689
690 One common mistake is to set the variable a few paragraphs above to
691 @code{gnus-subscribe-hierarchical-interactive}.  This is an error.  This
692 will not work.  This is ga-ga.  So don't do it.
693
694
695 @node Filtering New Groups
696 @subsection Filtering New Groups
697
698 A nice and portable way to control which new newsgroups should be
699 subscribed (or ignored) is to put an @dfn{options} line at the start of
700 the @file{.newsrc} file.  Here's an example:
701
702 @example
703 options -n !alt.all !rec.all sci.all
704 @end example
705
706 @vindex gnus-subscribe-options-newsgroup-method
707 This line obviously belongs to a serious-minded intellectual scientific
708 person (or she may just be plain old boring), because it says that all
709 groups that have names beginning with @samp{alt} and @samp{rec} should
710 be ignored, and all groups with names beginning with @samp{sci} should
711 be subscribed.  Gnus will not use the normal subscription method for
712 subscribing these groups.
713 @code{gnus-subscribe-options-newsgroup-method} is used instead.  This
714 variable defaults to @code{gnus-subscribe-alphabetically}.
715
716 @vindex gnus-options-not-subscribe
717 @vindex gnus-options-subscribe
718 If you don't want to mess with your @file{.newsrc} file, you can just
719 set the two variables @code{gnus-options-subscribe} and
720 @code{gnus-options-not-subscribe}.  These two variables do exactly the
721 same as the @file{.newsrc} @samp{options -n} trick.  Both are regexps,
722 and if the the new group matches the former, it will be unconditionally
723 subscribed, and if it matches the latter, it will be ignored.
724
725 @vindex gnus-auto-subscribed-groups
726 Yet another variable that meddles here is
727 @code{gnus-auto-subscribed-groups}.  It works exactly like
728 @code{gnus-options-subscribe}, and is therefore really superfluous, but I
729 thought it would be nice to have two of these.  This variable is more
730 meant for setting some ground rules, while the other variable is used
731 more for user fiddling.  By default this variable makes all new groups
732 that come from mail backends (@code{nnml}, @code{nnbabyl},
733 @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed.  If you
734 don't like that, just set this variable to @code{nil}.
735
736
737 @node Changing Servers
738 @section Changing Servers
739 @cindex changing servers
740
741 Sometimes it is necessary to move from one @sc{nntp} server to another.
742 This happens very rarely, but perhaps you change jobs, or one server is
743 very flaky and you want to use another.  
744
745 Changing the server is pretty easy, right?  You just change
746 @code{gnus-select-method} to point to the new server?  
747
748 @emph{Wrong!}
749
750 Article numbers are not (in any way) kept synchronized between different
751 @sc{nntp} servers, and the only way Gnus keeps track of what articles
752 you have read is by keeping track of article numbers.  So when you
753 change @code{gnus-select-method}, your @file{.newsrc} file becomes
754 worthless.  
755
756 Gnus provides a few functions to attempt to translate a @file{.newsrc}
757 file from one server to another.  They all have one thing in
758 common---they take a looong time to run.  You don't want to use these
759 functions more than absolutely necessary.
760
761 @kindex M-x gnus-change-server
762 @findex gnus-change-server
763 If you have access to both servers, Gnus can request the headers for all
764 the articles you have read and compare @code{Message-ID}s and map the
765 article numbers of the read articles and article marks.  The @kbd{M-x
766 gnus-change-server} command will do this for all your native groups.  It
767 will prompt for the method you want to move to.
768
769 @kindex M-x gnus-group-move-group-to-server
770 @findex gnus-group-move-group-to-server
771 You can also move individual groups with the @kbd{M-x
772 gnus-group-move-group-to-server} command.  This is useful if you want to
773 move a (foreign) group from one server to another.
774
775 @kindex M-x gnus-group-clear-data-on-native-groups
776 @findex gnus-group-clear-data-on-native-groups
777 If you don't have access to both the old and new server, all your marks
778 and read ranges have become worthless.  You can use the @kbd{M-x
779 gnus-group-clear-data-on-native-groups} command to clear out all data
780 that you have on your native groups.  Use with caution.
781
782
783 @node Startup Files
784 @section Startup Files
785 @cindex startup files
786 @cindex .newsrc
787 @cindex .newsrc.el
788 @cindex .newsrc.eld
789
790 Now, you all know about the @file{.newsrc} file.  All subscription
791 information is traditionally stored in this file.
792
793 Things got a bit more complicated with @sc{gnus}.  In addition to
794 keeping the @file{.newsrc} file updated, it also used a file called
795 @file{.newsrc.el} for storing all the information that didn't fit into
796 the @file{.newsrc} file.  (Actually, it also duplicated everything in
797 the @file{.newsrc} file.)  @sc{gnus} would read whichever one of these
798 files was the most recently saved, which enabled people to swap between
799 @sc{gnus} and other newsreaders.
800
801 That was kinda silly, so Gnus went one better: In addition to the
802 @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
803 @file{.newsrc.eld}.  It will read whichever of these files that are most
804 recent, but it will never write a @file{.newsrc.el} file.
805
806 @vindex gnus-save-newsrc-file
807 You can turn off writing the @file{.newsrc} file by setting
808 @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
809 the file and save some space, as well as making exit from Gnus faster.
810 However, this will make it impossible to use other newsreaders than
811 Gnus.  But hey, who would want to, right?
812
813 @vindex gnus-save-killed-list
814 If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
815 will not save the list of killed groups to the startup file.  This will
816 save both time (when starting and quitting) and space (on disk).  It
817 will also mean that Gnus has no record of what groups are new or old,
818 so the automatic new groups subscription methods become meaningless.
819 You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
820 @code{ask-server} if you set this variable to @code{nil} (@pxref{New
821 Groups}).  This variable can also be a regular expression.  If that's
822 the case, remove all groups that do not match this regexp before
823 saving.  This can be useful in certain obscure situations that involve
824 several servers where not all servers support @code{ask-server}.
825
826 @vindex gnus-startup-file
827 The @code{gnus-startup-file} variable says where the startup files are.
828 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
829 file being whatever that one is with a @samp{.eld} appended.
830
831 @vindex gnus-save-newsrc-hook
832 @vindex gnus-save-quick-newsrc-hook
833 @vindex gnus-save-standard-newsrc-hook
834 @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
835 files, while @code{gnus-save-quick-newsrc-hook} is called just before
836 saving the @file{.newsrc.eld} file, and
837 @code{gnus-save-standard-newsrc-hook} is called just before saving the
838 @file{.newsrc} file.  The latter two are commonly used to turn version
839 control on or off.  Version control is on by default when saving the
840 startup files.  If you want to turn backup creation off, say something like: 
841
842 @lisp
843 (defun turn-off-backup ()
844   (set (make-local-variable 'backup-inhibited) t))
845
846 (add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
847 (add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
848 @end lisp
849
850 @vindex gnus-init-file
851 When Gnus starts, it will read the @code{gnus-site-init-file}
852 (@file{.../site-lisp/gnus.el} by default) and @code{gnus-init-file}
853 (@file{~/.gnus.el} by default) files.  These are normal Emacs Lisp files
854 and can be used to avoid cluttering your @file{.emacs} and
855 @file{site-init} files with Gnus stuff.
856
857
858 @node Auto Save
859 @section Auto Save
860 @cindex dribble file
861 @cindex auto-save
862
863 Whenever you do something that changes the Gnus data (reading articles,
864 catching up, killing/subscribing groups), the change is added to a
865 special @dfn{dribble buffer}.  This buffer is auto-saved the normal
866 Emacs way.  If your Emacs should crash before you have saved the
867 @file{.newsrc} files, all changes you have made can be recovered from
868 this file.
869
870 If Gnus detects this file at startup, it will ask the user whether to
871 read it.  The auto save file is deleted whenever the real startup file is
872 saved.
873
874 @vindex gnus-use-dribble-file
875 If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
876 maintain a dribble buffer.  The default is @code{t}.
877
878 @vindex gnus-dribble-directory
879 Gnus will put the dribble file(s) in @code{gnus-dribble-directory}.  If
880 this variable is @code{nil}, which it is by default, Gnus will dribble
881 into the directory where the @file{.newsrc} file is located.  (This is
882 normally the user's home directory.)  The dribble file will get the same
883 file permissions as the @code{.newsrc} file.
884
885
886 @node The Active File
887 @section The Active File
888 @cindex active file
889 @cindex ignored groups
890
891 When Gnus starts, or indeed whenever it tries to determine whether new
892 articles have arrived, it reads the active file.  This is a very large
893 file that lists all the active groups and articles on the server.
894
895 @vindex gnus-ignored-newsgroups
896 Before examining the active file, Gnus deletes all lines that match the
897 regexp @code{gnus-ignored-newsgroups}.  This is done primarily to reject
898 any groups with bogus names, but you can use this variable to make Gnus
899 ignore hierarchies you aren't ever interested in.  However, this is not
900 recommended.  In fact, it's highly discouraged.  Instead, @pxref{New
901 Groups} for an overview of other variables that can be used instead.
902
903 @c This variable is
904 @c @code{nil} by default, and will slow down active file handling somewhat
905 @c if you set it to anything else.
906
907 @vindex gnus-read-active-file
908 @c @head
909 The active file can be rather Huge, so if you have a slow network, you
910 can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
911 reading the active file.  This variable is @code{t} by default.
912
913 Gnus will try to make do by getting information just on the groups that
914 you actually subscribe to.
915
916 Note that if you subscribe to lots and lots of groups, setting this
917 variable to @code{nil} will probably make Gnus slower, not faster.  At
918 present, having this variable @code{nil} will slow Gnus down
919 considerably, unless you read news over a 2400 baud modem.  
920
921 This variable can also have the value @code{some}.  Gnus will then
922 attempt to read active info only on the subscribed groups.  On some
923 servers this is quite fast (on sparkling, brand new INN servers that
924 support the @code{LIST ACTIVE group} command), on others this isn't fast
925 at all.  In any case, @code{some} should be faster than @code{nil}, and
926 is certainly faster than @code{t} over slow lines.
927
928 If this variable is @code{nil}, Gnus will ask for group info in total
929 lock-step, which isn't very fast.  If it is @code{some} and you use an
930 @sc{nntp} server, Gnus will pump out commands as fast as it can, and
931 read all the replies in one swoop.  This will normally result in better
932 performance, but if the server does not support the aforementioned
933 @code{LIST ACTIVE group} command, this isn't very nice to the server.
934
935 In any case, if you use @code{some} or @code{nil}, you should definitely
936 kill all groups that you aren't interested in to speed things up.
937
938
939 @node Startup Variables
940 @section Startup Variables
941
942 @table @code
943
944 @item gnus-load-hook
945 @vindex gnus-load-hook
946 A hook that is run while Gnus is being loaded.  Note that this hook will
947 normally be run just once in each Emacs session, no matter how many
948 times you start Gnus.
949
950 @item gnus-startup-hook
951 @vindex gnus-startup-hook
952 A hook that is run after starting up Gnus successfully.
953
954 @item gnus-check-bogus-newsgroups
955 @vindex gnus-check-bogus-newsgroups
956 If non-@code{nil}, Gnus will check for and delete all bogus groups at
957 startup.  A @dfn{bogus group} is a group that you have in your
958 @file{.newsrc} file, but doesn't exist on the news server.  Checking for
959 bogus groups can take quite a while, so to save time and resources it's
960 best to leave this option off, and do the checking for bogus groups once
961 in a while from the group buffer instead (@pxref{Group Maintenance}).
962
963 @item gnus-inhibit-startup-message
964 @vindex gnus-inhibit-startup-message
965 If non-@code{nil}, the startup message won't be displayed.  That way,
966 your boss might not notice as easily that you are reading news instead
967 of doing your job.  Note that this variable is used before
968 @file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead.
969
970 @item gnus-no-groups-message
971 @vindex gnus-no-groups-message
972 Message displayed by Gnus when no groups are available.
973
974 @item gnus-play-startup-jingle
975 @vindex gnus-play-startup-jingle
976 If non-@code{nil}, play the Gnus jingle at startup.
977
978 @item gnus-startup-jingle
979 @vindex gnus-startup-jingle
980 Jingle to be played if the above variable is non-@code{nil}.  The
981 default is @samp{Tuxedomoon.Jingle4.au}.
982
983 @end table
984
985
986 @node The Group Buffer
987 @chapter The Group Buffer
988 @cindex group buffer
989
990 The @dfn{group buffer} lists all (or parts) of the available groups.  It
991 is the first buffer shown when Gnus starts, and will never be killed as
992 long as Gnus is active.
993
994 @menu
995 * Group Buffer Format::    Information listed and how you can change it.
996 * Group Maneuvering::      Commands for moving in the group buffer.
997 * Selecting a Group::      Actually reading news.
998 * Group Data::             Changing the info for a group.
999 * Subscription Commands::  Unsubscribing, killing, subscribing.
1000 * Group Levels::           Levels? What are those, then?
1001 * Group Score::            A mechanism for finding out what groups you like.
1002 * Marking Groups::         You can mark groups for later processing.
1003 * Foreign Groups::         Creating and editing groups.
1004 * Group Parameters::       Each group may have different parameters set.
1005 * Listing Groups::         Gnus can list various subsets of the groups.
1006 * Sorting Groups::         Re-arrange the group order.
1007 * Group Maintenance::      Maintaining a tidy @file{.newsrc} file.
1008 * Browse Foreign Server::  You can browse a server.  See what it has to offer.
1009 * Exiting Gnus::           Stop reading news and get some work done.
1010 * Group Topics::           A folding group mode divided into topics.
1011 * Misc Group Stuff::       Other stuff that you can to do.
1012 @end menu
1013
1014
1015 @node Group Buffer Format
1016 @section Group Buffer Format
1017
1018 @menu 
1019 * Group Line Specification::       Deciding how the group buffer is to look.
1020 * Group Modeline Specification::   The group buffer modeline.
1021 * Group Highlighting::             Having nice colors in the group buffer.
1022 @end menu
1023
1024
1025 @node Group Line Specification
1026 @subsection Group Line Specification
1027 @cindex group buffer format
1028
1029 The default format of the group buffer is nice and dull, but you can
1030 make it as exciting and ugly as you feel like.
1031
1032 Here's a couple of example group lines:
1033
1034 @example
1035      25: news.announce.newusers
1036  *    0: alt.fan.andrea-dworkin
1037 @end example
1038
1039 Quite simple, huh?
1040
1041 You can see that there are 25 unread articles in
1042 @samp{news.announce.newusers}.  There are no unread articles, but some
1043 ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1044 asterisk at the beginning of the line?)
1045
1046 @vindex gnus-group-line-format
1047 You can change that format to whatever you want by fiddling with the
1048 @code{gnus-group-line-format} variable.  This variable works along the
1049 lines of a @code{format} specification, which is pretty much the same as
1050 a @code{printf} specifications, for those of you who use (feh!) C.
1051 @xref{Formatting Variables}. 
1052
1053 @samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above.
1054
1055 There should always be a colon on the line; the cursor always moves to
1056 the colon after performing an operation.  Nothing else is required---not
1057 even the group name.  All displayed text is just window dressing, and is
1058 never examined by Gnus.  Gnus stores all real information it needs using
1059 text properties.
1060
1061 (Note that if you make a really strange, wonderful, spreadsheet-like
1062 layout, everybody will believe you are hard at work with the accounting
1063 instead of wasting time reading news.)
1064
1065 Here's a list of all available format characters:
1066
1067 @table @samp
1068
1069 @item M    
1070 An asterisk if the group only has marked articles.
1071
1072 @item S
1073 Whether the group is subscribed.
1074
1075 @item L    
1076 Level of subscribedness.
1077
1078 @item N
1079 Number of unread articles.
1080
1081 @item I
1082 Number of dormant articles.
1083
1084 @item T
1085 Number of ticked articles.
1086
1087 @item R
1088 Number of read articles.
1089
1090 @item t
1091 Estimated total number of articles.  (This is really @var{max-number}
1092 minus @var{min-number} plus 1.)
1093
1094 @item y
1095 Number of unread, unticked, non-dormant articles.
1096
1097 @item i
1098 Number of ticked and dormant articles.
1099
1100 @item g
1101 Full group name.
1102
1103 @item G
1104 Group name.
1105
1106 @item D
1107 Newsgroup description.
1108
1109 @item o
1110 @samp{m} if moderated.
1111
1112 @item O
1113 @samp{(m)} if moderated.
1114
1115 @item s
1116 Select method.
1117
1118 @item n
1119 Select from where.
1120
1121 @item z
1122 A string that looks like @samp{<%s:%n>} if a foreign select method is
1123 used.
1124
1125 @item P
1126 Indentation based on the level of the topic (@pxref{Group Topics}). 
1127
1128 @item c
1129 @vindex gnus-group-uncollapsed-levels
1130 Short (collapsed) group name.  The @code{gnus-group-uncollapsed-levels}
1131 variable says how many levels to leave at the end of the group name.
1132 The default is 1---this will mean that group names like
1133 @samp{gnu.emacs.gnus} will be shortened to @samp{g.emacs.gnus}.
1134
1135 @item m
1136 @vindex gnus-new-mail-mark
1137 @cindex %
1138 @samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1139 the group lately.
1140
1141 @item d
1142 A string that says when you last read the group (@pxref{Group
1143 Timestamp}). 
1144
1145 @item u
1146 User defined specifier.  The next character in the format string should
1147 be a letter.  @sc{gnus} will call the function
1148 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1149 following @samp{%u}.  The function will be passed a single dummy
1150 paratere as argument.  The function should return a string, which will
1151 be inserted into the buffer just like information from any other
1152 specifier.
1153 @end table
1154
1155 @cindex *
1156 All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1157 if no info is available---for instance, if it is a non-activated foreign
1158 group, or a bogus native group.
1159
1160
1161 @node Group Modeline Specification
1162 @subsection Group Modeline Specification
1163 @cindex group modeline
1164
1165 @vindex gnus-group-mode-line-format
1166 The mode line can be changed by setting
1167 @code{gnus-group-mode-line-format} (@pxref{Formatting Variables}).  It
1168 doesn't understand that many format specifiers:
1169
1170 @table @samp
1171 @item S
1172 The native news server.
1173 @item M
1174 The native select method.
1175 @end table
1176
1177
1178 @node Group Highlighting
1179 @subsection Group Highlighting
1180 @cindex highlighting
1181 @cindex group highlighting
1182
1183 @vindex gnus-group-highlight
1184 Highlighting in the group buffer is controlled by the
1185 @code{gnus-group-highlight} variable.  This is an alist with elements
1186 that look like @var{(form . face)}.  If @var{form} evaluates to
1187 something non-@code{nil}, the @var{face} will be used on the line.
1188
1189 Here's an example value for this variable that might look nice if the
1190 background is dark:
1191
1192 @lisp
1193 (setq gnus-group-highlight
1194       `(((> unread 200) . 
1195          ,(custom-face-lookup "Red" nil nil t nil nil))
1196         ((and (< level 3) (zerop unread)) . 
1197          ,(custom-face-lookup "SeaGreen" nil nil t nil nil))
1198         ((< level 3) . 
1199          ,(custom-face-lookup "SpringGreen" nil nil t nil nil))
1200         ((zerop unread) . 
1201          ,(custom-face-lookup "SteelBlue" nil nil t nil nil))
1202         (t . 
1203          ,(custom-face-lookup "SkyBlue" nil nil t nil nil))))
1204 @end lisp
1205
1206 Variables that are dynamically bound when the forms are evaluated
1207 include:
1208
1209 @table @code
1210 @item group
1211 The group name.
1212 @item unread
1213 The number of unread articles in the group.
1214 @item method
1215 The select method.
1216 @item mailp
1217 Whether the group is a mail group.
1218 @item level
1219 The level of the group.
1220 @item score
1221 The score of the group.
1222 @item ticked 
1223 The number of ticked articles in the group.
1224 @item total
1225 The total number of articles in the group.  Or rather, MAX-NUMBER minus
1226 MIN-NUMBER.
1227 @item topic
1228 When using the topic minor mode, this variable is bound to the current
1229 topic being inserted.
1230 @end table
1231
1232 When the forms are @code{eval}ed, point is at the beginning of the line
1233 of the group in question, so you can use many of the normal Gnus
1234 functions for snarfing info on the group.
1235
1236 @vindex gnus-group-update-hook
1237 @findex gnus-group-highlight-line
1238 @code{gnus-group-update-hook} is called when a group line is changed.
1239 It will not be called when @code{gnus-visual} is @code{nil}.  This hook
1240 calls @code{gnus-group-highlight-line} by default.
1241
1242
1243 @node Group Maneuvering
1244 @section Group Maneuvering
1245 @cindex group movement
1246
1247 All movement commands understand the numeric prefix and will behave as
1248 expected, hopefully. 
1249
1250 @table @kbd
1251
1252 @item n
1253 @kindex n (Group)
1254 @findex gnus-group-next-unread-group
1255 Go to the next group that has unread articles
1256 (@code{gnus-group-next-unread-group}).
1257
1258 @item p
1259 @itemx DEL
1260 @kindex DEL (Group)
1261 @kindex p (Group)
1262 @findex gnus-group-prev-unread-group
1263 Go to the previous group that has unread articles
1264 (@code{gnus-group-prev-unread-group}).
1265
1266 @item N
1267 @kindex N (Group)
1268 @findex gnus-group-next-group
1269 Go to the next group (@code{gnus-group-next-group}).
1270
1271 @item P
1272 @kindex P (Group)
1273 @findex gnus-group-prev-group
1274 Go to the previous group (@code{gnus-group-prev-group}).
1275
1276 @item M-p
1277 @kindex M-p (Group)
1278 @findex gnus-group-next-unread-group-same-level
1279 Go to the next unread group on the same (or lower) level
1280 (@code{gnus-group-next-unread-group-same-level}). 
1281
1282 @item M-n
1283 @kindex M-n (Group)
1284 @findex gnus-group-prev-unread-group-same-level
1285 Go to the previous unread group on the same (or lower) level
1286 (@code{gnus-group-prev-unread-group-same-level}). 
1287 @end table
1288
1289 Three commands for jumping to groups:
1290
1291 @table @kbd
1292
1293 @item j
1294 @kindex j (Group)
1295 @findex gnus-group-jump-to-group
1296 Jump to a group (and make it visible if it isn't already)
1297 (@code{gnus-group-jump-to-group}).  Killed groups can be jumped to, just
1298 like living groups.
1299
1300 @item ,
1301 @kindex , (Group)
1302 @findex gnus-group-best-unread-group
1303 Jump to the unread group with the lowest level
1304 (@code{gnus-group-best-unread-group}). 
1305
1306 @item .
1307 @kindex . (Group)
1308 @findex gnus-group-first-unread-group
1309 Jump to the first group with unread articles
1310 (@code{gnus-group-first-unread-group}).  
1311 @end table
1312
1313 @vindex gnus-group-goto-unread
1314 If @code{gnus-group-goto-unread} is @code{nil}, all the movement
1315 commands will move to the next group, not the next unread group.  Even
1316 the commands that say they move to the next unread group.  The default
1317 is @code{t}.
1318
1319
1320 @node Selecting a Group
1321 @section Selecting a Group
1322 @cindex group selection
1323
1324 @table @kbd
1325
1326 @item SPACE
1327 @kindex SPACE (Group)
1328 @findex gnus-group-read-group
1329 Select the current group, switch to the summary buffer and display the
1330 first unread article (@code{gnus-group-read-group}).  If there are no
1331 unread articles in the group, or if you give a non-numerical prefix to
1332 this command, Gnus will offer to fetch all the old articles in this
1333 group from the server.  If you give a numerical prefix @var{N}, @var{N}
1334 determines the number of articles Gnus will fetch.  If @var{N} is
1335 positive, Gnus fetches the @var{N} newest articles, if @var{N} is
1336 negative, Gnus fetches the @var{abs(N)} oldest articles.
1337
1338 @item RET
1339 @kindex RET (Group)
1340 @findex gnus-group-select-group
1341 Select the current group and switch to the summary buffer
1342 (@code{gnus-group-select-group}).  Takes the same arguments as
1343 @code{gnus-group-read-group}---the only difference is that this command
1344 does not display the first unread article automatically upon group
1345 entry. 
1346
1347 @item M-RET
1348 @kindex M-RET (Group)
1349 @findex gnus-group-quick-select-group
1350 This does the same as the command above, but tries to do it with the
1351 minimum amount of fuzz (@code{gnus-group-quick-select-group}).  No
1352 scoring/killing will be performed, there will be no highlights and no
1353 expunging.  This might be useful if you're in a real hurry and have to
1354 enter some humongous group.  If you give a 0 prefix to this command
1355 (i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer.
1356 This might be useful if you want to toggle threading before entering the
1357 group.
1358
1359 @item M-SPACE
1360 @kindex M-SPACE (Group)
1361 @findex gnus-group-visible-select-group
1362 This is yet one more command that does the same as the @kbd{RET}
1363 command, but this one does it without expunging and hiding dormants
1364 (@code{gnus-group-visible-select-group}).
1365
1366 @end table
1367
1368 @vindex gnus-large-newsgroup
1369 The @code{gnus-large-newsgroup} variable says what Gnus should consider
1370 to be a big group.  This is 200 by default.  If the group has more
1371 (unread and/or ticked) articles than this, Gnus will query the user
1372 before entering the group.  The user can then specify how many articles
1373 should be fetched from the server.  If the user specifies a negative
1374 number (@code{-n}), the @code{n} oldest articles will be fetched.  If it
1375 is positive, the @code{n} articles that have arrived most recently will
1376 be fetched.
1377
1378 @vindex gnus-select-group-hook
1379 @vindex gnus-auto-select-first
1380 @code{gnus-auto-select-first} control whether any articles are selected
1381 automatically when entering a group with the @kbd{SPACE} command.
1382
1383 @table @code
1384
1385 @item nil
1386 Don't select any articles when entering the group.  Just display the
1387 full summary buffer.
1388
1389 @item t
1390 Select the first unread article when entering the group.  
1391
1392 @item best
1393 Select the most high-scored article in the group when entering the
1394 group. 
1395 @end table
1396         
1397 If you want to prevent automatic selection in some group (say, in a
1398 binary group with Huge articles) you can set this variable to @code{nil}
1399 in @code{gnus-select-group-hook}, which is called when a group is
1400 selected.
1401
1402
1403 @node Subscription Commands
1404 @section Subscription Commands
1405 @cindex subscription
1406
1407 @table @kbd
1408
1409 @item S t
1410 @itemx u
1411 @kindex S t (Group)
1412 @kindex u (Group)
1413 @findex gnus-group-unsubscribe-current-group
1414 Toggle subscription to the current group
1415 (@code{gnus-group-unsubscribe-current-group}).  
1416
1417 @item S s
1418 @itemx U
1419 @kindex S s (Group)
1420 @kindex U (Group)
1421 @findex gnus-group-unsubscribe-group
1422 Prompt for a group to subscribe, and then subscribe it.  If it was
1423 subscribed already, unsubscribe it instead
1424 (@code{gnus-group-unsubscribe-group}).
1425
1426 @item S k
1427 @itemx C-k
1428 @kindex S k (Group)
1429 @kindex C-k (Group)
1430 @findex gnus-group-kill-group
1431 Kill the current group (@code{gnus-group-kill-group}).
1432
1433 @item S y
1434 @itemx C-y
1435 @kindex S y (Group)
1436 @kindex C-y (Group)
1437 @findex gnus-group-yank-group
1438 Yank the last killed group (@code{gnus-group-yank-group}).
1439
1440 @item C-x C-t
1441 @kindex C-x C-t (Group)
1442 @findex gnus-group-transpose-groups
1443 Transpose two groups (@code{gnus-group-transpose-groups}).  This isn't
1444 really a subscription command, but you can use it instead of a
1445 kill-and-yank sequence sometimes.
1446
1447 @item S w
1448 @itemx C-w
1449 @kindex S w (Group)
1450 @kindex C-w (Group)
1451 @findex gnus-group-kill-region
1452 Kill all groups in the region (@code{gnus-group-kill-region}). 
1453
1454 @item S z
1455 @kindex S z (Group)
1456 @findex gnus-group-kill-all-zombies
1457 Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
1458
1459 @item S C-k
1460 @kindex S C-k (Group)
1461 @findex gnus-group-kill-level
1462 Kill all groups on a certain level (@code{gnus-group-kill-level}).
1463 These groups can't be yanked back after killing, so this command should
1464 be used with some caution.  The only time where this command comes in
1465 really handy is when you have a @file{.newsrc} with lots of unsubscribed
1466 groups that you want to get rid off.  @kbd{S C-k} on level 7 will
1467 kill off all unsubscribed groups that do not have message numbers in the
1468 @file{.newsrc} file.  
1469
1470 @end table
1471
1472 Also @pxref{Group Levels}.
1473
1474
1475 @node Group Data
1476 @section Group Data
1477
1478 @table @kbd
1479
1480 @item c
1481 @kindex c (Group)
1482 @findex gnus-group-catchup-current
1483 @vindex gnus-group-catchup-group-hook
1484 Mark all unticked articles in this group as read
1485 (@code{gnus-group-catchup-current}).
1486 @code{gnus-group-catchup-group-hook} is called when catching up a group from
1487 the group buffer.
1488
1489 @item C
1490 @kindex C (Group)
1491 @findex gnus-group-catchup-current-all
1492 Mark all articles in this group, even the ticked ones, as read
1493 (@code{gnus-group-catchup-current-all}).   
1494
1495 @item M-c
1496 @kindex M-c (Group)
1497 @findex gnus-group-clear-data
1498 Clear the data from the current group---nix out marks and the list of
1499 read articles (@code{gnus-group-clear-data}).
1500
1501 @item M-x gnus-group-clear-data-on-native-groups
1502 @kindex M-x gnus-group-clear-data-on-native-groups
1503 @findex gnus-group-clear-data-on-native-groups
1504 If you have switched from one @sc{nntp} server to another, all your marks
1505 and read ranges have become worthless.  You can use this command to
1506 clear out all data that you have on your native groups.  Use with
1507 caution. 
1508
1509 @end table
1510
1511
1512 @node Group Levels
1513 @section Group Levels
1514 @cindex group level
1515 @cindex level
1516
1517 All groups have a level of @dfn{subscribedness}.  For instance, if a
1518 group is on level 2, it is more subscribed than a group on level 5.  You
1519 can ask Gnus to just list groups on a given level or lower
1520 (@pxref{Listing Groups}), or to just check for new articles in groups on
1521 a given level or lower (@pxref{Scanning New Messages}).
1522
1523 Remember:  The higher the level of the group, the less important it is. 
1524
1525 @table @kbd
1526
1527 @item S l
1528 @kindex S l (Group)
1529 @findex gnus-group-set-current-level
1530 Set the level of the current group.  If a numeric prefix is given, the
1531 next @var{n} groups will have their levels set.  The user will be
1532 prompted for a level.
1533 @end table
1534
1535 @vindex gnus-level-killed
1536 @vindex gnus-level-zombie
1537 @vindex gnus-level-unsubscribed
1538 @vindex gnus-level-subscribed
1539 Gnus considers groups on between levels 1 and
1540 @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
1541 @code{gnus-level-subscribed} (exclusive) and
1542 @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
1543 unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
1544 (default 8) and @code{gnus-level-killed} to be killed (default 9),
1545 completely dead.  Gnus treats subscribed and unsubscribed groups exactly
1546 the same, but zombie and killed groups have no information on what
1547 articles you have read, etc, stored.  This distinction between dead and
1548 living groups isn't done because it is nice or clever, it is done purely
1549 for reasons of efficiency.
1550
1551 It is recommended that you keep all your mail groups (if any) on quite
1552 low levels (e.g. 1 or 2).
1553
1554 If you want to play with the level variables, you should show some care.
1555 Set them once, and don't touch them ever again.  Better yet, don't touch
1556 them at all unless you know exactly what you're doing.
1557
1558 @vindex gnus-level-default-unsubscribed
1559 @vindex gnus-level-default-subscribed
1560 Two closely related variables are @code{gnus-level-default-subscribed}
1561 (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
1562 which are the levels that new groups will be put on if they are
1563 (un)subscribed.  These two variables should, of course, be inside the
1564 relevant legal ranges.
1565
1566 @vindex gnus-keep-same-level
1567 If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
1568 will only move to groups that are of the same level (or lower).  In
1569 particular, going from the last article in one group to the next group
1570 will go to the next group of the same level (or lower).  This might be
1571 handy if you want to read the most important groups before you read the
1572 rest.
1573
1574 @vindex gnus-group-default-list-level
1575 All groups with a level less than or equal to
1576 @code{gnus-group-default-list-level} will be listed in the group buffer
1577 by default.
1578
1579 @vindex gnus-group-list-inactive-groups
1580 If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
1581 groups will be listed along with the unread groups.  This variable is
1582 @code{t} by default.  If it is @code{nil}, inactive groups won't be
1583 listed. 
1584
1585 @vindex gnus-group-use-permanent-levels
1586 If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
1587 give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
1588 use this level as the ``work'' level.
1589
1590 @vindex gnus-activate-level
1591 Gnus will normally just activate groups that are on level
1592 @code{gnus-activate-level} or less.  If you don't want to activate
1593 unsubscribed groups, for instance, you might set this variable to
1594 5.  The default is 6.
1595
1596
1597 @node Group Score
1598 @section Group Score
1599 @cindex group score
1600
1601 You would normally keep important groups on high levels, but that scheme
1602 is somewhat restrictive.  Don't you wish you could have Gnus sort the
1603 group buffer according to how often you read groups, perhaps?  Within
1604 reason?  
1605
1606 This is what @dfn{group score} is for.  You can assign a score to each
1607 group.  You can then sort the group buffer based on this score.
1608 Alternatively, you can sort on score and then level.  (Taken together,
1609 the level and the score is called the @dfn{rank} of the group.  A group
1610 that is on level 4 and has a score of 1 has a higher rank than a group
1611 on level 5 that has a score of 300.  (The level is the most significant
1612 part and the score is the least significant part.))
1613
1614 @findex gnus-summary-bubble-group
1615 If you want groups you read often to get higher scores than groups you
1616 read seldom you can add the @code{gnus-summary-bubble-group} function to
1617 the @code{gnus-summary-exit-hook} hook.  This will result (after
1618 sorting) in a bubbling sort of action.  If you want to see that in
1619 action after each summary exit, you can add
1620 @code{gnus-group-sort-groups-by-rank} or
1621 @code{gnus-group-sort-groups-by-score} to the same hook, but that will
1622 slow things down somewhat.
1623
1624
1625 @node Marking Groups
1626 @section Marking Groups
1627 @cindex marking groups
1628
1629 If you want to perform some command on several groups, and they appear
1630 subsequently in the group buffer, you would normally just give a
1631 numerical prefix to the command.  Most group commands will then do your
1632 bidding on those groups.
1633
1634 However, if the groups are not in sequential order, you can still
1635 perform a command on several groups.  You simply mark the groups first
1636 with the process mark and then execute the command.
1637
1638 @table @kbd
1639
1640 @item #
1641 @kindex # (Group)
1642 @itemx M m
1643 @kindex M m (Group)
1644 @findex gnus-group-mark-group
1645 Set the mark on the current group (@code{gnus-group-mark-group}). 
1646
1647 @item M-#
1648 @kindex M-# (Group)
1649 @itemx M u
1650 @kindex M u (Group)
1651 @findex gnus-group-unmark-group
1652 Remove the mark from the current group
1653 (@code{gnus-group-unmark-group}). 
1654
1655 @item M U
1656 @kindex M U (Group)
1657 @findex gnus-group-unmark-all-groups
1658 Remove the mark from all groups (@code{gnus-group-unmark-all-groups}). 
1659
1660 @item M w
1661 @kindex M w (Group)
1662 @findex gnus-group-mark-region
1663 Mark all groups between point and mark (@code{gnus-group-mark-region}). 
1664
1665 @item M b
1666 @kindex M b (Group)
1667 @findex gnus-group-mark-buffer
1668 Mark all groups in the buffer (@code{gnus-group-mark-buffer}). 
1669
1670 @item M r
1671 @kindex M r (Group)
1672 @findex gnus-group-mark-regexp
1673 Mark all groups that match some regular expression
1674 (@code{gnus-group-mark-regexp}).  
1675 @end table
1676
1677 Also @pxref{Process/Prefix}.
1678
1679 @findex gnus-group-universal-argument
1680 If you want to execute some command on all groups that have been marked
1681 with the process mark, you can use the @kbd{M-&}
1682 (@code{gnus-group-universal-argument}) command.  It will prompt you for
1683 the command to be executed.
1684
1685
1686 @node Foreign Groups
1687 @section Foreign Groups
1688 @cindex foreign groups
1689
1690 Below are some group mode commands for making and editing general foreign
1691 groups, as well as commands to ease the creation of a few
1692 special-purpose groups.  All these commands insert the newly created
1693 groups under point---@code{gnus-subscribe-newsgroup-method} is not
1694 consulted.
1695
1696 @table @kbd
1697
1698 @item G m
1699 @kindex G m (Group)
1700 @findex gnus-group-make-group
1701 @cindex making groups
1702 Make a new group (@code{gnus-group-make-group}).  Gnus will prompt you
1703 for a name, a method and possibly an @dfn{address}.  For an easier way
1704 to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
1705
1706 @item G r
1707 @kindex G r (Group)
1708 @findex gnus-group-rename-group
1709 @cindex renaming groups
1710 Rename the current group to something else
1711 (@code{gnus-group-rename-group}).  This is legal only on some
1712 groups---mail groups mostly.  This command might very well be quite slow
1713 on some backends.
1714
1715 @item G c
1716 @kindex G c (Group)
1717 @cindex customizing
1718 @findex gnus-group-customize
1719 Customize the group parameters (@code{gnus-group-customize}).
1720
1721 @item G e
1722 @kindex G e (Group)
1723 @findex gnus-group-edit-group-method
1724 @cindex renaming groups
1725 Enter a buffer where you can edit the select method of the current
1726 group (@code{gnus-group-edit-group-method}).
1727
1728 @item G p
1729 @kindex G p (Group)
1730 @findex gnus-group-edit-group-parameters
1731 Enter a buffer where you can edit the group parameters
1732 (@code{gnus-group-edit-group-parameters}). 
1733
1734 @item G E
1735 @kindex G E (Group)
1736 @findex gnus-group-edit-group
1737 Enter a buffer where you can edit the group info
1738 (@code{gnus-group-edit-group}).
1739
1740 @item G d
1741 @kindex G d (Group)
1742 @findex gnus-group-make-directory-group
1743 @cindex nndir
1744 Make a directory group (@pxref{Directory Groups}).  You will be prompted
1745 for a directory name (@code{gnus-group-make-directory-group}).
1746
1747 @item G h 
1748 @kindex G h (Group)
1749 @cindex help group
1750 @findex gnus-group-make-help-group
1751 Make the Gnus help group (@code{gnus-group-make-help-group}).
1752
1753 @item G a
1754 @kindex G a (Group)
1755 @cindex (ding) archive
1756 @cindex archive group
1757 @findex gnus-group-make-archive-group
1758 @vindex gnus-group-archive-directory
1759 @vindex gnus-group-recent-archive-directory
1760 Make a Gnus archive group (@code{gnus-group-make-archive-group}).  By
1761 default a group pointing to the most recent articles will be created
1762 (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
1763 group will be created from @code{gnus-group-archive-directory}.
1764
1765 @item G k
1766 @kindex G k (Group)
1767 @findex gnus-group-make-kiboze-group
1768 @cindex nnkiboze
1769 Make a kiboze group.  You will be prompted for a name, for a regexp to
1770 match groups to be ``included'' in the kiboze group, and a series of
1771 strings to match on headers (@code{gnus-group-make-kiboze-group}).
1772 @xref{Kibozed Groups}.
1773
1774 @item G D
1775 @kindex G D (Group)
1776 @findex gnus-group-enter-directory
1777 @cindex nneething
1778 Read an arbitrary directory as if with were a newsgroup with the
1779 @code{nneething} backend (@code{gnus-group-enter-directory}).
1780 @xref{Anything Groups}. 
1781
1782 @item G f
1783 @kindex G f (Group)
1784 @findex gnus-group-make-doc-group
1785 @cindex ClariNet Briefs
1786 @cindex nndoc
1787 Make a group based on some file or other
1788 (@code{gnus-group-make-doc-group}).  If you give a prefix to this
1789 command, you will be prompted for a file name and a file type.
1790 Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
1791 @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, and
1792 @code{forward}.  If you run this command without a prefix, Gnus will
1793 guess at the file type.  @xref{Document Groups}.
1794
1795 @item G w
1796 @kindex G w (Group)
1797 @findex gnus-group-make-web-group
1798 @cindex DejaNews
1799 @cindex Alta Vista
1800 @cindex InReference
1801 @cindex nnweb
1802 Make an ephemeral group based on a web search
1803 (@code{gnus-group-make-web-group}).  If you give a prefix to this
1804 command, make a solid group instead.  You will be prompted for the
1805 search engine type and the search string.  Legal search engine types
1806 include @code{dejanews}, @code{altavista} and @code{reference}.
1807 @xref{Web Searches}.
1808
1809 @item G DEL
1810 @kindex G DEL (Group)
1811 @findex gnus-group-delete-group
1812 This function will delete the current group
1813 (@code{gnus-group-delete-group}).  If given a prefix, this function will
1814 actually delete all the articles in the group, and forcibly remove the
1815 group itself from the face of the Earth.  Use a prefix only if you are
1816 absolutely sure of what you are doing.
1817
1818 @item G V
1819 @kindex G V (Group)
1820 @findex gnus-group-make-empty-virtual
1821 Make a new, fresh, empty @code{nnvirtual} group
1822 (@code{gnus-group-make-empty-virtual}).  @xref{Virtual Groups}.
1823
1824 @item G v
1825 @kindex G v (Group)
1826 @findex gnus-group-add-to-virtual
1827 Add the current group to an @code{nnvirtual} group
1828 (@code{gnus-group-add-to-virtual}).  Uses the process/prefix convention.
1829 @end table
1830
1831 @xref{Select Methods} for more information on the various select
1832 methods. 
1833
1834 @vindex gnus-activate-foreign-newsgroups
1835 If @code{gnus-activate-foreign-newsgroups} is a positive number,
1836 Gnus will check all foreign groups with this level or lower at startup.
1837 This might take quite a while, especially if you subscribe to lots of
1838 groups from different @sc{nntp} servers.
1839
1840
1841 @node Group Parameters
1842 @section Group Parameters
1843 @cindex group parameters
1844
1845 The group parameters store information local to a particular group:
1846
1847 @table @code
1848 @item to-address
1849 @cindex to-address
1850 If the group parameter list contains an element that looks like
1851 @code{(to-address .  "some@@where.com")}, that address will be used by
1852 the backend when doing followups and posts.  This is primarily useful in
1853 mail groups that represent closed mailing lists---mailing lists where
1854 it's expected that everybody that writes to the mailing list is
1855 subscribed to it.  Since using this parameter ensures that the mail only
1856 goes to the mailing list itself, it means that members won't receive two
1857 copies of your followups.
1858
1859 Using @code{to-address} will actually work whether the group is foreign
1860 or not.  Let's say there's a group on the server that is called
1861 @samp{fa.4ad-l}.  This is a real newsgroup, but the server has gotten
1862 the articles from a mail-to-news gateway.  Posting directly to this
1863 group is therefore impossible---you have to send mail to the mailing
1864 list address instead. 
1865
1866 @item to-list
1867 @cindex to-list
1868 If the group parameter list has an element that looks like
1869 @code{(to-list . "some@@where.com")}, that address will be used when
1870 doing a @kbd{a} in any group.  It is totally ignored when doing a
1871 followup---except that if it is present in a news group, you'll get mail
1872 group semantics when doing @kbd{f}.
1873
1874 @item broken-reply-to
1875 @cindex broken-reply-to
1876 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
1877 headers in this group are to be ignored.  This can be useful if you're
1878 reading a mailing list group where the listserv has inserted
1879 @code{Reply-To} headers that point back to the listserv itself.  This is
1880 broken behavior.  So there!
1881
1882 @item to-group
1883 @cindex to-group
1884 Elements like @code{(to-group . "some.group.name")} means that all
1885 posts in that group will be sent to @code{some.group.name}.  
1886
1887 @item newsgroup
1888 @cindex newsgroup
1889 If this symbol is present in the group parameter list, Gnus will treat
1890 all responses as if they were responses to news articles.  This can be
1891 useful if you have a mail group that's really a mirror of a news group. 
1892
1893 @item gcc-self
1894 @cindex gcc-self
1895 If this symbol is present in the group parameter list and set to
1896 @code{t}, new composed messages will be @code{Gcc}'d to the current
1897 group. If it is present and set to @code{none}, no @code{Gcc:} header
1898 will be generated, if it is present and a string, this string will be
1899 inserted literally as a @code{gcc} header (this symbol takes precedence over
1900 any default @code{Gcc} rules as described later).
1901
1902 @item auto-expire
1903 @cindex auto-expire
1904 If this symbol is present in the group parameter list, all articles that
1905 are read will be marked as expirable.  For an alternative approach,
1906 @pxref{Expiring Mail}.
1907
1908 @item total-expire
1909 @cindex total-expire
1910 If this symbol is present, all read articles will be put through the
1911 expiry process, even if they are not marked as expirable.  Use with
1912 caution. 
1913
1914 @item expiry-wait
1915 @cindex expiry-wait
1916 @vindex nnmail-expiry-wait-function
1917 If the group parameter has an element that looks like @code{(expiry-wait
1918 . 10)}, this value will override any @code{nnmail-expiry-wait} and
1919 @code{nnmail-expiry-wait-function} when expiring expirable messages.
1920 The value can either be a number of days (not necessarily an integer) or
1921 the symbols @code{never} or @code{immediate}.
1922
1923 @item score-file
1924 @cindex score file group parameter
1925 Elements that look like @code{(score-file . "file")} will make
1926 @file{file} into the current score file for the group in question.  This
1927 means that all score commands you issue will end up in that file. 
1928
1929 @item adapt-file
1930 @cindex adapt file group parameter
1931 Elements that look like @code{(adapt-file . "file")} will make
1932 @file{file} into the current adaptive file for the group in question.
1933 All adaptive score entries will be put into this file.
1934
1935 @item admin-address
1936 When unsubscribing to a mailing list you should never send the
1937 unsubscription notice to the mailing list itself.  Instead, you'd send
1938 messages to the administrative address.  This parameter allows you to
1939 put the admin address somewhere convenient.
1940
1941 @item display
1942 Elements that look like @code{(display . MODE)} says which articles to
1943 display on entering the group.  Legal values are:
1944
1945 @table @code
1946 @item all
1947 Display all articles, both read and unread.
1948
1949 @item default
1950 Display the default visible articles, which normally includes unread and
1951 ticked articles.
1952 @end table
1953
1954 @item comment
1955 Elements that look like @code{(comment . "This is a comment")}
1956 are arbitrary comments on the group.  They are currently ignored by
1957 Gnus, but provide a place for you to store information on particular
1958 groups. 
1959
1960 @item @var{(variable form)}
1961 You can use the group parameters to set variables local to the group you
1962 are entering.  If you want to turn threading off in @samp{news.answers},
1963 you could put @code{(gnus-show-threads nil)} in the group parameters of
1964 that group.  @code{gnus-show-threads} will be made into a local variable
1965 in the summary buffer you enter, and the form @code{nil} will be
1966 @code{eval}ed there.
1967
1968 This can also be used as a group-specific hook function, if you'd like.
1969 If you want to hear a beep when you enter a group, you could put
1970 something like @code{(dummy-variable (ding))} in the parameters of that
1971 group.  @code{dummy-variable} will be set to the result of the
1972 @code{(ding)} form, but who cares?
1973
1974 @end table
1975
1976 Use the @kbd{G p} command to edit group parameters of a group.
1977
1978 Also @pxref{Topic Parameters}.
1979
1980
1981 @node Listing Groups
1982 @section Listing Groups
1983 @cindex group listing
1984
1985 These commands all list various slices of the groups that are available.
1986
1987 @table @kbd
1988
1989 @item l
1990 @itemx A s
1991 @kindex A s (Group)
1992 @kindex l (Group)
1993 @findex gnus-group-list-groups
1994 List all groups that have unread articles
1995 (@code{gnus-group-list-groups}).  If the numeric prefix is used, this
1996 command will list only groups of level ARG and lower.  By default, it
1997 only lists groups of level five (i. e.,
1998 @code{gnus-group-default-list-level}) or lower (i.e., just subscribed
1999 groups).
2000
2001 @item L
2002 @itemx A u
2003 @kindex A u (Group)
2004 @kindex L (Group)
2005 @findex gnus-group-list-all-groups
2006 List all groups, whether they have unread articles or not
2007 (@code{gnus-group-list-all-groups}).  If the numeric prefix is used,
2008 this command will list only groups of level ARG and lower.  By default,
2009 it lists groups of level seven or lower (i.e., just subscribed and
2010 unsubscribed groups).
2011
2012 @item A l
2013 @kindex A l (Group)
2014 @findex gnus-group-list-level
2015 List all unread groups on a specific level
2016 (@code{gnus-group-list-level}).  If given a prefix, also list the groups
2017 with no unread articles.
2018
2019 @item A k
2020 @kindex A k (Group)
2021 @findex gnus-group-list-killed
2022 List all killed groups (@code{gnus-group-list-killed}).  If given a
2023 prefix argument, really list all groups that are available, but aren't
2024 currently (un)subscribed.  This could entail reading the active file
2025 from the server.
2026
2027 @item A z
2028 @kindex A z (Group)
2029 @findex gnus-group-list-zombies
2030 List all zombie groups (@code{gnus-group-list-zombies}).
2031
2032 @item A m
2033 @kindex A m (Group)
2034 @findex gnus-group-list-matching
2035 List all unread, subscribed groups with names that match a regexp
2036 (@code{gnus-group-list-matching}). 
2037
2038 @item A M
2039 @kindex A M (Group)
2040 @findex gnus-group-list-all-matching
2041 List groups that match a regexp (@code{gnus-group-list-all-matching}).
2042
2043 @item A A
2044 @kindex A A (Group)
2045 @findex gnus-group-list-active
2046 List absolutely all groups that are in the active file(s) of the
2047 server(s) you are connected to (@code{gnus-group-list-active}).  This
2048 might very well take quite a while.  It might actually be a better idea
2049 to do a @kbd{A M} to list all matching, and just give @samp{.} as the
2050 thing to match on.  Also note that this command may list group that
2051 don't exist (yet)---these will be listed as if they are killed groups.
2052 Take the output with some grains of salt.
2053
2054 @item A a
2055 @kindex A a (Group)
2056 @findex gnus-group-apropos
2057 List all groups that have names that match a regexp
2058 (@code{gnus-group-apropos}).
2059
2060 @item A d
2061 @kindex A d (Group)
2062 @findex gnus-group-description-apropos
2063 List all groups that have names or descriptions that match a regexp
2064 (@code{gnus-group-description-apropos}).
2065
2066 @end table
2067
2068 @vindex gnus-permanently-visible-groups
2069 @cindex visible group parameter
2070 Groups that match the @code{gnus-permanently-visible-groups} regexp will
2071 always be shown, whether they have unread articles or not.  You can also
2072 add the @code{visible} element to the group parameters in question to
2073 get the same effect.
2074
2075 @vindex gnus-list-groups-with-ticked-articles
2076 Groups that have just ticked articles in it are normally listed in the
2077 group buffer.  If @code{gnus-list-groups-with-ticked-articles} is
2078 @code{nil}, these groups will be treated just like totally empty
2079 groups.  It is @code{t} by default.
2080
2081
2082 @node Sorting Groups
2083 @section Sorting Groups
2084 @cindex sorting groups
2085
2086 @kindex C-c C-s (Group)
2087 @findex gnus-group-sort-groups
2088 @vindex gnus-group-sort-function
2089 The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
2090 group buffer according to the function(s) given by the
2091 @code{gnus-group-sort-function} variable.  Available sorting functions
2092 include: 
2093
2094 @table @code
2095
2096 @item gnus-group-sort-by-alphabet
2097 @findex gnus-group-sort-by-alphabet
2098 Sort the group names alphabetically.  This is the default.
2099
2100 @item gnus-group-sort-by-real-name
2101 @findex gnus-group-sort-by-real-name
2102 Sort the group alphabetically on the real (unprefixed) group names.
2103
2104 @item gnus-group-sort-by-level
2105 @findex gnus-group-sort-by-level
2106 Sort by group level.
2107
2108 @item gnus-group-sort-by-score
2109 @findex gnus-group-sort-by-score
2110 Sort by group score.
2111
2112 @item gnus-group-sort-by-rank
2113 @findex gnus-group-sort-by-rank
2114 Sort by group score and then the group level.  The level and the score
2115 are, when taken together, the group's @dfn{rank}. 
2116
2117 @item gnus-group-sort-by-unread
2118 @findex gnus-group-sort-by-unread
2119 Sort by number of unread articles.
2120
2121 @item gnus-group-sort-by-method
2122 @findex gnus-group-sort-by-method
2123 Sort alphabetically on the select method.
2124
2125
2126 @end table
2127
2128 @code{gnus-group-sort-function} can also be a list of sorting
2129 functions.  In that case, the most significant sort key function must be
2130 the last one.
2131
2132
2133 There are also a number of commands for sorting directly according to
2134 some sorting criteria:
2135
2136 @table @kbd
2137 @item G S a
2138 @kindex G S a (Group)
2139 @findex gnus-group-sort-groups-by-alphabet
2140 Sort the group buffer alphabetically by group name
2141 (@code{gnus-group-sort-groups-by-alphabet}). 
2142
2143 @item G S u
2144 @kindex G S u (Group)
2145 @findex gnus-group-sort-groups-by-unread
2146 Sort the group buffer by the number of unread articles
2147 (@code{gnus-group-sort-groups-by-unread}).
2148
2149 @item G S l
2150 @kindex G S l (Group)
2151 @findex gnus-group-sort-groups-by-level
2152 Sort the group buffer by group level
2153 (@code{gnus-group-sort-groups-by-level}). 
2154
2155 @item G S v
2156 @kindex G S v (Group)
2157 @findex gnus-group-sort-groups-by-score
2158 Sort the group buffer by group score
2159 (@code{gnus-group-sort-groups-by-score}). 
2160
2161 @item G S r
2162 @kindex G S r (Group)
2163 @findex gnus-group-sort-groups-by-rank
2164 Sort the group buffer by group rank
2165 (@code{gnus-group-sort-groups-by-rank}). 
2166
2167 @item G S m
2168 @kindex G S m (Group)
2169 @findex gnus-group-sort-groups-by-method
2170 Sort the group buffer alphabetically by backend name
2171 (@code{gnus-group-sort-groups-by-method}). 
2172
2173 @end table
2174
2175 When given a prefix, all these commands will sort in reverse order. 
2176
2177 You can also sort a subset of the groups:
2178
2179 @table @kbd
2180 @item G P a
2181 @kindex G P a (Group)
2182 @findex gnus-group-sort-selected-groups-by-alphabet
2183 Sort the process/prefixed groups in the group buffer alphabetically by
2184 group name (@code{gnus-group-sort-selected-groups-by-alphabet}).
2185
2186 @item G P u
2187 @kindex G P u (Group)
2188 @findex gnus-group-sort-selected-groups-by-unread
2189 Sort the process/prefixed groups in the group buffer by the number of
2190 unread articles (@code{gnus-group-sort-selected-groups-by-unread}).
2191
2192 @item G P l
2193 @kindex G P l (Group)
2194 @findex gnus-group-sort-selected-groups-by-level
2195 Sort the process/prefixed groups in the group buffer by group level
2196 (@code{gnus-group-sort-selected-groups-by-level}).
2197
2198 @item G P v
2199 @kindex G P v (Group)
2200 @findex gnus-group-sort-selected-groups-by-score
2201 Sort the process/prefixed groups in the group buffer by group score
2202 (@code{gnus-group-sort-selected-groups-by-score}).
2203
2204 @item G P r
2205 @kindex G P r (Group)
2206 @findex gnus-group-sort-selected-groups-by-rank
2207 Sort the process/prefixed groups in the group buffer by group rank
2208 (@code{gnus-group-sort-selected-groups-by-rank}).
2209
2210 @item G P m
2211 @kindex G P m (Group)
2212 @findex gnus-group-sort-selected-groups-by-method
2213 Sort the process/prefixed groups in the group buffer alphabetically by
2214 backend name (@code{gnus-group-sort-selected-groups-by-method}).
2215
2216 @end table
2217
2218
2219
2220 @node Group Maintenance
2221 @section Group Maintenance
2222 @cindex bogus groups
2223
2224 @table @kbd
2225 @item b
2226 @kindex b (Group)
2227 @findex gnus-group-check-bogus-groups
2228 Find bogus groups and delete them
2229 (@code{gnus-group-check-bogus-groups}).
2230
2231 @item F
2232 @kindex F (Group)
2233 @findex gnus-find-new-newsgroups
2234 Find new groups and process them (@code{gnus-find-new-newsgroups}).  If
2235 given a prefix, use the @code{ask-server} method to query the server for
2236 new groups.
2237
2238 @item C-c C-x
2239 @kindex C-c C-x (Group)
2240 @findex gnus-group-expire-articles
2241 Run all expirable articles in the current group through the expiry
2242 process (if any) (@code{gnus-group-expire-articles}).
2243
2244 @item C-c M-C-x
2245 @kindex C-c M-C-x (Group)
2246 @findex gnus-group-expire-all-groups
2247 Run all articles in all groups through the expiry process
2248 (@code{gnus-group-expire-all-groups}).
2249
2250 @end table
2251
2252
2253 @node Browse Foreign Server
2254 @section Browse Foreign Server
2255 @cindex foreign servers
2256 @cindex browsing servers
2257
2258 @table @kbd
2259 @item B
2260 @kindex B (Group)
2261 @findex gnus-group-browse-foreign-server
2262 You will be queried for a select method and a server name.  Gnus will
2263 then attempt to contact this server and let you browse the groups there
2264 (@code{gnus-group-browse-foreign-server}).
2265 @end table
2266
2267 @findex gnus-browse-mode
2268 A new buffer with a list of available groups will appear.  This buffer
2269 will be use the @code{gnus-browse-mode}.  This buffer looks a bit (well,
2270 a lot) like a normal group buffer.
2271
2272 Here's a list of keystrokes available in the browse mode:
2273
2274 @table @kbd
2275 @item n
2276 @kindex n (Browse)
2277 @findex gnus-group-next-group
2278 Go to the next group (@code{gnus-group-next-group}).
2279
2280 @item p
2281 @kindex p (Browse)
2282 @findex gnus-group-prev-group
2283 Go to the previous group (@code{gnus-group-prev-group}).
2284
2285 @item SPACE
2286 @kindex SPACE (Browse)
2287 @findex gnus-browse-read-group
2288 Enter the current group and display the first article
2289 (@code{gnus-browse-read-group}). 
2290
2291 @item RET
2292 @kindex RET (Browse)
2293 @findex gnus-browse-select-group
2294 Enter the current group (@code{gnus-browse-select-group}). 
2295
2296 @item u
2297 @kindex u (Browse)
2298 @findex gnus-browse-unsubscribe-current-group
2299 Unsubscribe to the current group, or, as will be the case here,
2300 subscribe to it (@code{gnus-browse-unsubscribe-current-group}). 
2301
2302 @item l
2303 @itemx q
2304 @kindex q (Browse)
2305 @kindex l (Browse)
2306 @findex gnus-browse-exit
2307 Exit browse mode (@code{gnus-browse-exit}).
2308
2309 @item ?
2310 @kindex ? (Browse)
2311 @findex gnus-browse-describe-briefly
2312 Describe browse mode briefly (well, there's not much to describe, is
2313 there) (@code{gnus-browse-describe-briefly}).
2314 @end table
2315
2316
2317 @node Exiting Gnus
2318 @section Exiting Gnus
2319 @cindex exiting Gnus
2320
2321 Yes, Gnus is ex(c)iting.
2322
2323 @table @kbd
2324 @item z
2325 @kindex z (Group)
2326 @findex gnus-group-suspend
2327 Suspend Gnus (@code{gnus-group-suspend}).  This doesn't really exit Gnus,
2328 but it kills all buffers except the Group buffer.  I'm not sure why this
2329 is a gain, but then who am I to judge?
2330
2331 @item q
2332 @kindex q (Group)
2333 @findex gnus-group-exit
2334 Quit Gnus (@code{gnus-group-exit}).
2335
2336 @item Q
2337 @kindex Q (Group)
2338 @findex gnus-group-quit
2339 Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
2340 The dribble file will be saved, though (@pxref{Auto Save}).
2341 @end table
2342
2343 @vindex gnus-exit-gnus-hook
2344 @vindex gnus-suspend-gnus-hook
2345 @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
2346 @code{gnus-exit-gnus-hook} is called when you quit Gnus, while
2347 @code{gnus-after-exiting-gnus-hook} is called as the final item when
2348 exiting Gnus.
2349
2350 @findex gnus-unload
2351 @cindex unloading
2352 If you wish to completely unload Gnus and all its adherents, you can use
2353 the @code{gnus-unload} command.  This command is also very handy when
2354 trying to customize meta-variables.
2355
2356 Note:
2357
2358 @quotation
2359 Miss Lisa Cannifax, while sitting in English class, felt her feet go
2360 numbly heavy and herself fall into a hazy trance as the boy sitting
2361 behind her drew repeated lines with his pencil across the back of her
2362 plastic chair.
2363 @end quotation
2364
2365
2366 @node Group Topics
2367 @section Group Topics
2368 @cindex topics
2369
2370 If you read lots and lots of groups, it might be convenient to group
2371 them hierarchically according to topics.  You put your Emacs groups over
2372 here, your sex groups over there, and the rest (what, two groups or so?)
2373 you put in some misc section that you never bother with anyway.  You can
2374 even group the Emacs sex groups as a sub-topic to either the Emacs
2375 groups or the sex groups---or both!  Go wild!
2376
2377 Here's an example:
2378
2379 @example
2380 Gnus
2381   Emacs -- I wuw it!
2382      3: comp.emacs
2383      2: alt.religion.emacs
2384     Naughty Emacs
2385      452: alt.sex.emacs
2386        0: comp.talk.emacs.recovery
2387   Misc
2388      8: comp.binaries.fractals
2389     13: comp.sources.unix
2390 @end example
2391
2392 @findex gnus-topic-mode
2393 @kindex t (Group)
2394 To get this @emph{fab} functionality you simply turn on (ooh!) the
2395 @code{gnus-topic} minor mode---type @kbd{t} in the group buffer.  (This
2396 is a toggling command.)
2397
2398 Go ahead, just try it.  I'll still be here when you get back.  La de
2399 dum...  Nice tune, that...  la la la...  What, you're back? Yes, and now
2400 press @kbd{l}.  There.  All your groups are now listed under
2401 @samp{misc}.  Doesn't that make you feel all warm and fuzzy?  Hot and
2402 bothered?
2403
2404 If you want this permanently enabled, you should add that minor mode to
2405 the hook for the group mode:
2406
2407 @lisp
2408 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
2409 @end lisp
2410
2411 @menu 
2412 * Topic Variables::    How to customize the topics the Lisp Way.
2413 * Topic Commands::     Interactive E-Z commands.
2414 * Topic Sorting::      Sorting each topic individually.
2415 * Topic Topology::     A map of the world.
2416 * Topic Parameters::   Parameters that apply to all groups in a topic.
2417 @end menu
2418
2419
2420 @node Topic Variables
2421 @subsection Topic Variables
2422 @cindex topic variables
2423
2424 Now, if you select a topic, if will fold/unfold that topic, which is
2425 really neat, I think.
2426
2427 @vindex gnus-topic-line-format
2428 The topic lines themselves are created according to the
2429 @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
2430 Legal elements are:
2431
2432 @table @samp
2433 @item i
2434 Indentation.
2435 @item n
2436 Topic name.
2437 @item v
2438 Visibility.
2439 @item l
2440 Level.
2441 @item g
2442 Number of groups in the topic.
2443 @item a
2444 Number of unread articles in the topic.
2445 @item A 
2446 Number of unread articles in the topic and all its subtopics. 
2447 @end table
2448
2449 @vindex gnus-topic-indent-level
2450 Each sub-topic (and the groups in the sub-topics) will be indented with
2451 @code{gnus-topic-indent-level} times the topic level number of spaces.
2452 The default is 2.
2453
2454 @vindex gnus-topic-mode-hook
2455 @code{gnus-topic-mode-hook} is called in topic minor mode buffers. 
2456
2457 @vindex gnus-topic-display-empty-topics
2458 The @code{gnus-topic-display-empty-topics} says whether to display even
2459 topics that have no unread articles in them.  The default is @code{t}.
2460
2461
2462 @node Topic Commands
2463 @subsection Topic Commands
2464 @cindex topic commands
2465
2466 When the topic minor mode is turned on, a new @kbd{T} submap will be
2467 available.  In addition, a few of the standard keys change their
2468 definitions slightly.
2469
2470 @table @kbd
2471
2472 @item T n
2473 @kindex T n (Topic)
2474 @findex gnus-topic-create-topic
2475 Prompt for a new topic name and create it 
2476 (@code{gnus-topic-create-topic}). 
2477
2478 @item T m
2479 @kindex T m (Topic)
2480 @findex gnus-topic-move-group
2481 Move the current group to some other topic
2482 (@code{gnus-topic-move-group}).  This command uses the process/prefix
2483 convention (@pxref{Process/Prefix}).
2484
2485 @item T c
2486 @kindex T c (Topic)
2487 @findex gnus-topic-copy-group
2488 Copy the current group to some other topic
2489 (@code{gnus-topic-copy-group}).  This command uses the process/prefix
2490 convention (@pxref{Process/Prefix}).
2491
2492 @item T D
2493 @kindex T D (Topic)
2494 @findex gnus-topic-remove-group
2495 Remove a group from the current topic (@code{gnus-topic-remove-group}).
2496 This command uses the process/prefix convention
2497 (@pxref{Process/Prefix}).
2498
2499 @item T M
2500 @kindex T M (Topic)
2501 @findex gnus-topic-move-matching
2502 Move all groups that match some regular expression to a topic
2503 (@code{gnus-topic-move-matching}). 
2504
2505 @item T C
2506 @kindex T C (Topic)
2507 @findex gnus-topic-copy-matching
2508 Copy all groups that match some regular expression to a topic
2509 (@code{gnus-topic-copy-matching}). 
2510
2511 @item T #
2512 @kindex T # (Topic)
2513 @findex gnus-topic-mark-topic
2514 Mark all groups in the current topic with the process mark
2515 (@code{gnus-topic-mark-topic}). 
2516
2517 @item T M-#
2518 @kindex T M-# (Topic)
2519 @findex gnus-topic-unmark-topic
2520 Remove the process mark from all groups in the current topic
2521 (@code{gnus-topic-unmark-topic}). 
2522
2523 @item RET
2524 @kindex RET (Topic)
2525 @findex gnus-topic-select-group
2526 @itemx SPACE
2527 Either select a group or fold a topic (@code{gnus-topic-select-group}).
2528 When you perform this command on a group, you'll enter the group, as
2529 usual.  When done on a topic line, the topic will be folded (if it was
2530 visible) or unfolded (if it was folded already).  So it's basically a
2531 toggling command on topics.  In addition, if you give a numerical
2532 prefix, group on that level (and lower) will be displayed.
2533
2534 @item T TAB
2535 @kindex T TAB (Topic)
2536 @findex gnus-topic-indent
2537 ``Indent'' the current topic so that it becomes a sub-topic of the
2538 previous topic (@code{gnus-topic-indent}).  If given a prefix,
2539 ``un-indent'' the topic instead.
2540
2541 @item C-k
2542 @kindex C-k (Topic)
2543 @findex gnus-topic-kill-group
2544 Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
2545 topic will be removed along with the topic.
2546
2547 @item C-y
2548 @kindex C-y (Topic)
2549 @findex gnus-topic-yank-group
2550 Yank the previously killed group or topic
2551 (@code{gnus-topic-yank-group}).  Note that all topics will be yanked
2552 before all groups. 
2553
2554 @item T r
2555 @kindex T r (Topic)
2556 @findex gnus-topic-rename
2557 Rename a topic (@code{gnus-topic-rename}). 
2558
2559 @item T DEL
2560 @kindex T DEL (Topic)
2561 @findex gnus-topic-delete
2562 Delete an empty topic (@code{gnus-topic-delete}). 
2563
2564 @item A T
2565 @kindex A T (Topic)
2566 @findex gnus-topic-list-active
2567 List all groups that Gnus knows about in a topics-ified way
2568 (@code{gnus-topic-list-active}).
2569
2570 @item G p
2571 @kindex G p (Topic)
2572 @findex gnus-topic-edit-parameters
2573 @cindex group parameters
2574 @cindex topic parameters
2575 @cindex parameters
2576 Edit the topic parameters (@code{gnus-topic-edit-parameters}).
2577 @xref{Topic Parameters}.
2578
2579 @end table
2580
2581
2582 @node Topic Sorting
2583 @subsection Topic Sorting
2584 @cindex topic sorting
2585
2586 You can sort the groups in each topic individually with the following
2587 commands: 
2588
2589
2590 @table @kbd
2591 @item T S a
2592 @kindex T S a (Topic)
2593 @findex gnus-topic-sort-groups-by-alphabet
2594 Sort the current topic alphabetically by group name
2595 (@code{gnus-topic-sort-groups-by-alphabet}). 
2596
2597 @item T S u
2598 @kindex T S u (Topic)
2599 @findex gnus-topic-sort-groups-by-unread
2600 Sort the current topic by the number of unread articles
2601 (@code{gnus-topic-sort-groups-by-unread}).
2602
2603 @item T S l
2604 @kindex T S l (Topic)
2605 @findex gnus-topic-sort-groups-by-level
2606 Sort the current topic by group level
2607 (@code{gnus-topic-sort-groups-by-level}). 
2608
2609 @item T S v
2610 @kindex T S v (Topic)
2611 @findex gnus-topic-sort-groups-by-score
2612 Sort the current topic by group score
2613 (@code{gnus-topic-sort-groups-by-score}). 
2614
2615 @item T S r
2616 @kindex T S r (Topic)
2617 @findex gnus-topic-sort-groups-by-rank
2618 Sort the current topic by group rank
2619 (@code{gnus-topic-sort-groups-by-rank}). 
2620
2621 @item T S m
2622 @kindex T S m (Topic)
2623 @findex gnus-topic-sort-groups-by-method
2624 Sort the current topic alphabetically by backend name
2625 (@code{gnus-topic-sort-groups-by-method}). 
2626
2627 @end table
2628
2629 @xref{Sorting Groups} for more information about group sorting. 
2630
2631
2632 @node Topic Topology
2633 @subsection Topic Topology
2634 @cindex topic topology
2635 @cindex topology
2636
2637 So, let's have a look at an example group buffer:
2638
2639 @example
2640 Gnus
2641   Emacs -- I wuw it!
2642      3: comp.emacs
2643      2: alt.religion.emacs
2644     Naughty Emacs
2645      452: alt.sex.emacs
2646        0: comp.talk.emacs.recovery
2647   Misc
2648      8: comp.binaries.fractals
2649     13: comp.sources.unix
2650 @end example
2651
2652 So, here we have one top-level topic (@samp{Gnus}), two topics under
2653 that, and one sub-topic under one of the sub-topics.  (There is always
2654 just one (1) top-level topic).  This topology can be expressed as
2655 follows:
2656
2657 @lisp
2658 (("Gnus" visible)
2659  (("Emacs -- I wuw it!" visible) 
2660   (("Naughty Emacs" visible)))
2661  (("Misc" visible)))
2662 @end lisp
2663
2664 @vindex gnus-topic-topology
2665 This is in fact how the variable @code{gnus-topic-topology} would look
2666 for the display above.  That variable is saved in the @file{.newsrc.eld}
2667 file, and shouldn't be messed with manually---unless you really want
2668 to.  Since this variable is read from the @file{.newsrc.eld} file,
2669 setting it in any other startup files will have no effect.  
2670
2671 This topology shows what topics are sub-topics of what topics (right),
2672 and which topics are visible.  Two settings are currently
2673 allowed---@code{visible} and @code{invisible}.
2674
2675
2676 @node Topic Parameters
2677 @subsection Topic Parameters
2678 @cindex topic parameters
2679
2680 All groups in a topic will inherit group parameters from the parent (and
2681 ancestor) topic parameters.  All legal group parameters are legal topic
2682 parameters (@pxref{Group Parameters}).  
2683
2684 Group parameters (of course) override topic parameters, and topic
2685 parameters in sub-topics override topic parameters in super-topics.  You
2686 know.  Normal inheritance rules.  (@dfn{Rules} is here a noun, not a
2687 verb, although you may feel free to disagree with me here.)
2688
2689 @example
2690 Gnus
2691   Emacs
2692      3: comp.emacs
2693      2: alt.religion.emacs
2694    452: alt.sex.emacs
2695     Relief
2696      452: alt.sex.emacs
2697        0: comp.talk.emacs.recovery
2698   Misc
2699      8: comp.binaries.fractals
2700     13: comp.sources.unix
2701    452: alt.sex.emacs
2702 @end example
2703
2704 The @samp{Emacs} topic has the topic parameter @code{(score-file
2705 . "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
2706 @code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
2707 topic parameter @code{(score-file . "emacs.SCORE")}.  In addition,
2708 @samp{alt.religion.emacs} has the group parameter @code{(score-file
2709 . "religion.SCORE")}.
2710
2711 Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
2712 will get the @file{relief.SCORE} home score file.  If you enter the same
2713 group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
2714 score file.  If you enter the group @samp{alt.religion.emacs}, you'll
2715 get the @file{religion.SCORE} home score file.
2716
2717 This seems rather simple and self-evident, doesn't it?  Well, yes.  But
2718 there are some problems, especially with the @code{total-expiry}
2719 parameter.  Say you have a mail group in two topics; one with
2720 @code{total-expiry} and one without.  What happens when you do @kbd{M-x
2721 gnus-expire-all-expirable-groups}?  Gnus has no way of telling which one
2722 of these topics you mean to expire articles from, so anything may
2723 happen.  In fact, I hereby declare that it is @dfn{undefined} what
2724 happens.  You just have to be careful if you do stuff like that.
2725
2726
2727 @node Misc Group Stuff
2728 @section Misc Group Stuff
2729
2730 @menu
2731 * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
2732 * Group Information::     Information and help on groups and Gnus.
2733 * Group Timestamp::       Making Gnus keep track of when you last read a group.
2734 * File Commands::         Reading and writing the Gnus files.
2735 @end menu
2736
2737 @table @kbd
2738
2739 @item ^
2740 @kindex ^ (Group)
2741 @findex gnus-group-enter-server-mode
2742 Enter the server buffer (@code{gnus-group-enter-server-mode}).
2743 @xref{The Server Buffer}.
2744
2745 @item a
2746 @kindex a (Group)
2747 @findex gnus-group-post-news
2748 Post an article to a group (@code{gnus-group-post-news}).  The current
2749 group name will be used as the default.
2750
2751 @item m
2752 @kindex m (Group)
2753 @findex gnus-group-mail
2754 Mail a message somewhere (@code{gnus-group-mail}).
2755
2756 @end table
2757
2758 Variables for the group buffer:
2759
2760 @table @code
2761
2762 @item gnus-group-mode-hook
2763 @vindex gnus-group-mode-hook
2764 @code{gnus-group-mode-hook} is called after the group buffer has been
2765 created. 
2766
2767 @item gnus-group-prepare-hook
2768 @vindex gnus-group-prepare-hook
2769 @code{gnus-group-prepare-hook} is called after the group buffer is
2770 generated.  It may be used to modify the buffer in some strange,
2771 unnatural way.
2772
2773 @item gnus-permanently-visible-groups
2774 @vindex gnus-permanently-visible-groups
2775 Groups matching this regexp will always be listed in the group buffer,
2776 whether they are empty or not.
2777
2778 @end table
2779
2780
2781 @node Scanning New Messages
2782 @subsection Scanning New Messages
2783 @cindex new messages
2784 @cindex scanning new news
2785
2786 @table @kbd
2787
2788 @item g
2789 @kindex g (Group)
2790 @findex gnus-group-get-new-news
2791 Check the server(s) for new articles.  If the numerical prefix is used,
2792 this command will check only groups of level @var{arg} and lower
2793 (@code{gnus-group-get-new-news}).  If given a non-numerical prefix, this
2794 command will force a total rereading of the active file(s) from the
2795 backend(s).
2796
2797 @item M-g
2798 @kindex M-g (Group)
2799 @findex gnus-group-get-new-news-this-group
2800 @vindex gnus-goto-next-group-when-activating
2801 Check whether new articles have arrived in the current group
2802 (@code{gnus-group-get-new-news-this-group}).
2803 @code{gnus-goto-next-group-when-activating} says whether this command is
2804 to move point to the next group or not.  It is @code{t} by default.
2805
2806 @findex gnus-activate-all-groups
2807 @cindex activating groups
2808 @item C-c M-g
2809 @kindex C-c M-g (Group)
2810 Activate absolutely all groups (@code{gnus-activate-all-groups}). 
2811
2812 @item R
2813 @kindex R (Group)
2814 @cindex restarting
2815 @findex gnus-group-restart
2816 Restart Gnus (@code{gnus-group-restart}).
2817
2818 @end table
2819
2820 @vindex gnus-get-new-news-hook
2821 @code{gnus-get-new-news-hook} is run just before checking for new news. 
2822
2823 @vindex gnus-after-getting-new-news-hook
2824 @code{gnus-after-getting-new-news-hook} is run after checking for new
2825 news.
2826
2827
2828 @node Group Information
2829 @subsection Group Information
2830 @cindex group information
2831 @cindex information on groups
2832
2833 @table @kbd
2834
2835
2836 @item H f
2837 @kindex H f (Group)
2838 @itemx M-f
2839 @findex gnus-group-fetch-faq
2840 @vindex gnus-group-faq-directory
2841 @cindex FAQ
2842 @cindex ange-ftp
2843 Try to fetch the FAQ for the current group
2844 (@code{gnus-group-fetch-faq}).  Gnus will try to get the FAQ from
2845 @code{gnus-group-faq-directory}, which is usually a directory on a
2846 remote machine.  This variable can also be a list of directories.  In
2847 that case, giving a prefix to this command will allow you to choose
2848 between the various sites.  @code{ange-ftp} (or @code{efs}) will be used
2849 for fetching the file.
2850
2851 If fetching from the first site is unsuccessful, Gnus will attempt to go
2852 through @code{gnus-group-faq-directory} and try to open them one by one.
2853
2854 @item H d
2855 @itemx C-c C-d
2856 @kindex H d (Group)
2857 @kindex C-c C-d (Group)
2858 @cindex describing groups
2859 @cindex group description
2860 @findex gnus-group-describe-group
2861 Describe the current group (@code{gnus-group-describe-group}).  If given
2862 a prefix, force Gnus to re-read the description from the server.
2863
2864 @item M-d
2865 @kindex M-d (Group)
2866 @findex gnus-group-describe-all-groups
2867 Describe all groups (@code{gnus-group-describe-all-groups}).  If given a
2868 prefix, force Gnus to re-read the description file from the server.
2869
2870 @item V
2871 @kindex V (Group)
2872 @cindex version
2873 @findex gnus-version
2874 Display current Gnus version numbers (@code{gnus-version}).
2875
2876 @item ?
2877 @kindex ? (Group)
2878 @findex gnus-group-describe-briefly
2879 Give a very short help message (@code{gnus-group-describe-briefly}).
2880
2881 @item C-c C-i
2882 @kindex C-c C-i (Group)
2883 @cindex info
2884 @cindex manual
2885 @findex gnus-info-find-node
2886 Go to the Gnus info node (@code{gnus-info-find-node}).
2887 @end table
2888
2889
2890 @node Group Timestamp
2891 @subsection Group Timestamp
2892 @cindex timestamps
2893 @cindex group timestamps
2894
2895 It can be convenient to let Gnus keep track of when you last read a
2896 group.  To set the ball rolling, you should add
2897 @code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
2898
2899 @lisp
2900 (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
2901 @end lisp
2902
2903 After doing this, each time you enter a group, it'll be recorded.
2904
2905 This information can be displayed in various ways---the easiest is to
2906 use the @samp{%d} spec in the group line format:
2907
2908 @lisp
2909 (setq gnus-group-line-format 
2910       "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
2911 @end lisp
2912
2913 This will result in lines looking like:
2914
2915 @example
2916 *        0: mail.ding                                19961002T012943
2917          0: custom                                   19961002T012713
2918 @end example
2919
2920 As you can see, the date is displayed in compact ISO 8601 format.  This
2921 may be a bit too much, so to just display the date, you could say
2922 something like:
2923
2924 @lisp
2925 (setq gnus-group-line-format 
2926       "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
2927 @end lisp
2928
2929
2930 @node File Commands
2931 @subsection File Commands
2932 @cindex file commands
2933
2934 @table @kbd
2935
2936 @item r
2937 @kindex r (Group)
2938 @findex gnus-group-read-init-file
2939 @vindex gnus-init-file
2940 @cindex reading init file
2941 Re-read the init file (@code{gnus-init-file}, which defaults to
2942 @file{~/.gnus}) (@code{gnus-group-read-init-file}).
2943
2944 @item s
2945 @kindex s (Group)
2946 @findex gnus-group-save-newsrc
2947 @cindex saving .newsrc
2948 Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
2949 (@code{gnus-group-save-newsrc}).  If given a prefix, force saving the
2950 file(s) whether Gnus thinks it is necessary or not.
2951
2952 @c @item Z
2953 @c @kindex Z (Group)
2954 @c @findex gnus-group-clear-dribble
2955 @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
2956
2957 @end table
2958
2959
2960 @node The Summary Buffer
2961 @chapter The Summary Buffer
2962 @cindex summary buffer
2963
2964 A line for each article is displayed in the summary buffer.  You can
2965 move around, read articles, post articles and reply to articles.
2966
2967 The most common way to a summary buffer is to select a group from the
2968 group buffer (@pxref{Selecting a Group}).  
2969
2970 You can have as many summary buffers open as you wish.
2971
2972 @menu
2973 * Summary Buffer Format::       Deciding how the summary buffer is to look.
2974 * Summary Maneuvering::         Moving around the summary buffer.
2975 * Choosing Articles::           Reading articles.
2976 * Paging the Article::          Scrolling the current article.
2977 * Reply Followup and Post::     Posting articles.
2978 * Canceling and Superseding::   ``Whoops, I shouldn't have called him that.''
2979 * Marking Articles::            Marking articles as read, expirable, etc.
2980 * Limiting::                    You can limit the summary buffer.
2981 * Threading::                   How threads are made.
2982 * Sorting::                     How articles and threads are sorted.
2983 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
2984 * Article Caching::             You may store articles in a cache.
2985 * Persistent Articles::         Making articles expiry-resistant.
2986 * Article Backlog::             Having already read articles hang around.
2987 * Saving Articles::             Ways of customizing article saving.
2988 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
2989 * Article Treatment::           The article buffer can be mangled at will.
2990 * Summary Sorting::             Sorting the summary buffer in various ways.
2991 * Finding the Parent::          No child support? Get the parent.
2992 * Alternative Approaches::      Reading using non-default summaries.
2993 * Tree Display::                A more visual display of threads.
2994 * Mail Group Commands::         Some commands can only be used in mail groups.
2995 * Various Summary Stuff::       What didn't fit anywhere else.
2996 * Exiting the Summary Buffer::  Returning to the Group buffer.
2997 * Crosspost Handling::          How crossposted articles are dealt with.
2998 * Duplicate Suppression::       An alternative when crosspost handling fails.
2999 @end menu
3000
3001
3002 @node Summary Buffer Format
3003 @section Summary Buffer Format
3004 @cindex summary buffer format
3005
3006 @menu
3007 * Summary Buffer Lines::     You can specify how summary lines should look.
3008 * Summary Buffer Mode Line:: You can say how the mode line should look.
3009 * Summary Highlighting::     Making the summary buffer all pretty and nice.
3010 @end menu
3011
3012 @findex mail-extract-address-components
3013 @findex gnus-extract-address-components
3014 @vindex gnus-extract-address-components
3015 Gnus will use the value of the @code{gnus-extract-address-components}
3016 variable as a function for getting the name and address parts of a
3017 @code{From} header.  Two pre-defined function exist:
3018 @code{gnus-extract-address-components}, which is the default, quite
3019 fast, and too simplistic solution; and
3020 @code{mail-extract-address-components}, which works very nicely, but is
3021 slower.  The default function will return the wrong answer in 5% of the
3022 cases.  If this is unacceptable to you, use the other function instead.
3023
3024 @vindex gnus-summary-same-subject
3025 @code{gnus-summary-same-subject} is a string indicating that the current
3026 article has the same subject as the previous.  This string will be used
3027 with those specs that require it.  The default is @samp{}.
3028
3029
3030 @node Summary Buffer Lines
3031 @subsection Summary Buffer Lines
3032
3033 @vindex gnus-summary-line-format
3034 You can change the format of the lines in the summary buffer by changing
3035 the @code{gnus-summary-line-format} variable.  It works along the same
3036 lines a a normal @code{format} string, with some extensions
3037 (@pxref{Formatting Variables}).
3038
3039 The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
3040
3041 The following format specification characters are understood:
3042
3043 @table @samp
3044 @item N 
3045 Article number.
3046 @item S
3047 Subject string.
3048 @item s
3049 Subject if the article is the root or the previous article had a
3050 different subject, @code{gnus-summary-same-subject} otherwise.
3051 (@code{gnus-summary-same-subject} defaults to @samp{}.)
3052 @item F
3053 Full @code{From} header.
3054 @item n
3055 The name (from the @code{From} header).
3056 @item a
3057 The name (from the @code{From} header).  This differs from the @code{n}
3058 spec in that it uses the function designated by the
3059 @code{gnus-extract-address-components} variable, which is slower, but
3060 may be more thorough.
3061 @item A
3062 The address (from the @code{From} header).  This works the same way as
3063 the @code{a} spec.
3064 @item L
3065 Number of lines in the article.
3066 @item c
3067 Number of characters in the article.
3068 @item I
3069 Indentation based on thread level (@pxref{Customizing Threading}).
3070 @item T
3071 Nothing if the article is a root and lots of spaces if it isn't (it
3072 pushes everything after it off the screen).
3073 @item [
3074 Opening bracket, which is normally @samp{[}, but can also be @samp{<}
3075 for adopted articles (@pxref{Customizing Threading}).
3076 @item ]
3077 Closing bracket, which is normally @samp{]}, but can also be @samp{>}
3078 for adopted articles.
3079 @item >
3080 One space for each thread level.
3081 @item <
3082 Twenty minus thread level spaces.
3083 @item U
3084 Unread.
3085 @item R
3086 Replied.
3087 @item i
3088 Score as a number.
3089 @item z
3090 @vindex gnus-summary-zcore-fuzz
3091 Zcore, @samp{+} if above the default level and @samp{-} if below the
3092 default level.  If the difference between
3093 @code{gnus-summary-default-level} and the score is less than
3094 @code{gnus-summary-zcore-fuzz}, this spec will not be used.
3095 @item V
3096 Total thread score.
3097 @item x
3098 @code{Xref}.
3099 @item D
3100 @code{Date}.
3101 @item d
3102 The @code{Date} in @code{YY-MMM} format.
3103 @item o
3104 The @code{Date} in @code{YYYYMMDDTHHMMSS} format.
3105 @item M
3106 @code{Message-ID}.
3107 @item r
3108 @code{References}.
3109 @item t
3110 Number of articles in the current sub-thread.  Using this spec will slow
3111 down summary buffer generation somewhat.
3112 @item e
3113 An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
3114 article has any children.
3115 @item P
3116 The line number.
3117 @item u
3118 User defined specifier.  The next character in the format string should
3119 be a letter.  @sc{gnus} will call the function
3120 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
3121 following @samp{%u}.  The function will be passed the current header as
3122 argument.  The function should return a string, which will be inserted
3123 into the summary just like information from any other summary specifier.
3124 @end table
3125
3126 The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
3127 have to be handled with care.  For reasons of efficiency, Gnus will
3128 compute what column these characters will end up in, and ``hard-code''
3129 that.  This means that it is illegal to have these specs after a
3130 variable-length spec.  Well, you might not be arrested, but your summary
3131 buffer will look strange, which is bad enough.
3132
3133 The smart choice is to have these specs as far to the left as possible.
3134 (Isn't that the case with everything, though?  But I digress.)
3135
3136 This restriction may disappear in later versions of Gnus.
3137
3138
3139 @node Summary Buffer Mode Line
3140 @subsection Summary Buffer Mode Line
3141
3142 @vindex gnus-summary-mode-line-format
3143 You can also change the format of the summary mode bar.  Set
3144 @code{gnus-summary-mode-line-format} to whatever you like.  The default
3145 is @samp{Gnus: %%b [%A] %Z}.  
3146
3147 Here are the elements you can play with:
3148
3149 @table @samp
3150 @item G
3151 Group name.
3152 @item p
3153 Unprefixed group name.
3154 @item A
3155 Current article number.
3156 @item V
3157 Gnus version.
3158 @item U
3159 Number of unread articles in this group.
3160 @item e
3161 Number of unselected articles in this group.
3162 @item Z
3163 A string with the number of unread and unselected articles represented
3164 either as @samp{<%U(+%e) more>} if there are both unread and unselected
3165 articles, and just as @samp{<%U more>} if there are just unread articles
3166 and no unselected ones.
3167 @item g
3168 Shortish group name.  For instance, @samp{rec.arts.anime} will be
3169 shortened to @samp{r.a.anime}. 
3170 @item S
3171 Subject of the current article.
3172 @item u
3173 User-defined spec.
3174 @item s
3175 Name of the current score file.
3176 @item d
3177 Number of dormant articles.
3178 @item t
3179 Number of ticked articles.
3180 @item r
3181 Number of articles that have been marked as read in this session. 
3182 @item E
3183 Number of articles expunged by the score files.
3184 @end table
3185
3186
3187 @node Summary Highlighting
3188 @subsection Summary Highlighting
3189
3190 @table @code
3191
3192 @item gnus-visual-mark-article-hook
3193 @vindex gnus-visual-mark-article-hook
3194 This hook is run after selecting an article.  It is meant to be used for
3195 highlighting the article in some way.  It is not run if
3196 @code{gnus-visual} is @code{nil}.
3197
3198 @item gnus-summary-update-hook
3199 @vindex gnus-summary-update-hook
3200 This hook is called when a summary line is changed.  It is not run if
3201 @code{gnus-visual} is @code{nil}.
3202
3203 @item gnus-summary-selected-face
3204 @vindex gnus-summary-selected-face
3205 This is the face (or @dfn{font} as some people call it) that is used to
3206 highlight the current article in the summary buffer.
3207
3208 @item gnus-summary-highlight
3209 @vindex gnus-summary-highlight
3210 Summary lines are highlighted according to this variable, which is a
3211 list where the elements are on the format @var{(FORM . FACE)}.  If you
3212 would, for instance, like ticked articles to be italic and high-scored
3213 articles to be bold, you could set this variable to something like
3214 @lisp
3215 (((eq mark gnus-ticked-mark) . italic)
3216  ((> score default) . bold))
3217 @end lisp
3218 As you may have guessed, if @var{FORM} returns a non-@code{nil} value,
3219 @var{FACE} will be applied to the line.
3220 @end table
3221
3222
3223 @node Summary Maneuvering
3224 @section Summary Maneuvering
3225 @cindex summary movement
3226
3227 All the straight movement commands understand the numeric prefix and
3228 behave pretty much as you'd expect. 
3229
3230 None of these commands select articles.
3231
3232 @table @kbd
3233 @item G M-n
3234 @itemx M-n
3235 @kindex M-n (Summary)
3236 @kindex G M-n (Summary)
3237 @findex gnus-summary-next-unread-subject
3238 Go to the next summary line of an unread article
3239 (@code{gnus-summary-next-unread-subject}). 
3240
3241 @item G M-p
3242 @itemx M-p
3243 @kindex M-p (Summary)
3244 @kindex G M-p (Summary)
3245 @findex gnus-summary-prev-unread-subject
3246 Go to the previous summary line of an unread article
3247 (@code{gnus-summary-prev-unread-subject}). 
3248
3249 @item G j
3250 @itemx j
3251 @kindex j (Summary)
3252 @kindex G j (Summary)
3253 @findex gnus-summary-goto-article
3254 Ask for an article number and then go to that article
3255 (@code{gnus-summary-goto-article}). 
3256
3257 @item G g
3258 @kindex G g (Summary)
3259 @findex gnus-summary-goto-subject
3260 Ask for an article number and then go the summary line of that article
3261 without displaying the article (@code{gnus-summary-goto-subject}).
3262 @end table
3263
3264 If Gnus asks you to press a key to confirm going to the next group, you
3265 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
3266 buffer, searching for the next group to read without actually returning
3267 to the group buffer.
3268
3269 Variables related to summary movement:
3270
3271 @table @code
3272
3273 @vindex gnus-auto-select-next
3274 @item gnus-auto-select-next
3275 If you issue one of the movement commands (like @kbd{n}) and there are
3276 no more unread articles after the current one, Gnus will offer to go to
3277 the next group.  If this variable is @code{t} and the next group is
3278 empty, Gnus will exit summary mode and return to the group buffer.  If
3279 this variable is neither @code{t} nor @code{nil}, Gnus will select the
3280 next group, no matter whether it has any unread articles or not.  As a
3281 special case, if this variable is @code{quietly}, Gnus will select the
3282 next group without asking for confirmation.  If this variable is
3283 @code{almost-quietly}, the same will happen only if you are located on
3284 the last article in the group.  Finally, if this variable is
3285 @code{slightly-quietly}, the @kbd{Z n} command will go to the next group
3286 without confirmation.  Also @pxref{Group Levels}.
3287
3288 @item gnus-auto-select-same
3289 @vindex gnus-auto-select-same
3290 If non-@code{nil}, all the movement commands will try to go to the next
3291 article with the same subject as the current.  (@dfn{Same} here might
3292 mean @dfn{roughly equal}.  See @code{gnus-summary-gather-subject-limit}
3293 for details (@pxref{Customizing Threading}).)  This variable is not
3294 particularly useful if you use a threaded display.
3295
3296 @item gnus-summary-check-current
3297 @vindex gnus-summary-check-current
3298 If non-@code{nil}, all the ``unread'' movement commands will not proceed
3299 to the next (or previous) article if the current article is unread.
3300 Instead, they will choose the current article.
3301
3302 @item gnus-auto-center-summary
3303 @vindex gnus-auto-center-summary
3304 If non-@code{nil}, Gnus will keep the point in the summary buffer
3305 centered at all times.  This makes things quite tidy, but if you have a
3306 slow network connection, or simply do not like this un-Emacsism, you can
3307 set this variable to @code{nil} to get the normal Emacs scrolling
3308 action.  This will also inhibit horizontal re-centering of the summary
3309 buffer, which might make it more inconvenient to read extremely long
3310 threads.
3311
3312 @end table
3313
3314
3315 @node Choosing Articles
3316 @section Choosing Articles
3317 @cindex selecting articles
3318
3319 @menu
3320 * Choosing Commands::        Commands for choosing articles.
3321 * Choosing Variables::       Variables that influence these commands.
3322 @end menu
3323
3324
3325 @node Choosing Commands
3326 @subsection Choosing Commands
3327
3328 None of the following movement commands understand the numeric prefix,
3329 and they all select and display an article.
3330
3331 @table @kbd
3332 @item SPACE
3333 @kindex SPACE (Summary)
3334 @findex gnus-summary-next-page
3335 Select the current article, or, if that one's read already, the next
3336 unread article (@code{gnus-summary-next-page}).
3337
3338 @item G n
3339 @itemx n
3340 @kindex n (Summary)
3341 @kindex G n (Summary)
3342 @findex gnus-summary-next-unread-article
3343 Go to next unread article (@code{gnus-summary-next-unread-article}).
3344
3345 @item G p
3346 @itemx p
3347 @kindex p (Summary)
3348 @findex gnus-summary-prev-unread-article
3349 Go to previous unread article (@code{gnus-summary-prev-unread-article}).
3350
3351 @item G N
3352 @itemx N
3353 @kindex N (Summary)
3354 @kindex G N (Summary)
3355 @findex gnus-summary-next-article
3356 Go to the next article (@code{gnus-summary-next-article}).
3357
3358 @item G P
3359 @itemx P
3360 @kindex P (Summary)
3361 @kindex G P (Summary)
3362 @findex gnus-summary-prev-article
3363 Go to the previous article (@code{gnus-summary-prev-article}).
3364
3365 @item G C-n
3366 @kindex G C-n (Summary)
3367 @findex gnus-summary-next-same-subject
3368 Go to the next article with the same subject
3369 (@code{gnus-summary-next-same-subject}). 
3370
3371 @item G C-p
3372 @kindex G C-p (Summary)
3373 @findex gnus-summary-prev-same-subject
3374 Go to the previous article with the same subject
3375 (@code{gnus-summary-prev-same-subject}). 
3376
3377 @item G f
3378 @itemx .
3379 @kindex G f  (Summary)
3380 @kindex .  (Summary)
3381 @findex gnus-summary-first-unread-article
3382 Go to the first unread article
3383 (@code{gnus-summary-first-unread-article}).
3384
3385 @item G b
3386 @itemx ,
3387 @kindex G b (Summary)
3388 @kindex , (Summary)
3389 @findex gnus-summary-best-unread-article
3390 Go to the article with the highest score
3391 (@code{gnus-summary-best-unread-article}). 
3392
3393 @item G l
3394 @itemx l
3395 @kindex l (Summary)
3396 @kindex G l (Summary)
3397 @findex gnus-summary-goto-last-article
3398 Go to the previous article read (@code{gnus-summary-goto-last-article}).
3399
3400 @item G p
3401 @kindex G p (Summary)
3402 @findex gnus-summary-pop-article
3403 Pop an article off the summary history and go to this article
3404 (@code{gnus-summary-pop-article}).  This command differs from the
3405 command above in that you can pop as many previous articles off the
3406 history as you like.
3407 @end table
3408
3409
3410 @node Choosing Variables
3411 @subsection Choosing Variables
3412
3413 Some variables that are relevant for moving and selecting articles:
3414
3415 @table @code
3416 @item gnus-auto-extend-newsgroup
3417 @vindex gnus-auto-extend-newsgroup
3418 All the movement commands will try to go to the previous (or next)
3419 article, even if that article isn't displayed in the Summary buffer if
3420 this variable is non-@code{nil}.  Gnus will then fetch the article from
3421 the server and display it in the article buffer.
3422
3423 @item gnus-select-article-hook
3424 @vindex gnus-select-article-hook
3425 This hook is called whenever an article is selected.  By default it
3426 exposes any threads hidden under the selected article.
3427
3428 @item gnus-mark-article-hook
3429 @vindex gnus-mark-article-hook
3430 @findex gnus-summary-mark-unread-as-read
3431 @findex gnus-summary-mark-read-and-unread-as-read
3432 @findex gnus-unread-mark
3433 This hook is called whenever an article is selected.  It is intended to
3434 be used for marking articles as read.  The default value is
3435 @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
3436 mark of almost any article you read to @code{gnus-unread-mark}.  The
3437 only articles not affected by this function are ticked, dormant, and
3438 expirable articles.  If you'd instead like to just have unread articles
3439 marked as read, you can use @code{gnus-summary-mark-unread-as-read}
3440 instead.  It will leave marks like @code{gnus-low-score-mark},
3441 @code{gnus-del-mark} (and so on) alone.
3442
3443 @end table
3444
3445
3446 @node Paging the Article
3447 @section Scrolling the Article
3448 @cindex article scrolling
3449
3450 @table @kbd
3451
3452 @item SPACE
3453 @kindex SPACE (Summary)
3454 @findex gnus-summary-next-page
3455 Pressing @kbd{SPACE} will scroll the current article forward one page,
3456 or, if you have come to the end of the current article, will choose the
3457 next article (@code{gnus-summary-next-page}).
3458
3459 @item DEL
3460 @kindex DEL (Summary)
3461 @findex gnus-summary-prev-page
3462 Scroll the current article back one page (@code{gnus-summary-prev-page}). 
3463
3464 @item RET
3465 @kindex RET (Summary)
3466 @findex gnus-summary-scroll-up
3467 Scroll the current article one line forward
3468 (@code{gnus-summary-scroll-up}).
3469
3470 @item A g
3471 @itemx g
3472 @kindex A g (Summary)
3473 @kindex g (Summary)
3474 @findex gnus-summary-show-article
3475 (Re)fetch the current article (@code{gnus-summary-show-article}).  If
3476 given a prefix, fetch the current article, but don't run any of the
3477 article treatment functions.  This will give you a ``raw'' article, just
3478 the way it came from the server.
3479
3480 @item A <
3481 @itemx <
3482 @kindex < (Summary)
3483 @kindex A < (Summary)
3484 @findex gnus-summary-beginning-of-article
3485 Scroll to the beginning of the article
3486 (@code{gnus-summary-beginning-of-article}).
3487
3488 @item A >
3489 @itemx >
3490 @kindex > (Summary)
3491 @kindex A > (Summary)
3492 @findex gnus-summary-end-of-article
3493 Scroll to the end of the article (@code{gnus-summary-end-of-article}).
3494
3495 @item A s 
3496 @itemx s
3497 @kindex A s (Summary)
3498 @kindex s (Summary)
3499 @findex gnus-summary-isearch-article
3500 Perform an isearch in the article buffer
3501 (@code{gnus-summary-isearch-article}). 
3502
3503 @end table
3504
3505
3506 @node Reply Followup and Post
3507 @section Reply, Followup and Post
3508
3509 @menu
3510 * Summary Mail Commands::            Sending mail.
3511 * Summary Post Commands::            Sending news.
3512 @end menu
3513
3514
3515 @node Summary Mail Commands
3516 @subsection Summary Mail Commands
3517 @cindex mail
3518 @cindex composing mail
3519
3520 Commands for composing a mail message:
3521
3522 @table @kbd
3523
3524 @item S r
3525 @itemx r
3526 @kindex S r (Summary)
3527 @kindex r (Summary)
3528 @findex gnus-summary-reply
3529 Mail a reply to the author of the current article
3530 (@code{gnus-summary-reply}). 
3531
3532 @item S R
3533 @itemx R
3534 @kindex R (Summary)
3535 @kindex S R (Summary)
3536 @findex gnus-summary-reply-with-original
3537 Mail a reply to the author of the current article and include the
3538 original message (@code{gnus-summary-reply-with-original}).  This
3539 command uses the process/prefix convention.
3540
3541 @item S o m
3542 @kindex S o m (Summary)
3543 @findex gnus-summary-mail-forward
3544 Forward the current article to some other person
3545 (@code{gnus-summary-mail-forward}).  If given a prefix, include the full
3546 headers of the forwarded article.
3547
3548 @item S m
3549 @itemx m
3550 @kindex m (Summary)
3551 @kindex S m (Summary)
3552 @findex gnus-summary-mail-other-window
3553 Send a mail to some other person
3554 (@code{gnus-summary-mail-other-window}).
3555
3556 @item S D b
3557 @kindex S D b (Summary)
3558 @findex gnus-summary-resend-bounced-mail
3559 @cindex bouncing mail
3560 If you have sent a mail, but the mail was bounced back to you for some
3561 reason (wrong address, transient failure), you can use this command to
3562 resend that bounced mail (@code{gnus-summary-resend-bounced-mail}).  You
3563 will be popped into a mail buffer where you can edit the headers before
3564 sending the mail off again.  If you give a prefix to this command, and
3565 the bounced mail is a reply to some other mail, Gnus will try to fetch
3566 that mail and display it for easy perusal of its headers.  This might
3567 very well fail, though.
3568
3569 @item S D r
3570 @kindex S D r (Summary)
3571 @findex gnus-summary-resend-message
3572 Not to be confused with the previous command,
3573 @code{gnus-summary-resend-message} will prompt you for an address to
3574 send the current message off to, and then send it to that place.  The
3575 headers of the message won't be altered---but lots of headers that say
3576 @code{Resent-To}, @code{Resent-From} and so on will be added.  This
3577 means that you actually send a mail to someone that has a @code{To}
3578 header that (probably) points to yourself.  This will confuse people.
3579 So, natcherly you'll only do that if you're really eVIl.  
3580
3581 This command is mainly used if you have several accounts and want to
3582 ship a mail to a different account of yours.  (If you're both
3583 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
3584 to the @code{root} account, you may want to resend it to
3585 @code{postmaster}.  Ordnung muß sein!
3586
3587 @item S O m
3588 @kindex S O m (Summary)
3589 @findex gnus-uu-digest-mail-forward
3590 Digest the current series and forward the result using mail
3591 (@code{gnus-uu-digest-mail-forward}).  This command uses the
3592 process/prefix convention (@pxref{Process/Prefix}). 
3593
3594 @item S M-c
3595 @kindex S M-c (Summary)
3596 @findex gnus-summary-mail-crosspost-complaint
3597 @cindex crossposting
3598 @cindex excessive crossposting
3599 Send a complaint about excessive crossposting to the author of the
3600 current article (@code{gnus-summary-mail-crosspost-complaint}).  
3601
3602 @findex gnus-crosspost-complaint
3603 This command is provided as a way to fight back agains the current
3604 crossposting pandemic that's sweeping Usenet.  It will compose a reply
3605 using the @code{gnus-crosspost-complaint} variable as a preamble.  This
3606 command understands the process/prefix convention
3607 (@pxref{Process/Prefix}) and will prompt you before sending each mail.
3608
3609 @end table
3610
3611
3612 @node Summary Post Commands
3613 @subsection Summary Post Commands
3614 @cindex post
3615 @cindex composing news
3616
3617 Commands for posting a news article:
3618
3619 @table @kbd
3620 @item S p
3621 @itemx a
3622 @kindex a (Summary)
3623 @kindex S p (Summary)
3624 @findex gnus-summary-post-news
3625 Post an article to the current group
3626 (@code{gnus-summary-post-news}).
3627
3628 @item S f
3629 @itemx f
3630 @kindex f (Summary)
3631 @kindex S f (Summary)
3632 @findex gnus-summary-followup
3633 Post a followup to the current article (@code{gnus-summary-followup}).
3634
3635 @item S F
3636 @itemx F
3637 @kindex S F (Summary)
3638 @kindex F (Summary)
3639 @findex gnus-summary-followup-with-original
3640 Post a followup to the current article and include the original message
3641 (@code{gnus-summary-followup-with-original}).   This command uses the
3642 process/prefix convention.
3643
3644 @item S n
3645 @kindex S n (Summary)
3646 @findex gnus-summary-followup-to-mail
3647 Post a followup to the current article via news, even if you got the
3648 message through mail (@code{gnus-summary-followup-to-mail}).
3649
3650 @item S n
3651 @kindex S n (Summary)
3652 @findex gnus-summary-followup-to-mail
3653 Post a followup to the current article via news, even if you got the
3654 message through mail and include the original message
3655 (@code{gnus-summary-followup-to-mail-with-original}).  This command uses
3656 the process/prefix convention.
3657
3658 @item S o p
3659 @kindex S o p (Summary)
3660 @findex gnus-summary-post-forward
3661 Forward the current article to a newsgroup
3662 (@code{gnus-summary-post-forward}).  If given a prefix, include the full
3663 headers of the forwarded article.
3664
3665 @item S O p
3666 @kindex S O p (Summary)
3667 @findex gnus-uu-digest-post-forward
3668 Digest the current series and forward the result to a newsgroup
3669 (@code{gnus-uu-digest-mail-forward}).  
3670
3671 @item S u
3672 @kindex S u (Summary)
3673 @findex gnus-uu-post-news
3674 Uuencode a file, split it into parts, and post it as a series
3675 (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}). 
3676 @end table
3677
3678
3679 @node Canceling and Superseding
3680 @section Canceling Articles
3681 @cindex canceling articles
3682 @cindex superseding articles
3683
3684 Have you ever written something, and then decided that you really,
3685 really, really wish you hadn't posted that?
3686
3687 Well, you can't cancel mail, but you can cancel posts.
3688
3689 @findex gnus-summary-cancel-article
3690 @kindex C (Summary)
3691 Find the article you wish to cancel (you can only cancel your own
3692 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
3693 c} (@code{gnus-summary-cancel-article}).  Your article will be
3694 canceled---machines all over the world will be deleting your article. 
3695
3696 Be aware, however, that not all sites honor cancels, so your article may
3697 live on here and there, while most sites will delete the article in
3698 question.
3699
3700 If you discover that you have made some mistakes and want to do some
3701 corrections, you can post a @dfn{superseding} article that will replace
3702 your original article.
3703
3704 @findex gnus-summary-supersede-article
3705 @kindex S (Summary)
3706 Go to the original article and press @kbd{S s}
3707 (@code{gnus-summary-supersede-article}).  You will be put in a buffer
3708 where you can edit the article all you want before sending it off the
3709 usual way.
3710
3711 The same goes for superseding as for canceling, only more so: Some
3712 sites do not honor superseding.  On those sites, it will appear that you
3713 have posted almost the same article twice.
3714
3715 If you have just posted the article, and change your mind right away,
3716 there is a trick you can use to cancel/supersede the article without
3717 waiting for the article to appear on your site first.  You simply return
3718 to the post buffer (which is called @code{*post-buf*}).  There you will
3719 find the article you just posted, with all the headers intact.  Change
3720 the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
3721 header by substituting one of those words for the word
3722 @code{Message-ID}.  Then just press @kbd{C-c C-c} to send the article as
3723 you would do normally.  The previous article will be
3724 canceled/superseded.
3725
3726 Just remember, kids: There is no 'c' in 'supersede'.
3727
3728
3729 @node Marking Articles
3730 @section Marking Articles
3731 @cindex article marking
3732 @cindex article ticking
3733 @cindex marks
3734
3735 There are several marks you can set on an article. 
3736
3737 You have marks that decide the @dfn{readedness} (whoo, neato-keano
3738 neologism ohoy!) of the article.  Alphabetic marks generally mean
3739 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
3740
3741 In addition, you also have marks that do not affect readedness.
3742
3743 @menu
3744 * Unread Articles::      Marks for unread articles.
3745 * Read Articles::        Marks for read articles.
3746 * Other Marks::          Marks that do not affect readedness.
3747 @end menu
3748
3749 @ifinfo
3750 There's a plethora of commands for manipulating these marks:
3751 @end ifinfo
3752
3753 @menu
3754 * Setting Marks::           How to set and remove marks.
3755 * Setting Process Marks::   How to mark articles for later processing.
3756 @end menu
3757
3758
3759 @node Unread Articles
3760 @subsection Unread Articles
3761
3762 The following marks mark articles as (kinda) unread, in one form or
3763 other.
3764
3765 @table @samp
3766 @item !
3767 @vindex gnus-ticked-mark
3768 Marked as ticked (@code{gnus-ticked-mark}).
3769
3770 @dfn{Ticked articles} are articles that will remain visible always.  If
3771 you see an article that you find interesting, or you want to put off
3772 reading it, or replying to it, until sometime later, you'd typically
3773 tick it.  However, articles can be expired, so if you want to keep an
3774 article forever, you'll have to make it persistent (@pxref{Persistent
3775 Articles}).  
3776
3777 @item ?
3778 @vindex gnus-dormant-mark
3779 Marked as dormant (@code{gnus-dormant-mark}).  
3780
3781 @dfn{Dormant articles} will only appear in the summary buffer if there
3782 are followups to it.
3783
3784 @item SPACE
3785 @vindex gnus-unread-mark
3786 Markes as unread (@code{gnus-unread-mark}).
3787
3788 @dfn{Unread articles} are articles that haven't been read at all yet.
3789 @end table
3790
3791
3792 @node Read Articles
3793 @subsection Read Articles
3794 @cindex expirable mark
3795
3796 All the following marks mark articles as read.
3797
3798 @table @samp
3799
3800 @item r
3801 @vindex gnus-del-mark
3802 These are articles that the user has marked as read with the @kbd{d}
3803 command manually, more or less (@code{gnus-del-mark}).
3804
3805 @item R
3806 @vindex gnus-read-mark
3807 Articles that have actually been read (@code{gnus-read-mark}).
3808
3809 @item O
3810 @vindex gnus-ancient-mark
3811 Articles that were marked as read in previous sessions and are now
3812 @dfn{old} (@code{gnus-ancient-mark}).
3813
3814 @item K
3815 @vindex gnus-killed-mark
3816 Marked as killed (@code{gnus-killed-mark}).
3817
3818 @item X
3819 @vindex gnus-kill-file-mark
3820 Marked as killed by kill files (@code{gnus-kill-file-mark}).
3821
3822 @item Y
3823 @vindex gnus-low-score-mark
3824 Marked as read by having a too low score (@code{gnus-low-score-mark}).
3825
3826 @item C
3827 @vindex gnus-catchup-mark
3828 Marked as read by a catchup (@code{gnus-catchup-mark}).
3829
3830 @item G
3831 @vindex gnus-canceled-mark
3832 Canceled article (@code{gnus-canceled-mark})
3833
3834 @item F
3835 @vindex gnus-souped-mark
3836 @sc{SOUP}ed article (@code{gnus-souped-mark}).  @xref{SOUP}.
3837
3838 @item Q
3839 @vindex gnus-sparse-mark
3840 Sparsely reffed article (@code{gnus-sparse-mark}).  @xref{Customizing
3841 Threading}.
3842
3843 @item M
3844 @vindex gnus-duplicate-mark
3845 Article marked as read by duplicate suppression
3846 (@code{gnus-duplicated-mark}).  @xref{Duplicate Suppression}.
3847
3848 @end table
3849
3850 All these marks just mean that the article is marked as read, really.
3851 They are interpreted differently when doing adaptive scoring, though.
3852
3853 One more special mark, though:
3854
3855 @table @samp
3856 @item E
3857 @vindex gnus-expirable-mark
3858 Marked as expirable (@code{gnus-expirable-mark}).
3859
3860 Marking articles as @dfn{expirable} (or have them marked as such
3861 automatically) doesn't make much sense in normal groups---a user doesn't
3862 control the expiring of news articles, but in mail groups, for instance,
3863 articles that are marked as @dfn{expirable} can be deleted by Gnus at
3864 any time.
3865 @end table
3866
3867
3868 @node Other Marks
3869 @subsection Other Marks
3870 @cindex process mark
3871 @cindex bookmarks
3872
3873 There are some marks that have nothing to do with whether the article is
3874 read or not.
3875
3876 @itemize @bullet
3877
3878 @item 
3879 You can set a bookmark in the current article.  Say you are reading a
3880 long thesis on cats' urinary tracts, and have to go home for dinner
3881 before you've finished reading the thesis.  You can then set a bookmark
3882 in the article, and Gnus will jump to this bookmark the next time it
3883 encounters the article.  @xref{Setting Marks}
3884
3885 @item
3886 @vindex gnus-replied-mark
3887 All articles that you have replied to or made a followup to (i.e., have
3888 answered) will be marked with an @samp{A} in the second column
3889 (@code{gnus-replied-mark}).
3890
3891 @item 
3892 @vindex gnus-cached-mark
3893 Articles that are stored in the article cache will be marked with an
3894 @samp{*} in the second column (@code{gnus-cached-mark}).
3895
3896 @item 
3897 @vindex gnus-saved-mark
3898 Articles that are ``saved'' (in some manner or other; not necessarily
3899 religiously) are marked with an @samp{S} in the second column
3900 (@code{gnus-saved-mark}.
3901
3902 @item 
3903 @vindex gnus-not-empty-thread-mark
3904 @vindex gnus-empty-thread-mark
3905 It the @samp{%e} spec is used, the presence of threads or not will be
3906 marked with @code{gnus-not-empty-thread-mark} and
3907 @code{gnus-empty-thread-mark} in the third column, respectively.
3908
3909 @item 
3910 @vindex gnus-process-mark
3911 Finally we have the @dfn{process mark} (@code{gnus-process-mark}.  A
3912 variety of commands react to the presence of the process mark.  For
3913 instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
3914 all articles that have been marked with the process mark.  Articles
3915 marked with the process mark have a @samp{#} in the second column.
3916
3917 @end itemize
3918
3919 You might have noticed that most of these ``non-readedness'' marks
3920 appear in the second column by default.  So if you have a cached, saved,
3921 replied article that you have process-marked, what will that look like?
3922
3923 Nothing much.  The precedence rules go as follows: process -> cache ->
3924 replied -> saved.  So if the article is in the cache and is replied,
3925 you'll only see the cache mark and not the replied mark.
3926
3927
3928 @node Setting Marks
3929 @subsection Setting Marks
3930 @cindex setting marks
3931
3932 All the marking commands understand the numeric prefix.
3933
3934 @table @kbd
3935 @item M t
3936 @itemx !
3937 @kindex ! (Summary)
3938 @kindex M t (Summary)
3939 @findex gnus-summary-tick-article-forward
3940 Tick the current article (@code{gnus-summary-tick-article-forward}).
3941
3942 @item M ?
3943 @itemx ?
3944 @kindex ? (Summary)
3945 @kindex M ? (Summary)
3946 @findex gnus-summary-mark-as-dormant
3947 Mark the current article as dormant
3948 (@code{gnus-summary-mark-as-dormant}).
3949
3950 @item M d
3951 @itemx d
3952 @kindex M d (Summary)
3953 @kindex d (Summary)
3954 @findex gnus-summary-mark-as-read-forward
3955 Mark the current article as read
3956 (@code{gnus-summary-mark-as-read-forward}).
3957
3958 @item D
3959 @kindex D (Summary)
3960 @findex gnus-summary-mark-as-read-backward
3961 Mark the current article as read and move point to the previous line
3962 (@code{gnus-summary-mark-as-read-backward}).
3963
3964 @item M k
3965 @itemx k
3966 @kindex k (Summary)
3967 @kindex M k (Summary)
3968 @findex gnus-summary-kill-same-subject-and-select
3969 Mark all articles that have the same subject as the current one as read,
3970 and then select the next unread article
3971 (@code{gnus-summary-kill-same-subject-and-select}).
3972
3973 @item M K
3974 @itemx C-k
3975 @kindex M K (Summary)
3976 @kindex C-k (Summary)
3977 @findex gnus-summary-kill-same-subject
3978 Mark all articles that have the same subject as the current one as read
3979 (@code{gnus-summary-kill-same-subject}).  
3980
3981 @item M C
3982 @kindex M C (Summary)
3983 @findex gnus-summary-catchup
3984 Mark all unread articles as read (@code{gnus-summary-catchup}).
3985
3986 @item M C-c
3987 @kindex M C-c (Summary)
3988 @findex gnus-summary-catchup-all
3989 Mark all articles in the group as read---even the ticked and dormant
3990 articles (@code{gnus-summary-catchup-all}).
3991
3992 @item M H
3993 @kindex M H (Summary)
3994 @findex gnus-summary-catchup-to-here
3995 Catchup the current group to point
3996 (@code{gnus-summary-catchup-to-here}). 
3997
3998 @item C-w
3999 @kindex C-w (Summary)
4000 @findex gnus-summary-mark-region-as-read
4001 Mark all articles between point and mark as read
4002 (@code{gnus-summary-mark-region-as-read}). 
4003
4004 @item M V k
4005 @kindex M V k (Summary)
4006 @findex gnus-summary-kill-below
4007 Kill all articles with scores below the default score (or below the
4008 numeric prefix) (@code{gnus-summary-kill-below}).
4009
4010 @item M c
4011 @itemx M-u
4012 @kindex M c (Summary)
4013 @kindex M-u (Summary)
4014 @findex gnus-summary-clear-mark-forward
4015 Clear all readedness-marks from the current article
4016 (@code{gnus-summary-clear-mark-forward}).
4017
4018 @item M e
4019 @itemx E
4020 @kindex M e (Summary)
4021 @kindex E (Summary)
4022 @findex gnus-summary-mark-as-expirable
4023 Mark the current article as expirable
4024 (@code{gnus-summary-mark-as-expirable}).
4025
4026 @item M b
4027 @kindex M b (Summary)
4028 @findex gnus-summary-set-bookmark
4029 Set a bookmark in the current article
4030 (@code{gnus-summary-set-bookmark}).
4031
4032 @item M B
4033 @kindex M B (Summary)
4034 @findex gnus-summary-remove-bookmark
4035 Remove the bookmark from the current article
4036 (@code{gnus-summary-remove-bookmark}).
4037
4038 @item M V c
4039 @kindex M V c (Summary)
4040 @findex gnus-summary-clear-above
4041 Clear all marks from articles with scores over the default score (or
4042 over the numeric prefix) (@code{gnus-summary-clear-above}).
4043
4044 @item M V u
4045 @kindex M V u (Summary)
4046 @findex gnus-summary-tick-above
4047 Tick all articles with scores over the default score (or over the
4048 numeric prefix) (@code{gnus-summary-tick-above}).
4049
4050 @item M V m
4051 @kindex M V m (Summary)
4052 @findex gnus-summary-mark-above
4053 Prompt for a mark, and mark all articles with scores over the default
4054 score (or over the numeric prefix) with this mark
4055 (@code{gnus-summary-clear-above}).
4056 @end table
4057
4058 @vindex gnus-summary-goto-unread
4059 The @code{gnus-summary-goto-unread} variable controls what action should
4060 be taken after setting a mark.  If non-@code{nil}, point will move to
4061 the next/previous unread article.  If @code{nil}, point will just move
4062 one line up or down.  As a special case, if this variable is
4063 @code{never}, all the marking commands as well as other commands (like
4064 @kbd{SPACE}) will move to the next article, whether it is unread or not.
4065 The default is @code{t}.
4066
4067
4068 @node Setting Process Marks
4069 @subsection Setting Process Marks
4070 @cindex setting process marks
4071
4072 @table @kbd
4073
4074 @item M P p
4075 @itemx #
4076 @kindex # (Summary)
4077 @kindex M P p (Summary)
4078 @findex gnus-summary-mark-as-processable
4079 Mark the current article with the process mark
4080 (@code{gnus-summary-mark-as-processable}). 
4081 @findex gnus-summary-unmark-as-processable
4082
4083 @item M P u 
4084 @itemx M-#
4085 @kindex M P u (Summary)
4086 @kindex M-# (Summary)
4087 Remove the process mark, if any, from the current article
4088 (@code{gnus-summary-unmark-as-processable}).
4089
4090 @item M P U
4091 @kindex M P U (Summary)
4092 @findex gnus-summary-unmark-all-processable
4093 Remove the process mark from all articles
4094 (@code{gnus-summary-unmark-all-processable}). 
4095
4096 @item M P i
4097 @kindex M P i (Summary)
4098 @findex gnus-uu-invert-processable
4099 Invert the list of process marked articles
4100 (@code{gnus-uu-invert-processable}). 
4101
4102 @item M P R
4103 @kindex M P R (Summary)
4104 @findex gnus-uu-mark-by-regexp
4105 Mark articles by a regular expression (@code{gnus-uu-mark-by-regexp}). 
4106
4107 @item M P r
4108 @kindex M P r (Summary)
4109 @findex gnus-uu-mark-region
4110 Mark articles in region (@code{gnus-uu-mark-region}).
4111
4112 @item M P t
4113 @kindex M P t (Summary)
4114 @findex gnus-uu-mark-thread
4115 Mark all articles in the current (sub)thread
4116 (@code{gnus-uu-mark-thread}).
4117
4118 @item M P T
4119 @kindex M P T (Summary)
4120 @findex gnus-uu-unmark-thread
4121 Unmark all articles in the current (sub)thread
4122 (@code{gnus-uu-unmark-thread}).
4123
4124 @item M P v
4125 @kindex M P v (Summary)
4126 @findex gnus-uu-mark-over
4127 Mark all articles that have a score above the prefix argument
4128 (@code{gnus-uu-mark-over}).
4129
4130 @item M P s
4131 @kindex M P s (Summary)
4132 @findex gnus-uu-mark-series
4133 Mark all articles in the current series (@code{gnus-uu-mark-series}).
4134
4135 @item M P S
4136 @kindex M P S (Summary)
4137 @findex gnus-uu-mark-sparse
4138 Mark all series that have already had some articles marked
4139 (@code{gnus-uu-mark-sparse}).
4140
4141 @item M P a
4142 @kindex M P a (Summary)
4143 @findex gnus-uu-mark-all
4144 Mark all articles in series order (@code{gnus-uu-mark-series}).
4145
4146 @item M P b
4147 @kindex M P b (Summary)
4148 @findex gnus-uu-mark-buffer
4149 Mark all articles in the buffer in the order they appear
4150 (@code{gnus-uu-mark-buffer}). 
4151
4152 @item M P k
4153 @kindex M P k (Summary)
4154 @findex gnus-summary-kill-process-mark
4155 Push the current process mark set onto the stack and unmark all articles
4156 (@code{gnus-summary-kill-process-mark}).
4157
4158 @item M P y
4159 @kindex M P y (Summary)
4160 @findex gnus-summary-yank-process-mark
4161 Pop the previous process mark set from the stack and restore it
4162 (@code{gnus-summary-yank-process-mark}).
4163
4164 @item M P w
4165 @kindex M P w (Summary)
4166 @findex gnus-summary-save-process-mark
4167 Push the current process mark set onto the stack
4168 (@code{gnus-summary-save-process-mark}).
4169
4170 @end table
4171
4172
4173 @node Limiting
4174 @section Limiting
4175 @cindex limiting
4176
4177 It can be convenient to limit the summary buffer to just show some
4178 subset of the articles currently in the group.  The effect most limit
4179 commands have is to remove a few (or many) articles from the summary
4180 buffer. 
4181
4182 @table @kbd
4183
4184 @item / /
4185 @itemx / s
4186 @kindex / / (Summary)
4187 @findex gnus-summary-limit-to-subject
4188 Limit the summary buffer to articles that match some subject
4189 (@code{gnus-summary-limit-to-subject}). 
4190
4191 @item / a
4192 @kindex / a (Summary)
4193 @findex gnus-summary-limit-to-author
4194 Limit the summary buffer to articles that match some author
4195 (@code{gnus-summary-limit-to-author}).
4196
4197 @item / u
4198 @itemx x
4199 @kindex / u (Summary)
4200 @kindex x (Summary)
4201 @findex gnus-summary-limit-to-unread
4202 Limit the summary buffer to articles that are not marked as read
4203 (@code{gnus-summary-limit-to-unread}).  If given a prefix, limit the
4204 buffer to articles that are strictly unread.  This means that ticked and
4205 dormant articles will also be excluded.
4206
4207 @item / m
4208 @kindex / m (Summary)
4209 @findex gnus-summary-limit-to-marks
4210 Ask for a mark and then limit to all articles that have not been marked
4211 with that mark (@code{gnus-summary-limit-to-marks}).
4212
4213 @item / n
4214 @kindex / n (Summary)
4215 @findex gnus-summary-limit-to-articles
4216 Limit the summary buffer to the current article
4217 (@code{gnus-summary-limit-to-articles}).  Uses the process/prefix
4218 convention (@pxref{Process/Prefix}).
4219
4220 @item / w
4221 @kindex / w (Summary)
4222 @findex gnus-summary-pop-limit
4223 Pop the previous limit off the stack and restore it
4224 (@code{gnus-summary-pop-limit}).  If given a prefix, pop all limits off
4225 the stack.
4226
4227 @item / v
4228 @kindex / v (Summary)
4229 @findex gnus-summary-limit-to-score
4230 Limit the summary buffer to articles that have a score at or above some
4231 score (@code{gnus-summary-limit-to-score}).
4232
4233 @item / E
4234 @itemx M S
4235 @kindex M S (Summary)
4236 @kindex / E (Summary)
4237 @findex gnus-summary-limit-include-expunged
4238 Display all expunged articles
4239 (@code{gnus-summary-limit-include-expunged}). 
4240
4241 @item / D
4242 @kindex / D (Summary)
4243 @findex gnus-summary-limit-include-dormant
4244 Display all dormant articles (@code{gnus-summary-limit-include-dormant}).
4245
4246 @item / d
4247 @kindex / d (Summary)
4248 @findex gnus-summary-limit-exclude-dormant
4249 Hide all dormant articles (@code{gnus-summary-limit-exclude-dormant}).
4250
4251 @item / c
4252 @kindex / c (Summary)
4253 @findex gnus-summary-limit-exclude-childless-dormant
4254 Hide all dormant articles that have no children
4255 (@code{gnus-summary-limit-exclude-childless-dormant}). 
4256
4257 @item / C
4258 @kindex / C (Summary)
4259 @findex gnus-summary-limit-mark-excluded-as-read
4260 Mark all excluded unread articles as read
4261 (@code{gnus-summary-limit-mark-excluded-as-read}).   If given a prefix,
4262 also mark excluded ticked and dormant articles as read.
4263
4264 @end table
4265
4266
4267 @node Threading
4268 @section Threading
4269 @cindex threading
4270 @cindex article threading
4271
4272 Gnus threads articles by default.  @dfn{To thread} is to put replies to
4273 articles directly after the articles they reply to---in a hierarchical
4274 fashion.
4275
4276 @menu
4277 * Customizing Threading::     Variables you can change to affect the threading.
4278 * Thread Commands::           Thread based commands in the summary buffer.
4279 @end menu
4280
4281
4282 @node Customizing Threading
4283 @subsection Customizing Threading
4284 @cindex customizing threading
4285 @cindex <
4286 @cindex >
4287
4288 @table @code
4289
4290 @item gnus-show-threads
4291 @vindex gnus-show-threads
4292 If this variable is @code{nil}, no threading will be done, and all of
4293 the rest of the variables here will have no effect.  Turning threading
4294 off will speed group selection up a bit, but it is sure to make reading
4295 slower and more awkward.
4296
4297 @item gnus-fetch-old-headers
4298 @vindex gnus-fetch-old-headers
4299 If non-@code{nil}, Gnus will attempt to build old threads by fetching
4300 more old headers---headers to articles that are marked as read.  If you
4301 would like to display as few summary lines as possible, but still
4302 connect as many loose threads as possible, you should set this variable
4303 to @code{some} or a number.  If you set it to a number, no more than
4304 that number of extra old headers will be fetched.  In either case,
4305 fetching old headers only works if the backend you are using carries
4306 overview files---this would normally be @code{nntp}, @code{nnspool} and
4307 @code{nnml}.  Also remember that if the root of the thread has been
4308 expired by the server, there's not much Gnus can do about that.
4309
4310 @item gnus-build-sparse-threads
4311 @vindex gnus-build-sparse-threads
4312 Fetching old headers can be slow.  A low-rent similar effect can be
4313 gotten by setting this variable to @code{some}.  Gnus will then look at
4314 the complete @code{References} headers of all articles and try to string
4315 articles that belong in the same thread together.  This will leave
4316 @dfn{gaps} in the threading display where Gnus guesses that an article
4317 is missing from the thread.  (These gaps appear like normal summary
4318 lines.  If you select a gap, Gnus will try to fetch the article in
4319 question.)  If this variable is @code{t}, Gnus will display all these
4320 ``gaps'' without regard for whether they are useful for completing the
4321 thread or not.  Finally, if this variable is @code{more}, Gnus won't cut
4322 off sparse leaf nodes that don't lead anywhere.  This variable is
4323 @code{nil} by default.
4324
4325 @item gnus-summary-gather-subject-limit
4326 @vindex gnus-summary-gather-subject-limit
4327 Loose threads are gathered by comparing subjects of articles.  If this
4328 variable is @code{nil}, Gnus requires an exact match between the
4329 subjects of the loose threads before gathering them into one big
4330 super-thread.  This might be too strict a requirement, what with the
4331 presence of stupid newsreaders that chop off long subjects lines.  If
4332 you think so, set this variable to, say, 20 to require that only the
4333 first 20 characters of the subjects have to match.  If you set this
4334 variable to a really low number, you'll find that Gnus will gather
4335 everything in sight into one thread, which isn't very helpful.
4336
4337 @cindex fuzzy article gathering
4338 If you set this variable to the special value @code{fuzzy}, Gnus will
4339 use a fuzzy string comparison algorithm on the subjects.
4340
4341 @item gnus-simplify-subject-fuzzy-regexp
4342 @vindex gnus-simplify-subject-fuzzy-regexp
4343 This can either be a regular expression or list of regular expressions
4344 that match strings that will be removed from subjects if fuzzy subject
4345 simplification is used.
4346
4347 @item gnus-simplify-ignored-prefixes
4348 @vindex gnus-simplify-ignored-prefixes
4349 If you set @code{gnus-summary-gather-subject-limit} to something as low
4350 as 10, you might consider setting this variable to something sensible:
4351
4352 @c Written by Michael Ernst <mernst@cs.rice.edu>
4353 @lisp
4354 (setq gnus-simplify-ignored-prefixes
4355       (concat 
4356        "\\`\\[?\\("
4357        (mapconcat 
4358         'identity
4359         '("looking"
4360           "wanted" "followup" "summary\\( of\\)?"
4361           "help" "query" "problem" "question" 
4362           "answer" "reference" "announce"
4363           "How can I" "How to" "Comparison of"
4364           ;; ...
4365           )
4366         "\\|")
4367        "\\)\\s *\\("
4368        (mapconcat 'identity
4369                   '("for" "for reference" "with" "about")
4370                   "\\|")
4371        "\\)?\\]?:?[ \t]*"))
4372 @end lisp
4373
4374 All words that match this regexp will be removed before comparing two
4375 subjects. 
4376
4377 @item gnus-summary-gather-exclude-subject
4378 @vindex gnus-summary-gather-exclude-subject
4379 Since loose thread gathering is done on subjects only, that might lead
4380 to many false hits, especially with certain common subjects like
4381 @samp{} and @samp{(none)}.  To make the situation slightly better,
4382 you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
4383 what subjects should be excluded from the gathering process.  The
4384 default is @samp{^ *$\\|^(none)$}.  
4385
4386 @item gnus-summary-thread-gathering-function
4387 @vindex gnus-summary-thread-gathering-function
4388 Gnus gathers threads by looking at @code{Subject} headers.  This means
4389 that totally unrelated articles may end up in the same ``thread'', which
4390 is confusing.  An alternate approach is to look at all the
4391 @code{Message-ID}s in all the @code{References} headers to find matches.
4392 This will ensure that no gathered threads ever includes unrelated
4393 articles, but it's also means that people who have posted with broken
4394 newsreaders won't be gathered properly.  The choice is yours---plague or
4395 cholera:
4396
4397 @table @code
4398 @item gnus-gather-threads-by-subject
4399 @findex gnus-gather-threads-by-subject
4400 This function is the default gathering function and looks at
4401 @code{Subject}s exclusively.
4402
4403 @item gnus-gather-threads-by-references
4404 @findex gnus-gather-threads-by-references
4405 This function looks at @code{References} headers exclusively.
4406 @end table
4407
4408 If you want to test gathering by @code{References}, you could say
4409 something like:
4410
4411 @lisp
4412 (setq gnus-summary-thread-gathering-function
4413       'gnus-gather-threads-by-references)
4414 @end lisp
4415
4416 @item gnus-summary-make-false-root
4417 @vindex gnus-summary-make-false-root
4418 If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
4419 and create a dummy root at the top.  (Wait a minute.  Root at the top?
4420 Yup.)  Loose subtrees occur when the real root has expired, or you've
4421 read or killed the root in a previous session.
4422
4423 When there is no real root of a thread, Gnus will have to fudge
4424 something.  This variable says what fudging method Gnus should use.
4425 There are four possible values:
4426
4427 @cindex adopting articles
4428
4429 @table @code
4430
4431 @item adopt
4432 Gnus will make the first of the orphaned articles the parent.  This
4433 parent will adopt all the other articles.  The adopted articles will be
4434 marked as such by pointy brackets (@samp{<>}) instead of the standard
4435 square brackets (@samp{[]}).  This is the default method.
4436
4437 @item dummy
4438 @vindex gnus-summary-dummy-line-format
4439 Gnus will create a dummy summary line that will pretend to be the
4440 parent.  This dummy line does not correspond to any real article, so
4441 selecting it will just select the first real article after the dummy
4442 article.  @code{gnus-summary-dummy-line-format} is used to specify the
4443 format of the dummy roots.  It accepts only one format spec:  @samp{S},
4444 which is the subject of the article.  @xref{Formatting Variables}.
4445
4446 @item empty
4447 Gnus won't actually make any article the parent, but simply leave the
4448 subject field of all orphans except the first empty.  (Actually, it will
4449 use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
4450 Buffer Format}).)
4451
4452 @item none
4453 Don't make any article parent at all.  Just gather the threads and
4454 display them after one another.
4455
4456 @item nil
4457 Don't gather loose threads.
4458 @end table
4459
4460 @item gnus-thread-hide-subtree
4461 @vindex gnus-thread-hide-subtree
4462 If non-@code{nil}, all threads will be hidden when the summary buffer is
4463 generated.
4464
4465 @item gnus-thread-hide-killed
4466 @vindex gnus-thread-hide-killed
4467 if you kill a thread and this variable is non-@code{nil}, the subtree
4468 will be hidden.
4469
4470 @item gnus-thread-ignore-subject
4471 @vindex gnus-thread-ignore-subject
4472 Sometimes somebody changes the subject in the middle of a thread.  If
4473 this variable is non-@code{nil}, the subject change is ignored.  If it
4474 is @code{nil}, which is the default, a change in the subject will result
4475 in a new thread.
4476
4477 @item gnus-thread-indent-level
4478 @vindex gnus-thread-indent-level
4479 This is a number that says how much each sub-thread should be indented.
4480 The default is 4.
4481 @end table
4482
4483
4484 @node Thread Commands
4485 @subsection Thread Commands
4486 @cindex thread commands
4487
4488 @table @kbd
4489
4490 @item T k
4491 @itemx M-C-k
4492 @kindex T k (Summary)
4493 @kindex M-C-k (Summary)
4494 @findex gnus-summary-kill-thread
4495 Mark all articles in the current (sub-)thread as read
4496 (@code{gnus-summary-kill-thread}).  If the prefix argument is positive,
4497 remove all marks instead.  If the prefix argument is negative, tick
4498 articles instead.
4499
4500 @item T l
4501 @itemx M-C-l
4502 @kindex T l (Summary)
4503 @kindex M-C-l (Summary)
4504 @findex gnus-summary-lower-thread
4505 Lower the score of the current (sub-)thread
4506 (@code{gnus-summary-lower-thread}). 
4507
4508 @item T i
4509 @kindex T i (Summary)
4510 @findex gnus-summary-raise-thread
4511 Increase the score of the current (sub-)thread
4512 (@code{gnus-summary-raise-thread}).
4513
4514 @item T #
4515 @kindex T # (Summary)
4516 @findex gnus-uu-mark-thread
4517 Set the process mark on the current (sub-)thread
4518 (@code{gnus-uu-mark-thread}).
4519
4520 @item T M-#
4521 @kindex T M-# (Summary)
4522 @findex gnus-uu-unmark-thread
4523 Remove the process mark from the current (sub-)thread
4524 (@code{gnus-uu-unmark-thread}).
4525
4526 @item T T
4527 @kindex T T (Summary)
4528 @findex gnus-summary-toggle-threads
4529 Toggle threading (@code{gnus-summary-toggle-threads}).
4530
4531 @item T s
4532 @kindex T s (Summary)
4533 @findex gnus-summary-show-thread
4534 Expose the (sub-)thread hidden under the current article, if any
4535 (@code{gnus-summary-show-thread}).
4536
4537 @item T h
4538 @kindex T h (Summary)
4539 @findex gnus-summary-hide-thread
4540 Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
4541
4542 @item T S
4543 @kindex T S (Summary)
4544 @findex gnus-summary-show-all-threads
4545 Expose all hidden threads (@code{gnus-summary-show-all-threads}).
4546
4547 @item T H
4548 @kindex T H (Summary)
4549 @findex gnus-summary-hide-all-threads
4550 Hide all threads (@code{gnus-summary-hide-all-threads}).
4551
4552 @item T t
4553 @kindex T t (Summary)
4554 @findex gnus-summary-rethread-current
4555 Re-thread the thread the current article is part of
4556 (@code{gnus-summary-rethread-current}).  This works even when the
4557 summary buffer is otherwise unthreaded.
4558
4559 @item T ^
4560 @kindex T ^ (Summary)
4561 @findex gnus-summary-reparent-thread
4562 Make the current article the child of the marked (or previous) article
4563 (@code{gnus-summary-reparent-thread}.
4564
4565 @end table
4566
4567 The following commands are thread movement commands.  They all
4568 understand the numeric prefix.
4569
4570 @table @kbd
4571
4572 @item T n
4573 @kindex T n (Summary)
4574 @findex gnus-summary-next-thread
4575 Go to the next thread (@code{gnus-summary-next-thread}).
4576
4577 @item T p
4578 @kindex T p (Summary)
4579 @findex gnus-summary-prev-thread
4580 Go to the previous thread (@code{gnus-summary-prev-thread}).
4581
4582 @item T d
4583 @kindex T d (Summary)
4584 @findex gnus-summary-down-thread
4585 Descend the thread (@code{gnus-summary-down-thread}).
4586
4587 @item T u
4588 @kindex T u (Summary)
4589 @findex gnus-summary-up-thread
4590 Ascend the thread (@code{gnus-summary-up-thread}).
4591
4592 @item T o
4593 @kindex T o (Summary)
4594 @findex gnus-summary-top-thread
4595 Go to the top of the thread (@code{gnus-summary-top-thread}).
4596 @end table
4597
4598 @vindex gnus-thread-operation-ignore-subject 
4599 If you ignore subject while threading, you'll naturally end up with
4600 threads that have several different subjects in them.  If you then issue
4601 a command like `T k' (@code{gnus-summary-kill-thread}) you might not
4602 wish to kill the entire thread, but just those parts of the thread that
4603 have the same subject as the current article.  If you like this idea,
4604 you can fiddle with @code{gnus-thread-operation-ignore-subject}.  If is
4605 is non-@code{nil} (which it is by default), subjects will be ignored
4606 when doing thread commands.  If this variable is @code{nil}, articles in
4607 the same thread with different subjects will not be included in the
4608 operation in question.  If this variable is @code{fuzzy}, only articles
4609 that have subjects that are fuzzily equal will be included.
4610
4611
4612 @node Sorting
4613 @section Sorting
4614
4615 @findex gnus-thread-sort-by-total-score
4616 @findex gnus-thread-sort-by-date
4617 @findex gnus-thread-sort-by-score
4618 @findex gnus-thread-sort-by-subject
4619 @findex gnus-thread-sort-by-author
4620 @findex gnus-thread-sort-by-number
4621 @vindex gnus-thread-sort-functions
4622 If you are using a threaded summary display, you can sort the threads by
4623 setting @code{gnus-thread-sort-functions}, which is a list of functions.
4624 By default, sorting is done on article numbers.  Ready-made sorting
4625 predicate functions include @code{gnus-thread-sort-by-number},
4626 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
4627 @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and
4628 @code{gnus-thread-sort-by-total-score}.
4629
4630 Each function takes two threads and return non-@code{nil} if the first
4631 thread should be sorted before the other.  Note that sorting really is
4632 normally done by looking only at the roots of each thread.  If you use
4633 more than one function, the primary sort key should be the last function
4634 in the list.  You should probably always include
4635 @code{gnus-thread-sort-by-number} in the list of sorting
4636 functions---preferably first.  This will ensure that threads that are
4637 equal with respect to the other sort criteria will be displayed in
4638 ascending article order.
4639
4640 If you would like to sort by score, then by subject, and finally by
4641 number, you could do something like:
4642
4643 @lisp
4644 (setq gnus-thread-sort-functions 
4645       '(gnus-thread-sort-by-number
4646         gnus-thread-sort-by-subject
4647         gnus-thread-sort-by-score))
4648 @end lisp
4649
4650 The threads that have highest score will be displayed first in the
4651 summary buffer.  When threads have the same score, they will be sorted
4652 alphabetically.  The threads that have the same score and the same
4653 subject will be sorted by number, which is (normally) the sequence in
4654 which the articles arrived.
4655
4656 If you want to sort by score and then reverse arrival order, you could
4657 say something like:
4658
4659 @lisp
4660 (setq gnus-thread-sort-functions
4661       '((lambda (t1 t2) 
4662           (not (gnus-thread-sort-by-number t1 t2)))
4663         gnus-thread-sort-by-score))
4664 @end lisp
4665
4666 @vindex gnus-thread-score-function
4667 The function in the @code{gnus-thread-score-function} variable (default
4668 @code{+}) is used for calculating the total score of a thread.  Useful
4669 functions might be @code{max}, @code{min}, or squared means, or whatever
4670 tickles your fancy.
4671
4672 @findex gnus-article-sort-functions
4673 @findex gnus-article-sort-by-date
4674 @findex gnus-article-sort-by-score
4675 @findex gnus-article-sort-by-subject
4676 @findex gnus-article-sort-by-author
4677 @findex gnus-article-sort-by-number
4678 If you are using an unthreaded display for some strange reason or other,
4679 you have to fiddle with the @code{gnus-article-sort-functions} variable.
4680 It is very similar to the @code{gnus-thread-sort-functions}, except that
4681 is uses slightly different functions for article comparison.  Available
4682 sorting predicate functions are @code{gnus-article-sort-by-number},
4683 @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
4684 @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
4685
4686 If you want to sort an unthreaded summary display by subject, you could
4687 say something like:
4688
4689 @lisp
4690 (setq gnus-article-sort-functions 
4691       '(gnus-article-sort-by-number
4692         gnus-article-sort-by-subject))
4693 @end lisp
4694
4695
4696
4697 @node Asynchronous Fetching
4698 @section Asynchronous Article Fetching
4699 @cindex asynchronous article fetching
4700 @cindex article pre-fetch
4701 @cindex pre-fetch
4702
4703 If you read your news from an @sc{nntp} server that's far away, the
4704 network latencies may make reading articles a chore.  You have to wait
4705 for a while after pressing @kbd{n} to go to the next article before the
4706 article appears.  Why can't Gnus just go ahead and fetch the article
4707 while you are reading the previous one?  Why not, indeed.
4708
4709 First, some caveats.  There are some pitfalls to using asynchronous
4710 article fetching, especially the way Gnus does it.  
4711
4712 Let's say you are reading article 1, which is short, and article 2 is
4713 quite long, and you are not interested in reading that.  Gnus does not
4714 know this, so it goes ahead and fetches article 2.  You decide to read
4715 article 3, but since Gnus is in the process of fetching article 2, the
4716 connection is blocked.
4717
4718 To avoid these situations, Gnus will open two (count 'em two)
4719 connections to the server.  Some people may think this isn't a very nice
4720 thing to do, but I don't see any real alternatives.  Setting up that
4721 extra connection takes some time, so Gnus startup will be slower.
4722
4723 Gnus will fetch more articles than you will read.  This will mean that
4724 the link between your machine and the @sc{nntp} server will become more
4725 loaded than if you didn't use article pre-fetch.  The server itself will
4726 also become more loaded---both with the extra article requests, and the
4727 extra connection.
4728
4729 Ok, so now you know that you shouldn't really use this thing...  unless
4730 you really want to.
4731
4732 @vindex gnus-asynchronous
4733 Here's how:  Set @code{gnus-asynchronous} to @code{t}.  The rest should
4734 happen automatically.
4735
4736 @vindex gnus-use-article-prefetch
4737 You can control how many articles that are to be pre-fetched by setting
4738 @code{gnus-use-article-prefetch}.  This is 30 by default, which means
4739 that when you read an article in the group, the backend will pre-fetch
4740 the next 30 articles.  If this variable is @code{t}, the backend will
4741 pre-fetch all the articles that it can without bound.  If it is
4742 @code{nil}, no pre-fetching will be made.
4743
4744 @vindex gnus-async-prefetch-article-p
4745 @findex gnus-async-read-p
4746 There are probably some articles that you don't want to pre-fetch---read
4747 articles, for instance.  Which articles to pre-fetch is controlled by
4748 the @code{gnus-async-prefetch-article-p} variable.  This function should
4749 return non-@code{nil} when the article in question is to be
4750 pre-fetched.  The default is @code{gnus-async-read-p}, which returns
4751 @code{nil} on read articles.  The function is called with an article
4752 data structure as the only parameter.
4753
4754 If, for instance, you wish to pre-fetch only unread articles that are
4755 shorter than 100 lines, you could say something like:
4756
4757 @lisp
4758 (defun my-async-short-unread-p (data)
4759   "Return non-nil for short, unread articles."
4760   (and (gnus-data-unread-p data)
4761        (< (mail-header-lines (gnus-data-header data))
4762           100)))
4763
4764 (setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
4765 @end lisp
4766
4767 These functions will be called many, many times, so they should
4768 preferrably be short and sweet to avoid slowing down Gnus too much.
4769 It's also probably a good idea to byte-compile things like this.
4770
4771 @vindex gnus-prefetched-article-deletion-strategy
4772 Articles have to be removed from the asynch buffer sooner or later.  The
4773 @code{gnus-prefetched-article-deletion-strategy} says when to remove
4774 articles.  This is a list that may contain the following elements:
4775
4776 @table @code
4777 @item read
4778 Remove articles when they are read.
4779
4780 @item exit
4781 Remove articles when exiting the group.
4782 @end table
4783
4784 The default value is @code{(read exit)}.
4785
4786 @vindex gnus-use-header-prefetch
4787 If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
4788 from the next group.
4789
4790
4791 @node Article Caching
4792 @section Article Caching
4793 @cindex article caching
4794 @cindex caching
4795
4796 If you have an @emph{extremely} slow @sc{nntp} connection, you may
4797 consider turning article caching on.  Each article will then be stored
4798 locally under your home directory.  As you may surmise, this could
4799 potentially use @emph{huge} amounts of disk space, as well as eat up all
4800 your inodes so fast it will make your head swim.  In vodka.
4801
4802 Used carefully, though, it could be just an easier way to save articles.
4803
4804 @vindex gnus-use-long-file-name
4805 @vindex gnus-cache-directory
4806 @vindex gnus-use-cache
4807 To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
4808 all articles that are ticked or marked as dormant will then be copied
4809 over to your local cache (@code{gnus-cache-directory}).  Whether this
4810 cache is flat or hierarchal is controlled by the
4811 @code{gnus-use-long-file-name} variable, as usual.
4812
4813 When re-select a ticked or dormant article, it will be fetched from the
4814 cache instead of from the server.  As articles in your cache will never
4815 expire, this might serve as a method of saving articles while still
4816 keeping them where they belong.  Just mark all articles you want to save
4817 as dormant, and don't worry.
4818
4819 When an article is marked as read, is it removed from the cache.
4820
4821 @vindex gnus-cache-remove-articles
4822 @vindex gnus-cache-enter-articles
4823 The entering/removal of articles from the cache is controlled by the
4824 @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
4825 variables.  Both are lists of symbols.  The first is @code{(ticked
4826 dormant)} by default, meaning that ticked and dormant articles will be
4827 put in the cache.  The latter is @code{(read)} by default, meaning that
4828 articles that are marked as read are removed from the cache.  Possibly
4829 symbols in these two lists are @code{ticked}, @code{dormant},
4830 @code{unread} and @code{read}.
4831
4832 @findex gnus-jog-cache
4833 So where does the massive article-fetching and storing come into the
4834 picture?  The @code{gnus-jog-cache} command will go through all
4835 subscribed newsgroups, request all unread articles, and store them in
4836 the cache.  You should only ever, ever ever ever, use this command if 1)
4837 your connection to the @sc{nntp} server is really, really, really slow
4838 and 2) you have a really, really, really huge disk.  Seriously.
4839
4840 @vindex gnus-uncacheable-groups
4841 It is likely that you do not want caching on some groups.  For instance,
4842 if your @code{nnml} mail is located under your home directory, it makes no
4843 sense to cache it somewhere else under your home directory.  Unless you
4844 feel that it's neat to use twice as much space.  To limit the caching,
4845 you could set the @code{gnus-uncacheable-groups} regexp to
4846 @samp{^nnml}, for instance.  This variable is @code{nil} by
4847 default.
4848
4849 @findex gnus-cache-generate-nov-databases
4850 @findex gnus-cache-generate-active
4851 @vindex gnus-cache-active-file
4852 The cache stores information on what articles it contains in its active
4853 file (@code{gnus-cache-active-file}).  If this file (or any other parts
4854 of the cache) becomes all messed up for some reason or other, Gnus
4855 offers two functions that will try to set things right.  @kbd{M-x
4856 gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
4857 files, and @kbd{gnus-cache-generate-active} will (re)generate the active
4858 file.
4859
4860
4861 @node Persistent Articles
4862 @section Persistent Articles
4863 @cindex persistent articles
4864
4865 Closely related to article caching, we have @dfn{persistent articles}.
4866 In fact, it's just a different way of looking at caching, and much more
4867 useful in my opinion.
4868
4869 Say you're reading a newsgroup, and you happen on to some valuable gem
4870 that you want to keep and treasure forever.  You'd normally just save it
4871 (using one of the many saving commands) in some file.  The problem with
4872 that is that it's just, well, yucky.  Ideally you'd prefer just having
4873 the article remain in the group where you found it forever; untouched by
4874 the expiry going on at the news server.
4875
4876 This is what a @dfn{persistent article} is---an article that just won't
4877 be deleted.  It's implemented using the normal cache functions, but
4878 you use two explicit commands for managing persistent articles:
4879
4880 @table @kbd
4881
4882 @item *
4883 @kindex * (Summary)
4884 @findex gnus-cache-enter-article
4885 Make the current article persistent (@code{gnus-cache-enter-article}). 
4886
4887 @item M-*
4888 @kindex M-* (Summary)
4889 @findex gnus-cache-remove-article
4890 Remove the current article from the persistent articles
4891 (@code{gnus-cache-remove-article}).  This will normally delete the
4892 article. 
4893 @end table
4894
4895 Both these commands understand the process/prefix convention. 
4896
4897 To avoid having all ticked articles (and stuff) entered into the cache,
4898 you should set @code{gnus-use-cache} to @code{passive} if you're just
4899 interested in persistent articles:
4900
4901 @lisp
4902 (setq gnus-use-cache 'passive)
4903 @end lisp
4904
4905
4906 @node Article Backlog
4907 @section Article Backlog
4908 @cindex backlog
4909 @cindex article backlog
4910
4911 If you have a slow connection, but the idea of using caching seems
4912 unappealing to you (and it is, really), you can help the situation some
4913 by switching on the @dfn{backlog}.  This is where Gnus will buffer
4914 already read articles so that it doesn't have to re-fetch articles
4915 you've already read.  This only helps if you are in the habit of
4916 re-selecting articles you've recently read, of course.  If you never do
4917 that, turning the backlog on will slow Gnus down a little bit, and
4918 increase memory usage some.
4919
4920 @vindex gnus-keep-backlog
4921 If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
4922 at most @var{n} old articles in a buffer for later re-fetching.  If this
4923 variable is non-@code{nil} and is not a number, Gnus will store
4924 @emph{all} read articles, which means that your Emacs will grow without
4925 bound before exploding and taking your machine down with you.  I put
4926 that in there just to keep y'all on your toes.  
4927
4928 This variable is @code{nil} by default.
4929
4930
4931 @node Saving Articles
4932 @section Saving Articles
4933 @cindex saving articles
4934
4935 Gnus can save articles in a number of ways.  Below is the documentation
4936 for saving articles in a fairly straight-forward fashion (i.e., little
4937 processing of the article is done before it is saved).  For a different
4938 approach (uudecoding, unsharing) you should use @code{gnus-uu}
4939 (@pxref{Decoding Articles}).
4940
4941 @vindex gnus-save-all-headers
4942 If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
4943 unwanted headers before saving the article.
4944
4945 @vindex gnus-saved-headers
4946 If the preceding variable is @code{nil}, all headers that match the
4947 @code{gnus-saved-headers} regexp will be kept, while the rest will be
4948 deleted before saving.
4949
4950 @table @kbd
4951
4952 @item O o
4953 @itemx o
4954 @kindex O o (Summary)
4955 @kindex o (Summary)
4956 @findex gnus-summary-save-article
4957 Save the current article using the default article saver
4958 (@code{gnus-summary-save-article}). 
4959
4960 @item O m
4961 @kindex O m (Summary)
4962 @findex gnus-summary-save-article-mail
4963 Save the current article in mail format
4964 (@code{gnus-summary-save-article-mail}). 
4965
4966 @item O r
4967 @kindex O r (Summary)
4968 @findex gnus-summary-save-article-rmail
4969 Save the current article in rmail format
4970 (@code{gnus-summary-save-article-rmail}). 
4971
4972 @item O f
4973 @kindex O f (Summary)
4974 @findex gnus-summary-save-article-file
4975 Save the current article in plain file format
4976 (@code{gnus-summary-save-article-file}). 
4977
4978 @item O F
4979 @kindex O F (Summary)
4980 @findex gnus-summary-write-article-file
4981 Write the current article in plain file format, overwriting any previous
4982 file contents (@code{gnus-summary-write-article-file}). 
4983
4984 @item O b
4985 @kindex O b (Summary)
4986 @findex gnus-summary-save-article-body-file
4987 Save the current article body in plain file format
4988 (@code{gnus-summary-save-article-body-file}). 
4989
4990 @item O h
4991 @kindex O h (Summary)
4992 @findex gnus-summary-save-article-folder
4993 Save the current article in mh folder format
4994 (@code{gnus-summary-save-article-folder}). 
4995
4996 @item O v
4997 @kindex O v (Summary)
4998 @findex gnus-summary-save-article-vm
4999 Save the current article in a VM folder
5000 (@code{gnus-summary-save-article-vm}).
5001
5002 @item O p
5003 @kindex O p (Summary)
5004 @findex gnus-summary-pipe-output
5005 Save the current article in a pipe.  Uhm, like, what I mean is---Pipe
5006 the current article to a process (@code{gnus-summary-pipe-output}).
5007 @end table
5008
5009 @vindex gnus-prompt-before-saving
5010 All these commands use the process/prefix convention
5011 (@pxref{Process/Prefix}).  If you save bunches of articles using these
5012 functions, you might get tired of being prompted for files to save each
5013 and every article in.  The prompting action is controlled by
5014 the @code{gnus-prompt-before-saving} variable, which is @code{always} by
5015 default, giving you that excessive prompting action you know and
5016 loathe.  If you set this variable to @code{t} instead, you'll be prompted
5017 just once for each series of articles you save.  If you like to really
5018 have Gnus do all your thinking for you, you can even set this variable
5019 to @code{nil}, which means that you will never be prompted for files to
5020 save articles in.  Gnus will simply save all the articles in the default
5021 files. 
5022
5023
5024 @vindex gnus-default-article-saver
5025 You can customize the @code{gnus-default-article-saver} variable to make
5026 Gnus do what you want it to.  You can use any of the four ready-made
5027 functions below, or you can create your own.
5028
5029 @table @code
5030
5031 @item gnus-summary-save-in-rmail
5032 @findex gnus-summary-save-in-rmail
5033 @vindex gnus-rmail-save-name
5034 @findex gnus-plain-save-name
5035 This is the default format, @dfn{babyl}.  Uses the function in the
5036 @code{gnus-rmail-save-name} variable to get a file name to save the
5037 article in.  The default is @code{gnus-plain-save-name}.
5038
5039 @item gnus-summary-save-in-mail
5040 @findex gnus-summary-save-in-mail
5041 @vindex gnus-mail-save-name
5042 Save in a Unix mail (mbox) file.  Uses the function in the
5043 @code{gnus-mail-save-name} variable to get a file name to save the
5044 article in.  The default is @code{gnus-plain-save-name}.
5045
5046 @item gnus-summary-save-in-file
5047 @findex gnus-summary-save-in-file
5048 @vindex gnus-file-save-name
5049 @findex gnus-numeric-save-name
5050 Append the article straight to an ordinary file.  Uses the function in
5051 the @code{gnus-file-save-name} variable to get a file name to save the
5052 article in.  The default is @code{gnus-numeric-save-name}.
5053
5054 @item gnus-summary-save-body-in-file
5055 @findex gnus-summary-save-body-in-file
5056 Append the article body to an ordinary file.  Uses the function in the
5057 @code{gnus-file-save-name} variable to get a file name to save the
5058 article in.  The default is @code{gnus-numeric-save-name}.
5059
5060 @item gnus-summary-save-in-folder
5061 @findex gnus-summary-save-in-folder
5062 @findex gnus-folder-save-name
5063 @findex gnus-Folder-save-name
5064 @vindex gnus-folder-save-name
5065 @cindex rcvstore
5066 @cindex MH folders
5067 Save the article to an MH folder using @code{rcvstore} from the MH
5068 library.  Uses the function in the @code{gnus-folder-save-name} variable
5069 to get a file name to save the article in.  The default is
5070 @code{gnus-folder-save-name}, but you can also use
5071 @code{gnus-Folder-save-name}.  The former creates capitalized names, and
5072 the latter does not.
5073
5074 @item gnus-summary-save-in-vm
5075 @findex gnus-summary-save-in-vm
5076 Save the article in a VM folder.  You have to have the VM mail
5077 reader to use this setting.
5078 @end table
5079
5080 @vindex gnus-article-save-directory
5081 All of these functions, except for the last one, will save the article
5082 in the @code{gnus-article-save-directory}, which is initialized from the
5083 @code{SAVEDIR} environment variable.  This is @file{~/News/} by
5084 default. 
5085
5086 As you can see above, the functions use different functions to find a
5087 suitable name of a file to save the article in.  Below is a list of
5088 available functions that generate names:
5089
5090 @table @code
5091
5092 @item gnus-Numeric-save-name
5093 @findex gnus-Numeric-save-name
5094 File names like @file{~/News/Alt.andrea-dworkin/45}.
5095
5096 @item gnus-numeric-save-name
5097 @findex gnus-numeric-save-name
5098 File names like @file{~/News/alt.andrea-dworkin/45}.
5099
5100 @item gnus-Plain-save-name
5101 @findex gnus-Plain-save-name
5102 File names like @file{~/News/Alt.andrea-dworkin}.
5103
5104 @item gnus-plain-save-name
5105 @findex gnus-plain-save-name
5106 File names like @file{~/News/alt.andrea-dworkin}.
5107 @end table
5108
5109 @vindex gnus-split-methods
5110 You can have Gnus suggest where to save articles by plonking a regexp into
5111 the @code{gnus-split-methods} alist.  For instance, if you would like to
5112 save articles related to Gnus in the file @file{gnus-stuff}, and articles
5113 related to VM in @code{vm-stuff}, you could set this variable to something
5114 like:
5115
5116 @lisp
5117 (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
5118  ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
5119  (my-choosing-function "../other-dir/my-stuff")
5120  ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
5121 @end lisp
5122
5123 We see that this is a list where each element is a list that has two
5124 elements---the @dfn{match} and the @dfn{file}.  The match can either be
5125 a string (in which case it is used as a regexp to match on the article
5126 head); it can be a symbol (which will be called as a function with the
5127 group name as a parameter); or it can be a list (which will be
5128 @code{eval}ed).  If any of these actions have a non-@code{nil} result,
5129 the @dfn{file} will be used as a default prompt.  In addition, the
5130 result of the operation itself will be used if the function or form
5131 called returns a string or a list of strings.
5132
5133 You basically end up with a list of file names that might be used when
5134 saving the current article.  (All ``matches'' will be used.)  You will
5135 then be prompted for what you really want to use as a name, with file
5136 name completion over the results from applying this variable.
5137
5138 This variable is @code{((gnus-article-archive-name))} by default, which
5139 means that Gnus will look at the articles it saves for an
5140 @code{Archive-name} line and use that as a suggestion for the file
5141 name. 
5142
5143 @vindex gnus-use-long-file-name
5144 Finally, you have the @code{gnus-use-long-file-name} variable.  If it is
5145 @code{nil}, all the preceding functions will replace all periods
5146 (@samp{.}) in the group names with slashes (@samp{/})---which means that
5147 the functions will generate hierarchies of directories instead of having
5148 all the files in the toplevel directory
5149 (@file{~/News/alt/andrea-dworkin} instead of
5150 @file{~/News/alt.andrea-dworkin}.)  This variable is @code{t} by default
5151 on most systems.  However, for historical reasons, this is @code{nil} on
5152 Xenix and usg-unix-v machines by default.
5153
5154 This function also affects kill and score file names.  If this variable
5155 is a list, and the list contains the element @code{not-score}, long file
5156 names will not be used for score files, if it contains the element
5157 @code{not-save}, long file names will not be used for saving, and if it
5158 contains the element @code{not-kill}, long file names will not be used
5159 for kill files.
5160
5161 If you'd like to save articles in a hierarchy that looks something like
5162 a spool, you could
5163
5164 @lisp
5165 (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
5166 (setq gnus-default-article-save 'gnus-summary-save-in-file) ; no encoding
5167 @end lisp
5168
5169 Then just save with @kbd{o}.  You'd then read this hierarchy with
5170 ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
5171 the toplevel directory as the argument (@file{~/News/}).  Then just walk
5172 around to the groups/directories with @code{nneething}.
5173
5174
5175 @node Decoding Articles
5176 @section Decoding Articles
5177 @cindex decoding articles
5178
5179 Sometime users post articles (or series of articles) that have been
5180 encoded in some way or other.  Gnus can decode them for you.
5181
5182 @menu 
5183 * Uuencoded Articles::    Uudecode articles.
5184 * Shared Articles::       Unshar articles.
5185 * PostScript Files::      Split PostScript.
5186 * Decoding Variables::    Variables for a happy decoding.
5187 * Viewing Files::         You want to look at the result of the decoding?
5188 @end menu
5189
5190 All these functions use the process/prefix convention
5191 (@pxref{Process/Prefix}) for finding out what articles to work on, with
5192 the extension that a ``single article'' means ``a single series''.  Gnus
5193 can find out by itself what articles belong to a series, decode all the
5194 articles and unpack/view/save the resulting file(s).
5195
5196 Gnus guesses what articles are in the series according to the following
5197 simplish rule: The subjects must be (nearly) identical, except for the
5198 last two numbers of the line.  (Spaces are largely ignored, however.)
5199
5200 For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
5201 will find all the articles that match the regexp @samp{^cat.gif
5202 ([0-9]+/[0-9]+).*$}.  
5203
5204 Subjects that are nonstandard, like @samp{cat.gif (2/3) Part 6 of a
5205 series}, will not be properly recognized by any of the automatic viewing
5206 commands, and you have to mark the articles manually with @kbd{#}.
5207
5208
5209 @node Uuencoded Articles
5210 @subsection Uuencoded Articles
5211 @cindex uudecode
5212 @cindex uuencoded articles
5213
5214 @table @kbd
5215
5216 @item X u
5217 @kindex X u (Summary)
5218 @findex gnus-uu-decode-uu
5219 Uudecodes the current series (@code{gnus-uu-decode-uu}).
5220
5221 @item X U
5222 @kindex X U (Summary)
5223 @findex gnus-uu-decode-uu-and-save
5224 Uudecodes and saves the current series
5225 (@code{gnus-uu-decode-uu-and-save}).
5226
5227 @item X v u
5228 @kindex X v u (Summary)
5229 @findex gnus-uu-decode-uu-view
5230 Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
5231
5232 @item X v U
5233 @kindex X v U (Summary)
5234 @findex gnus-uu-decode-uu-and-save-view
5235 Uudecodes, views and saves the current series
5236 (@code{gnus-uu-decode-uu-and-save-view}). 
5237 @end table
5238
5239 Remember that these all react to the presence of articles marked with
5240 the process mark.  If, for instance, you'd like to decode and save an
5241 entire newsgroup, you'd typically do @kbd{M P a}
5242 (@code{gnus-uu-mark-all}) and then @kbd{X U}
5243 (@code{gnus-uu-decode-uu-and-save}).
5244
5245 All this is very much different from how @code{gnus-uu} worked with
5246 @sc{gnus 4.1}, where you had explicit keystrokes for everything under
5247 the sun.  This version of @code{gnus-uu} generally assumes that you mark
5248 articles in some way (@pxref{Setting Process Marks}) and then press
5249 @kbd{X u}.
5250
5251 @vindex gnus-uu-notify-files
5252 Note: When trying to decode articles that have names matching
5253 @code{gnus-uu-notify-files}, which is hard-coded to
5254 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
5255 automatically post an article on @samp{comp.unix.wizards} saying that
5256 you have just viewed the file in question.  This feature can't be turned
5257 off.
5258
5259
5260 @node Shared Articles
5261 @subsection Shared Articles
5262 @cindex unshar
5263 @cindex shared articles
5264
5265 @table @kbd
5266
5267 @item X s
5268 @kindex X s (Summary)
5269 @findex gnus-uu-decode-unshar
5270 Unshars the current series (@code{gnus-uu-decode-unshar}).
5271
5272 @item X S
5273 @kindex X S (Summary)
5274 @findex gnus-uu-decode-unshar-and-save
5275 Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
5276
5277 @item X v s
5278 @kindex X v s (Summary)
5279 @findex gnus-uu-decode-unshar-view
5280 Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
5281
5282 @item X v S
5283 @kindex X v S (Summary)
5284 @findex gnus-uu-decode-unshar-and-save-view
5285 Unshars, views and saves the current series
5286 (@code{gnus-uu-decode-unshar-and-save-view}). 
5287 @end table
5288
5289
5290 @node PostScript Files
5291 @subsection PostScript Files
5292 @cindex PostScript
5293
5294 @table @kbd
5295
5296 @item X p
5297 @kindex X p (Summary)
5298 @findex gnus-uu-decode-postscript
5299 Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
5300
5301 @item X P
5302 @kindex X P (Summary)
5303 @findex gnus-uu-decode-postscript-and-save
5304 Unpack and save the current PostScript series
5305 (@code{gnus-uu-decode-postscript-and-save}).
5306
5307 @item X v p
5308 @kindex X v p (Summary)
5309 @findex gnus-uu-decode-postscript-view
5310 View the current PostScript series
5311 (@code{gnus-uu-decode-postscript-view}).
5312
5313 @item X v P
5314 @kindex X v P (Summary)
5315 @findex gnus-uu-decode-postscript-and-save-view
5316 View and save the current PostScript series
5317 (@code{gnus-uu-decode-postscript-and-save-view}). 
5318 @end table
5319
5320
5321 @node Decoding Variables
5322 @subsection Decoding Variables
5323
5324 Adjective, not verb.
5325
5326 @menu 
5327 * Rule Variables::          Variables that say how a file is to be viewed.
5328 * Other Decode Variables::  Other decode variables.
5329 * Uuencoding and Posting::  Variables for customizing uuencoding.
5330 @end menu
5331
5332
5333 @node Rule Variables
5334 @subsubsection Rule Variables
5335 @cindex rule variables
5336
5337 Gnus uses @dfn{rule variables} to decide how to view a file.  All these
5338 variables are on the form
5339   
5340 @lisp
5341       (list '(regexp1 command2)
5342             '(regexp2 command2)
5343             ...)
5344 @end lisp
5345
5346 @table @code
5347
5348 @item gnus-uu-user-view-rules
5349 @vindex gnus-uu-user-view-rules
5350 @cindex sox
5351 This variable is consulted first when viewing files.  If you wish to use,
5352 for instance, @code{sox} to convert an @samp{.au} sound file, you could
5353 say something like:
5354 @lisp
5355 (setq gnus-uu-user-view-rules
5356       (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\")))
5357 @end lisp
5358
5359 @item gnus-uu-user-view-rules-end
5360 @vindex gnus-uu-user-view-rules-end
5361 This variable is consulted if Gnus couldn't make any matches from the
5362 user and default view rules.
5363
5364 @item gnus-uu-user-archive-rules
5365 @vindex gnus-uu-user-archive-rules
5366 This variable can be used to say what commands should be used to unpack
5367 archives.
5368 @end table
5369
5370
5371 @node Other Decode Variables
5372 @subsubsection Other Decode Variables
5373
5374 @table @code
5375 @vindex gnus-uu-grabbed-file-functions
5376
5377 @item gnus-uu-grabbed-file-functions
5378 All functions in this list will be called right each file has been
5379 successfully decoded---so that you can move or view files right away,
5380 and don't have to wait for all files to be decoded before you can do
5381 anything.  Ready-made functions you can put in this list are:
5382
5383 @table @code
5384
5385 @item gnus-uu-grab-view
5386 @findex gnus-uu-grab-view
5387 View the file.
5388
5389 @item gnus-uu-grab-move
5390 @findex gnus-uu-grab-move
5391 Move the file (if you're using a saving function.)
5392 @end table
5393
5394 @item gnus-uu-be-dangerous
5395 @vindex gnus-uu-be-dangerous
5396 Specifies what to do if unusual situations arise during decoding.  If
5397 @code{nil}, be as conservative as possible.  If @code{t}, ignore things
5398 that didn't work, and overwrite existing files.  Otherwise, ask each
5399 time.
5400
5401 @item gnus-uu-ignore-files-by-name
5402 @vindex gnus-uu-ignore-files-by-name
5403 Files with name matching this regular expression won't be viewed.
5404
5405 @item gnus-uu-ignore-files-by-type
5406 @vindex gnus-uu-ignore-files-by-type
5407 Files with a @sc{mime} type matching this variable won't be viewed.
5408 Note that Gnus tries to guess what type the file is based on the name.
5409 @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
5410 kludgey.
5411
5412 @item gnus-uu-tmp-dir
5413 @vindex gnus-uu-tmp-dir
5414 Where @code{gnus-uu} does its work.
5415
5416 @item gnus-uu-do-not-unpack-archives
5417 @vindex gnus-uu-do-not-unpack-archives
5418 Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
5419 looking for files to display.
5420
5421 @item gnus-uu-view-and-save
5422 @vindex gnus-uu-view-and-save
5423 Non-@code{nil} means that the user will always be asked to save a file
5424 after viewing it.
5425
5426 @item gnus-uu-ignore-default-view-rules
5427 @vindex gnus-uu-ignore-default-view-rules
5428 Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
5429 rules.
5430
5431 @item gnus-uu-ignore-default-archive-rules
5432 @vindex gnus-uu-ignore-default-archive-rules
5433 Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
5434 unpacking commands.
5435
5436 @item gnus-uu-kill-carriage-return
5437 @vindex gnus-uu-kill-carriage-return
5438 Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
5439 from articles.
5440
5441 @item gnus-uu-unmark-articles-not-decoded
5442 @vindex gnus-uu-unmark-articles-not-decoded
5443 Non-@code{nil} means that @code{gnus-uu} will mark articles that were
5444 unsuccessfully decoded as unread.
5445
5446 @item gnus-uu-correct-stripped-uucode
5447 @vindex gnus-uu-correct-stripped-uucode
5448 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
5449 uuencoded files that have had trailing spaces deleted.
5450
5451 @item gnus-uu-view-with-metamail
5452 @vindex gnus-uu-view-with-metamail
5453 @cindex metamail
5454 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
5455 commands defined by the rule variables and just fudge a @sc{mime}
5456 content type based on the file name.  The result will be fed to
5457 @code{metamail} for viewing.
5458
5459 @item gnus-uu-save-in-digest
5460 @vindex gnus-uu-save-in-digest
5461 Non-@code{nil} means that @code{gnus-uu}, when asked to save without
5462 decoding, will save in digests.  If this variable is @code{nil},
5463 @code{gnus-uu} will just save everything in a file without any
5464 embellishments.  The digesting almost conforms to RFC1153---no easy way
5465 to specify any meaningful volume and issue numbers were found, so I
5466 simply dropped them.
5467
5468 @end table
5469
5470
5471 @node Uuencoding and Posting
5472 @subsubsection Uuencoding and Posting
5473
5474 @table @code
5475
5476 @item gnus-uu-post-include-before-composing
5477 @vindex gnus-uu-post-include-before-composing
5478 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
5479 before you compose the article.  If this variable is @code{t}, you can
5480 either include an encoded file with @kbd{C-c C-i} or have one included
5481 for you when you post the article.
5482
5483 @item gnus-uu-post-length
5484 @vindex gnus-uu-post-length
5485 Maximum length of an article.  The encoded file will be split into how
5486 many articles it takes to post the entire file.
5487
5488 @item gnus-uu-post-threaded
5489 @vindex gnus-uu-post-threaded
5490 Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
5491 thread.  This may not be smart, as no other decoder I have seen are able
5492 to follow threads when collecting uuencoded articles.  (Well, I have
5493 seen one package that does that---@code{gnus-uu}, but somehow, I don't
5494 think that counts...) Default is @code{nil}.
5495
5496 @item gnus-uu-post-separate-description
5497 @vindex gnus-uu-post-separate-description
5498 Non-@code{nil} means that the description will be posted in a separate
5499 article.  The first article will typically be numbered (0/x).  If this
5500 variable is @code{nil}, the description the user enters will be included
5501 at the beginning of the first article, which will be numbered (1/x).
5502 Default is @code{t}.
5503
5504 @end table
5505
5506
5507 @node Viewing Files
5508 @subsection Viewing Files
5509 @cindex viewing files
5510 @cindex pseudo-articles
5511
5512 After decoding, if the file is some sort of archive, Gnus will attempt
5513 to unpack the archive and see if any of the files in the archive can be
5514 viewed.  For instance, if you have a gzipped tar file @file{pics.tar.gz}
5515 containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
5516 uncompress and de-tar the main file, and then view the two pictures.
5517 This unpacking process is recursive, so if the archive contains archives
5518 of archives, it'll all be unpacked.
5519
5520 Finally, Gnus will normally insert a @dfn{pseudo-article} for each
5521 extracted file into the summary buffer.  If you go to these
5522 ``articles'', you will be prompted for a command to run (usually Gnus
5523 will make a suggestion), and then the command will be run.
5524
5525 @vindex gnus-view-pseudo-asynchronously
5526 If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
5527 until the viewing is done before proceeding.
5528
5529 @vindex gnus-view-pseudos
5530 If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
5531 the pseudo-articles into the summary buffer, but view them
5532 immediately.  If this variable is @code{not-confirm}, the user won't even
5533 be asked for a confirmation before viewing is done.
5534
5535 @vindex gnus-view-pseudos-separately 
5536 If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
5537 pseudo-article will be created for each file to be viewed.  If
5538 @code{nil}, all files that use the same viewing command will be given as
5539 a list of parameters to that command.
5540
5541 @vindex gnus-insert-pseudo-articles
5542 If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
5543 pseudo-articles when decoding.  It is @code{t} by default.
5544
5545 So; there you are, reading your @emph{pseudo-articles} in your
5546 @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
5547 Why isn't anything real anymore? How did we get here?
5548
5549
5550 @node Article Treatment
5551 @section Article Treatment
5552
5553 Reading through this huge manual, you may have quite forgotten that the
5554 object of newsreaders are to actually, like, read what people have
5555 written.  Reading articles.  Unfortunately, people are quite bad at
5556 writing, so there are tons of functions and variables to make reading
5557 these articles easier.
5558
5559 @menu
5560 * Article Highlighting::    You want to make the article look like fruit salad.
5561 * Article Fontisizing::     Making emphasized text look niced.
5562 * Article Hiding::          You also want to make certain info go away.
5563 * Article Washing::         Lots of way-neat functions to make life better.
5564 * Article Buttons::         Click on URLs, Message-IDs, addresses and the like.
5565 * Article Date::            Grumble, UT!
5566 * Article Signature::       What is a signature?
5567 @end menu
5568
5569
5570 @node Article Highlighting
5571 @subsection Article Highlighting
5572 @cindex highlight
5573
5574 Not only do you want your article buffer to look like fruit salad, but
5575 you want it to look like technicolor fruit salad.
5576
5577 @table @kbd
5578
5579 @item W H a
5580 @kindex W H a (Summary)
5581 @findex gnus-article-highlight
5582 Highlight the current article (@code{gnus-article-highlight}).
5583
5584 @item W H h
5585 @kindex W H h (Summary)
5586 @findex gnus-article-highlight-headers
5587 @vindex gnus-header-face-alist
5588 Highlight the headers (@code{gnus-article-highlight-headers}).  The
5589 highlighting will be done according to the @code{gnus-header-face-alist}
5590 variable, which is a list where each element has the form @var{(regexp
5591 name content)}.  @var{regexp} is a regular expression for matching the
5592 header, @var{name} is the face used for highlighting the header name and
5593 @var{content} is the face for highlighting the header value.  The first
5594 match made will be used.  Note that @var{regexp} shouldn't have @samp{^}
5595 prepended---Gnus will add one.
5596
5597 @item W H c
5598 @kindex W H c (Summary)
5599 @findex gnus-article-highlight-citation
5600 Highlight cited text (@code{gnus-article-highlight-citation}). 
5601
5602 Some variables to customize the citation highlights:
5603
5604 @table @code
5605 @vindex gnus-cite-parse-max-size
5606
5607 @item gnus-cite-parse-max-size
5608 If the article size if bigger than this variable (which is 25000 by
5609 default), no citation highlighting will be performed.  
5610
5611 @item gnus-cite-prefix-regexp
5612 @vindex gnus-cite-prefix-regexp
5613 Regexp matching the longest possible citation prefix on a line. 
5614
5615 @item gnus-cite-max-prefix
5616 @vindex gnus-cite-max-prefix
5617 Maximum possible length for a citation prefix (default 20).
5618
5619 @item gnus-cite-face-list
5620 @vindex gnus-cite-face-list
5621 List of faces used for highlighting citations.  When there are citations
5622 from multiple articles in the same message, Gnus will try to give each
5623 citation from each article its own face.  This should make it easier to
5624 see who wrote what.
5625
5626 @item gnus-supercite-regexp
5627 @vindex gnus-supercite-regexp
5628 Regexp matching normal Supercite attribution lines.  
5629
5630 @item gnus-supercite-secondary-regexp
5631 @vindex gnus-supercite-secondary-regexp
5632 Regexp matching mangled Supercite attribution lines.
5633
5634 @item gnus-cite-minimum-match-count
5635 @vindex gnus-cite-minimum-match-count
5636 Minimum number of identical prefixes we have to see before we believe
5637 that it's a citation.
5638
5639 @item gnus-cite-attribution-prefix
5640 @vindex gnus-cite-attribution-prefix
5641 Regexp matching the beginning of an attribution line.
5642
5643 @item gnus-cite-attribution-suffix
5644 @vindex gnus-cite-attribution-suffix
5645 Regexp matching the end of an attribution line.
5646
5647 @item gnus-cite-attribution-face
5648 @vindex gnus-cite-attribution-face
5649 Face used for attribution lines.  It is merged with the face for the
5650 cited text belonging to the attribution.
5651
5652 @end table
5653
5654
5655 @item W H s
5656 @kindex W H s (Summary)
5657 @vindex gnus-signature-separator
5658 @vindex gnus-signature-face
5659 @findex gnus-article-highlight-signature
5660 Highlight the signature (@code{gnus-article-highlight-signature}).
5661 Everything after @code{gnus-signature-separator} (@pxref{Article
5662 Signature}) in an article will be considered a signature and will be
5663 highlighted with @code{gnus-signature-face}, which is @code{italic} by
5664 default.
5665
5666 @end table
5667
5668
5669 @node Article Fontisizing
5670 @subsection Article Fontisizing
5671 @cindex emphasis
5672 @cindex article emphasis
5673
5674 @findex gnus-article-emphasize
5675 @kindex W e (Summary)
5676 People commonly add emphasis to words in news articles by writing things
5677 like @samp{_this_} or @samp{*this*}.  Gnus can make this look nicer by
5678 running the article through the @kbd{W e}
5679 (@code{gnus-article-emphasize}) command.
5680
5681 @vindex gnus-article-emphasis
5682 How the emphasis is computed is controlled by the
5683 @code{gnus-article-emphasis} variable.  This is an alist where the first
5684 element is a regular expression to be matched.  The second is a number
5685 that says what regular expression grouping used to find the entire
5686 emphasized word.  The third is a number that says what regexp grouping
5687 should be displayed and highlighted.  (The text between these two
5688 groupings will be hidden.)  The fourth is the face used for
5689 highlighting.
5690
5691 @lisp
5692 (setq gnus-article-emphasis
5693       '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
5694         ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
5695 @end lisp
5696
5697 @vindex gnus-emphasis-underline
5698 @vindex gnus-emphasis-bold
5699 @vindex gnus-emphasis-italic
5700 @vindex gnus-emphasis-underline-bold
5701 @vindex gnus-emphasis-underline-italic
5702 @vindex gnus-emphasis-bold-italic
5703 @vindex gnus-emphasis-underline-bold-italic
5704 By default, there are seven rules, and they use the following faces:
5705 @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
5706 @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
5707 @code{gnus-emphasis-underline-italic},
5708 @code{gnus-emphasis-undeline-bold}, and
5709 @code{gnus-emphasis-underline-bold-italic}.  
5710
5711 If you want to change these faces, you can either use @kbd{M-x
5712 customize}, or you can use @code{copy-face}.  For instance, if you want
5713 to make @code{gnus-emphasis-italic} use a red face instead, you could
5714 say something like:
5715
5716 @lisp
5717 (copy-face 'red 'gnus-emphasis-italic)
5718 @end lisp
5719
5720
5721 @node Article Hiding
5722 @subsection Article Hiding
5723 @cindex article hiding
5724
5725 Or rather, hiding certain things in each article.  There usually is much
5726 too much cruft in most articles.  
5727
5728 @table @kbd
5729
5730 @item W W a
5731 @kindex W W a (Summary)
5732 @findex gnus-article-hide
5733 Do maximum hiding on the summary buffer (@kbd{gnus-article-hide}). 
5734
5735 @item W W h
5736 @kindex W W h (Summary)
5737 @findex gnus-article-hide-headers
5738 Hide headers (@code{gnus-article-hide-headers}).  @xref{Hiding
5739 Headers}. 
5740
5741 @item W W b
5742 @kindex W W b (Summary)
5743 @findex gnus-article-hide-boring-headers
5744 Hide headers that aren't particularly interesting
5745 (@code{gnus-article-hide-boring-headers}).  @xref{Hiding Headers}.
5746
5747 @item W W s
5748 @kindex W W s (Summary)
5749 @findex gnus-article-hide-signature
5750 Hide signature (@code{gnus-article-hide-signature}).  @xref{Article
5751 Signature}. 
5752
5753 @item W W p
5754 @kindex W W p (Summary)
5755 @findex gnus-article-hide-pgp
5756 Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). 
5757
5758 @item W W P
5759 @kindex W W P (Summary)
5760 @findex gnus-article-hide-pem
5761 Hide @sc{pem} (privacy enhanced messages) gruft
5762 (@code{gnus-article-hide-pem}).
5763
5764 @item W W c
5765 @kindex W W c (Summary)
5766 @findex gnus-article-hide-citation
5767 Hide citation (@code{gnus-article-hide-citation}).  Some variables for
5768 customizing the hiding:
5769
5770 @table @code
5771
5772 @item gnus-cite-hide-percentage
5773 @vindex gnus-cite-hide-percentage
5774 If the cited text is of a bigger percentage than this variable (default
5775 50), hide the cited text.
5776
5777 @item gnus-cite-hide-absolute
5778 @vindex gnus-cite-hide-absolute
5779 The cited text must be have at least this length (default 10) before it
5780 is hidden.
5781
5782 @item gnus-cited-text-button-line-format
5783 @vindex gnus-cited-text-button-line-format
5784 Gnus adds buttons show where the cited text has been hidden, and to
5785 allow toggle hiding the text.  The format of the variable is specified
5786 by this format-like variable (@pxref{Formatting Variables}).  These
5787 specs are legal:
5788
5789 @table @samp
5790 @item b
5791 Start point of the hidden text.
5792 @item e
5793 End point of the hidden text.
5794 @item l
5795 Length of the hidden text.
5796 @end table
5797
5798 @item gnus-cited-lines-visible
5799 @vindex gnus-cited-lines-visible
5800 The number of lines at the beginning of the cited text to leave shown. 
5801
5802 @end table
5803
5804 @item W W C
5805 @kindex W W C (Summary)
5806 @findex gnus-article-hide-citation-in-followups
5807 Hide cited text in articles that aren't roots
5808 (@code{gnus-article-hide-citation-in-followups}).  This isn't very
5809 useful as an interactive command, but might be a handy function to stick
5810 in @code{gnus-article-display-hook} (@pxref{Customizing Articles}). 
5811
5812 @end table
5813
5814 All these ``hiding'' commands are toggles, but if you give a negative
5815 prefix to these commands, they will show what they have previously
5816 hidden.  If you give a positive prefix, they will always hide.
5817
5818 Also @pxref{Article Highlighting} for further variables for
5819 citation customization.
5820
5821
5822 @node Article Washing
5823 @subsection Article Washing
5824 @cindex washing
5825 @cindex article washing
5826
5827 We call this ``article washing'' for a really good reason.  Namely, the
5828 @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
5829
5830 @dfn{Washing} is defined by us as ``changing something from something to
5831 something else'', but normally results in something looking better.
5832 Cleaner, perhaps.
5833
5834 @table @kbd
5835
5836 @item W l
5837 @kindex W l (Summary)
5838 @findex gnus-summary-stop-page-breaking
5839 Remove page breaks from the current article
5840 (@code{gnus-summary-stop-page-breaking}).
5841
5842 @item W r
5843 @kindex W r (Summary)
5844 @findex gnus-summary-caesar-message
5845 Do a Caesar rotate (rot13) on the article buffer
5846 (@code{gnus-summary-caesar-message}). 
5847
5848 @item W t
5849 @kindex W t (Summary)
5850 @findex gnus-summary-toggle-header
5851 Toggle whether to display all headers in the article buffer
5852 (@code{gnus-summary-toggle-header}). 
5853
5854 @item W v
5855 @kindex W v (Summary)
5856 @findex gnus-summary-verbose-header
5857 Toggle whether to display all headers in the article buffer permanently
5858 (@code{gnus-summary-verbose-header}).
5859
5860 @item W m
5861 @kindex W m (Summary)
5862 @findex gnus-summary-toggle-mime
5863 Toggle whether to run the article through @sc{mime} before displaying
5864 (@code{gnus-summary-toggle-mime}).
5865
5866 @item W o
5867 @kindex W o (Summary)
5868 @findex gnus-article-treat-overstrike
5869 Treat overstrike (@code{gnus-article-treat-overstrike}).
5870
5871 @item W w
5872 @kindex W w (Summary)
5873 @findex gnus-article-fill-cited-article
5874 Do word wrap (@code{gnus-article-fill-cited-article}).  If you use this
5875 function in @code{gnus-article-display-hook}, it should be run fairly
5876 late and certainly after any highlighting.
5877
5878 @item W c
5879 @kindex W c (Summary)
5880 @findex gnus-article-remove-cr
5881 Remove CR (@code{gnus-article-remove-cr}).
5882
5883 @item W q
5884 @kindex W q (Summary)
5885 @findex gnus-article-de-quoted-unreadable
5886 Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
5887
5888 @item W f
5889 @kindex W f (Summary)
5890 @cindex x-face
5891 @findex gnus-article-display-x-face
5892 @findex gnus-article-x-face-command
5893 @vindex gnus-article-x-face-command
5894 @vindex gnus-article-x-face-too-ugly
5895 Look for and display any X-Face headers
5896 (@code{gnus-article-display-x-face}).  The command executed by this
5897 function is given by the @code{gnus-article-x-face-command} variable.
5898 If this variable is a string, this string will be executed in a
5899 sub-shell.  If it is a function, this function will be called with the
5900 face as the argument.  If the @code{gnus-article-x-face-too-ugly} (which
5901 is a regexp) matches the @code{From} header, the face will not be shown.
5902 The default action under Emacs is to fork off an @code{xv} to view the
5903 face; under XEmacs the default action is to display the face before the
5904 @code{From} header.  (It's nicer if XEmacs has been compiled with X-Face
5905 support---that will make display somewhat faster.  If there's no native
5906 X-Face support, Gnus will try to convert the @code{X-Face} header using
5907 external programs from the @code{pbmplus} package and friends.)  If you
5908 want to have this function in the display hook, it should probably come
5909 last.
5910
5911 @item W b
5912 @kindex W b (Summary)
5913 @findex gnus-article-add-buttons
5914 Add clickable buttons to the article (@code{gnus-article-add-buttons}). 
5915
5916 @item W B
5917 @kindex W B (Summary)
5918 @findex gnus-article-add-buttons-to-head
5919 Add clickable buttons to the article headers
5920 (@code{gnus-article-add-buttons-to-head}).  
5921
5922 @item W E l
5923 @kindex W E l (Summary)
5924 @findex gnus-article-strip-leading-blank-lines
5925 Remove all blank lines from the beginning of the article
5926 (@code{gnus-article-strip-leading-blank-lines}).
5927
5928 @item W E m
5929 @kindex W E m (Summary)
5930 @findex gnus-article-strip-multiple-blank-lines
5931 Replace all blank lines with empty lines and then all multiple empty
5932 lines with a single empty line.
5933 (@code{gnus-article-strip-multiple-blank-lines}).
5934
5935 @item W E t
5936 @kindex W E t (Summary)
5937 @findex gnus-article-remove-trailing-blank-lines
5938 Remove all blank lines at the end of the article
5939 (@code{gnus-article-remove-trailing-blank-lines}).
5940
5941 @item W E a
5942 @kindex W E a (Summary)
5943 @findex gnus-article-strip-blank-lines
5944 Do all the three commands above
5945 (@code{gnus-article-strip-blank-lines}).
5946
5947 @end table
5948
5949
5950 @node Article Buttons
5951 @subsection Article Buttons
5952 @cindex buttons
5953
5954 People often include references to other stuff in articles, and it would
5955 be nice if Gnus could just fetch whatever it is that people talk about
5956 with the minimum of fuzz.
5957
5958 Gnus adds @dfn{buttons} to certain standard references by default:
5959 Well-formed URLs, mail addresses and Message-IDs.  This is controlled by
5960 two variables, one that handles article bodies and one that handles
5961 article heads:
5962
5963 @table @code
5964
5965 @item gnus-button-alist
5966 @vindex gnus-button-alist
5967 This is an alist where each entry has this form:
5968
5969 @lisp
5970 (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
5971 @end lisp
5972
5973 @table @var
5974
5975 @item regexp
5976 All text that match this regular expression will be considered an
5977 external reference.  Here's a typical regexp that match embedded URLs:
5978 @samp{<URL:\\([^\n\r>]*\\)>}. 
5979
5980 @item button-par
5981 Gnus has to know which parts of the match is to be highlighted.  This is
5982 a number that says what sub-expression of the regexp that is to be
5983 highlighted.  If you want it all highlighted, you use 0 here.
5984
5985 @item use-p
5986 This form will be @code{eval}ed, and if the result is non-@code{nil},
5987 this is considered a match.  This is useful if you want extra sifting to
5988 avoid false matches.
5989
5990 @item function
5991 This function will be called when you click on this button.
5992
5993 @item data-par
5994 As with @var{button-par}, this is a sub-expression number, but this one
5995 says which part of the match is to be sent as data to @var{function}. 
5996
5997 @end table
5998
5999 So the full entry for buttonizing URLs is then
6000
6001 @lisp
6002 ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
6003 @end lisp
6004
6005 @item gnus-header-button-alist
6006 @vindex gnus-header-button-alist
6007 This is just like the other alist, except that it is applied to the
6008 article head only, and that each entry has an additional element that is
6009 used to say what headers to apply the buttonize coding to:
6010
6011 @lisp
6012 (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
6013 @end lisp
6014
6015 @var{header} is a regular expression.
6016
6017 @item gnus-button-url-regexp
6018 @vindex gnus-button-url-regexp
6019 A regular expression that matches embedded URLs.  It is used in the
6020 default values of the variables above.
6021
6022 @item gnus-article-button-face
6023 @vindex gnus-article-button-face
6024 Face used on buttons.
6025
6026 @item gnus-article-mouse-face
6027 @vindex gnus-article-mouse-face
6028 Face is used when the mouse cursor is over a button.
6029
6030 @end table
6031
6032
6033 @node Article Date
6034 @subsection Article Date
6035
6036 The date is most likely generated in some obscure timezone you've never
6037 heard of, so it's quite nice to be able to find out what the time was
6038 when the article was sent.
6039
6040 @table @kbd
6041
6042 @item W T u
6043 @kindex W T u (Summary)
6044 @findex gnus-article-date-ut
6045 Display the date in UT (aka. GMT, aka ZULU)
6046 (@code{gnus-article-date-ut}). 
6047
6048 @item W T l
6049 @kindex W T l (Summary)
6050 @findex gnus-article-date-local
6051 Display the date in the local timezone (@code{gnus-article-date-local}).
6052
6053 @item W T e
6054 @kindex W T e (Summary)
6055 @findex gnus-article-date-lapsed
6056 Say how much time has (e)lapsed between the article was posted and now
6057 (@code{gnus-article-date-lapsed}).
6058
6059 @item W T o
6060 @kindex W T o (Summary)
6061 @findex gnus-article-date-original
6062 Display the original date (@code{gnus-article-date-original}).  This can
6063 be useful if you normally use some other conversion function and is
6064 worried that it might be doing something totally wrong.  Say, claiming
6065 that the article was posted in 1854.  Although something like that is
6066 @emph{totally} impossible.  Don't you trust me? *titter*
6067
6068 @end table
6069
6070
6071 @node Article Signature
6072 @subsection Article Signature
6073 @cindex signatures
6074 @cindex article signature
6075
6076 @vindex gnus-signature-separator
6077 Each article is divided into two parts---the head and the body.  The
6078 body can be divided into a signature part and a text part.  The variable
6079 that says what is to be considered a signature is
6080 @code{gnus-signature-separator}.  This is normally the standard
6081 @samp{^-- $} as mandated by son-of-RFC 1036.  However, many people use
6082 non-standard signature separators, so this variable can also be a list
6083 of regular expressions to be tested, one by one.  (Searches are done
6084 from the end of the body towards the beginning.)  One likely value is:
6085
6086 @lisp
6087 (setq gnus-signature-separator
6088       '("^-- $"         ; The standard
6089         "^-- *$"        ; A common mangling
6090         "^-------*$"    ; Many people just use a looong 
6091                         ; line of dashes.  Shame!
6092         "^ *--------*$" ; Double-shame!
6093         "^________*$"   ; Underscores are also popular
6094         "^========*$")) ; Pervert!
6095 @end lisp
6096
6097 The more permissive you are, the more likely it is that you'll get false
6098 positives.
6099
6100 @vindex gnus-signature-limit
6101 @code{gnus-signature-limit} provides a limit to what is considered a
6102 signature. 
6103
6104 @enumerate
6105 @item 
6106 If it is an integer, no signature may be longer (in characters) than
6107 that integer.
6108 @item 
6109 If it is a floating point number, no signature may be longer (in lines)
6110 than that number.
6111 @item 
6112 If it is a function, the function will be called without any parameters,
6113 and if it returns @code{nil}, there is no signature in the buffer.
6114 @item
6115 If it is a string, it will be used as a regexp.  If it matches, the text
6116 in question is not a signature.
6117 @end enumerate
6118
6119 This variable can also be a list where the elements may be of the types
6120 listed above.  
6121
6122
6123 @node Summary Sorting
6124 @section Summary Sorting
6125 @cindex summary sorting
6126
6127 You can have the summary buffer sorted in various ways, even though I
6128 can't really see why you'd want that.
6129
6130 @table @kbd
6131
6132 @item C-c C-s C-n
6133 @kindex C-c C-s C-n (Summary)
6134 @findex gnus-summary-sort-by-number
6135 Sort by article number (@code{gnus-summary-sort-by-number}).
6136
6137 @item C-c C-s C-a
6138 @kindex C-c C-s C-a (Summary)
6139 @findex gnus-summary-sort-by-author
6140 Sort by author (@code{gnus-summary-sort-by-author}).
6141
6142 @item C-c C-s C-s
6143 @kindex C-c C-s C-s (Summary)
6144 @findex gnus-summary-sort-by-subject
6145 Sort by subject (@code{gnus-summary-sort-by-subject}).
6146
6147 @item C-c C-s C-d
6148 @kindex C-c C-s C-d (Summary)
6149 @findex gnus-summary-sort-by-date
6150 Sort by date (@code{gnus-summary-sort-by-date}).
6151
6152 @item C-c C-s C-i
6153 @kindex C-c C-s C-i (Summary)
6154 @findex gnus-summary-sort-by-score
6155 Sort by score (@code{gnus-summary-sort-by-score}).
6156 @end table
6157
6158 These functions will work both when you use threading and when you don't
6159 use threading.  In the latter case, all summary lines will be sorted,
6160 line by line.  In the former case, sorting will be done on a
6161 root-by-root basis, which might not be what you were looking for.  To
6162 toggle whether to use threading, type @kbd{T T} (@pxref{Thread
6163 Commands}).
6164
6165
6166 @node Finding the Parent
6167 @section Finding the Parent
6168 @cindex parent articles
6169 @cindex referring articles
6170
6171 @findex gnus-summary-refer-parent-article
6172 @kindex ^ (Summary)
6173 If you'd like to read the parent of the current article, and it is not
6174 displayed in the summary buffer, you might still be able to.  That is,
6175 if the current group is fetched by @sc{nntp}, the parent hasn't expired
6176 and the @code{References} in the current article are not mangled, you
6177 can just press @kbd{^} or @kbd{A r}
6178 (@code{gnus-summary-refer-parent-article}).  If everything goes well,
6179 you'll get the parent.  If the parent is already displayed in the
6180 summary buffer, point will just move to this article.
6181
6182 If given a positive numerical prefix, fetch that many articles back into
6183 the ancestry.  If given a negative numerical prefix, fetch just that
6184 ancestor.  So if you say @kbd{3 ^}, Gnus will fetch the parent, the
6185 grandparent and the grandgrandparent of the current article.  If you say
6186 @kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
6187 article. 
6188
6189 @findex gnus-summary-refer-references
6190 @kindex A R (Summary)
6191 You can have Gnus fetch all articles mentioned in the @code{References}
6192 header of the article by pushing @kbd{A R}
6193 (@code{gnus-summary-refer-references}). 
6194
6195 @findex gnus-summary-refer-article
6196 @kindex M-^ (Summary)
6197 @cindex Message-ID
6198 @cindex fetching by Message-ID
6199 You can also ask the @sc{nntp} server for an arbitrary article, no
6200 matter what group it belongs to.  @kbd{M-^}
6201 (@code{gnus-summary-refer-article}) will ask you for a
6202 @code{Message-ID}, which is one of those long, hard-to-read thingies
6203 that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You
6204 have to get it all exactly right.  No fuzzy searches, I'm afraid.
6205
6206 @vindex gnus-refer-article-method
6207 If the group you are reading is located on a backend that does not
6208 support fetching by @code{Message-ID} very well (like @code{nnspool}),
6209 you can set @code{gnus-refer-article-method} to an @sc{nntp} method.  It
6210 would, perhaps, be best if the @sc{nntp} server you consult is the same
6211 as the one that keeps the spool you are reading from updated, but that's
6212 not really necessary.
6213
6214 Most of the mail backends support fetching by @code{Message-ID}, but do
6215 not do a particularly excellent job of it.  That is, @code{nnmbox} and
6216 @code{nnbabyl} are able to locate articles from any groups, while
6217 @code{nnml} and @code{nnfolder} are only able to locate articles that
6218 have been posted to the current group.  (Anything else would be too time
6219 consuming.)  @code{nnmh} does not support this at all.
6220
6221
6222 @node Alternative Approaches
6223 @section Alternative Approaches
6224
6225 Different people like to read news using different methods.  This being
6226 Gnus, we offer a small selection of minor modes for the summary buffers.
6227
6228 @menu
6229 * Pick and Read::               First mark articles and then read them.
6230 * Binary Groups::               Auto-decode all articles.
6231 @end menu
6232
6233
6234 @node Pick and Read
6235 @subsection Pick and Read
6236 @cindex pick and read
6237
6238 Some newsreaders (like @code{nn} and, uhm, @code{nn}) use a two-phased
6239 reading interface.  The user first marks the articles she wants to read
6240 from a summary buffer.  Then she starts reading the articles with just
6241 an article buffer displayed.
6242
6243 @findex gnus-pick-mode
6244 @kindex M-x gnus-pick-mode
6245 Gnus provides a summary buffer minor mode that allows
6246 this---@code{gnus-pick-mode}.  This basically means that a few process
6247 mark commands become one-keystroke commands to allow easy marking, and
6248 it makes one additional command for switching to the summary buffer
6249 available. 
6250
6251 Here are the available keystrokes when using pick mode:
6252
6253 @table @kbd
6254 @item .
6255 @kindex . (Pick)
6256 @findex gnus-summary-mark-as-processable
6257 Pick the article on the current line
6258 (@code{gnus-summary-mark-as-processable}).  If given a numerical prefix,
6259 go to the article on that line and pick that article.  (The line number
6260 is normally displayed on the beginning of the summary pick lines.)
6261
6262 @item SPACE
6263 @kindex SPACE (Pick)
6264 @findex gnus-pick-next-page
6265 Scroll the summary buffer up one page (@code{gnus-pick-next-page}).  If
6266 at the end of the buffer, start reading the picked articles.
6267
6268 @item u
6269 @kindex u (Pick)
6270 @findex gnus-summary-unmark-as-processable
6271 Unpick the article (@code{gnus-summary-unmark-as-processable}). 
6272
6273 @item U
6274 @kindex U (Pick)
6275 @findex gnus-summary-unmark-all-processable
6276 Unpick all articles (@code{gnus-summary-unmark-all-processable}). 
6277
6278 @item t
6279 @kindex t (Pick)
6280 @findex gnus-uu-mark-thread
6281 Pick the thread (@code{gnus-uu-mark-thread}). 
6282
6283 @item T
6284 @kindex T (Pick)
6285 @findex gnus-uu-unmark-thread
6286 Unpick the thread (@code{gnus-uu-unmark-thread}). 
6287
6288 @item r
6289 @kindex r (Pick)
6290 @findex gnus-uu-mark-region
6291 Pick the region (@code{gnus-uu-mark-region}). 
6292
6293 @item R
6294 @kindex R (Pick)
6295 @findex gnus-uu-unmark-region
6296 Unpick the region (@code{gnus-uu-unmark-region}). 
6297
6298 @item e
6299 @kindex e (Pick)
6300 @findex gnus-uu-mark-by-regexp
6301 Pick articles that match a regexp (@code{gnus-uu-mark-by-regexp}). 
6302
6303 @item E
6304 @kindex E (Pick)
6305 @findex gnus-uu-unmark-by-regexp
6306 Unpick articles that match a regexp (@code{gnus-uu-unmark-by-regexp}). 
6307
6308 @item b
6309 @kindex b (Pick)
6310 @findex gnus-uu-mark-buffer
6311 Pick the buffer (@code{gnus-uu-mark-buffer}). 
6312
6313 @item B
6314 @kindex B (Pick)
6315 @findex gnus-uu-unmark-buffer
6316 Unpick the buffer (@code{gnus-uu-unmark-buffer}). 
6317
6318 @item RET
6319 @kindex RET (Pick)
6320 @findex gnus-pick-start-reading
6321 @vindex gnus-pick-display-summary
6322 Start reading the picked articles (@code{gnus-pick-start-reading}).  If
6323 given a prefix, mark all unpicked articles as read first.  If
6324 @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
6325 will still be visible when you are reading.
6326
6327 @end table
6328
6329 If this sounds like a good idea to you, you could say:
6330
6331 @lisp
6332 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
6333 @end lisp
6334
6335 @vindex gnus-pick-mode-hook
6336 @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
6337
6338 @vindex gnus-mark-unpicked-articles-as-read
6339 If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
6340 all unpicked articles as read.  The default is @code{nil}.
6341
6342 @vindex gnus-summary-pick-line-format
6343 The summary line format in pick mode is slightly different than the
6344 standard format.  At the beginning of each line the line number is
6345 displayed.  The pick mode line format is controlled by the
6346 @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
6347 Variables}).  It accepts the same format specs that
6348 @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}). 
6349
6350
6351 @node Binary Groups
6352 @subsection Binary Groups
6353 @cindex binary groups
6354
6355 @findex gnus-binary-mode
6356 @kindex M-x gnus-binary-mode
6357 If you spend much time in binary groups, you may grow tired of hitting
6358 @kbd{X u}, @kbd{n}, @kbd{RET} all the time.  @kbd{M-x gnus-binary-mode}
6359 is a minor mode for summary buffers that makes all ordinary Gnus article
6360 selection functions uudecode series of articles and display the result
6361 instead of just displaying the articles the normal way.  
6362
6363 @kindex g (Binary)
6364 @findex gnus-binary-show-article
6365 In fact, the only way to see the actual articles if you have turned this
6366 mode on is the @kbd{g} command (@code{gnus-binary-show-article}). 
6367
6368 @vindex gnus-binary-mode-hook
6369 @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
6370
6371
6372 @node Tree Display
6373 @section Tree Display
6374 @cindex trees
6375
6376 @vindex gnus-use-trees
6377 If you don't like the normal Gnus summary display, you might try setting
6378 @code{gnus-use-trees} to @code{t}.  This will create (by default) an
6379 additional @dfn{tree buffer}.  You can execute all summary mode commands
6380 in the tree buffer.  
6381
6382 There are a few variables to customize the tree display, of course:
6383
6384 @table @code
6385 @item gnus-tree-mode-hook
6386 @vindex gnus-tree-mode-hook
6387 A hook called in all tree mode buffers.
6388
6389 @item gnus-tree-mode-line-format
6390 @vindex gnus-tree-mode-line-format
6391 A format string for the mode bar in the tree mode buffers.  The default
6392 is @samp{Gnus: %%b [%A] %Z}.  For a list of legal specs, @pxref{Summary
6393 Buffer Mode Line}. 
6394
6395 @item gnus-selected-tree-face
6396 @vindex gnus-selected-tree-face
6397 Face used for highlighting the selected article in the tree buffer.  The
6398 default is @code{modeline}.
6399
6400 @item gnus-tree-line-format
6401 @vindex gnus-tree-line-format
6402 A format string for the tree nodes.  The name is a bit of a misnomer,
6403 though---it doesn't define a line, but just the node.  The default value
6404 is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
6405 the name of the poster.  It is vital that all nodes are of the same
6406 length, so you @emph{must} use @samp{%4,4n}-like specifiers.
6407
6408 Legal specs are:
6409
6410 @table @samp
6411 @item n
6412 The name of the poster.
6413 @item f
6414 The @code{From} header.
6415 @item N
6416 The number of the article.
6417 @item [
6418 The opening bracket.
6419 @item ] 
6420 The closing bracket.
6421 @item s
6422 The subject.
6423 @end table
6424
6425 @xref{Formatting Variables}.
6426
6427 Variables related to the display are:
6428
6429 @table @code
6430 @item gnus-tree-brackets
6431 @vindex gnus-tree-brackets
6432 This is used for differentiating between ``real'' articles and
6433 ``sparse'' articles.  The format is @var{((real-open . real-close)
6434 (sparse-open . sparse-close) (dummy-open . dummy-close))}, and the
6435 default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}))}.
6436
6437 @item gnus-tree-parent-child-edges
6438 @vindex gnus-tree-parent-child-edges
6439 This is a list that contains the characters used for connecting parent
6440 nodes to their children.  The default is @code{(?- ?\\ ?|)}. 
6441
6442 @end table
6443
6444 @item gnus-tree-minimize-window
6445 @vindex gnus-tree-minimize-window
6446 If this variable is non-@code{nil}, Gnus will try to keep the tree
6447 buffer as small as possible to allow more room for the other Gnus
6448 windows.  If this variable is a number, the tree buffer will never be
6449 higher than that number.  The default is @code{t}.
6450
6451 @item gnus-generate-tree-function
6452 @vindex gnus-generate-tree-function
6453 @findex gnus-generate-horizontal-tree
6454 @findex gnus-generate-vertical-tree
6455 The function that actually generates the thread tree.  Two predefined
6456 functions are available: @code{gnus-generate-horizontal-tree} and
6457 @code{gnus-generate-vertical-tree} (which is the default).
6458
6459 @end table
6460
6461 Here's and example from a horizontal tree buffer:
6462
6463 @example
6464 @{***@}-(***)-[odd]-[Gun]
6465      |      \[Jan]
6466      |      \[odd]-[Eri]
6467      |      \(***)-[Eri]
6468      |            \[odd]-[Paa]
6469      \[Bjo]
6470      \[Gun]
6471      \[Gun]-[Jor]
6472 @end example
6473
6474 Here's the same thread displayed in a vertical tree buffer:
6475
6476 @example
6477 @{***@}
6478   |--------------------------\-----\-----\
6479 (***)                         [Bjo] [Gun] [Gun]
6480   |--\-----\-----\                          |
6481 [odd] [Jan] [odd] (***)                   [Jor]
6482   |           |     |--\
6483 [Gun]       [Eri] [Eri] [odd]
6484                           |
6485                         [Paa]
6486 @end example
6487
6488
6489 @node Mail Group Commands
6490 @section Mail Group Commands
6491 @cindex mail group commands
6492
6493 Some commands only make sense in mail groups.  If these commands are
6494 illegal in the current group, they will raise a hell and let you know.
6495
6496 All these commands (except the expiry and edit commands) use the
6497 process/prefix convention (@pxref{Process/Prefix}).
6498
6499 @table @kbd
6500
6501 @item B e
6502 @kindex B e (Summary)
6503 @findex gnus-summary-expire-articles
6504 Expire all expirable articles in the group
6505 (@code{gnus-summary-expire-articles}).
6506
6507 @item B M-C-e
6508 @kindex B M-C-e (Summary)
6509 @findex gnus-summary-expire-articles-now
6510 Delete all the expirable articles in the group
6511 (@code{gnus-summary-expire-articles-now}).  This means that @strong{all}
6512 articles that are eligible for expiry in the current group will
6513 disappear forever into that big @file{/dev/null} in the sky.
6514
6515 @item B DEL
6516 @kindex B DEL (Summary)
6517 @findex gnus-summary-delete-article
6518 Delete the mail article.  This is ``delete'' as in ``delete it from your
6519 disk forever and ever, never to return again.'' Use with caution.
6520 (@code{gnus-summary-delete-article}).
6521
6522 @item B m
6523 @kindex B m (Summary)
6524 @cindex move mail
6525 @findex gnus-summary-move-article
6526 Move the article from one mail group to another
6527 (@code{gnus-summary-move-article}). 
6528
6529 @item B c
6530 @kindex B c (Summary)
6531 @cindex copy mail
6532 @findex gnus-summary-copy-article
6533 Copy the article from one group (mail group or not) to a mail group
6534 (@code{gnus-summary-copy-article}).
6535
6536 @item B C
6537 @kindex B C (Summary)
6538 @cindex crosspost mail
6539 @findex gnus-summary-crosspost-article
6540 Crosspost the current article to some other group
6541 (@code{gnus-summary-crosspost-article}).  This will create a new copy of
6542 the article in the other group, and the Xref headers of the article will
6543 be properly updated.
6544
6545 @item B i
6546 @kindex B i (Summary)
6547 @findex gnus-summary-import-article
6548 Import an arbitrary file into the current mail newsgroup
6549 (@code{gnus-summary-import-article}).  You will be prompted for a file
6550 name, a @code{From} header and a @code{Subject} header.
6551
6552 @item B r
6553 @kindex B r (Summary)
6554 @findex gnus-summary-respool-article
6555 Respool the mail article (@code{gnus-summary-move-article}).
6556
6557 @item B w
6558 @itemx e
6559 @kindex B w (Summary)
6560 @kindex e (Summary)
6561 @findex gnus-summary-edit-article
6562 @kindex C-c C-c (Article)
6563 Edit the current article (@code{gnus-summary-edit-article}).  To finish
6564 editing and make the changes permanent, type @kbd{C-c C-c}
6565 (@kbd{gnus-summary-edit-article-done}).
6566
6567 @item B q
6568 @kindex B q (Summary)
6569 @findex gnus-summary-respool-query
6570 If you want to re-spool an article, you might be curious as to what group
6571 the article will end up in before you do the re-spooling.  This command
6572 will tell you (@code{gnus-summary-respool-query}). 
6573
6574 @item B p
6575 @kindex B p (Summary)
6576 @findex gnus-summary-article-posted-p
6577 Some people have a tendency to send you "courtesy" copies when they
6578 follow up to articles you have posted.  These usually have a
6579 @code{Newsgroups} header in them, but not always.  This command
6580 (@code{gnus-summary-article-posted-p}) will try to fetch the current
6581 article from your news server (or rather, from
6582 @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
6583 report back whether it found the article or not.  Even if it says that
6584 it didn't find the article, it may have been posted anyway---mail
6585 propagation is much faster than news propagation, and the news copy may
6586 just not have arrived yet.
6587
6588 @end table
6589
6590 @vindex gnus-move-split-methods
6591 @cindex moving articles
6592 If you move (or copy) articles regularly, you might wish to have Gnus
6593 suggest where to put the articles.  @code{gnus-move-split-methods} is a
6594 variable that uses the same syntax as @code{gnus-split-methods}
6595 (@pxref{Saving Articles}).  You may customize that variable to create
6596 suggestions you find reasonable.
6597
6598
6599 @node Various Summary Stuff
6600 @section Various Summary Stuff
6601
6602 @menu
6603 * Summary Group Information::         Information oriented commands.
6604 * Searching for Articles::            Multiple article commands.
6605 * Summary Generation Commands::       (Re)generating the summary buffer.
6606 * Really Various Summary Commands::   Those pesky non-conformant commands.
6607 @end menu
6608
6609 @table @code
6610 @vindex gnus-summary-mode-hook
6611 @item gnus-summary-mode-hook
6612 This hook is called when creating a summary mode buffer.
6613
6614 @vindex gnus-summary-generate-hook
6615 @item gnus-summary-generate-hook
6616 This is called as the last thing before doing the threading and the
6617 generation of the summary buffer.  It's quite convenient for customizing
6618 the threading variables based on what data the newsgroup has.  This hook
6619 is called from the summary buffer after most summary buffer variables
6620 has been set.
6621
6622 @vindex gnus-summary-prepare-hook
6623 @item gnus-summary-prepare-hook
6624 Is is called after the summary buffer has been generated.  You might use
6625 it to, for instance, highlight lines or modify the look of the buffer in
6626 some other ungodly manner.  I don't care.
6627
6628 @end table
6629
6630
6631 @node Summary Group Information
6632 @subsection Summary Group Information
6633
6634 @table @kbd
6635
6636 @item H f
6637 @kindex H f (Summary)
6638 @findex gnus-summary-fetch-faq
6639 @vindex gnus-group-faq-directory
6640 Try to fetch the FAQ (list of frequently asked questions) for the
6641 current group (@code{gnus-summary-fetch-faq}).  Gnus will try to get the
6642 FAQ from @code{gnus-group-faq-directory}, which is usually a directory
6643 on a remote machine.  This variable can also be a list of directories.
6644 In that case, giving a prefix to this command will allow you to choose
6645 between the various sites.  @code{ange-ftp} probably will be used for
6646 fetching the file.
6647
6648 @item H d
6649 @kindex H d (Summary)
6650 @findex gnus-summary-describe-group
6651 Give a brief description of the current group
6652 (@code{gnus-summary-describe-group}).  If given a prefix, force
6653 rereading the description from the server.
6654
6655 @item H h
6656 @kindex H h (Summary)
6657 @findex gnus-summary-describe-briefly
6658 Give an extremely brief description of the most important summary
6659 keystrokes (@code{gnus-summary-describe-briefly}).
6660
6661 @item H i
6662 @kindex H i (Summary)
6663 @findex gnus-info-find-node
6664 Go to the Gnus info node (@code{gnus-info-find-node}).
6665 @end table
6666
6667
6668 @node Searching for Articles
6669 @subsection Searching for Articles
6670
6671 @table @kbd
6672
6673 @item M-s
6674 @kindex M-s (Summary)
6675 @findex gnus-summary-search-article-forward
6676 Search through all subsequent articles for a regexp
6677 (@code{gnus-summary-search-article-forward}). 
6678
6679 @item M-r
6680 @kindex M-r (Summary)
6681 @findex gnus-summary-search-article-backward
6682 Search through all previous articles for a regexp
6683 (@code{gnus-summary-search-article-backward}). 
6684
6685 @item &
6686 @kindex & (Summary)
6687 @findex gnus-summary-execute-command
6688 This command will prompt you for a header field, a regular expression to
6689 match on this field, and a command to be executed if the match is made
6690 (@code{gnus-summary-execute-command}).
6691
6692 @item M-&
6693 @kindex M-& (Summary)
6694 @findex gnus-summary-universal-argument
6695 Perform any operation on all articles that have been marked with
6696 the process mark (@code{gnus-summary-universal-argument}).
6697 @end table
6698
6699 @node Summary Generation Commands
6700 @subsection Summary Generation Commands
6701
6702 @table @kbd
6703
6704 @item Y g
6705 @kindex Y g (Summary)
6706 @findex gnus-summary-prepare
6707 Regenerate the current summary buffer (@code{gnus-summary-prepare}).
6708
6709 @item Y c 
6710 @kindex Y c (Summary)
6711 @findex gnus-summary-insert-cached-articles
6712 Pull all cached articles (for the current group) into the summary buffer
6713 (@code{gnus-summary-insert-cached-articles}).
6714
6715 @end table
6716
6717
6718 @node Really Various Summary Commands
6719 @subsection Really Various Summary Commands
6720
6721 @table @kbd
6722
6723 @item C-d
6724 @kindex C-d (Summary)
6725 @findex gnus-summary-enter-digest-group
6726 If the current article is a collection of other articles (for instance,
6727 a digest), you might use this command to enter a group based on the that
6728 article (@code{gnus-summary-enter-digest-group}).  Gnus will try to
6729 guess what article type is currently displayed unless you give a prefix
6730 to this command, which forces a ``digest'' interpretation.  Basically,
6731 whenever you see a message that is a collection of other messages on
6732 some format, you @kbd{C-d} and read these messages in a more convenient
6733 fashion.
6734
6735 @item M-C-d
6736 @kindex M-C-d (Summary)
6737 @findex gnus-summary-read-document
6738 This command is very similar to the one above, but lets you gather
6739 several documents into one biiig group
6740 (@code{gnus-summary-read-document}).  It does this by opening several
6741 @code{nndoc} groups for each document, and then opening an
6742 @code{nnvirtual} group on top of these @code{nndoc} groups.  This
6743 command understands the process/prefix convention
6744 (@pxref{Process/Prefix}). 
6745
6746 @item C-t
6747 @kindex C-t (Summary)
6748 @findex gnus-summary-toggle-truncation
6749 Toggle truncation of summary lines
6750 (@code{gnus-summary-toggle-truncation}).  This will probably confuse the
6751 line centering function in the summary buffer, so it's not a good idea
6752 to have truncation switched off while reading articles.
6753
6754 @item =
6755 @kindex = (Summary)
6756 @findex gnus-summary-expand-window
6757 Expand the summary buffer window (@code{gnus-summary-expand-window}).
6758 If given a prefix, force an @code{article} window configuration. 
6759
6760 @end table
6761
6762
6763 @node Exiting the Summary Buffer
6764 @section Exiting the Summary Buffer
6765 @cindex summary exit
6766 @cindex exiting groups
6767
6768 Exiting from the summary buffer will normally update all info on the
6769 group and return you to the group buffer. 
6770
6771 @table @kbd
6772
6773 @item Z Z
6774 @itemx q
6775 @kindex Z Z (Summary)
6776 @kindex q (Summary)
6777 @findex gnus-summary-exit
6778 @vindex gnus-summary-exit-hook
6779 @vindex gnus-summary-prepare-exit-hook
6780 Exit the current group and update all information on the group
6781 (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
6782 called before doing much of the exiting, and calls
6783 @code{gnus-summary-expire-articles} by default.
6784 @code{gnus-summary-exit-hook} is called after finishing the exiting
6785 process. 
6786
6787 @item Z E
6788 @itemx Q
6789 @kindex Z E (Summary)
6790 @kindex Q (Summary)
6791 @findex gnus-summary-exit-no-update
6792 Exit the current group without updating any information on the group
6793 (@code{gnus-summary-exit-no-update}).
6794
6795 @item Z c
6796 @itemx c
6797 @kindex Z c (Summary)
6798 @kindex c (Summary)
6799 @findex gnus-summary-catchup-and-exit
6800 Mark all unticked articles in the group as read and then exit
6801 (@code{gnus-summary-catchup-and-exit}).
6802
6803 @item Z C
6804 @kindex Z C (Summary)
6805 @findex gnus-summary-catchup-all-and-exit
6806 Mark all articles, even the ticked ones, as read and then exit
6807 (@code{gnus-summary-catchup-all-and-exit}).
6808
6809 @item Z n
6810 @kindex Z n (Summary)
6811 @findex gnus-summary-catchup-and-goto-next-group
6812 Mark all articles as read and go to the next group
6813 (@code{gnus-summary-catchup-and-goto-next-group}). 
6814
6815 @item Z R
6816 @kindex Z R (Summary)
6817 @findex gnus-summary-reselect-current-group
6818 Exit this group, and then enter it again
6819 (@code{gnus-summary-reselect-current-group}).  If given a prefix, select
6820 all articles, both read and unread.
6821
6822 @item Z G
6823 @itemx M-g
6824 @kindex Z G (Summary)
6825 @kindex M-g (Summary)
6826 @findex gnus-summary-rescan-group
6827 Exit the group, check for new articles in the group, and select the
6828 group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
6829 articles, both read and unread.
6830
6831 @item Z N
6832 @kindex Z N (Summary)
6833 @findex gnus-summary-next-group
6834 Exit the group and go to the next group
6835 (@code{gnus-summary-next-group}). 
6836
6837 @item Z P
6838 @kindex Z P (Summary)
6839 @findex gnus-summary-prev-group
6840 Exit the group and go to the previous group
6841 (@code{gnus-summary-prev-group}). 
6842 @end table
6843
6844 @vindex gnus-exit-group-hook
6845 @code{gnus-exit-group-hook} is called when you exit the current
6846 group.  
6847
6848 @findex gnus-summary-wake-up-the-dead
6849 @findex gnus-dead-summary-mode
6850 @vindex gnus-kill-summary-on-exit
6851 If you're in the habit of exiting groups, and then changing your mind
6852 about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
6853 If you do that, Gnus won't kill the summary buffer when you exit it.
6854 (Quelle surprise!)  Instead it will change the name of the buffer to
6855 something like @samp{*Dead Summary ... *} and install a minor mode
6856 called @code{gnus-dead-summary-mode}.  Now, if you switch back to this
6857 buffer, you'll find that all keys are mapped to a function called
6858 @code{gnus-summary-wake-up-the-dead}.  So tapping any keys in a dead
6859 summary buffer will result in a live, normal summary buffer.  
6860
6861 There will never be more than one dead summary buffer at any one time. 
6862
6863 @vindex gnus-use-cross-reference
6864 The data on the current group will be updated (which articles you have
6865 read, which articles you have replied to, etc.) when you exit the
6866 summary buffer.  If the @code{gnus-use-cross-reference} variable is
6867 @code{t} (which is the default), articles that are cross-referenced to
6868 this group and are marked as read, will also be marked as read in the
6869 other subscribed groups they were cross-posted to.  If this variable is
6870 neither @code{nil} nor @code{t}, the article will be marked as read in
6871 both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
6872
6873
6874 @node Crosspost Handling
6875 @section Crosspost Handling
6876
6877 @cindex velveeta
6878 @cindex spamming
6879 Marking cross-posted articles as read ensures that you'll never have to
6880 read the same article more than once.  Unless, of course, somebody has
6881 posted it to several groups separately.  Posting the same article to
6882 several groups (not cross-posting) is called @dfn{spamming}, and you are
6883 by law required to send nasty-grams to anyone who perpetrates such a
6884 heinous crime.  You may want to try NoCeM handling to filter out spam
6885 (@pxref{NoCeM}). 
6886
6887 Remember: Cross-posting is kinda ok, but posting the same article
6888 separately to several groups is not.  Massive cross-posting (aka.
6889 @dfn{velveeta}) is to be avoided at all costs, and you can even use the
6890 @code{gnus-summary-mail-crosspost-complaint} command to complain about
6891 excessive crossposting (@pxref{Summary Mail Commands}).
6892
6893 @cindex cross-posting
6894 @cindex Xref
6895 @cindex @sc{nov}
6896 One thing that may cause Gnus to not do the cross-posting thing
6897 correctly is if you use an @sc{nntp} server that supports @sc{xover}
6898 (which is very nice, because it speeds things up considerably) which
6899 does not include the @code{Xref} header in its @sc{nov} lines.  This is
6900 Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
6901 even with @sc{xover} by registering the @code{Xref} lines of all
6902 articles you actually read, but if you kill the articles, or just mark
6903 them as read without reading them, Gnus will not get a chance to snoop
6904 the @code{Xref} lines out of these articles, and will be unable to use
6905 the cross reference mechanism.
6906
6907 @cindex LIST overview.fmt
6908 @cindex overview.fmt
6909 To check whether your @sc{nntp} server includes the @code{Xref} header
6910 in its overview files, try @samp{telnet your.nntp.server nntp},
6911 @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
6912 overview.fmt}.  This may not work, but if it does, and the last line you
6913 get does not read @samp{Xref:full}, then you should shout and whine at
6914 your news admin until she includes the @code{Xref} header in the
6915 overview files.
6916
6917 @vindex gnus-nov-is-evil
6918 If you want Gnus to get the @code{Xref}s right all the time, you have to
6919 set @code{gnus-nov-is-evil} to @code{t}, which slows things down
6920 considerably.
6921
6922 C'est la vie.
6923
6924 For an alternative approach, @pxref{Duplicate Suppression}.
6925
6926
6927 @node Duplicate Suppression
6928 @section Duplicate Suppression
6929
6930 By default, Gnus tries to make sure that you don't have to read the same
6931 article more than once by utilizing the crossposting mechanism
6932 (@pxref{Crosspost Handling}).  However, that simple and efficient
6933 approach may not work satisfactorily for some users for various
6934 reasons.  
6935
6936 @enumerate
6937 @item 
6938 The @sc{nntp} server may fail to generate the @code{Xref} header.  This
6939 is evil and not very common.
6940
6941 @item 
6942 The @sc{nntp} server may fail to include the @code{Xref} header in the
6943 @file{.overview} data bases.  This is evil and all too common, alas.
6944
6945 @item
6946 You may be reading the same group (or several related groups) from
6947 different @sc{nntp} servers.
6948
6949 @item
6950 You may be getting mail that duplicates articles posted to groups.
6951 @end enumerate
6952
6953 I'm sure there are other situations that @code{Xref} handling fails as
6954 well, but these four are the most common situations.
6955
6956 If, and only if, @code{Xref} handling fails for you, then you may
6957 consider switching on @dfn{duplicate suppression}.  If you do so, Gnus
6958 will remember the @code{Message-ID}s of all articles you have read or
6959 otherwise marked as read, and then, as if by magic, mark them as read
6960 all subsequent times you see them---in @emph{all} groups.  Using this
6961 mechanism is quite likely to be somewhat inefficient, but not overly
6962 so.  It's certainly preferable to reading the same articles more than
6963 once.
6964
6965 Duplicate suppression is not a very subtle instrument.  It's more like a
6966 sledge hammer than anything else.  It works in a very simple
6967 fashion---if you have marked an article as read, it adds this Message-ID
6968 to a cache.  The next time it sees this Message-ID, it will mark the
6969 article as read the the @samp{M} mark.  It doesn't care what group it
6970 saw the article in.
6971
6972 @table @code
6973 @item gnus-suppress-duplicates
6974 @vindex gnus-suppress-duplicates
6975 If non-@code{nil}, suppress duplicates.
6976
6977 @item gnus-save-duplicate-list
6978 @vindex gnus-save-duplicate-list
6979 If non-@code{nil}, save the list of duplicates to a file.  This will
6980 make startup and shutdown take longer, so the default is @code{nil}.
6981 However, this means that only duplicate articles that is read in a
6982 single Gnus session are suppressed.  
6983
6984 @item gnus-duplicate-list-length
6985 @vindex gnus-duplicate-list-length
6986 This variables says how many @code{Message-ID}s to keep in the duplicate
6987 suppression list.  The default is 10000.  
6988
6989 @item gnus-duplicate-file
6990 @vindex gnus-duplicate-file
6991 The name of the file to store the duplicate suppression list.  The
6992 default is @file{~/News/suppression}.
6993 @end table
6994
6995 If you have a tendency to stop and start Gnus often, setting
6996 @code{gnus-save-duplicate-list} to @code{t} is probably a good idea.  If
6997 you leave Gnus running for weeks on end, you may have it @code{nil}.  On
6998 the other hand, saving the list makes startup and shutdown much slower,
6999 so that means that if you stop and start Gnus often, you should set
7000 @code{gnus-save-duplicate-list} to @code{nil}.  Uhm.  I'll leave this up
7001 to you to figure out, I think.
7002
7003
7004 @node The Article Buffer
7005 @chapter The Article Buffer
7006 @cindex article buffer
7007
7008 The articles are displayed in the article buffer, of which there is only
7009 one.  All the summary buffers share the same article buffer unless you
7010 tell Gnus otherwise.
7011
7012 @menu
7013 * Hiding Headers::        Deciding what headers should be displayed.
7014 * Using MIME::            Pushing articles through @sc{mime} before reading them.
7015 * Customizing Articles::  Tailoring the look of the articles.
7016 * Article Keymap::        Keystrokes available in the article buffer.
7017 * Misc Article::          Other stuff.
7018 @end menu
7019
7020
7021 @node Hiding Headers
7022 @section Hiding Headers
7023 @cindex hiding headers
7024 @cindex deleting headers
7025
7026 The top section of each article is the @dfn{head}.  (The rest is the
7027 @dfn{body}, but you may have guessed that already.)
7028
7029 @vindex gnus-show-all-headers
7030 There is a lot of useful information in the head: the name of the person
7031 who wrote the article, the date it was written and the subject of the
7032 article.  That's well and nice, but there's also lots of information
7033 most people do not want to see---what systems the article has passed
7034 through before reaching you, the @code{Message-ID}, the
7035 @code{References}, etc. ad nauseum---and you'll probably want to get rid
7036 of some of those lines.  If you want to keep all those lines in the
7037 article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
7038
7039 Gnus provides you with two variables for sifting headers:
7040
7041 @table @code
7042
7043 @item gnus-visible-headers
7044 @vindex gnus-visible-headers
7045 If this variable is non-@code{nil}, it should be a regular expression
7046 that says what headers you wish to keep in the article buffer.  All
7047 headers that do not match this variable will be hidden.
7048
7049 For instance, if you only want to see the name of the person who wrote
7050 the article and the subject, you'd say:
7051
7052 @lisp
7053 (setq gnus-visible-headers "^From:\\|^Subject:")
7054 @end lisp
7055
7056 This variable can also be a list of regexps to match headers that are to
7057 remain visible.
7058
7059 @item gnus-ignored-headers
7060 @vindex gnus-ignored-headers
7061 This variable is the reverse of @code{gnus-visible-headers}.  If this
7062 variable is set (and @code{gnus-visible-headers} is @code{nil}), it
7063 should be a regular expression that matches all lines that you want to
7064 hide.  All lines that do not match this variable will remain visible.
7065
7066 For instance, if you just want to get rid of the @code{References} line
7067 and the @code{Xref} line, you might say:
7068
7069 @lisp
7070 (setq gnus-ignored-headers "^References:\\|^Xref:")
7071 @end lisp
7072
7073 This variable can also be a list of regexps to match headers that are to
7074 be removed.
7075
7076 Note that if @code{gnus-visible-headers} is non-@code{nil}, this
7077 variable will have no effect.
7078
7079 @end table
7080
7081 @vindex gnus-sorted-header-list
7082 Gnus can also sort the headers for you.  (It does this by default.)  You
7083 can control the sorting by setting the @code{gnus-sorted-header-list}
7084 variable.  It is a list of regular expressions that says in what order
7085 the headers are to be displayed.
7086
7087 For instance, if you want the name of the author of the article first,
7088 and then the subject, you might say something like:
7089
7090 @lisp
7091 (setq gnus-sorted-header-list '("^From:" "^Subject:"))
7092 @end lisp
7093
7094 Any headers that are to remain visible, but are not listed in this
7095 variable, will be displayed in random order after all the headers that
7096 are listed in this variable.
7097
7098 @findex gnus-article-hide-boring-headers
7099 @vindex gnus-article-display-hook
7100 @vindex gnus-boring-article-headers
7101 You can hide further boring headers by entering
7102 @code{gnus-article-hide-boring-headers} into
7103 @code{gnus-article-display-hook}.  What this function does depends on
7104 the @code{gnus-boring-article-headers} variable.  It's a list, but this
7105 list doesn't actually contain header names.  Instead is lists various
7106 @dfn{boring conditions} that Gnus can check and remove from sight.
7107
7108 These conditions are:
7109 @table @code
7110 @item empty
7111 Remove all empty headers.
7112 @item newsgroups
7113 Remove the @code{Newsgroups} header if it only contains the current group
7114 name. 
7115 @item followup-to
7116 Remove the @code{Followup-To} header if it is identical to the
7117 @code{Newsgroups} header.
7118 @item reply-to
7119 Remove the @code{Reply-To} header if it lists the same address as the
7120 @code{From} header.
7121 @item date
7122 Remove the @code{Date} header if the article is less than three days
7123 old. 
7124 @end table
7125
7126 To include the four first elements, you could say something like;
7127
7128 @lisp
7129 (setq gnus-boring-article-headers 
7130       '(empty newsgroups followup-to reply-to))
7131 @end lisp
7132
7133 This is also the default value for this variable.
7134
7135
7136 @node Using MIME
7137 @section Using @sc{mime}
7138 @cindex @sc{mime}
7139
7140 Mime is a standard for waving your hands through the air, aimlessly,
7141 while people stand around yawning.
7142
7143 @sc{mime}, however, is a standard for encoding your articles, aimlessly,
7144 while all newsreaders die of fear.
7145
7146 @sc{mime} may specify what character set the article uses, the encoding
7147 of the characters, and it also makes it possible to embed pictures and
7148 other naughty stuff in innocent-looking articles.
7149
7150 @vindex gnus-show-mime
7151 @vindex gnus-show-mime-method
7152 @vindex gnus-strict-mime
7153 @findex metamail-buffer
7154 Gnus handles @sc{mime} by pushing the articles through
7155 @code{gnus-show-mime-method}, which is @code{metamail-buffer} by
7156 default.  Set @code{gnus-show-mime} to @code{t} if you want to use
7157 @sc{mime} all the time.  However, if @code{gnus-strict-mime} is
7158 non-@code{nil}, the @sc{mime} method will only be used if there are
7159 @sc{mime} headers in the article.  If you have @code{gnus-show-mime}
7160 set, then you'll see some unfortunate display glitches in the article
7161 buffer.  These can't be avoided.
7162
7163 It might be best to just use the toggling functions from the summary
7164 buffer to avoid getting nasty surprises. (For instance, you enter the
7165 group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
7166 decoded the sound file in the article and some horrible sing-a-long song
7167 comes streaming out out your speakers, and you can't find the volume
7168 button, because there isn't one, and people are starting to look at you,
7169 and you try to stop the program, but you can't, and you can't find the
7170 program to control the volume, and everybody else in the room suddenly
7171 decides to look at you disdainfully, and you'll feel rather stupid.)
7172
7173 Any similarity to real events and people is purely coincidental.  Ahem.
7174
7175
7176 @node Customizing Articles
7177 @section Customizing Articles
7178 @cindex article customization
7179
7180 @vindex gnus-article-display-hook
7181 The @code{gnus-article-display-hook} is called after the article has
7182 been inserted into the article buffer.  It is meant to handle all
7183 treatment of the article before it is displayed. 
7184
7185 @findex gnus-article-maybe-highlight
7186 By default this hook just contains @code{gnus-article-hide-headers},
7187 @code{gnus-article-treat-overstrike}, and
7188 @code{gnus-article-maybe-highlight}, but there are thousands, nay
7189 millions, of functions you can put in this hook.  For an overview of
7190 functions @pxref{Article Highlighting}, @pxref{Article Hiding},
7191 @pxref{Article Washing}, @pxref{Article Buttons} and @pxref{Article
7192 Date}.  Note that the order of functions in this hook might affect
7193 things, so you may have to fiddle a bit to get the desired results. 
7194
7195 You can, of course, write your own functions.  The functions are called
7196 from the article buffer, and you can do anything you like, pretty much.
7197 There is no information that you have to keep in the buffer---you can
7198 change everything.  However, you shouldn't delete any headers.  Instead
7199 make them invisible if you want to make them go away.
7200
7201
7202 @node Article Keymap
7203 @section Article Keymap
7204
7205 Most of the keystrokes in the summary buffer can also be used in the
7206 article buffer.  They should behave as if you typed them in the summary
7207 buffer, which means that you don't actually have to have a summary
7208 buffer displayed while reading.  You can do it all from the article
7209 buffer.
7210
7211 A few additional keystrokes are available:
7212
7213 @table @kbd
7214
7215 @item SPACE
7216 @kindex SPACE (Article)
7217 @findex gnus-article-next-page
7218 Scroll forwards one page (@code{gnus-article-next-page}).
7219
7220 @item DEL
7221 @kindex DEL (Article)
7222 @findex gnus-article-prev-page
7223 Scroll backwards one page (@code{gnus-article-prev-page}).
7224
7225 @item C-c ^
7226 @kindex C-c ^ (Article)
7227 @findex gnus-article-refer-article
7228 If point is in the neighborhood of a @code{Message-ID} and you press
7229 @kbd{r}, Gnus will try to get that article from the server
7230 (@code{gnus-article-refer-article}).
7231
7232 @item C-c C-m
7233 @kindex C-c C-m (Article)
7234 @findex gnus-article-mail
7235 Send a reply to the address near point (@code{gnus-article-mail}).  If
7236 given a prefix, include the mail.
7237
7238 @item s
7239 @kindex s (Article)
7240 @findex gnus-article-show-summary
7241 Reconfigure the buffers so that the summary buffer becomes visible
7242 (@code{gnus-article-show-summary}).
7243
7244 @item ?
7245 @kindex ? (Article)
7246 @findex gnus-article-describe-briefly
7247 Give a very brief description of the available keystrokes
7248 (@code{gnus-article-describe-briefly}). 
7249
7250 @item TAB
7251 @kindex TAB (Article)
7252 @findex gnus-article-next-button
7253 Go to the next button, if any (@code{gnus-article-next-button}.  This
7254 only makes sense if you have buttonizing turned on.
7255
7256 @item M-TAB
7257 @kindex M-TAB (Article)
7258 @findex gnus-article-prev-button
7259 Go to the previous button, if any (@code{gnus-article-prev-button}.  
7260
7261 @end table
7262
7263
7264 @node Misc Article
7265 @section Misc Article
7266
7267 @table @code
7268
7269 @item gnus-single-article-buffer
7270 @vindex gnus-single-article-buffer
7271 If non-@code{nil}, use the same article buffer for all the groups.
7272 (This is the default.)  If @code{nil}, each group will have its own
7273 article buffer.
7274
7275 @vindex gnus-article-prepare-hook
7276 @item gnus-article-prepare-hook
7277 This hook is called right after the article has been inserted into the
7278 article buffer.  It is mainly intended for functions that do something
7279 depending on the contents; it should probably not be used for changing
7280 the contents of the article buffer.
7281
7282 @vindex gnus-article-display-hook
7283 @item gnus-article-display-hook
7284 This hook is called as the last thing when displaying an article, and is
7285 intended for modifying the contents of the buffer, doing highlights,
7286 hiding headers, and the like.
7287
7288 @item gnus-article-mode-hook
7289 @vindex gnus-article-mode-hook
7290 Hook called in article mode buffers.
7291
7292 @item gnus-article-mode-syntax-table
7293 @vindex gnus-article-mode-syntax-table
7294 Syntax table used in article buffers.  It is initialized from
7295 @code{text-mode-syntax-table}. 
7296
7297 @vindex gnus-article-mode-line-format
7298 @item gnus-article-mode-line-format
7299 This variable is a format string along the same lines as
7300 @code{gnus-summary-mode-line-format}.  It accepts the same
7301 format specifications as that variable, with one extension:
7302
7303 @table @samp
7304 @item w
7305 The @dfn{wash status} of the article.  This is a short string with one
7306 character for each possible article wash operation that may have been
7307 performed. 
7308 @end table
7309
7310 @vindex gnus-break-pages
7311
7312 @item gnus-break-pages
7313 Controls whether @dfn{page breaking} is to take place.  If this variable
7314 is non-@code{nil}, the articles will be divided into pages whenever a
7315 page delimiter appears in the article.  If this variable is @code{nil},
7316 paging will not be done.
7317
7318 @item gnus-page-delimiter
7319 @vindex gnus-page-delimiter
7320 This is the delimiter mentioned above.  By default, it is @samp{^L}
7321 (form linefeed).
7322 @end table
7323
7324
7325 @node Composing Messages
7326 @chapter Composing Messages
7327 @cindex reply
7328 @cindex followup
7329 @cindex post
7330
7331 @kindex C-c C-c (Post)
7332 All commands for posting and mailing will put you in a message buffer
7333 where you can edit the article all you like, before you send the article
7334 by pressing @kbd{C-c C-c}.  @xref{Top, , Top, message, The Message
7335 Manual}.  If you are in a foreign news group, and you wish to post the
7336 article using the foreign server, you can give a prefix to @kbd{C-c C-c}
7337 to make Gnus try to post using the foreign server.
7338
7339 @menu 
7340 * Mail::                 Mailing and replying.
7341 * Post::                 Posting and following up.
7342 * Posting Server::       What server should you post via?
7343 * Mail and Post::        Mailing and posting at the same time.
7344 * Archived Messages::    Where Gnus stores the messages you've sent.
7345 @c * Posting Styles::       An easier way to configure some key elements.
7346 @c * Drafts::               Postponing messages and rejected messages.
7347 @c * Rejected Articles::    What happens if the server doesn't like your article?
7348 @end menu
7349
7350 Also see @pxref{Canceling and Superseding} for information on how to
7351 remove articles you shouldn't have posted.
7352
7353
7354 @node Mail
7355 @section Mail
7356
7357 Variables for customizing outgoing mail:
7358
7359 @table @code
7360 @item gnus-uu-digest-headers
7361 @vindex gnus-uu-digest-headers
7362 List of regexps to match headers included in digested messages.  The
7363 headers will be included in the sequence they are matched.
7364
7365 @end table
7366
7367
7368 @node Post
7369 @section Post
7370
7371 Variables for composing news articles:
7372
7373 @table @code
7374 @item gnus-sent-message-ids-file
7375 @vindex gnus-sent-message-ids-file
7376 Gnus will keep a @code{Message-ID} history file of all the mails it has
7377 sent.  If it discovers that it has already sent a mail, it will ask the
7378 user whether to re-send the mail.  (This is primarily useful when
7379 dealing with @sc{soup} packets and the like where one is apt to sent the
7380 same packet multiple times.)  This variable says what the name of this
7381 history file is.  It is @file{~/News/Sent-Message-IDs} by default.  Set
7382 this variable to @code{nil} if you don't want Gnus to keep a history
7383 file.
7384
7385 @item gnus-sent-message-ids-length
7386 @vindex gnus-sent-message-ids-length
7387 This variable says how many @code{Message-ID}s to keep in the history
7388 file.  It is 1000 by default.
7389
7390 @end table
7391
7392
7393 @node Posting Server
7394 @section Posting Server
7395
7396 When you press those magical @kbd{C-c C-c} keys to ship off your latest
7397 (extremely intelligent, of course) article, where does it go?
7398
7399 Thank you for asking.  I hate you.
7400
7401 @vindex gnus-post-method
7402
7403 It can be quite complicated.  Normally, Gnus will use the same native
7404 server.  However.  If your native server doesn't allow posting, just
7405 reading, you probably want to use some other server to post your
7406 (extremely intelligent and fabulously interesting) articles.  You can
7407 then set the @code{gnus-post-method} to some other method:
7408
7409 @lisp
7410 (setq gnus-post-method '(nnspool ""))
7411 @end lisp
7412
7413 Now, if you've done this, and then this server rejects your article, or
7414 this server is down, what do you do then?  To override this variable you
7415 can use a non-zero prefix to the @kbd{C-c C-c} command to force using
7416 the ``current'' server for posting.
7417
7418 If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
7419 Gnus will prompt you for what method to use for posting.  
7420
7421 You can also set @code{gnus-post-method} to a list of select methods.
7422 If that's the case, Gnus will always prompt you for what method to use
7423 for posting. 
7424
7425
7426 @node Mail and Post
7427 @section Mail and Post
7428
7429 Here's a list of variables that are relevant to both mailing and
7430 posting:
7431
7432 @table @code
7433 @item gnus-mailing-list-groups
7434 @findex gnus-mailing-list-groups
7435 @cindex mailing lists
7436
7437 If your news server offers groups that are really mailing lists that are
7438 gatewayed to the @sc{nntp} server, you can read those groups without
7439 problems, but you can't post/followup to them without some difficulty.
7440 One solution is to add a @code{to-address} to the group parameters
7441 (@pxref{Group Parameters}).  An easier thing to do is set the
7442 @code{gnus-mailing-list-groups} to a regexp that match the groups that
7443 really are mailing lists.  Then, at least, followups to the mailing
7444 lists will work most of the time.  Posting to these groups (@kbd{a}) is
7445 still a pain, though.
7446
7447 @end table
7448
7449 You may want to do spell-checking on messages that you send out.  Or, if
7450 you don't want to spell-check by hand, you could add automatic
7451 spell-checking via the @code{ispell} package:
7452
7453 @cindex ispell
7454 @findex ispell-message
7455 @lisp
7456 (add-hook 'message-send-hook 'ispell-message) 
7457 @end lisp
7458
7459
7460 @node Archived Messages
7461 @section Archived Messages
7462 @cindex archived messages
7463 @cindex sent messages
7464
7465 Gnus provides a few different methods for storing the mail you send.
7466 The default method is to use the @dfn{archive virtual server} to store
7467 the mail.  If you want to disable this completely, you should set
7468 @code{gnus-message-archive-group} to @code{nil}.
7469
7470 @vindex gnus-message-archive-method
7471 @code{gnus-message-archive-method} says what virtual server Gnus is to
7472 use to store sent messages.  The default is:
7473
7474 @lisp
7475 (nnfolder "archive"
7476           (nnfolder-directory "~/Mail/archive/"))
7477 @end lisp
7478
7479 You can, however, use any mail select method (@code{nnml},
7480 @code{nnmbox}, etc.).  @code{nnfolder} is a quite likeable select method
7481 for doing this sort of thing, though.  If you don't like the default
7482 directory chosen, you could say something like:
7483
7484 @lisp
7485 (setq gnus-message-archive-method
7486       '(nnfolder "archive" 
7487                  (nnfolder-inhibit-expiry t)
7488                  (nnfolder-active-file "~/News/sent-mail/active")
7489                  (nnfolder-directory "~/News/sent-mail/")))
7490 @end lisp
7491
7492 @vindex gnus-message-archive-group
7493 @cindex Gcc
7494 Gnus will insert @code{Gcc} headers in all outgoing messages that point
7495 to one or more group(s) on that server.  Which group to use is
7496 determined by the @code{gnus-message-archive-group} variable.  
7497
7498 This variable can be:
7499
7500 @itemize @bullet
7501 @item a string
7502 Messages will be saved in that group.
7503 @item a list of strings
7504 Messages will be saved in all those groups.
7505 @item an alist of regexps, functions and forms
7506 When a key ``matches'', the result is used.
7507 @item @code{nil}
7508 No message archiving will take place.  This is the default.
7509 @end itemize
7510
7511 Let's illustrate:
7512
7513 Just saving to a single group called @samp{MisK}:
7514 @lisp
7515 (setq gnus-message-archive-group "MisK")
7516 @end lisp
7517
7518 Saving to two groups, @samp{MisK} and @samp{safe}:
7519 @lisp
7520 (setq gnus-message-archive-group '("MisK" "safe"))
7521 @end lisp
7522
7523 Save to different groups based on what group you are in:
7524 @lisp
7525 (setq gnus-message-archive-group 
7526       '(("^alt" "sent-to-alt")
7527         ("mail" "sent-to-mail")
7528         (".*" "sent-to-misc")))
7529 @end lisp
7530
7531 More complex stuff:
7532 @lisp
7533 (setq gnus-message-archive-group 
7534       '((if (message-news-p)
7535             "misc-news" 
7536           "misc-mail")))
7537 @end lisp       
7538
7539 How about storing all news messages in one file, but storing all mail
7540 messages in one file per month:
7541
7542 @lisp
7543 (setq gnus-message-archive-group
7544       '((if (message-news-p)
7545             "misc-news" 
7546           (concat "mail." (format-time-string 
7547                            "%Y-%m" (current-time))))))
7548 @end lisp
7549
7550 Now, when you send a message off, it will be stored in the appropriate
7551 group.  (If you want to disable storing for just one particular message,
7552 you can just remove the @code{Gcc} header that has been inserted.)  The
7553 archive group will appear in the group buffer the next time you start
7554 Gnus, or the next time you press @kbd{F} in the group buffer.  You can
7555 enter it and read the articles in it just like you'd read any other
7556 group.  If the group gets really big and annoying, you can simply rename
7557 if (using @kbd{G r} in the group buffer) to something
7558 nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
7559 continue to be stored in the old (now empty) group.
7560
7561 That's the default method of archiving sent mail.  Gnus also a different
7562 way for the people who don't like the default method.  In that case you
7563 should set @code{gnus-message-archive-group} to @code{nil}; this will
7564 disable archiving.
7565
7566 XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
7567 use a different value for @code{gnus-message-archive-group} there.
7568
7569 @table @code
7570 @item gnus-outgoing-message-group 
7571 @vindex gnus-outgoing-message-group 
7572 All outgoing messages will be put in this group.  If you want to store
7573 all your outgoing mail and articles in the group @samp{nnml:archive},
7574 you set this variable to that value.  This variable can also be a list of
7575 group names.
7576
7577 If you want to have greater control over what group to put each
7578 message in, you can set this variable to a function that checks the
7579 current newsgroup name and then returns a suitable group name (or list
7580 of names).
7581 @end table
7582
7583
7584 @c @node Posting Styles
7585 @c @section Posting Styles
7586 @c @cindex posting styles
7587 @c @cindex styles
7588 @c 
7589 @c All them variables, they make my head swim.  
7590 @c 
7591 @c So what if you want a different @code{Organization} and signature based
7592 @c on what groups you post to?  And you post both from your home machine
7593 @c and your work machine, and you want different @code{From} lines, and so
7594 @c on? 
7595 @c 
7596 @c @vindex gnus-posting-styles
7597 @c One way to do stuff like that is to write clever hooks that change the
7598 @c variables you need to have changed.  That's a bit boring, so somebody
7599 @c came up with the bright idea of letting the user specify these things in
7600 @c a handy alist.  Here's an example of a @code{gnus-posting-styles}
7601 @c variable: 
7602 @c 
7603 @c @lisp
7604 @c ((".*" 
7605 @c   (signature . "Peace and happiness")
7606 @c   (organization . "What me?"))
7607 @c  ("^comp" 
7608 @c   (signature . "Death to everybody"))
7609 @c  ("comp.emacs.i-love-it" 
7610 @c   (organization . "Emacs is it")))
7611 @c @end lisp
7612 @c 
7613 @c As you might surmise from this example, this alist consists of several
7614 @c @dfn{styles}.  Each style will be applicable if the first element
7615 @c ``matches'', in some form or other.  The entire alist will be iterated
7616 @c over, from the beginning towards the end, and each match will be
7617 @c applied, which means that attributes in later styles that match override
7618 @c the same attributes in earlier matching styles.  So
7619 @c @samp{comp.programming.literate} will have the @samp{Death to everybody}
7620 @c signature and the @samp{What me?} @code{Organization} header.
7621 @c 
7622 @c The first element in each style is called the @code{match}.  If it's a
7623 @c string, then Gnus will try to regexp match it against the group name.
7624 @c If it's a function symbol, that function will be called with no
7625 @c arguments.  If it's a variable symbol, then the variable will be
7626 @c referenced.  If it's a list, then that list will be @code{eval}ed.  In
7627 @c any case, if this returns a non-@code{nil} value, then the style is said
7628 @c to @dfn{match}.
7629 @c 
7630 @c Each style may contain a arbitrary amount of @dfn{attributes}.  Each
7631 @c attribute consists of a @var{(name . value)} pair.  The attribute name
7632 @c can be one of @code{signature}, @code{organization} or @code{from}.  The
7633 @c attribute name can also be a string.  In that case, this will be used as
7634 @c a header name, and the value will be inserted in the headers of the
7635 @c article.
7636 @c 
7637 @c The attribute value can be a string (used verbatim), a function (the
7638 @c return value will be used), a variable (its value will be used) or a
7639 @c list (it will be @code{eval}ed and the return value will be used).
7640 @c 
7641 @c So here's a new example:
7642 @c 
7643 @c @lisp
7644 @c (setq gnus-posting-styles
7645 @c       '((".*" 
7646 @c           (signature . "~/.signature") 
7647 @c           (from . "user@@foo (user)")
7648 @c           ("X-Home-Page" . (getenv "WWW_HOME"))
7649 @c           (organization . "People's Front Against MWM"))
7650 @c         ("^rec.humor" 
7651 @c           (signature . my-funny-signature-randomizer))
7652 @c         ((equal (system-name) "gnarly")
7653 @c           (signature . my-quote-randomizer))
7654 @c         (posting-from-work-p
7655 @c           (signature . "~/.work-signature")
7656 @c           (from . "user@@bar.foo (user)")
7657 @c           (organization . "Important Work, Inc"))
7658 @c         ("^nn.+:" 
7659 @c           (signature . "~/.mail-signature"))))
7660 @c @end lisp
7661
7662 @c @node Drafts
7663 @c @section Drafts
7664 @c @cindex drafts
7665 @c 
7666 @c If you are writing a message (mail or news) and suddenly remember that
7667 @c you have a steak in the oven (or some pesto in the food processor, you
7668 @c craazy vegetarians), you'll probably wish there was a method to save the
7669 @c message you are writing so that you can continue editing it some other
7670 @c day, and send it when you feel its finished.
7671 @c 
7672 @c Well, don't worry about it.  Whenever you start composing a message of
7673 @c some sort using the Gnus mail and post commands, the buffer you get will
7674 @c automatically associate to an article in a special @dfn{draft} group.
7675 @c If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
7676 @c article will be saved there.  (Auto-save files also go to the draft
7677 @c group.) 
7678 @c 
7679 @c @cindex nndraft
7680 @c @vindex gnus-draft-group-directory
7681 @c The draft group is a special group (which is implemented as an
7682 @c @code{nndraft} group, if you absolutely have to know) called
7683 @c @samp{nndraft:drafts}.  The variable @code{gnus-draft-group-directory}
7684 @c controls both the name of the group and the location---the leaf element
7685 @c in the path will be used as the name of the group.  What makes this
7686 @c group special is that you can't tick any articles in it or mark any
7687 @c articles as read---all articles in the group are permanently unread.
7688 @c 
7689 @c If the group doesn't exist, it will be created and you'll be subscribed
7690 @c to it.
7691 @c 
7692 @c @findex gnus-dissociate-buffer-from-draft
7693 @c @kindex C-c M-d (Mail)
7694 @c @kindex C-c M-d (Post)
7695 @c @findex gnus-associate-buffer-with-draft
7696 @c @kindex C-c C-d (Mail)
7697 @c @kindex C-c C-d (Post)
7698 @c If you're writing some super-secret message that you later want to
7699 @c encode with PGP before sending, you may wish to turn the auto-saving
7700 @c (and association with the draft group) off.  You never know who might be
7701 @c interested in reading all your extremely valuable and terribly horrible
7702 @c and interesting secrets.  The @kbd{C-c M-d}
7703 @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
7704 @c If you change your mind and want to turn the auto-saving back on again,
7705 @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
7706 @c 
7707 @c @vindex gnus-use-draft
7708 @c To leave association with the draft group off by default, set
7709 @c @code{gnus-use-draft} to @code{nil}.  It is @code{t} by default. 
7710 @c 
7711 @c @findex gnus-summary-send-draft
7712 @c @kindex S D c (Summary)
7713 @c When you want to continue editing the article, you simply enter the
7714 @c draft group and push @kbd{S D c} (@code{gnus-summary-send-draft}) to do
7715 @c that.  You will be placed in a buffer where you left off.
7716 @c 
7717 @c Rejected articles will also be put in this draft group (@pxref{Rejected
7718 @c Articles}).
7719 @c 
7720 @c @findex gnus-summary-send-all-drafts
7721 @c If you have lots of rejected messages you want to post (or mail) without
7722 @c doing further editing, you can use the @kbd{S D a} command
7723 @c (@code{gnus-summary-send-all-drafts}).  This command understands the
7724 @c process/prefix convention (@pxref{Process/Prefix}).  
7725 @c 
7726 @c 
7727 @c @node Rejected Articles
7728 @c @section Rejected Articles
7729 @c @cindex rejected articles
7730 @c 
7731 @c Sometimes a news server will reject an article.  Perhaps the server
7732 @c doesn't like your face.  Perhaps it just feels miserable.  Perhaps
7733 @c @emph{there be demons}.  Perhaps you have included too much cited text.
7734 @c Perhaps the disk is full.  Perhaps the server is down.
7735 @c 
7736 @c These situations are, of course, totally beyond the control of Gnus.
7737 @c (Gnus, of course, loves the way you look, always feels great, has angels
7738 @c fluttering around inside of it, doesn't care about how much cited text
7739 @c you include, never runs full and never goes down.)  So Gnus saves these
7740 @c articles until some later time when the server feels better.
7741 @c 
7742 @c The rejected articles will automatically be put in a special draft group
7743 @c (@pxref{Drafts}).  When the server comes back up again, you'd then
7744 @c typically enter that group and send all the articles off.
7745 @c 
7746
7747 @node Select Methods
7748 @chapter Select Methods
7749 @cindex foreign groups
7750 @cindex select methods
7751
7752 A @dfn{foreign group} is a group that is not read by the usual (or
7753 default) means.  It could be, for instance, a group from a different
7754 @sc{nntp} server, it could be a virtual group, or it could be your own
7755 personal mail group.
7756
7757 A foreign group (or any group, really) is specified by a @dfn{name} and
7758 a @dfn{select method}.  To take the latter first, a select method is a
7759 list where the first element says what backend to use (e.g. @code{nntp},
7760 @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
7761 name}.  There may be additional elements in the select method, where the
7762 value may have special meaning for the backend in question.
7763
7764 One could say that a select method defines a @dfn{virtual server}---so
7765 we do just that (@pxref{The Server Buffer}).
7766
7767 The @dfn{name} of the group is the name the backend will recognize the
7768 group as.
7769
7770 For instance, the group @samp{soc.motss} on the @sc{nntp} server
7771 @samp{some.where.edu} will have the name @samp{soc.motss} and select
7772 method @code{(nntp "some.where.edu")}.  Gnus will call this group
7773 @samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
7774 backend just knows this group as @samp{soc.motss}.
7775
7776 The different methods all have their peculiarities, of course.
7777
7778 @menu
7779 * The Server Buffer::     Making and editing virtual servers.
7780 * Getting News::          Reading USENET news with Gnus.
7781 * Getting Mail::          Reading your personal mail with Gnus.
7782 * Other Sources::         Reading directories, files, SOUP packets.
7783 * Combined Groups::       Combining groups into one group.
7784 @end menu
7785
7786
7787 @node The Server Buffer
7788 @section The Server Buffer
7789
7790 Traditionally, a @dfn{server} is a machine or a piece of software that
7791 one connects to, and then requests information from.  Gnus does not
7792 connect directly to any real servers, but does all transactions through
7793 one backend or other.  But that's just putting one layer more between
7794 the actual media and Gnus, so we might just as well say that each
7795 backend represents a virtual server.
7796
7797 For instance, the @code{nntp} backend may be used to connect to several
7798 different actual @sc{nntp} servers, or, perhaps, to many different ports
7799 on the same actual @sc{nntp} server.  You tell Gnus which backend to
7800 use, and what parameters to set by specifying a @dfn{select method}.
7801
7802 These select methods specifications can sometimes become quite
7803 complicated---say, for instance, that you want to read from the
7804 @sc{nntp} server @samp{news.funet.fi} on port number 13, which
7805 hangs if queried for @sc{nov} headers and has a buggy select.  Ahem.
7806 Anyways, if you had to specify that for each group that used this
7807 server, that would be too much work, so Gnus offers a way of naming
7808 select methods, which is what you do in the server buffer.
7809
7810 To enter the server buffer, user the @kbd{^}
7811 (@code{gnus-group-enter-server-mode}) command in the group buffer.
7812
7813 @menu
7814 * Server Buffer Format::      You can customize the look of this buffer.
7815 * Server Commands::           Commands to manipulate servers.
7816 * Example Methods::           Examples server specifications.
7817 * Creating a Virtual Server:: An example session.
7818 * Servers and Methods::       You can use server names as select methods.
7819 * Unavailable Servers::       Some servers you try to contact may be down.
7820 @end menu
7821
7822 @vindex gnus-server-mode-hook
7823 @code{gnus-server-mode-hook} is run when creating the server buffer.
7824
7825
7826 @node Server Buffer Format
7827 @subsection Server Buffer Format
7828 @cindex server buffer format
7829
7830 @vindex gnus-server-line-format
7831 You can change the look of the server buffer lines by changing the
7832 @code{gnus-server-line-format} variable.  This is a @code{format}-like
7833 variable, with some simple extensions:
7834
7835 @table @samp
7836
7837 @item h 
7838 How the news is fetched---the backend name.
7839
7840 @item n
7841 The name of this server.
7842
7843 @item w
7844 Where the news is to be fetched from---the address.
7845
7846 @item s
7847 The opened/closed/denied status of the server.
7848 @end table
7849
7850 @vindex gnus-server-mode-line-format
7851 The mode line can also be customized by using the
7852 @code{gnus-server-mode-line-format} variable.  The following specs are
7853 understood: 
7854
7855 @table @samp
7856 @item S
7857 Server name.
7858
7859 @item M
7860 Server method.
7861 @end table
7862
7863 Also @pxref{Formatting Variables}.
7864
7865
7866 @node Server Commands
7867 @subsection Server Commands
7868 @cindex server commands
7869
7870 @table @kbd
7871
7872 @item a
7873 @kindex a (Server)
7874 @findex gnus-server-add-server
7875 Add a new server (@code{gnus-server-add-server}).
7876
7877 @item e
7878 @kindex e (Server)
7879 @findex gnus-server-edit-server
7880 Edit a server (@code{gnus-server-edit-server}).
7881
7882 @item SPACE
7883 @kindex SPACE (Server)
7884 @findex gnus-server-read-server
7885 Browse the current server (@code{gnus-server-read-server}).
7886
7887 @item q
7888 @kindex q (Server)
7889 @findex gnus-server-exit
7890 Return to the group buffer (@code{gnus-server-exit}).
7891
7892 @item k
7893 @kindex k (Server)
7894 @findex gnus-server-kill-server
7895 Kill the current server (@code{gnus-server-kill-server}).
7896
7897 @item y
7898 @kindex y (Server)
7899 @findex gnus-server-yank-server
7900 Yank the previously killed server (@code{gnus-server-yank-server}).
7901
7902 @item c
7903 @kindex c (Server)
7904 @findex gnus-server-copy-server
7905 Copy the current server (@code{gnus-server-copy-server}).
7906
7907 @item l
7908 @kindex l (Server)
7909 @findex gnus-server-list-servers
7910 List all servers (@code{gnus-server-list-servers}).
7911
7912 @item s
7913 @kindex s (Server)
7914 @findex gnus-server-scan-server
7915 Request that the server scan its sources for new articles
7916 (@code{gnus-server-scan-server}).  This is mainly sensible with mail
7917 servers. 
7918
7919 @item g
7920 @kindex g (Server)
7921 @findex gnus-server-regenerate-server
7922 Request that the server regenerate all its data structures
7923 (@code{gnus-server-regenerate-server}).  This can be useful if you have
7924 a mail backend that has gotten out of synch.
7925
7926 @end table
7927
7928
7929 @node Example Methods
7930 @subsection Example Methods
7931
7932 Most select methods are pretty simple and self-explanatory: 
7933
7934 @lisp
7935 (nntp "news.funet.fi")
7936 @end lisp
7937
7938 Reading directly from the spool is even simpler:
7939
7940 @lisp
7941 (nnspool "")
7942 @end lisp
7943
7944 As you can see, the first element in a select method is the name of the
7945 backend, and the second is the @dfn{address}, or @dfn{name}, if you
7946 will. 
7947
7948 After these two elements, there may be a arbitrary number of
7949 @var{(variable form)} pairs.
7950
7951 To go back to the first example---imagine that you want to read from
7952 port 15 from that machine.  This is what the select method should
7953 look like then:
7954
7955 @lisp
7956 (nntp "news.funet.fi" (nntp-port-number 15))
7957 @end lisp
7958
7959 You should read the documentation to each backend to find out what
7960 variables are relevant, but here's an @code{nnmh} example. 
7961
7962 @code{nnmh} is a mail backend that reads a spool-like structure.  Say
7963 you have two structures that you wish to access: One is your private
7964 mail spool, and the other is a public one.  Here's the possible spec for
7965 you private mail:
7966
7967 @lisp
7968 (nnmh "private" (nnmh-directory "~/private/mail/"))
7969 @end lisp
7970
7971 (This server is then called @samp{private}, but you may have guessed
7972 that.)
7973
7974 Here's the method for a public spool:
7975
7976 @lisp
7977 (nnmh "public" 
7978       (nnmh-directory "/usr/information/spool/") 
7979       (nnmh-get-new-mail nil))
7980 @end lisp
7981
7982
7983 @node Creating a Virtual Server
7984 @subsection Creating a Virtual Server
7985
7986 If you're saving lots of articles in the cache by using persistent
7987 articles, you may want to create a virtual server to read the cache.
7988
7989 First you need to add a new server.  The @kbd{a} command does that.  It
7990 would probably be best to use @code{nnspool} to read the cache.  You
7991 could also use @code{nnml} or @code{nnmh}, though.
7992
7993 Type @kbd{a nnspool RET cache RET}.
7994
7995 You should now have a brand new @code{nnspool} virtual server called
7996 @samp{cache}.  You now need to edit it to have the right definitions.
7997 Type @kbd{e} to edit the server.  You'll be entered into a buffer that
7998 will contain the following:
7999
8000 @lisp
8001 (nnspool "cache")
8002 @end lisp
8003
8004 Change that to:
8005
8006 @lisp
8007 (nnspool "cache"
8008          (nnspool-spool-directory "~/News/cache/")
8009          (nnspool-nov-directory "~/News/cache/")
8010          (nnspool-active-file "~/News/cache/active"))
8011 @end lisp
8012
8013 Type @kbd{C-c C-c} to return to the server buffer.  If you now press
8014 @kbd{RET} over this virtual server, you should be entered into a browse
8015 buffer, and you should be able to enter any of the groups displayed.
8016
8017
8018 @node Servers and Methods
8019 @subsection Servers and Methods
8020
8021 Wherever you would normally use a select method
8022 (e.g. @code{gnus-secondary-select-method}, in the group select method,
8023 when browsing a foreign server) you can use a virtual server name
8024 instead.  This could potentially save lots of typing.  And it's nice all
8025 over.
8026
8027
8028 @node Unavailable Servers
8029 @subsection Unavailable Servers
8030
8031 If a server seems to be unreachable, Gnus will mark that server as
8032 @code{denied}.  That means that any subsequent attempt to make contact
8033 with that server will just be ignored.  ``It can't be opened,'' Gnus
8034 will tell you, without making the least effort to see whether that is
8035 actually the case or not.
8036
8037 That might seem quite naughty, but it does make sense most of the time.
8038 Let's say you have 10 groups subscribed to the server
8039 @samp{nepholococcygia.com}.  This server is located somewhere quite far
8040 away from you, the machine is quite, so it takes 1 minute just to find
8041 out that it refuses connection from you today.  If Gnus were to attempt
8042 to do that 10 times, you'd be quite annoyed, so Gnus won't attempt to do
8043 that.  Once it has gotten a single ``connection refused'', it will
8044 regard that server as ``down''.
8045
8046 So, what happens if the machine was only feeling unwell temporarily?
8047 How do you test to see whether the machine has come up again?
8048
8049 You jump to the server buffer (@pxref{The Server Buffer}) and poke it
8050 with the following commands:
8051
8052 @table @kbd
8053
8054 @item O
8055 @kindex O (Server)
8056 @findex gnus-server-open-server
8057 Try to establish connection to the server on the current line
8058 (@code{gnus-server-open-server}).
8059
8060 @item C
8061 @kindex C (Server)
8062 @findex gnus-server-close-server
8063 Close the connection (if any) to the server
8064 (@code{gnus-server-close-server}).
8065
8066 @item D
8067 @kindex D (Server)
8068 @findex gnus-server-deny-server
8069 Mark the current server as unreachable
8070 (@code{gnus-server-deny-server}). 
8071
8072 @item M-o
8073 @kindex M-o (Server)
8074 @findex gnus-server-open-all-servers
8075 Open the connections to all servers in the buffer
8076 (@code{gnus-server-open-all-servers}). 
8077
8078 @item M-c
8079 @kindex M-c (Server)
8080 @findex gnus-server-close-all-servers
8081 Close the connections to all servers in the buffer
8082 (@code{gnus-server-close-all-servers}). 
8083
8084 @item R
8085 @kindex R (Server)
8086 @findex gnus-server-remove-denials
8087 Remove all marks to whether Gnus was denied connection from all servers
8088 (@code{gnus-server-remove-denials}). 
8089
8090 @end table
8091
8092
8093 @node Getting News
8094 @section Getting News
8095 @cindex reading news
8096 @cindex news backends
8097
8098 A newsreader is normally used for reading news.  Gnus currently provides
8099 only two methods of getting news---it can read from an @sc{nntp} server,
8100 or it can read from a local spool.
8101
8102 @menu
8103 * NNTP::               Reading news from an @sc{nntp} server.
8104 * News Spool::         Reading news from the local spool.
8105 @end menu
8106
8107
8108 @node NNTP
8109 @subsection @sc{nntp}
8110 @cindex nntp
8111
8112 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
8113 You just specify @code{nntp} as method and the address of the @sc{nntp}
8114 server as the, uhm, address.
8115
8116 If the @sc{nntp} server is located at a non-standard port, setting the
8117 third element of the select method to this port number should allow you
8118 to connect to the right port.  You'll have to edit the group info for
8119 that (@pxref{Foreign Groups}).
8120
8121 The name of the foreign group can be the same as a native group.  In
8122 fact, you can subscribe to the same group from as many different servers
8123 you feel like.  There will be no name collisions.
8124
8125 The following variables can be used to create a virtual @code{nntp}
8126 server: 
8127
8128 @table @code
8129
8130 @item nntp-server-opened-hook
8131 @vindex nntp-server-opened-hook
8132 @cindex @sc{mode reader}
8133 @cindex authinfo
8134 @cindex authentification
8135 @cindex nntp authentification
8136 @findex nntp-send-authinfo
8137 @findex nntp-send-mode-reader
8138 @code{nntp-server-opened-hook} is run after a connection has been made.
8139 It can be used to send commands to the @sc{nntp} server after it has
8140 been contacted.  By default is sends the command @code{MODE READER} to
8141 the server with the @code{nntp-send-mode-reader} function. 
8142
8143 @item nntp-authinfo-function 
8144 @vindex nntp-authinfo-function 
8145 This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
8146 server.  Available functions include:
8147
8148 @table @code
8149 @item nntp-send-authinfo
8150 @findex nntp-send-authinfo
8151 This function will used you current login name as the user name and will
8152 prompt you for the password.  This is the default.
8153
8154 @item nntp-send-nosy-authinfo
8155 @findex nntp-send-nosy-authinfo
8156 This function will prompt you for both user name and password.
8157
8158 @item nntp-send-authinfo-from-file
8159 @findex nntp-send-authinfo-from-file
8160 This function will use your current login name as the user name and will
8161 read the @sc{nntp} password from @file{~/.nntp-authinfo}.
8162 @end table
8163
8164 @item nntp-server-action-alist 
8165 @vindex nntp-server-action-alist 
8166 This is an list of regexps to match on server types and actions to be
8167 taken when matches are made.  For instance, if you want Gnus to beep
8168 every time you connect to innd, you could say something like:
8169
8170 @lisp
8171 (setq nntp-server-action-alist
8172       '(("innd" (ding))))
8173 @end lisp
8174
8175 You probably don't want to do that, though.
8176
8177 The default value is
8178
8179 @lisp
8180   '(("nntpd 1\\.5\\.11t" 
8181      (remove-hook 'nntp-server-opened-hook nntp-send-mode-reader)))
8182 @end lisp
8183
8184 This ensures that Gnus doesn't send the @code{MODE READER} command to
8185 nntpd 1.5.11t, since that command chokes that server, I've been told. 
8186
8187 @item nntp-maximum-request
8188 @vindex nntp-maximum-request
8189 If the @sc{nntp} server doesn't support @sc{nov} headers, this backend
8190 will collect headers by sending a series of @code{head} commands.  To
8191 speed things up, the backend sends lots of these commands without
8192 waiting for reply, and then reads all the replies.  This is controlled
8193 by the @code{nntp-maximum-request} variable, and is 400 by default.  If
8194 your network is buggy, you should set this to 1.
8195
8196 @item nntp-connection-timeout
8197 @vindex nntp-connection-timeout
8198 If you have lots of foreign @code{nntp} groups that you connect to
8199 regularly, you're sure to have problems with @sc{nntp} servers not
8200 responding properly, or being too loaded to reply within reasonable
8201 time.  This is can lead to awkward problems, which can be helped
8202 somewhat by setting @code{nntp-connection-timeout}.  This is an integer
8203 that says how many seconds the @code{nntp} backend should wait for a
8204 connection before giving up.  If it is @code{nil}, which is the default,
8205 no timeouts are done.
8206
8207 @item nntp-command-timeout
8208 @vindex nntp-command-timeout
8209 @cindex PPP connections
8210 @cindex dynamic IP addresses
8211 If you're running Gnus on a machine that has a dynamically assigned
8212 address, Gnus may become confused.  If the address of your machine
8213 changes after connecting to the @sc{nntp} server, Gnus will simply sit
8214 waiting forever for replies from the server.  To help with this
8215 unfortunate problem, you can set this command to a number.  Gnus will
8216 then, if it sits waiting longer than that number of seconds for a reply
8217 from the server, shut down the connection, start a new one, and resend
8218 the command.  This should hopefully be transparent to the user.  A
8219 likely number is 30 seconds. 
8220
8221 @item nntp-retry-on-break
8222 @vindex nntp-retry-on-break
8223 If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
8224 hangs.  This will have much the same effect as the command timeout
8225 described above.
8226
8227 @item nntp-server-hook
8228 @vindex nntp-server-hook
8229 This hook is run as the last step when connecting to an @sc{nntp}
8230 server.
8231
8232 @findex nntp-open-rlogin
8233 @findex nntp-open-network-stream
8234 @item nntp-open-server-function
8235 @vindex nntp-open-server-function
8236 This function is used to connect to the remote system.  Two pre-made
8237 functions are @code{nntp-open-network-stream}, which is the default, and
8238 simply connects to some port or other on the remote system.  The other
8239 is @code{nntp-open-rlogin}, which does an rlogin on the remote system,
8240 and then does a telnet to the @sc{nntp} server available there.
8241
8242 @item nntp-rlogin-parameters
8243 @vindex nntp-rlogin-parameters
8244 If you use @code{nntp-open-rlogin} as the
8245 @code{nntp-open-server-function}, this list will be used as the
8246 parameter list given to @code{rsh}.
8247
8248 @item nntp-end-of-line
8249 @vindex nntp-end-of-line
8250 String to use as end-of-line markers when talking to the @sc{nntp}
8251 server.  This is @samp{\r\n} by default, but should be @samp{\n} when
8252 using @code{rlogin} to talk to the server.
8253
8254 @item nntp-rlogin-user-name
8255 @vindex nntp-rlogin-user-name
8256 User name on the remote system when using the @code{rlogin} connect
8257 function. 
8258
8259 @item nntp-address
8260 @vindex nntp-address
8261 The address of the remote system running the @sc{nntp} server.
8262
8263 @item nntp-port-number
8264 @vindex nntp-port-number
8265 Port number to connect to when using the @code{nntp-open-network-stream}
8266 connect function.
8267
8268 @item nntp-buggy-select
8269 @vindex nntp-buggy-select
8270 Set this to non-@code{nil} if your select routine is buggy.
8271
8272 @item nntp-nov-is-evil 
8273 @vindex nntp-nov-is-evil 
8274 If the @sc{nntp} server does not support @sc{nov}, you could set this
8275 variable to @code{t}, but @code{nntp} usually checks whether @sc{nov}
8276 can be used automatically.
8277
8278 @item nntp-xover-commands
8279 @vindex nntp-xover-commands
8280 @cindex nov
8281 @cindex XOVER
8282 List of strings that are used as commands to fetch @sc{nov} lines from a
8283 server.  The default value of this variable is @code{("XOVER"
8284 "XOVERVIEW")}. 
8285
8286 @item nntp-nov-gap
8287 @vindex nntp-nov-gap
8288 @code{nntp} normally sends just one big request for @sc{nov} lines to
8289 the server.  The server responds with one huge list of lines.  However,
8290 if you have read articles 2-5000 in the group, and only want to read
8291 article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
8292 lines that you do not want, and will not use.  This variable says how
8293 big a gap between two consecutive articles is allowed to be before the
8294 @code{XOVER} request is split into several request.  Note that if your
8295 network is fast, setting this variable to a really small number means
8296 that fetching will probably be slower.  If this variable is @code{nil},
8297 @code{nntp} will never split requests.
8298
8299 @item nntp-prepare-server-hook
8300 @vindex nntp-prepare-server-hook
8301 A hook run before attempting to connect to an @sc{nntp} server.
8302
8303 @item nntp-warn-about-losing-connection
8304 @vindex nntp-warn-about-losing-connection
8305 If this variable is non-@code{nil}, some noise will be made when a
8306 server closes connection.
8307
8308 @end table
8309
8310
8311 @node News Spool
8312 @subsection News Spool
8313 @cindex nnspool
8314 @cindex news spool
8315
8316 Subscribing to a foreign group from the local spool is extremely easy,
8317 and might be useful, for instance, to speed up reading groups that
8318 contain very big articles---@samp{alt.binaries.pictures.furniture}, for
8319 instance. 
8320
8321 Anyways, you just specify @code{nnspool} as the method and @samp{} (or
8322 anything else) as the address.
8323
8324 If you have access to a local spool, you should probably use that as the
8325 native select method (@pxref{Finding the News}).  It is normally faster
8326 than using an @code{nntp} select method, but might not be.  It depends.
8327 You just have to try to find out what's best at your site.
8328
8329 @table @code
8330
8331 @item nnspool-inews-program
8332 @vindex nnspool-inews-program
8333 Program used to post an article.
8334
8335 @item nnspool-inews-switches
8336 @vindex nnspool-inews-switches
8337 Parameters given to the inews program when posting an article. 
8338
8339 @item nnspool-spool-directory
8340 @vindex nnspool-spool-directory
8341 Where @code{nnspool} looks for the articles.  This is normally
8342 @file{/usr/spool/news/}.
8343
8344 @item nnspool-nov-directory 
8345 @vindex nnspool-nov-directory 
8346 Where @code{nnspool} will look for @sc{nov} files.  This is normally
8347 @file{/usr/spool/news/over.view/}.
8348
8349 @item nnspool-lib-dir
8350 @vindex nnspool-lib-dir
8351 Where the news lib dir is (@file{/usr/lib/news/} by default).
8352
8353 @item nnspool-active-file
8354 @vindex nnspool-active-file
8355 The path of the active file.
8356
8357 @item nnspool-newsgroups-file
8358 @vindex nnspool-newsgroups-file
8359 The path of the group descriptions file.
8360
8361 @item nnspool-history-file
8362 @vindex nnspool-history-file
8363 The path of the news history file.
8364
8365 @item nnspool-active-times-file
8366 @vindex nnspool-active-times-file
8367 The path of the active date file.
8368
8369 @item nnspool-nov-is-evil
8370 @vindex nnspool-nov-is-evil
8371 If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
8372 that it finds.
8373
8374 @item nnspool-sift-nov-with-sed
8375 @vindex nnspool-sift-nov-with-sed
8376 @cindex sed
8377 If non-@code{nil}, which is the default, use @code{sed} to get the
8378 relevant portion from the overview file.  If nil, @code{nnspool} will
8379 load the entire file into a buffer and process it there.
8380
8381 @end table
8382
8383
8384 @node Getting Mail
8385 @section Getting Mail
8386 @cindex reading mail
8387 @cindex mail
8388
8389 Reading mail with a newsreader---isn't that just plain WeIrD? But of
8390 course.
8391
8392 @menu
8393 * Getting Started Reading Mail:: A simple cookbook example.
8394 * Splitting Mail::               How to create mail groups.
8395 * Mail Backend Variables::       Variables for customizing mail handling.
8396 * Fancy Mail Splitting::         Gnus can do hairy splitting of incoming mail.
8397 * Mail and Procmail::            Reading mail groups that procmail create.
8398 * Incorporating Old Mail::       What about the old mail you have?
8399 * Expiring Mail::                Getting rid of unwanted mail.
8400 * Washing Mail::                 Removing gruft from the mail you get.
8401 * Duplicates::                   Dealing with duplicated mail.
8402 * Not Reading Mail::             Using mail backends for reading other files.
8403 * Choosing a Mail Backend::      Gnus can read a variety of mail formats.
8404 @end menu
8405
8406
8407 @node Getting Started Reading Mail
8408 @subsection Getting Started Reading Mail
8409
8410 It's quite easy to use Gnus to read your new mail.  You just plonk the
8411 mail backend of your choice into @code{gnus-secondary-select-methods},
8412 and things will happen automatically.
8413
8414 For instance, if you want to use @code{nnml} (which is a one file per
8415 mail backend), you could put the following in your @file{.gnus} file:
8416
8417 @lisp
8418 (setq gnus-secondary-select-methods
8419       '((nnml "private")))
8420 @end lisp
8421
8422 Now, the next time you start Gnus, this backend will be queried for new
8423 articles, and it will move all the messages in your spool file to its
8424 directory, which is @code{~/Mail/} by default.  The new group that will
8425 be created (@samp{mail.misc}) will be subscribed, and you can read it
8426 like any other group.
8427
8428 You will probably want to split the mail into several groups, though:
8429
8430 @lisp
8431 (setq nnmail-split-methods
8432       '(("junk" "^From:.*Lars Ingebrigtsen")
8433        ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
8434        ("other" "")))
8435 @end lisp
8436
8437 This will result in three new @code{nnml} mail groups being created:
8438 @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}.  All the
8439 mail that doesn't fit into the first two groups will be placed in the
8440 latter group.
8441
8442 This should be sufficient for reading mail with Gnus.  You might want to
8443 give the other sections in this part of the manual a perusal, though,
8444 especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}. 
8445
8446
8447 @node Splitting Mail
8448 @subsection Splitting Mail
8449 @cindex splitting mail
8450 @cindex mail splitting
8451
8452 @vindex nnmail-split-methods
8453 The @code{nnmail-split-methods} variable says how the incoming mail is
8454 to be split into groups.
8455
8456 @lisp
8457 (setq nnmail-split-methods
8458   '(("mail.junk" "^From:.*Lars Ingebrigtsen")
8459     ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
8460     ("mail.other" "")))
8461 @end lisp
8462
8463 This variable is a list of lists, where the first element of each of
8464 these lists is the name of the mail group (they do not have to be called
8465 something beginning with @samp{mail}, by the way), and the second
8466 element is a regular expression used on the header of each mail to
8467 determine if it belongs in this mail group.
8468
8469 If the first element is the special symbol @code{junk}, then messages
8470 that match the regexp will disappear into the aether.  Use with
8471 extreme caution. 
8472
8473 The second element can also be a function.  In that case, it will be
8474 called narrowed to the headers with the first element of the rule as the
8475 argument.  It should return a non-@code{nil} value if it thinks that the
8476 mail belongs in that group.
8477
8478 The last of these groups should always be a general one, and the regular
8479 expression should @emph{always} be @samp{} so that it matches any
8480 mails that haven't been matched by any of the other regexps.
8481
8482 If you like to tinker with this yourself, you can set this variable to a
8483 function of your choice.  This function will be called without any
8484 arguments in a buffer narrowed to the headers of an incoming mail
8485 message.  The function should return a list of groups names that it
8486 thinks should carry this mail message.
8487
8488 Note that the mail backends are free to maul the poor, innocent
8489 incoming headers all they want to.  They all add @code{Lines} headers;
8490 some add @code{X-Gnus-Group} headers; most rename the Unix mbox
8491 @code{From<SPACE>} line to something else.
8492
8493 @vindex nnmail-crosspost
8494 The mail backends all support cross-posting.  If several regexps match,
8495 the mail will be ``cross-posted'' to all those groups.
8496 @code{nnmail-crosspost} says whether to use this mechanism or not.  Note
8497 that no articles are crossposted to the general (@samp{}) group.
8498
8499 @vindex nnmail-crosspost-link-function
8500 @cindex crosspost
8501 @cindex links
8502 @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
8503 the crossposted articles.  However, not all files systems support hard
8504 links.  If that's the case for you, set
8505 @code{nnmail-crosspost-link-function} to @code{copy-file}.  (This
8506 variable is @code{add-name-to-file} by default.)  
8507
8508 @kindex M-x nnmail-split-history
8509 @kindex nnmail-split-history
8510 If you wish to see where the previous mail split put the messages, you
8511 can use the @kbd{M-x nnmail-split-history} command.
8512
8513 Gnus gives you all the opportunity you could possibly want for shooting
8514 yourself in the foot.  Let's say you create a group that will contain
8515 all the mail you get from your boss.  And then you accidentally
8516 unsubscribe from the group.  Gnus will still put all the mail from your
8517 boss in the unsubscribed group, and so, when your boss mails you ``Have
8518 that report ready by Monday or you're fired!'', you'll never see it and,
8519 come Tuesday, you'll still believe that you're gainfully employed while
8520 you really should be out collecting empty bottles to save up for next
8521 month's rent money.
8522
8523
8524 @node Mail Backend Variables
8525 @subsection Mail Backend Variables
8526
8527 These variables are (for the most part) pertinent to all the various
8528 mail backends.
8529
8530 @table @code
8531 @vindex nnmail-read-incoming-hook
8532 @item nnmail-read-incoming-hook
8533 The mail backends all call this hook after reading new mail.  You can
8534 use this hook to notify any mail watch programs, if you want to.
8535
8536 @vindex nnmail-spool-file
8537 @item nnmail-spool-file
8538 @cindex POP mail
8539 @cindex MAILHOST
8540 @cindex movemail
8541 @vindex nnmail-pop-password
8542 @vindex nnmail-pop-password-required
8543 The backends will look for new mail in this file.  If this variable is
8544 @code{nil}, the mail backends will never attempt to fetch mail by
8545 themselves.  If you are using a POP mail server and your name is
8546 @samp{larsi}, you should set this variable to @samp{po:larsi}.  If
8547 your name is not @samp{larsi}, you should probably modify that
8548 slightly, but you may have guessed that already, you smart & handsome
8549 devil!  You can also set this variable to @code{pop}, and Gnus will try
8550 to figure out the POP mail string by itself.  In any case, Gnus will
8551 call @code{movemail} which will contact the POP server named in the
8552 @code{MAILHOST} environment variable.  If the POP server needs a
8553 password, you can either set @code{nnmail-pop-password-required} to
8554 @code{t} and be prompted for the password, or set
8555 @code{nnmail-pop-password} to the password itself.
8556
8557 Your Emacs has to have been configured with @samp{--with-pop} before
8558 compilation.  This is the default, but some installations have it
8559 switched off.
8560
8561 When you use a mail backend, Gnus will slurp all your mail from your
8562 inbox and plonk it down in your home directory.  Gnus doesn't move any
8563 mail if you're not using a mail backend---you have to do a lot of magic
8564 invocations first.  At the time when you have finished drawing the
8565 pentagram, lightened the candles, and sacrificed the goat, you really
8566 shouldn't be too surprised when Gnus moves your mail.
8567
8568 @vindex nnmail-use-procmail
8569 @vindex nnmail-procmail-suffix
8570 @item nnmail-use-procmail
8571 If non-@code{nil}, the mail backends will look in
8572 @code{nnmail-procmail-directory} for incoming mail.  All the files in
8573 that directory that have names ending in @code{nnmail-procmail-suffix}
8574 will be considered incoming mailboxes, and will be searched for new
8575 mail.
8576
8577 @vindex nnmail-crash-box
8578 @item nnmail-crash-box
8579 When the mail backends read a spool file, it is first moved to this
8580 file, which is @file{~/.gnus-crash-box} by default.  If this file
8581 already exists, it will always be read (and incorporated) before any
8582 other spool files.
8583
8584 @vindex nnmail-prepare-incoming-hook
8585 @item nnmail-prepare-incoming-hook
8586 This is run in a buffer that holds all the new incoming mail, and can be
8587 used for, well, anything, really.
8588
8589 @vindex nnmail-split-hook
8590 @item nnmail-split-hook
8591 @findex article-decode-rfc1522
8592 @findex RFC1522 decoding
8593 Hook run in the buffer where the mail headers of each message is kept
8594 just before the splitting based on these headers is done.  The hook is
8595 free to modify the buffer contents in any way it sees fit---the buffer
8596 is discarded after the splitting has been done, and no changes performed
8597 in the buffer will show up in any files.  @code{article-decode-rfc1522}
8598 is one likely function to add to this hook.
8599
8600 @vindex nnmail-pre-get-new-mail-hook
8601 @vindex nnmail-post-get-new-mail-hook
8602 @item nnmail-pre-get-new-mail-hook
8603 @itemx nnmail-post-get-new-mail-hook
8604 These are two useful hooks executed when treating new incoming
8605 mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
8606 starting to handle the new mail) and
8607 @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
8608 is done).  Here's and example of using these two hooks to change the
8609 default file modes the new mail files get:
8610
8611 @lisp
8612 (add-hook 'gnus-pre-get-new-mail-hook 
8613           (lambda () (set-default-file-modes 511)))
8614
8615 (add-hook 'gnus-post-get-new-mail-hook 
8616           (lambda () (set-default-file-modes 551)))
8617 @end lisp
8618
8619 @item nnmail-tmp-directory
8620 @vindex nnmail-tmp-directory
8621 This variable says where to move the incoming mail to while processing
8622 it.  This is usually done in the same directory that the mail backend
8623 inhabits (i.e., @file{~/Mail/}), but if this variable is non-@code{nil},
8624 it will be used instead.
8625
8626 @item nnmail-movemail-program
8627 @vindex nnmail-movemail-program
8628 This program is executed to move mail from the user's inbox to her home
8629 directory.  The default is @samp{movemail}.
8630
8631 This can also be a function.  In that case, the function will be called
8632 with two parameters -- the name of the inbox, and the file to be moved
8633 to.
8634
8635 @item nnmail-delete-incoming
8636 @vindex nnmail-delete-incoming
8637 @cindex incoming mail files
8638 @cindex deleting incoming files
8639 If non-@code{nil}, the mail backends will delete the temporary incoming
8640 file after splitting mail into the proper groups.  This is @code{nil} by
8641 default for reasons of security.
8642
8643 Since Red Gnus is an alpha release, it is to be expected to lose mail.
8644 (No Gnus release since (ding) Gnus 0.10 (or something like that) have
8645 lost mail, I think, but that's not the point.)  By not deleting the
8646 Incoming* files, one can be sure to not lose mail -- if Gnus totally
8647 whacks out, one can always recover what was lost.
8648
8649 Delete the @file{Incoming*} files at will.
8650
8651 @item nnmail-use-long-file-names
8652 @vindex nnmail-use-long-file-names
8653 If non-@code{nil}, the mail backends will use long file and directory
8654 names.  Groups like @samp{mail.misc} will end up in directories like
8655 @file{mail.misc/}.  If it is @code{nil}, the same group will end up in
8656 @file{mail/misc/}.
8657
8658 @item nnmail-delete-file-function
8659 @vindex nnmail-delete-file-function
8660 @findex delete-file
8661 Function called to delete files.  It is @code{delete-file} by default. 
8662
8663 @end table
8664
8665
8666 @node Fancy Mail Splitting
8667 @subsection Fancy Mail Splitting
8668 @cindex mail splitting
8669 @cindex fancy mail splitting
8670
8671 @vindex nnmail-split-fancy
8672 @findex nnmail-split-fancy
8673 If the rather simple, standard method for specifying how to split mail
8674 doesn't allow you to do what you want, you can set
8675 @code{nnmail-split-methods} to @code{nnmail-split-fancy}.  Then you can
8676 play with the @code{nnmail-split-fancy} variable.
8677
8678 Let's look at an example value of this variable first:
8679
8680 @lisp
8681 ;; Messages from the mailer daemon are not crossposted to any of
8682 ;; the ordinary groups.  Warnings are put in a separate group
8683 ;; from real errors.
8684 (| ("from" mail (| ("subject" "warn.*" "mail.warning")
8685                    "mail.misc"))
8686    ;; Non-error messages are crossposted to all relevant
8687    ;; groups, but we don't crosspost between the group for the
8688    ;; (ding) list and the group for other (ding) related mail.
8689    (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
8690          ("subject" "ding" "ding.misc"))
8691       ;; Other mailing lists...
8692       (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
8693       (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
8694       ;; People...
8695       (any "larsi@@ifi\\.uio\\.no" "people.Lars Magne Ingebrigtsen"))
8696    ;; Unmatched mail goes to the catch all group.
8697    "misc.misc")
8698 @end lisp
8699
8700 This variable has the format of a @dfn{split}.  A split is a (possibly)
8701 recursive structure where each split may contain other splits.  Here are
8702 the five possible split syntaxes:
8703
8704 @enumerate
8705
8706 @item 
8707 @samp{group}: If the split is a string, that will be taken as a group name. 
8708
8709 @item
8710 @var{(FIELD VALUE SPLIT)}: If the split is a list, and the first
8711 element is a string, then that means that if header FIELD (a regexp)
8712 contains VALUE (also a regexp), then store the message as specified by
8713 SPLIT.
8714
8715 @item
8716 @var{(| SPLIT...)}: If the split is a list, and the first element is
8717 @code{|} (vertical bar), then process each SPLIT until one of them
8718 matches.  A SPLIT is said to match if it will cause the mail message to
8719 be stored in one or more groups.
8720
8721 @item
8722 @var{(& SPLIT...)}: If the split is a list, and the first element is
8723 @code{&}, then process all SPLITs in the list.
8724
8725 @item 
8726 @code{junk}: If the split is the symbol @code{junk}, then don't save
8727 this message anywhere.
8728
8729 @item
8730 @var{(: function arg1 arg2 ...)}:  If the split is a list, and the first
8731 element is @code{:}, then the second element will be called as a
8732 function with @var{args} given as arguments.  The function should return
8733 a SPLIT.
8734
8735 @end enumerate
8736
8737 In these splits, @var{FIELD} must match a complete field name.
8738 @var{VALUE} must match a complete word according to the fundamental mode
8739 syntax table.  You can use @code{.*} in the regexps to match partial
8740 field names or words.  In other words, all @var{VALUE}'s are wrapped in
8741 @samp{\<} and @samp{\>} pairs.
8742
8743 @vindex nnmail-split-abbrev-alist
8744 @var{FIELD} and @var{VALUE} can also be lisp symbols, in that case they
8745 are expanded as specified by the variable
8746 @code{nnmail-split-abbrev-alist}.  This is an alist of cons cells, where
8747 the car of the cells contains the key, and the cdr contains a string.
8748
8749 @vindex nnmail-split-fancy-syntax-table
8750 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
8751 when all this splitting is performed.
8752
8753 If you want to have Gnus create groups dynamically based on some
8754 information in the headers, you can say things like:
8755
8756 @example
8757 (any "debian-\(\\w*\\)@@lists.debian.org" "mail.debian.\\1")
8758 @end example
8759
8760 That is, do @code{replace-match}-like substitions in the group names. 
8761
8762
8763 @node Mail and Procmail
8764 @subsection Mail and Procmail
8765 @cindex procmail
8766
8767 @cindex slocal
8768 @cindex elm
8769 Many people use @code{procmail} (or some other mail filter program or
8770 external delivery agent---@code{slocal}, @code{elm}, etc) to split
8771 incoming mail into groups.  If you do that, you should set
8772 @code{nnmail-spool-file} to @code{procmail} to ensure that the mail
8773 backends never ever try to fetch mail by themselves.
8774
8775 This also means that you probably don't want to set
8776 @code{nnmail-split-methods} either, which has some, perhaps, unexpected
8777 side effects.
8778
8779 When a mail backend is queried for what groups it carries, it replies
8780 with the contents of that variable, along with any groups it has figured
8781 out that it carries by other means.  None of the backends (except
8782 @code{nnmh}) actually go out to the disk and check what groups actually
8783 exist.  (It's not trivial to distinguish between what the user thinks is
8784 a basis for a newsgroup and what is just a plain old file or directory.)
8785
8786 This means that you have to tell Gnus (and the backends) what groups
8787 exist by hand.
8788
8789 Let's take the @code{nnmh} backend as an example. 
8790
8791 The folders are located in @code{nnmh-directory}, say, @file{~/Mail/}.
8792 There are three folders, @file{foo}, @file{bar} and @file{mail.baz}.
8793
8794 Go to the group buffer and type @kbd{G m}.  When prompted, answer
8795 @samp{foo} for the name and @samp{nnmh} for the method.  Repeat
8796 twice for the two other groups, @samp{bar} and @samp{mail.baz}.  Be sure
8797 to include all your mail groups.
8798
8799 That's it.  You are now set to read your mail.  An active file for this
8800 method will be created automatically.
8801
8802 @vindex nnmail-procmail-suffix
8803 @vindex nnmail-procmail-directory
8804 If you use @code{nnfolder} or any other backend that store more than a
8805 single article in each file, you should never have procmail add mails to
8806 the file that Gnus sees.  Instead, procmail should put all incoming mail
8807 in @code{nnmail-procmail-directory}.  To arrive at the file name to put
8808 the incoming mail in, append @code{nnmail-procmail-suffix} to the group
8809 name.  The mail backends will read the mail from these files.
8810
8811 @vindex nnmail-resplit-incoming
8812 When Gnus reads a file called @file{mail.misc.spool}, this mail will be
8813 put in the @code{mail.misc}, as one would expect.  However, if you want
8814 Gnus to split the mail the normal way, you could set
8815 @code{nnmail-resplit-incoming} to @code{t}.
8816
8817 @vindex nnmail-keep-last-article
8818 If you use @code{procmail} to split things directory into an @code{nnmh}
8819 directory (which you shouldn't do), you should set
8820 @code{nnmail-keep-last-article} to non-@code{nil} to prevent Gnus from
8821 ever expiring the final article in a mail newsgroup.  This is quite,
8822 quite important.
8823
8824 Here's an example setup:  The incoming spools are located in
8825 @file{~/incoming/} and have @samp{""} as suffixes (i. e., the incoming
8826 spool files have the same names as the equivalent groups).  The
8827 @code{nnfolder} backend is to be used as the mail interface, and the
8828 @code{nnfolder} directory is @file{~/fMail/}.
8829
8830 @lisp
8831 (setq nnfolder-directory "~/fMail/")
8832 (setq nnmail-spool-file 'procmail)
8833 (setq nnmail-procmail-directory "~/incoming/")
8834 (setq gnus-secondary-select-methods '((nnfolder "")))
8835 (setq nnmail-procmail-suffix "")
8836 @end lisp
8837
8838
8839 @node Incorporating Old Mail
8840 @subsection Incorporating Old Mail
8841
8842 Most people have lots of old mail stored in various file formats.  If
8843 you have set up Gnus to read mail using one of the spiffy Gnus mail
8844 backends, you'll probably wish to have that old mail incorporated into
8845 your mail groups.
8846
8847 Doing so can be quite easy.
8848
8849 To take an example: You're reading mail using @code{nnml}
8850 (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
8851 satisfactory value (@pxref{Splitting Mail}).  You have an old Unix mbox
8852 file filled with important, but old, mail.  You want to move it into
8853 your @code{nnml} groups.
8854
8855 Here's how:
8856
8857 @enumerate
8858 @item
8859 Go to the group buffer.
8860
8861 @item 
8862 Type `G f' and give the path of the mbox file when prompted to create an
8863 @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
8864
8865 @item 
8866 Type `SPACE' to enter the newly created group.
8867
8868 @item
8869 Type `M P b' to process-mark all articles in this group (@pxref{Setting
8870 Process Marks}).
8871
8872 @item 
8873 Type `B r' to respool all the process-marked articles, and answer
8874 @samp{nnml} when prompted (@pxref{Mail Group Commands}).
8875 @end enumerate
8876
8877 All the mail messages in the mbox file will now also be spread out over
8878 all your @code{nnml} groups.  Try entering them and check whether things
8879 have gone without a glitch.  If things look ok, you may consider
8880 deleting the mbox file, but I wouldn't do that unless I was absolutely
8881 sure that all the mail has ended up where it should be.
8882
8883 Respooling is also a handy thing to do if you're switching from one mail
8884 backend to another.  Just respool all the mail in the old mail groups
8885 using the new mail backend.
8886
8887
8888 @node Expiring Mail
8889 @subsection Expiring Mail
8890 @cindex article expiry
8891
8892 Traditional mail readers have a tendency to remove mail articles when
8893 you mark them as read, in some way.  Gnus takes a fundamentally
8894 different approach to mail reading.
8895
8896 Gnus basically considers mail just to be news that has been received in
8897 a rather peculiar manner.  It does not think that it has the power to
8898 actually change the mail, or delete any mail messages.  If you enter a
8899 mail group, and mark articles as ``read'', or kill them in some other
8900 fashion, the mail articles will still exist on the system.  I repeat:
8901 Gnus will not delete your old, read mail.  Unless you ask it to, of
8902 course.
8903
8904 To make Gnus get rid of your unwanted mail, you have to mark the
8905 articles as @dfn{expirable}.  This does not mean that the articles will
8906 disappear right away, however.  In general, a mail article will be
8907 deleted from your system if, 1) it is marked as expirable, AND 2) it is
8908 more than one week old.  If you do not mark an article as expirable, it
8909 will remain on your system until hell freezes over.  This bears
8910 repeating one more time, with some spurious capitalizations: IF you do
8911 NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
8912
8913 @vindex gnus-auto-expirable-newsgroups
8914 You do not have to mark articles as expirable by hand.  Groups that
8915 match the regular expression @code{gnus-auto-expirable-newsgroups} will
8916 have all articles that you read marked as expirable automatically.  All
8917 articles that are marked as expirable have an @samp{E} in the first
8918 column in the summary buffer.
8919
8920 Note that making a group auto-expirable don't mean that all read
8921 articles are expired---only the articles that are marked as expirable
8922 will be expired.  Also note the using the @kbd{d} command won't make
8923 groups expirable---only semi-automatic marking of articles as read will
8924 mark the articles as expirable in auto-expirable groups.
8925
8926 Let's say you subscribe to a couple of mailing lists, and you want the
8927 articles you have read to disappear after a while:
8928
8929 @lisp
8930 (setq gnus-auto-expirable-newsgroups 
8931       "mail.nonsense-list\\|mail.nice-list")
8932 @end lisp
8933
8934 Another way to have auto-expiry happen is to have the element
8935 @code{auto-expire} in the group parameters of the group. 
8936
8937 If you use adaptive scoring (@pxref{Adaptive Scoring}) and
8938 auto-expiring, you'll have problems.  Auto-expiring and adaptive scoring
8939 doesn't really mix very well.  
8940
8941 @vindex nnmail-expiry-wait
8942 The @code{nnmail-expiry-wait} variable supplies the default time an
8943 expirable article has to live.  The default is seven days.  
8944
8945 Gnus also supplies a function that lets you fine-tune how long articles
8946 are to live, based on what group they are in.  Let's say you want to
8947 have one month expiry period in the @samp{mail.private} group, a one day
8948 expiry period in the @samp{mail.junk} group, and a six day expiry period
8949 everywhere else:
8950
8951 @vindex nnmail-expiry-wait-function
8952 @lisp
8953 (setq nnmail-expiry-wait-function
8954       (lambda (group)
8955        (cond ((string= group "mail.private")
8956                31)
8957              ((string= group "mail.junk")
8958                1)
8959              ((string= group "important")
8960                'never)
8961              (t
8962                6))))
8963 @end lisp
8964
8965 The group names that this function is fed are ``unadorned'' group
8966 names---no @samp{nnml:} prefixes and the like.
8967
8968 The @code{nnmail-expiry-wait} variable and
8969 @code{nnmail-expiry-wait-function} function can be either a number (not
8970 necessarily an integer) or the symbols @code{immediate} or
8971 @code{never}.  
8972
8973 You can also use the @code{expiry-wait} group parameter to selectively
8974 change the expiry period (@pxref{Group Parameters}).
8975
8976 @vindex nnmail-keep-last-article
8977 If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
8978 expire the final article in a mail newsgroup.  This is to make life
8979 easier for procmail users.
8980
8981 @vindex gnus-total-expirable-newsgroups
8982 By the way, that line up there about Gnus never expiring non-expirable
8983 articles is a lie.  If you put @code{total-expire} in the group
8984 parameters, articles will not be marked as expirable, but all read
8985 articles will be put through the expiry process.  Use with extreme
8986 caution.  Even more dangerous is the
8987 @code{gnus-total-expirable-newsgroups} variable.  All groups that match
8988 this regexp will have all read articles put through the expiry process,
8989 which means that @emph{all} old mail articles in the groups in question
8990 will be deleted after a while.  Use with extreme caution, and don't come
8991 crying to me when you discover that the regexp you used matched the
8992 wrong group and all your important mail has disappeared.  Be a
8993 @emph{man}!  Or a @emph{woman}!  Whatever you feel more comfortable
8994 with!  So there!
8995
8996 Most people make most of their mail groups total-expirable, though. 
8997
8998
8999 @node Washing Mail
9000 @subsection Washing Mail
9001 @cindex mail washing
9002 @cindex list server brain damage
9003 @cindex incoming mail treatment
9004
9005 Mailers and list servers are notorious for doing all sorts of really,
9006 really stupid things with mail.  ``Hey, RFC822 doesn't explicitly
9007 prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
9008 end of all lines passing through our server, so let's do that!!!!1!''
9009 Yes, but RFC822 wasn't designed to be read by morons.  Things that were
9010 considered to be self-evident were not discussed.  So.  Here we are.
9011
9012 Case in point:  The German version of Microsoft Exchange adds @samp{AW:
9013 } to the subjects of replies instead of @samp{Re: }.  I could pretend to
9014 be shocked and dismayed by this, but I haven't got the energy.  It is to
9015 laugh.
9016
9017 Gnus provides a plethora of functions for washing articles while
9018 displaying them, but it might be nicer to do the filtering before
9019 storing the mail to disc.  For that purpose, we have three hooks and
9020 various functions that can be put in these hooks.
9021
9022 @table @code
9023 @item nnmail-prepare-incoming-hook
9024 @vindex nnmail-prepare-incoming-hook
9025 This hook is called before doing anything with the mail and is meant for
9026 grand, sweeping gestures.  Functions to be used include:
9027
9028 @table @code
9029 @item nnheader-ms-strip-cr
9030 @findex nnheader-ms-strip-cr
9031 Remove trailing carriage returns from each line.  This is default on
9032 Emacs running on MS machines.
9033
9034 @end table
9035
9036 @item nnmail-prepare-incoming-header-hook
9037 @vindex nnmail-prepare-incoming-header-hook
9038 This hook is called narrowed to each header.  It can be used when
9039 cleaning up the headers.  Functions that can be used include:
9040
9041 @table @code
9042 @item nnmail-remove-leading-whitespace
9043 @findex nnmail-remove-leading-whitespace
9044 Clear leading white space that ``helpful'' listservs have added to the
9045 headers too make them look nice.  Aaah.  
9046
9047 @item nnmail-remove-list-identifiers
9048 @findex nnmail-remove-list-identifiers
9049 Some list servers add an identifier---for example, @samp{(idm)}---to the
9050 beginning of all @code{Subject} headers.  I'm sure that's nice for
9051 people who use stone age mail readers.  This function will remove
9052 strings that match the @code{nnmail-list-identifiers} regexp, which can
9053 also be a list of regexp.
9054
9055 For instance, if you want to remove the @samp{(idm)} and the
9056 @samp{nagnagnag} identifiers:
9057
9058 @lisp
9059 (setq nnmail-list-identifiers
9060       '("(idm)" "nagnagnag"))
9061 @end lisp
9062
9063 @item nnmail-remove-tabs
9064 @findex nnmail-remove-tabs
9065 Translate all @samp{TAB} characters into @samp{SPACE} characters. 
9066
9067 @end table
9068
9069 @item nnmail-prepare-incoming-message-hook
9070 @vindex nnmail-prepare-incoming-message-hook
9071 This hook is called narrowed to each message.  Functions to be used
9072 include: 
9073
9074 @table @code
9075 @item article-de-quoted-unreadable
9076 @findex article-de-quoted-unreadable
9077 Decode Quoted Readable encoding.
9078
9079 @end table
9080 @end table
9081
9082
9083 @node Duplicates
9084 @subsection Duplicates
9085
9086 @vindex nnmail-treat-duplicates
9087 @vindex nnmail-message-id-cache-length
9088 @vindex nnmail-message-id-cache-file
9089 @cindex duplicate mails
9090 If you are a member of a couple of mailing list, you will sometime
9091 receive two copies of the same mail.  This can be quite annoying, so
9092 @code{nnmail} checks for and treats any duplicates it might find.  To do
9093 this, it keeps a cache of old @code{Message-ID}s---
9094 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
9095 default.  The approximate maximum number of @code{Message-ID}s stored
9096 there is controlled by the @code{nnmail-message-id-cache-length}
9097 variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
9098 stored.) If all this sounds scary to you, you can set
9099 @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
9100 default), and @code{nnmail} won't delete duplicate mails.  Instead it
9101 will generate a brand new @code{Message-ID} for the mail and insert a
9102 warning into the head of the mail saying that it thinks that this is a
9103 duplicate of a different message.  
9104
9105 This variable can also be a function.  If that's the case, the function
9106 will be called from a buffer narrowed to the message in question with
9107 the @code{Message-ID} as a parameter.  The function must return either
9108 @code{nil}, @code{warn}, or @code{delete}.
9109
9110 You can turn this feature off completely by setting the variable to
9111 @code{nil}.
9112
9113 If you want all the duplicate mails to be put into a special
9114 @dfn{duplicates} group, you could do that using the normal mail split
9115 methods:
9116
9117 @lisp
9118 (setq nnmail-split-fancy
9119       '(| ;; Messages duplicates go to a separate group.
9120           ("gnus-warning" "duplication of message" "duplicate")
9121           ;; Message from daemons, postmaster, and the like to another.
9122           (any mail "mail.misc")
9123           ;; Other rules.
9124           [ ... ] ))
9125 @end lisp
9126
9127 Or something like:
9128 @lisp
9129 (setq nnmail-split-methods 
9130       '(("duplicates" "^Gnus-Warning:")
9131         ;; Other rules.
9132         [...]))
9133 @end lisp
9134
9135 Here's a neat feature: If you know that the recipient reads her mail
9136 with Gnus, and that she has @code{nnmail-treat-duplicates} set to
9137 @code{delete}, you can send her as many insults as you like, just by
9138 using a @code{Message-ID} of a mail that you know that she's already
9139 received.  Think of all the fun!  She'll never see any of it!  Whee!
9140
9141
9142 @node Not Reading Mail
9143 @subsection Not Reading Mail
9144
9145 If you start using any of the mail backends, they have the annoying
9146 habit of assuming that you want to read mail with them.  This might not
9147 be unreasonable, but it might not be what you want.
9148
9149 If you set @code{nnmail-spool-file} to @code{nil}, none of the backends
9150 will ever attempt to read incoming mail, which should help.
9151
9152 @vindex nnbabyl-get-new-mail
9153 @vindex nnmbox-get-new-mail
9154 @vindex nnml-get-new-mail
9155 @vindex nnmh-get-new-mail
9156 @vindex nnfolder-get-new-mail
9157 This might be too much, if, for instance, you are reading mail quite
9158 happily with @code{nnml} and just want to peek at some old @sc{rmail}
9159 file you have stashed away with @code{nnbabyl}.  All backends have
9160 variables called backend-@code{get-new-mail}.  If you want to disable
9161 the @code{nnbabyl} mail reading, you edit the virtual server for the
9162 group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
9163
9164 All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook}
9165 narrowed to the article to be saved before saving it when reading
9166 incoming mail.
9167
9168
9169 @node Choosing a Mail Backend
9170 @subsection Choosing a Mail Backend
9171
9172 Gnus will read the mail spool when you activate a mail group.  The mail
9173 file is first copied to your home directory.  What happens after that
9174 depends on what format you want to store your mail in.
9175
9176 @menu
9177 * Unix Mail Box::               Using the (quite) standard Un*x mbox.
9178 * Rmail Babyl::                 Emacs programs use the rmail babyl format.
9179 * Mail Spool::                  Store your mail in a private spool?
9180 * MH Spool::                    An mhspool-like backend.
9181 * Mail Folders::                Having one file for each group.
9182 @end menu
9183
9184
9185 @node Unix Mail Box
9186 @subsubsection Unix Mail Box
9187 @cindex nnmbox
9188 @cindex unix mail box
9189
9190 @vindex nnmbox-active-file
9191 @vindex nnmbox-mbox-file
9192 The @dfn{nnmbox} backend will use the standard Un*x mbox file to store
9193 mail.  @code{nnmbox} will add extra headers to each mail article to say
9194 which group it belongs in.
9195
9196 Virtual server settings:
9197
9198 @table @code
9199 @item nnmbox-mbox-file
9200 @vindex nnmbox-mbox-file
9201 The name of the mail box in the user's home directory. 
9202
9203 @item nnmbox-active-file
9204 @vindex nnmbox-active-file
9205 The name of the active file for the mail box.
9206
9207 @item nnmbox-get-new-mail
9208 @vindex nnmbox-get-new-mail
9209 If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
9210 into groups.
9211 @end table
9212
9213
9214 @node Rmail Babyl
9215 @subsubsection Rmail Babyl
9216 @cindex nnbabyl
9217 @cindex rmail mbox
9218
9219 @vindex nnbabyl-active-file
9220 @vindex nnbabyl-mbox-file
9221 The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail
9222 mbox}) to store mail. @code{nnbabyl} will add extra headers to each mail
9223 article to say which group it belongs in.
9224
9225 Virtual server settings:
9226
9227 @table @code
9228 @item nnbabyl-mbox-file
9229 @vindex nnbabyl-mbox-file
9230 The name of the rmail mbox file.
9231
9232 @item nnbabyl-active-file
9233 @vindex nnbabyl-active-file
9234 The name of the active file for the rmail box.
9235
9236 @item nnbabyl-get-new-mail
9237 @vindex nnbabyl-get-new-mail
9238 If non-@code{nil}, @code{nnbabyl} will read incoming mail. 
9239 @end table
9240
9241
9242 @node Mail Spool
9243 @subsubsection Mail Spool
9244 @cindex nnml
9245 @cindex mail @sc{nov} spool
9246
9247 The @dfn{nnml} spool mail format isn't compatible with any other known
9248 format.  It should be used with some caution.
9249
9250 @vindex nnml-directory
9251 If you use this backend, Gnus will split all incoming mail into files;
9252 one file for each mail, and put the articles into the correct
9253 directories under the directory specified by the @code{nnml-directory}
9254 variable.  The default value is @file{~/Mail/}.
9255
9256 You do not have to create any directories beforehand; Gnus will take
9257 care of all that.
9258
9259 If you have a strict limit as to how many files you are allowed to store
9260 in your account, you should not use this backend.  As each mail gets its
9261 own file, you might very well occupy thousands of inodes within a few
9262 weeks.  If this is no problem for you, and it isn't a problem for you
9263 having your friendly systems administrator walking around, madly,
9264 shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
9265 know that this is probably the fastest format to use.  You do not have
9266 to trudge through a big mbox file just to read your new mail.
9267
9268 @code{nnml} is probably the slowest backend when it comes to article
9269 splitting.  It has to create lots of files, and it also generates
9270 @sc{nov} databases for the incoming mails.  This makes is the fastest
9271 backend when it comes to reading mail.
9272
9273 Virtual server settings:
9274
9275 @table @code
9276 @item nnml-directory
9277 @vindex nnml-directory
9278 All @code{nnml} directories will be placed under this directory. 
9279
9280 @item nnml-active-file
9281 @vindex nnml-active-file
9282 The active file for the @code{nnml} server.
9283
9284 @item nnml-newsgroups-file
9285 @vindex nnml-newsgroups-file
9286 The @code{nnml} group descriptions file.  @xref{Newsgroups File
9287 Format}. 
9288
9289 @item nnml-get-new-mail
9290 @vindex nnml-get-new-mail
9291 If non-@code{nil}, @code{nnml} will read incoming mail.
9292
9293 @item nnml-nov-is-evil
9294 @vindex nnml-nov-is-evil
9295 If non-@code{nil}, this backend will ignore any @sc{nov} files.  
9296
9297 @item nnml-nov-file-name
9298 @vindex nnml-nov-file-name
9299 The name of the @sc{nov} files.  The default is @file{.overview}. 
9300
9301 @item nnml-prepare-save-mail-hook
9302 @vindex nnml-prepare-save-mail-hook
9303 Hook run narrowed to an article before saving.
9304
9305 @end table
9306
9307 @findex nnml-generate-nov-databases
9308 If your @code{nnml} groups and @sc{nov} files get totally out of whack,
9309 you can do a complete update by typing @kbd{M-x
9310 nnml-generate-nov-databases}.  This command will trawl through the
9311 entire @code{nnml} hierarchy, looking at each and every article, so it
9312 might take a while to complete.  A better interface to this
9313 functionality can be found in the server buffer (@pxref{Server
9314 Commands}). 
9315
9316
9317 @node MH Spool
9318 @subsubsection MH Spool
9319 @cindex nnmh
9320 @cindex mh-e mail spool
9321
9322 @code{nnmh} is just like @code{nnml}, except that is doesn't generate
9323 @sc{nov} databases and it doesn't keep an active file.  This makes
9324 @code{nnmh} a @emph{much} slower backend than @code{nnml}, but it also
9325 makes it easier to write procmail scripts for.
9326
9327 Virtual server settings:
9328
9329 @table @code
9330 @item nnmh-directory
9331 @vindex nnmh-directory
9332 All @code{nnmh} directories will be located under this directory.
9333
9334 @item nnmh-get-new-mail
9335 @vindex nnmh-get-new-mail
9336 If non-@code{nil}, @code{nnmh} will read incoming mail.
9337
9338 @item nnmh-be-safe
9339 @vindex nnmh-be-safe
9340 If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
9341 sure that the articles in the folder are actually what Gnus thinks they
9342 are.  It will check date stamps and stat everything in sight, so
9343 setting this to @code{t} will mean a serious slow-down.  If you never
9344 use anything but Gnus to read the @code{nnmh} articles, you do not have
9345 to set this variable to @code{t}.
9346 @end table
9347
9348
9349 @node Mail Folders
9350 @subsubsection Mail Folders
9351 @cindex nnfolder
9352 @cindex mbox folders
9353 @cindex mail folders
9354
9355 @code{nnfolder} is a backend for storing each mail group in a separate
9356 file.  Each file is in the standard Un*x mbox format.  @code{nnfolder}
9357 will add extra headers to keep track of article numbers and arrival
9358 dates.
9359
9360 Virtual server settings:
9361
9362 @table @code
9363 @item nnfolder-directory
9364 @vindex nnfolder-directory
9365 All the @code{nnfolder} mail boxes will be stored under this directory. 
9366
9367 @item nnfolder-active-file
9368 @vindex nnfolder-active-file
9369 The name of the active file.
9370
9371 @item nnfolder-newsgroups-file
9372 @vindex nnfolder-newsgroups-file
9373 The name of the group descriptions file.  @xref{Newsgroups File Format}.
9374
9375 @item nnfolder-get-new-mail
9376 @vindex nnfolder-get-new-mail
9377 If non-@code{nil}, @code{nnfolder} will read incoming mail.
9378 @end table
9379
9380 @findex nnfolder-generate-active-file
9381 @kindex M-x nnfolder-generate-active-file
9382 If you have lots of @code{nnfolder}-like files you'd like to read with
9383 @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
9384 command to make @code{nnfolder} aware of all likely files in
9385 @code{nnfolder-directory}.
9386
9387
9388 @node Other Sources
9389 @section Other Sources
9390
9391 Gnus can do more than just read news or mail.  The methods described
9392 below allow Gnus to view directories and files as if they were
9393 newsgroups.
9394
9395 @menu
9396 * Directory Groups::      You can read a directory as if it was a newsgroup.
9397 * Anything Groups::       Dired?  Who needs dired?
9398 * Document Groups::       Single files can be the basis of a group.
9399 * SOUP::                  Reading @sc{SOUP} packets ``offline''.
9400 * Web Searches::          Creating groups from articles that match a string.
9401 * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
9402 @end menu
9403
9404
9405 @node Directory Groups
9406 @subsection Directory Groups
9407 @cindex nndir
9408 @cindex directory groups
9409
9410 If you have a directory that has lots of articles in separate files in
9411 it, you might treat it as a newsgroup.  The files have to have numerical
9412 names, of course.
9413
9414 This might be an opportune moment to mention @code{ange-ftp}, that most
9415 wonderful of all wonderful Emacs packages.  When I wrote @code{nndir}, I
9416 didn't think much about it---a backend to read directories.  Big deal.
9417
9418 @code{ange-ftp} changes that picture dramatically.  For instance, if you
9419 enter the @code{ange-ftp} file name
9420 @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the the directory name,
9421 @code{ange-ftp} will actually allow you to read this directory over at
9422 @samp{sina} as a newsgroup.  Distributed news ahoy!
9423
9424 @code{nndir} will use @sc{nov} files if they are present.
9425
9426 @code{nndir} is a ``read-only'' backend---you can't delete or expire
9427 articles with this method.  You can use @code{nnmh} or @code{nnml} for
9428 whatever you use @code{nndir} for, so you could switch to any of those
9429 methods if you feel the need to have a non-read-only @code{nndir}.
9430
9431
9432 @node Anything Groups
9433 @subsection Anything Groups
9434 @cindex nneething
9435
9436 From the @code{nndir} backend (which reads a single spool-like
9437 directory), it's just a hop and a skip to @code{nneething}, which
9438 pretends that any arbitrary directory is a newsgroup.  Strange, but
9439 true.
9440
9441 When @code{nneething} is presented with a directory, it will scan this
9442 directory and assign article numbers to each file.  When you enter such
9443 a group, @code{nneething} must create ``headers'' that Gnus can use.
9444 After all, Gnus is a newsreader, in case you're
9445 forgetting. @code{nneething} does this in a two-step process.  First, it
9446 snoops each file in question.  If the file looks like an article (i.e.,
9447 the first few lines look like headers), it will use this as the head.
9448 If this is just some arbitrary file without a head (e.g. a C source
9449 file), @code{nneething} will cobble up a header out of thin air.  It
9450 will use file ownership, name and date and do whatever it can with these
9451 elements.
9452
9453 All this should happen automatically for you, and you will be presented
9454 with something that looks very much like a newsgroup.  Totally like a
9455 newsgroup, to be precise.  If you select an article, it will be displayed
9456 in the article buffer, just as usual.
9457
9458 If you select a line that represents a directory, Gnus will pop you into
9459 a new summary buffer for this @code{nneething} group.  And so on.  You can
9460 traverse the entire disk this way, if you feel like, but remember that
9461 Gnus is not dired, really, and does not intend to be, either.
9462
9463 There are two overall modes to this action---ephemeral or solid.  When
9464 doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
9465 will not store information on what files you have read, and what files
9466 are new, and so on.  If you create a solid @code{nneething} group the
9467 normal way with @kbd{G m}, Gnus will store a mapping table between
9468 article numbers and file names, and you can treat this group like any
9469 other groups.  When you activate a solid @code{nneething} group, you will
9470 be told how many unread articles it contains, etc., etc.
9471
9472 Some variables:
9473
9474 @table @code
9475 @item nneething-map-file-directory
9476 @vindex nneething-map-file-directory
9477 All the mapping files for solid @code{nneething} groups will be stored
9478 in this directory, which defaults to @file{~/.nneething/}.
9479
9480 @item nneething-exclude-files
9481 @vindex nneething-exclude-files
9482 All files that match this regexp will be ignored.  Nice to use to exclude
9483 auto-save files and the like, which is what it does by default.
9484
9485 @item nneething-map-file
9486 @vindex nneething-map-file
9487 Name of the map files.
9488 @end table
9489
9490
9491 @node Document Groups
9492 @subsection Document Groups
9493 @cindex nndoc
9494 @cindex documentation group
9495 @cindex help group
9496
9497 @code{nndoc} is a cute little thing that will let you read a single file
9498 as a newsgroup.  Several files types are supported:
9499
9500 @table @code
9501 @cindex babyl
9502 @cindex rmail mbox
9503
9504 @item babyl
9505 The babyl (rmail) mail box.
9506 @cindex mbox
9507 @cindex Unix mbox
9508
9509 @item mbox
9510 The standard Unix mbox file.
9511
9512 @cindex MMDF mail box
9513 @item mmdf
9514 The MMDF mail box format.
9515
9516 @item news
9517 Several news articles appended into a file.
9518
9519 @item rnews
9520 @cindex rnews batch files
9521 The rnews batch transport format.
9522 @cindex forwarded messages
9523
9524 @item forward
9525 Forwarded articles.
9526
9527 @item mime-digest
9528 @cindex digest
9529 @cindex MIME digest
9530 @cindex 1153 digest
9531 @cindex RFC 1153 digest
9532 @cindex RFC 341 digest
9533 MIME (RFC 1341) digest format.
9534
9535 @item standard-digest
9536 The standard (RFC 1153) digest format.
9537
9538 @item slack-digest
9539 Non-standard digest format---matches most things, but does it badly. 
9540 @end table
9541
9542 You can also use the special ``file type'' @code{guess}, which means
9543 that @code{nndoc} will try to guess what file type it is looking at.
9544 @code{digest} means that @code{nndoc} should guess what digest type the
9545 file is.
9546
9547 @code{nndoc} will not try to change the file or insert any extra headers into
9548 it---it will simply, like, let you use the file as the basis for a
9549 group.  And that's it.
9550
9551 If you have some old archived articles that you want to insert into your
9552 new & spiffy Gnus mail backend, @code{nndoc} can probably help you with
9553 that.  Say you have an old @file{RMAIL} file with mail that you now want
9554 to split into your new @code{nnml} groups.  You look at that file using
9555 @code{nndoc} (using the @kbd{G f} command in the group buffer
9556 (@pxref{Foreign Groups})), set the process mark on all the articles in
9557 the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
9558 using @code{nnml}.  If all goes well, all the mail in the @file{RMAIL}
9559 file is now also stored in lots of @code{nnml} directories, and you can
9560 delete that pesky @file{RMAIL} file.  If you have the guts!
9561
9562 Virtual server variables:
9563
9564 @table @code
9565 @item nndoc-article-type
9566 @vindex nndoc-article-type
9567 This should be one of @code{mbox}, @code{babyl}, @code{digest},
9568 @code{mmdf}, @code{forward}, @code{news}, @code{rnews},
9569 @code{mime-digest}, @code{clari-briefs}, or @code{guess}.
9570
9571 @item nndoc-post-type
9572 @vindex nndoc-post-type
9573 This variable says whether Gnus is to consider the group a news group or
9574 a mail group.  There are two legal values:  @code{mail} (the default)
9575 and @code{news}.
9576 @end table
9577
9578 @menu
9579 * Document Server Internals::   How to add your own document types.
9580 @end menu
9581
9582
9583 @node Document Server Internals
9584 @subsubsection Document Server Internals
9585
9586 Adding new document types to be recognized by @code{nndoc} isn't
9587 difficult.  You just have to whip up a definition of what the document
9588 looks like, write a predicate function to recognize that document type,
9589 and then hook into @code{nndoc}.
9590
9591 First, here's an example document type definition:
9592
9593 @example
9594 (mmdf 
9595  (article-begin .  "^\^A\^A\^A\^A\n")
9596  (body-end .  "^\^A\^A\^A\^A\n"))
9597 @end example
9598
9599 The definition is simply a unique @dfn{name} followed by a series of
9600 regexp pseudo-variable settings.  Below are the possible
9601 variables---don't be daunted by the number of variables; most document
9602 types can be defined with very few settings:
9603
9604 @table @code
9605 @item first-article
9606 If present, @code{nndoc} will skip past all text until it finds
9607 something that match this regexp.  All text before this will be
9608 totally ignored. 
9609
9610 @item article-begin
9611 This setting has to be present in all document type definitions.  It
9612 says what the beginning of each article looks like.
9613
9614 @item head-begin-function
9615 If present, this should be a function that moves point to the head of
9616 the article.
9617
9618 @item nndoc-head-begin
9619 If present, this should be a regexp that matches the head of the
9620 article. 
9621
9622 @item nndoc-head-end
9623 This should match the end of the head of the article.  It defaults to
9624 @samp{^$}---the empty line.
9625
9626 @item body-begin-function
9627 If present, this function should move point to the beginning of the body
9628 of the article.
9629
9630 @item body-begin
9631 This should match the beginning of the body of the article.  It defaults
9632 to @samp{^\n}.
9633
9634 @item body-end-function
9635 If present, this function should move point to the end of the body of
9636 the article.
9637
9638 @item body-end
9639 If present, this should match the end of the body of the article.
9640
9641 @item nndoc-file-end
9642 If present, this should match the end of the file.  All text after this
9643 regexp will be totally ignored. 
9644
9645 @end table
9646
9647 So, using these variables @code{nndoc} is able to dissect a document
9648 file into a series of articles, each with a head and a body.  However, a
9649 few more variables are needed since not all document types are all that
9650 news-like---variables needed to transform the head or the body into
9651 something that's palatable for Gnus:
9652
9653 @table @code
9654 @item prepare-body-function
9655 If present, this function will be called when requesting an article.  It
9656 will be called with point at the start of the body, and is useful if the
9657 document has encoded some parts of its contents. 
9658
9659 @item article-transform-function
9660 If present, this function is called when requesting an article.  It's
9661 meant to be used how more wide-ranging transformation of both head and
9662 body of the article.
9663
9664 @item generate-head-function
9665 If present, this function is called to generate a head that Gnus can
9666 understand.  It is called with the article number as a parameter, and is
9667 expected to generate a nice head for the article in question.  It is
9668 called when requesting the headers of all articles.
9669
9670 @end table
9671
9672 Let's look at the most complicated example I can come up with---standard
9673 digests:
9674
9675 @example
9676 (standard-digest
9677  (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
9678  (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
9679  (prepare-body-function . nndoc-unquote-dashes)
9680  (body-end-function . nndoc-digest-body-end)
9681  (head-end . "^ ?$")
9682  (body-begin . "^ ?\n")
9683  (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
9684  (subtype digest guess))
9685 @end example
9686
9687 We see that all text before a 70-width line of dashes is ignored; all
9688 text after a line that starts with that @samp{^End of} is also ignored;
9689 each article begins with a 30-width line of dashes; the line separating
9690 the head from the body may contain a single space; and that the body is
9691 run through @code{nndoc-unquote-dashes} before being delivered.
9692
9693 To hook your own document definition into @code{nndoc}, use the
9694 @code{nndoc-add-type} function.  It takes two parameters---the first is
9695 the definition itself and the second (optional) parameter says where in
9696 the document type definition alist to put this definition.  The alist is
9697 traversed sequentially, and @code{nndoc-TYPE-type-p} is called for each
9698 type.  So @code{nndoc-mmdf-type-p} is called to see whether a document
9699 is of @code{mmdf} type, and so on.  These type predicates should return
9700 @code{nil} if the document is not of the correct type; @code{t} if it is
9701 of the correct type; and a number if the document might be of the
9702 correct type.  A high number means high probability; a low number means
9703 low probability with @samp{0} being the lowest legal number.
9704
9705
9706 @node SOUP
9707 @subsection SOUP
9708 @cindex SOUP
9709 @cindex offline
9710
9711 In the PC world people often talk about ``offline'' newsreaders.  These
9712 are thingies that are combined reader/news transport monstrosities.
9713 With built-in modem programs.  Yecchh!
9714
9715 Of course, us Unix Weenie types of human beans use things like
9716 @code{uucp} and, like, @code{nntpd} and set up proper news and mail
9717 transport things like Ghod intended.  And then we just use normal
9718 newsreaders.  
9719
9720 However, it can sometimes be convenient to do something a that's a bit
9721 easier on the brain if you have a very slow modem, and you're not really
9722 that interested in doing things properly.  
9723
9724 A file format called @sc{soup} has been developed for transporting news
9725 and mail from servers to home machines and back again.  It can be a bit
9726 fiddly.
9727
9728 First some terminology:
9729
9730 @table @dfn
9731
9732 @item server
9733 This is the machine that is connected to the outside world and where you
9734 get news and/or mail from.
9735
9736 @item home machine
9737 This is the machine that you want to do the actual reading and responding
9738 on.  It is typically not connected to the rest of the world in any way.
9739
9740 @item packet
9741 Something that contains messages and/or commands.  There are two kinds
9742 of packets:
9743
9744 @table @dfn
9745 @item message packets
9746 These are packets made at the server, and typically contains lots of
9747 messages for you to read.  These are called @file{SoupoutX.tgz} by
9748 default, where @var{X} is a number.
9749
9750 @item response packets
9751 These are packets made at the home machine, and typically contains
9752 replies that you've written.  These are called @file{SoupinX.tgz} by
9753 default, where @var{X} is a number.
9754
9755 @end table
9756
9757 @end table
9758
9759
9760 @enumerate
9761
9762 @item
9763 You log in on the server and create a @sc{soup} packet.  You can either
9764 use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
9765 can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
9766 s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
9767
9768 @item 
9769 You transfer the packet home.  Rail, boat, car or modem will do fine.
9770
9771 @item
9772 You put the packet in your home directory.
9773
9774 @item
9775 You fire up Gnus on your home machine using the @code{nnsoup} backend as
9776 the native or secondary server.
9777
9778 @item
9779 You read articles and mail and answer and followup to the things you
9780 want (@pxref{SOUP Replies}).
9781
9782 @item 
9783 You do the @kbd{G s r} command to pack these replies into a @sc{soup}
9784 packet.
9785
9786 @item 
9787 You transfer this packet to the server.  
9788
9789 @item
9790 You use Gnus to mail this packet out with the @kbd{G s s} command.
9791
9792 @item
9793 You then repeat until you die.
9794
9795 @end enumerate
9796
9797 So you basically have a bipartite system---you use @code{nnsoup} for
9798 reading and Gnus for packing/sending these @sc{soup} packets.
9799
9800 @menu
9801 * SOUP Commands::     Commands for creating and sending @sc{soup} packets
9802 * SOUP Groups::       A backend for reading @sc{soup} packets.
9803 * SOUP Replies::      How to enable @code{nnsoup} to take over mail and news.
9804 @end menu
9805
9806
9807 @node SOUP Commands
9808 @subsubsection SOUP Commands
9809
9810 These are commands for creating and manipulating @sc{soup} packets.
9811
9812 @table @kbd
9813 @item G s b
9814 @kindex G s b (Group)
9815 @findex gnus-group-brew-soup
9816 Pack all unread articles in the current group
9817 (@code{gnus-group-brew-soup}).  This command understands the
9818 process/prefix convention.
9819
9820 @item G s w
9821 @kindex G s w (Group)
9822 @findex gnus-soup-save-areas
9823 Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
9824
9825 @item G s s
9826 @kindex G s s (Group)
9827 @findex gnus-soup-send-replies
9828 Send all replies from the replies packet
9829 (@code{gnus-soup-send-replies}). 
9830
9831 @item G s p
9832 @kindex G s p (Group)
9833 @findex gnus-soup-pack-packet
9834 Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}). 
9835
9836 @item G s r
9837 @kindex G s r (Group)
9838 @findex nnsoup-pack-replies
9839 Pack all replies into a replies packet (@code{nnsoup-pack-replies}). 
9840
9841 @item O s
9842 @kindex O s (Summary)
9843 @findex gnus-soup-add-article
9844 This summary-mode command adds the current article to a @sc{soup} packet
9845 (@code{gnus-soup-add-article}).  It understands the process/prefix
9846 convention (@pxref{Process/Prefix}). 
9847
9848 @end table
9849
9850
9851 There are a few variables to customize where Gnus will put all these
9852 thingies:  
9853
9854 @table @code
9855
9856 @item gnus-soup-directory
9857 @vindex gnus-soup-directory
9858 Directory where Gnus will save intermediate files while composing
9859 @sc{soup} packets.  The default is @file{~/SoupBrew/}. 
9860
9861 @item gnus-soup-replies-directory
9862 @vindex gnus-soup-replies-directory
9863 This is what Gnus will use as a temporary directory while sending our
9864 reply packets.  @file{~/SoupBrew/SoupReplies/} is the default.
9865
9866 @item gnus-soup-prefix-file
9867 @vindex gnus-soup-prefix-file
9868 Name of the file where Gnus stores the last used prefix.  The default is
9869 @samp{gnus-prefix}. 
9870
9871 @item gnus-soup-packer
9872 @vindex gnus-soup-packer
9873 A format string command for packing a @sc{soup} packet.  The default is
9874 @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}. 
9875
9876 @item gnus-soup-unpacker
9877 @vindex gnus-soup-unpacker
9878 Format string command for unpacking a @sc{soup} packet.  The default is
9879 @samp{gunzip -c %s | tar xvf -}.
9880
9881 @item gnus-soup-packet-directory
9882 @vindex gnus-soup-packet-directory
9883 Where Gnus will look for reply packets.  The default is @file{~/}. 
9884
9885 @item gnus-soup-packet-regexp
9886 @vindex gnus-soup-packet-regexp
9887 Regular expression matching @sc{soup} reply packets in
9888 @code{gnus-soup-packet-directory}. 
9889
9890 @end table
9891  
9892
9893 @node SOUP Groups
9894 @subsubsection @sc{soup} Groups
9895 @cindex nnsoup
9896
9897 @code{nnsoup} is the backend for reading @sc{soup} packets.  It will
9898 read incoming packets, unpack them, and put them in a directory where
9899 you can read them at leisure.
9900
9901 These are the variables you can use to customize its behavior:
9902
9903 @table @code
9904
9905 @item nnsoup-tmp-directory
9906 @vindex nnsoup-tmp-directory
9907 When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
9908 directory.  (@file{/tmp/} by default.)  
9909
9910 @item nnsoup-directory
9911 @vindex nnsoup-directory
9912 @code{nnsoup} then moves each message and index file to this directory.
9913 The default is @file{~/SOUP/}.
9914
9915 @item nnsoup-replies-directory 
9916 @vindex nnsoup-replies-directory 
9917 All replies will stored in this directory before being packed into a
9918 reply packet.  The default is @file{~/SOUP/replies/"}.
9919
9920 @item nnsoup-replies-format-type
9921 @vindex nnsoup-replies-format-type
9922 The @sc{soup} format of the replies packets.  The default is @samp{?n}
9923 (rnews), and I don't think you should touch that variable.  I probably
9924 shouldn't even have documented it.  Drats!  Too late!
9925
9926 @item nnsoup-replies-index-type
9927 @vindex nnsoup-replies-index-type
9928 The index type of the replies packet.  The is @samp{?n}, which means
9929 ``none''.  Don't fiddle with this one either!
9930
9931 @item nnsoup-active-file
9932 @vindex nnsoup-active-file
9933 Where @code{nnsoup} stores lots of information.  This is not an ``active
9934 file'' in the @code{nntp} sense; it's an Emacs Lisp file.  If you lose
9935 this file or mess it up in any way, you're dead.  The default is
9936 @file{~/SOUP/active}.
9937
9938 @item nnsoup-packer
9939 @vindex nnsoup-packer
9940 Format string command for packing a reply @sc{soup} packet.  The default
9941 is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}. 
9942
9943 @item nnsoup-unpacker
9944 @vindex nnsoup-unpacker
9945 Format string command for unpacking incoming @sc{soup} packets.  The
9946 default is @samp{gunzip -c %s | tar xvf -}. 
9947
9948 @item nnsoup-packet-directory
9949 @vindex nnsoup-packet-directory
9950 Where @code{nnsoup} will look for incoming packets.  The default is
9951 @file{~/}.  
9952
9953 @item nnsoup-packet-regexp
9954 @vindex nnsoup-packet-regexp
9955 Regular expression matching incoming @sc{soup} packets.  The default is
9956 @samp{Soupout}. 
9957
9958 @end table
9959
9960
9961 @node SOUP Replies
9962 @subsubsection SOUP Replies
9963
9964 Just using @code{nnsoup} won't mean that your postings and mailings end
9965 up in @sc{soup} reply packets automagically.  You have to work a bit
9966 more for that to happen.
9967
9968 @findex nnsoup-set-variables
9969 The @code{nnsoup-set-variables} command will set the appropriate
9970 variables to ensure that all your followups and replies end up in the
9971 @sc{soup} system.
9972
9973 In specific, this is what it does:
9974
9975 @lisp
9976 (setq message-send-news-function 'nnsoup-request-post)
9977 (setq message-send-mail-function 'nnsoup-request-mail)
9978 @end lisp
9979
9980 And that's it, really.  If you only want news to go into the @sc{soup}
9981 system you just use the first line.  If you only want mail to be
9982 @sc{soup}ed you use the second.
9983
9984
9985 @node Web Searches
9986 @subsection Web Searches
9987 @cindex nnweb
9988 @cindex DejaNews
9989 @cindex Alta Vista
9990 @cindex InReference
9991 @cindex Usenet searches
9992 @cindex searching the Usenet
9993
9994 It's, like, too neat to search the Usenet for articles that match a
9995 string, but it, like, totally @emph{sucks}, like, totally, to use one of
9996 those, like, Web browsers, and you, like, have to, rilly, like, look at
9997 the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
9998 searches without having to use a browser.
9999
10000 The @code{nnweb} backend allows an easy interface to the mighty search
10001 engine.  You create an @code{nnweb} group, enter a search pattern, and
10002 then enter the group and read the articles like you would any normal
10003 group.  The @kbd{G w} command in the group buffer (@pxref{Foreign
10004 Groups}) will do this in an easy-to-use fashion.
10005
10006 @code{nnweb} groups don't really lend themselves to being solid
10007 groups---they have a very fleeting idea of article numbers.  In fact,
10008 each time you enter an @code{nnweb} group (not even changing the search
10009 pattern), you are likely to get the articles ordered in a different
10010 manner.  Not even using duplicate suppression (@code{Duplicate
10011 Suppression}) will help, since @code{nnweb} doesn't even know the
10012 @code{Message-ID} of the articles before reading them using some search
10013 engines (DejaNews, for instance).  The only possible way to keep track
10014 of which articles you've read is by scoring on the @code{Date}
10015 header---mark all articles that were posted before the last date you
10016 read the group as read.
10017
10018 If the search engine changes its output substantially, @code{nnweb}
10019 won't be able to parse it and will fail.  One could hardly fault the Web
10020 providers if they were to do this---their @emph{raison d'être} is to
10021 make money off of advertisements, not to provide services to the
10022 community.  Since @code{nnweb} washes the ads off all the articles, one
10023 might think that the providers might be somewhat miffed.  We'll see.
10024
10025 You must have the @code{url} and @code{w3} package installed to be able
10026 to use @code{nnweb}.
10027
10028 Virtual server variables:
10029
10030 @table @code
10031 @item nnweb-type
10032 @vindex nnweb-type
10033 What search engine type is being used.  The currently supported types
10034 are @code{dejanews}, @code{altavista} and @code{reference}.
10035
10036 @item nnweb-search
10037 @vindex nnweb-search
10038 The search string to feed to the search engine.
10039
10040 @item nnweb-max-hits
10041 @vindex nnweb-max-hits
10042 Advisory maximum number of hits per search to display.  The default is
10043 100.
10044
10045 @item nnweb-type-definition
10046 @vindex nnweb-type-definition
10047 Type-to-definition alist.  This alist says what @code{nnweb} should do
10048 with the various search engine types.  The following elements must be
10049 present: 
10050
10051 @table @code
10052 @item article
10053 Function to decode the article and provide something that Gnus
10054 understands. 
10055
10056 @item map
10057 Function to create an article number to message header and URL alist. 
10058
10059 @item search
10060 Function to send the search string to the search engine.
10061
10062 @item address
10063 The address the aforementioned function should send the search string
10064 to. 
10065
10066 @item id
10067 Format string URL to fetch an article by @code{Message-ID}.
10068 @end table
10069
10070 @end table
10071
10072
10073
10074 @node Mail-To-News Gateways
10075 @subsection Mail-To-News Gateways
10076 @cindex mail-to-news gateways
10077 @cindex gateways
10078
10079 If your local @code{nntp} server doesn't allow posting, for some reason
10080 or other, you can post using one of the numerous mail-to-news gateways.
10081 The @code{nngateway} backend provides the interface.
10082
10083 Note that you can't read anything from this backend---it can only be
10084 used to post with.
10085
10086 Server variables:
10087
10088 @table @code
10089 @item nngateway-address 
10090 @vindex nngateway-address 
10091 This is the address of the mail-to-news gateway.
10092
10093 @item nngateway-header-transformation
10094 @vindex nngateway-header-transformation
10095 News headers have often have to be transformed in some odd way or other
10096 for the mail-to-news gateway to accept it.  This variable says what 
10097 transformation should be called, and defaults to
10098 @code{nngateway-simple-header-transformation}.  The function is called
10099 narrowed to the headers to be transformed and with one parameter---the
10100 gateway address.
10101
10102 This default function just inserts a new @code{To} header based on the
10103 @code{Newsgroups} header and the gateway address---an article with this
10104 @code{Newsgroups} header:
10105
10106 @example
10107 Newsgroups: alt.religion.emacs
10108 @end example
10109
10110 will get this @code{From} header inserted:
10111
10112 @example
10113 To: alt-religion-emacs@@GATEWAY
10114 @end example
10115
10116 @end table
10117
10118 So, to use this, simply say something like:
10119
10120 @lisp
10121 (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
10122 @end lisp
10123
10124
10125 @node Combined Groups
10126 @section Combined Groups
10127
10128 Gnus allows combining a mixture of all the other group types into bigger
10129 groups.
10130
10131 @menu
10132 * Virtual Groups::     Combining articles from many groups.
10133 * Kibozed Groups::     Looking through parts of the newsfeed for articles.
10134 @end menu
10135
10136
10137 @node Virtual Groups
10138 @subsection Virtual Groups
10139 @cindex nnvirtual
10140 @cindex virtual groups
10141
10142 An @dfn{nnvirtual group} is really nothing more than a collection of
10143 other groups.
10144
10145 For instance, if you are tired of reading many small group, you can
10146 put them all in one big group, and then grow tired of reading one
10147 big, unwieldy group.  The joys of computing!
10148
10149 You specify @code{nnvirtual} as the method.  The address should be a
10150 regexp to match component groups.
10151
10152 All marks in the virtual group will stick to the articles in the
10153 component groups.  So if you tick an article in a virtual group, the
10154 article will also be ticked in the component group from whence it came.
10155 (And vice versa---marks from the component groups will also be shown in
10156 the virtual group.)
10157
10158 Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
10159 newsgroups into one, big, happy newsgroup:
10160
10161 @lisp
10162 (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
10163 @end lisp
10164
10165 The component groups can be native or foreign; everything should work
10166 smoothly, but if your computer explodes, it was probably my fault.
10167
10168 Collecting the same group from several servers might actually be a good
10169 idea if users have set the Distribution header to limit distribution.
10170 If you would like to read @samp{soc.motss} both from a server in Japan
10171 and a server in Norway, you could use the following as the group regexp:
10172
10173 @example
10174 "^nntp+some.server.jp:soc.motss$\\|^nntp+some.server.no:soc.motss$"
10175 @end example
10176
10177 This should work kinda smoothly---all articles from both groups should
10178 end up in this one, and there should be no duplicates.  Threading (and
10179 the rest) will still work as usual, but there might be problems with the
10180 sequence of articles.  Sorting on date might be an option here
10181 (@pxref{Selecting a Group}.
10182
10183 One limitation, however---all groups that are included in a virtual
10184 group has to be alive (i.e., subscribed or unsubscribed).  Killed or
10185 zombie groups can't be component groups for @code{nnvirtual} groups.
10186
10187 @vindex nnvirtual-always-rescan
10188 If the @code{nnvirtual-always-rescan} is non-@code{nil},
10189 @code{nnvirtual} will always scan groups for unread articles when
10190 entering a virtual group.  If this variable is @code{nil} (which is the
10191 default) and you read articles in a component group after the virtual
10192 group has been activated, the read articles from the component group
10193 will show up when you enter the virtual group.  You'll also see this
10194 effect if you have two virtual groups that contain the same component
10195 group.  If that's the case, you should set this variable to @code{t}.
10196 Or you can just tap @code{M-g} on the virtual group every time before
10197 you enter it---it'll have much the same effect.
10198
10199
10200 @node Kibozed Groups
10201 @subsection Kibozed Groups
10202 @cindex nnkiboze
10203 @cindex kibozing
10204
10205 @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
10206 the news feed''.  @code{nnkiboze} is a backend that will do this for
10207 you.  Oh joy!  Now you can grind any @sc{nntp} server down to a halt
10208 with useless requests!  Oh happiness!
10209
10210 @kindex G k (Group)
10211 To create a kibozed group, use the @kbd{G k} command in the group
10212 buffer. 
10213
10214 The address field of the @code{nnkiboze} method is, as with
10215 @code{nnvirtual}, a regexp to match groups to be ``included'' in the
10216 @code{nnkiboze} group.  There most similarities between @code{nnkiboze}
10217 and @code{nnvirtual} ends.
10218
10219 In addition to this regexp detailing component groups, an @code{nnkiboze} group
10220 must have a score file to say what articles that are to be included in
10221 the group (@pxref{Scoring}).
10222
10223 @kindex M-x nnkiboze-generate-groups
10224 @findex nnkiboze-generate-groups
10225 You must run @kbd{M-x nnkiboze-generate-groups} after creating the
10226 @code{nnkiboze} groups you want to have.  This command will take time.  Lots of
10227 time.  Oodles and oodles of time.  Gnus has to fetch the headers from
10228 all the articles in all the components groups and run them through the
10229 scoring process to determine if there are any articles in the groups
10230 that are to be part of the @code{nnkiboze} groups.
10231
10232 Please limit the number of component groups by using restrictive
10233 regexps.  Otherwise your sysadmin may become annoyed with you, and the
10234 @sc{nntp} site may throw you off and never let you back in again.
10235 Stranger things have happened.
10236
10237 @code{nnkiboze} component groups do not have to be alive---they can be dead,
10238 and they can be foreign.  No restrictions.
10239
10240 @vindex nnkiboze-directory
10241 The generation of an @code{nnkiboze} group means writing two files in
10242 @code{nnkiboze-directory}, which is @file{~/News/} by default.  One
10243 contains the @sc{nov} header lines for all the articles in the group,
10244 and the other is an additional @file{.newsrc} file to store information
10245 on what groups that have been searched through to find component
10246 articles.
10247
10248 Articles that are marked as read in the @code{nnkiboze} group will have their
10249 @sc{nov} lines removed from the @sc{nov} file.
10250
10251
10252 @node Scoring
10253 @chapter Scoring
10254 @cindex scoring
10255
10256 Other people use @dfn{kill files}, but we here at Gnus Towers like
10257 scoring better than killing, so we'd rather switch than fight.  They do
10258 something completely different as well, so sit up straight and pay
10259 attention!
10260
10261 @vindex gnus-summary-mark-below
10262 All articles have a default score (@code{gnus-summary-default-score}),
10263 which is 0 by default.  This score may be raised or lowered either
10264 interactively or by score files.  Articles that have a score lower than
10265 @code{gnus-summary-mark-below} are marked as read.
10266
10267 Gnus will read any @dfn{score files} that apply to the current group
10268 before generating the summary buffer.
10269
10270 There are several commands in the summary buffer that insert score
10271 entries based on the current article.  You can, for instance, ask Gnus to
10272 lower or increase the score of all articles with a certain subject.
10273
10274 There are two sorts of scoring entries: Permanent and temporary.
10275 Temporary score entries are self-expiring entries.  Any entries that are
10276 temporary and have not been used for, say, a week, will be removed
10277 silently to help keep the sizes of the score files down.
10278
10279 @menu 
10280 * Summary Score Commands::   Adding score entries for the current group.
10281 * Group Score Commands::     General score commands.
10282 * Score Variables::          Customize your scoring.  (My, what terminology).
10283 * Score File Format::        What a score file may contain.
10284 * Score File Editing::       You can edit score files by hand as well.
10285 * Adaptive Scoring::         Big Sister Gnus knows what you read.
10286 * Home Score File::          How to say where new score entries are to go.
10287 * Followups To Yourself::    Having Gnus notice when people answer you.
10288 * Scoring Tips::             How to score effectively.
10289 * Reverse Scoring::          That problem child of old is not problem.
10290 * Global Score Files::       Earth-spanning, ear-splitting score files.
10291 * Kill Files::               They are still here, but they can be ignored.
10292 * Converting Kill Files::    Translating kill files to score files.
10293 * GroupLens::                Getting predictions on what you like to read.
10294 * Advanced Scoring::         Using logical expressions to build score rules.
10295 * Score Decays::             It can be useful to let scores wither away.
10296 @end menu
10297
10298
10299 @node Summary Score Commands
10300 @section Summary Score Commands
10301 @cindex score commands
10302
10303 The score commands that alter score entries do not actually modify real
10304 score files.  That would be too inefficient.  Gnus maintains a cache of
10305 previously loaded score files, one of which is considered the
10306 @dfn{current score file alist}.  The score commands simply insert
10307 entries into this list, and upon group exit, this list is saved.
10308
10309 The current score file is by default the group's local score file, even
10310 if no such score file actually exists.  To insert score commands into
10311 some other score file (e.g. @file{all.SCORE}), you must first make this
10312 score file the current one.
10313
10314 General score commands that don't actually change the score file:
10315
10316 @table @kbd
10317
10318 @item V s
10319 @kindex V s (Summary)
10320 @findex gnus-summary-set-score
10321 Set the score of the current article (@code{gnus-summary-set-score}).  
10322
10323 @item V S
10324 @kindex V S (Summary)
10325 @findex gnus-summary-current-score
10326 Display the score of the current article
10327 (@code{gnus-summary-current-score}).   
10328
10329 @item V t
10330 @kindex V t (Summary)
10331 @findex gnus-score-find-trace
10332 Display all score rules that have been used on the current article
10333 (@code{gnus-score-find-trace}).   
10334
10335 @item V R
10336 @kindex V R (Summary)
10337 @findex gnus-summary-rescore
10338 Run the current summary through the scoring process
10339 (@code{gnus-summary-rescore}).  This might be useful if you're playing
10340 around with your score files behind Gnus' back and want to see the
10341 effect you're having.
10342
10343 @item V a
10344 @kindex V a (Summary)
10345 @findex gnus-summary-score-entry
10346 Add a new score entry, and allow specifying all elements 
10347 (@code{gnus-summary-score-entry}).
10348
10349 @item V c
10350 @kindex V c (Summary)
10351 @findex gnus-score-change-score-file
10352 Make a different score file the current
10353 (@code{gnus-score-change-score-file}). 
10354
10355 @item V e
10356 @kindex V e (Summary)
10357 @findex gnus-score-edit-current-scores
10358 Edit the current score file (@code{gnus-score-edit-current-scores}).
10359 You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
10360 File Editing}).
10361
10362 @item V f
10363 @kindex V f (Summary)
10364 @findex gnus-score-edit-file
10365 Edit a score file and make this score file the current one
10366 (@code{gnus-score-edit-file}).
10367
10368 @item V F
10369 @kindex V F (Summary)
10370 @findex gnus-score-flush-cache
10371 Flush the score cache (@code{gnus-score-flush-cache}).  This is useful
10372 after editing score files.
10373
10374 @item V C
10375 @kindex V C (Summary)
10376 @findex gnus-score-customize
10377 Customize a score file in a visually pleasing manner
10378 (@code{gnus-score-customize}). 
10379
10380 @item I C-i
10381 @kindex I C-i (Summary)
10382 @findex gnus-summary-raise-score
10383 Increase the score of the current article
10384 (@code{gnus-summary-raise-score}).
10385
10386 @item L C-l
10387 @kindex L C-l (Summary)
10388 @findex gnus-summary-lower-score
10389 Lower the score of the current article
10390 (@code{gnus-summary-lower-score}). 
10391 @end table
10392
10393 The rest of these commands modify the local score file.
10394
10395 @table @kbd
10396
10397 @item V m
10398 @kindex V m (Summary)
10399 @findex gnus-score-set-mark-below
10400 Prompt for a score, and mark all articles with a score below this as
10401 read (@code{gnus-score-set-mark-below}).
10402
10403 @item V x
10404 @kindex V x (Summary)
10405 @findex gnus-score-set-expunge-below
10406 Prompt for a score, and add a score rule to the current score file to
10407 expunge all articles below this score
10408 (@code{gnus-score-set-expunge-below}).
10409 @end table
10410
10411 The keystrokes for actually making score entries follow a very regular
10412 pattern, so there's no need to list all the commands.  (Hundreds of
10413 them.)  
10414
10415 @enumerate
10416 @item
10417 The first key is either @kbd{I} (upper case i) for increasing the score
10418 or @kbd{L} for lowering the score. 
10419 @item
10420 The second key says what header you want to score on.  The following
10421 keys are available:
10422 @table @kbd
10423
10424 @item a
10425 Score on the author name.
10426
10427 @item s
10428 Score on the subject line.
10429
10430 @item x
10431 Score on the Xref line---i.e., the cross-posting line.
10432
10433 @item t
10434 Score on thread---the References line.
10435
10436 @item d
10437 Score on the date.
10438
10439 @item l
10440 Score on the number of lines.
10441
10442 @item i
10443 Score on the Message-ID.
10444
10445 @item f
10446 Score on followups.
10447
10448 @item b
10449 Score on the body.
10450
10451 @item h
10452 Score on the head.
10453 @end table
10454
10455 @item
10456 The third key is the match type.  Which match types are legal depends on
10457 what headers you are scoring on.
10458
10459 @table @code
10460
10461 @item strings 
10462
10463 @table @kbd
10464
10465 @item e
10466 Exact matching.
10467
10468 @item s
10469 Substring matching.
10470
10471 @item f
10472 Fuzzy matching.
10473
10474 @item r
10475 Regexp matching
10476 @end table
10477
10478 @item date
10479 @table @kbd
10480
10481 @item b
10482 Before date.
10483
10484 @item a
10485 At date.
10486
10487 @item n
10488 This date.
10489 @end table
10490
10491 @item number
10492 @table @kbd
10493
10494 @item <
10495 Less than number.
10496
10497 @item =
10498 Equal to number.
10499
10500 @item >
10501 Greater than number.
10502 @end table
10503 @end table
10504
10505 @item 
10506 The fourth and final key says whether this is a temporary (i.e., expiring)
10507 score entry, or a permanent (i.e., non-expiring) score entry, or whether
10508 it is to be done immediately, without adding to the score file.
10509 @table @kbd
10510
10511 @item t
10512 Temporary score entry.
10513
10514 @item p
10515 Permanent score entry.
10516
10517 @item i
10518 Immediately scoring.
10519 @end table
10520
10521 @end enumerate
10522
10523 So, let's say you want to increase the score on the current author with
10524 exact matching permanently: @kbd{I a e p}.  If you want to lower the
10525 score based on the subject line, using substring matching, and make a
10526 temporary score entry: @kbd{L s s t}.  Pretty easy.
10527
10528 To make things a bit more complicated, there are shortcuts.  If you use
10529 a capital letter on either the second or third keys, Gnus will use
10530 defaults for the remaining one or two keystrokes.  The defaults are
10531 ``substring'' and ``temporary''.  So @kbd{I A} is the same as @kbd{I a s
10532 t}, and @kbd{I a R} is the same as @kbd{I a r t}.
10533
10534 @vindex gnus-score-mimic-keymap
10535 The @code{gnus-score-mimic-keymap} says whether these commands will
10536 pretend they are keymaps or not.
10537
10538
10539 @node Group Score Commands
10540 @section Group Score Commands
10541 @cindex group score commands
10542
10543 There aren't many of these as yet, I'm afraid.
10544
10545 @table @kbd
10546
10547 @item W f
10548 @kindex W f (Group)
10549 @findex gnus-score-flush-cache
10550 Gnus maintains a cache of score alists to avoid having to reload them
10551 all the time.  This command will flush the cache
10552 (@code{gnus-score-flush-cache}). 
10553
10554 @end table
10555
10556
10557 @node Score Variables
10558 @section Score Variables
10559 @cindex score variables
10560
10561 @table @code
10562
10563 @item gnus-use-scoring
10564 @vindex gnus-use-scoring
10565 If @code{nil}, Gnus will not check for score files, and will not, in
10566 general, do any score-related work.  This is @code{t} by default.
10567
10568 @item gnus-kill-killed
10569 @vindex gnus-kill-killed
10570 If this variable is @code{nil}, Gnus will never apply score files to
10571 articles that have already been through the kill process.  While this
10572 may save you lots of time, it also means that if you apply a kill file
10573 to a group, and then change the kill file and want to run it over you
10574 group again to kill more articles, it won't work.  You have to set this
10575 variable to @code{t} to do that.  (It is @code{t} by default.)
10576
10577 @item gnus-kill-files-directory
10578 @vindex gnus-kill-files-directory
10579 All kill and score files will be stored in this directory, which is
10580 initialized from the @code{SAVEDIR} environment variable by default.
10581 This is @file{~/News/} by default.
10582
10583 @item gnus-score-file-suffix
10584 @vindex gnus-score-file-suffix
10585 Suffix to add to the group name to arrive at the score file name
10586 (@samp{SCORE} by default.)
10587
10588 @item gnus-score-uncacheable-files
10589 @vindex gnus-score-uncacheable-files
10590 @cindex score cache
10591 All score files are normally cached to avoid excessive re-loading of
10592 score files.  However, if this might make you Emacs grow big and
10593 bloated, so this regexp can be used to weed out score files that are
10594 unlikely to be needed again.  It would be a bad idea to deny caching of
10595 @file{all.SCORE}, while it might be a good idea to not cache
10596 @file{comp.infosystems.www.authoring.misc.ADAPT}.  In fact, this
10597 variable is @samp{ADAPT$} by default, so no adaptive score files will
10598 be cached.
10599
10600 @item gnus-save-score
10601 @vindex gnus-save-score
10602 If you have really complicated score files, and do lots of batch
10603 scoring, then you might set this variable to @code{t}.  This will make
10604 Gnus save the scores into the @file{.newsrc.eld} file.
10605
10606 @item gnus-score-interactive-default-score
10607 @vindex gnus-score-interactive-default-score
10608 Score used by all the interactive raise/lower commands to raise/lower
10609 score with.  Default is 1000, which may seem excessive, but this is to
10610 ensure that the adaptive scoring scheme gets enough room to play with.
10611 We don't want the small changes from the adaptive scoring to overwrite
10612 manually entered data.
10613
10614 @item gnus-summary-default-score
10615 @vindex gnus-summary-default-score
10616 Default score of an article, which is 0 by default.
10617
10618 @item gnus-score-over-mark
10619 @vindex gnus-score-over-mark
10620 Mark (in the third column) used for articles with a score over the
10621 default.  Default is @samp{+}.
10622
10623 @item gnus-score-below-mark
10624 @vindex gnus-score-below-mark
10625 Mark (in the third column) used for articles with a score below the
10626 default.  Default is @samp{-}.
10627
10628 @item gnus-score-find-score-files-function
10629 @vindex gnus-score-find-score-files-function
10630 Function used to find score files for the current group.  This function
10631 is called with the name of the group as the argument. 
10632
10633 Predefined functions available are:
10634 @table @code
10635
10636 @item gnus-score-find-single
10637 @findex gnus-score-find-single
10638 Only apply the group's own score file.
10639
10640 @item gnus-score-find-bnews
10641 @findex gnus-score-find-bnews
10642 Apply all score files that match, using bnews syntax.  This is the
10643 default.  If the current group is @samp{gnu.emacs.gnus}, for instance, 
10644 @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
10645 @file{gnu.all.SCORE} would all apply.  In short, the instances of
10646 @samp{all} in the score file names are translated into @samp{.*}, and
10647 then a regexp match is done.
10648
10649 This means that if you have some score entries that you want to apply to
10650 all groups, then you put those entries in the @file{all.SCORE} file. 
10651
10652 The score files are applied in a semi-random order, although Gnus will
10653 try to apply the more general score files before the more specific score
10654 files.  It does this by looking at the number of elements in the score
10655 file names---discarding the @samp{all} elements.
10656
10657 @item gnus-score-find-hierarchical
10658 @findex gnus-score-find-hierarchical
10659 Apply all score files from all the parent groups.  This means that you
10660 can't have score files like @file{all.SCORE}, but you can have
10661 @file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE}.
10662
10663 @end table
10664 This variable can also be a list of functions.  In that case, all these
10665 functions will be called, and all the returned lists of score files will
10666 be applied.  These functions can also return lists of score alists
10667 directly.  In that case, the functions that return these non-file score
10668 alists should probably be placed before the ``real'' score file
10669 functions, to ensure that the last score file returned is the local
10670 score file.  Phu.
10671
10672 @item gnus-score-expiry-days
10673 @vindex gnus-score-expiry-days
10674 This variable says how many days should pass before an unused score file
10675 entry is expired.  If this variable is @code{nil}, no score file entries
10676 are expired.  It's 7 by default.
10677
10678 @item gnus-update-score-entry-dates
10679 @vindex gnus-update-score-entry-dates
10680 If this variable is non-@code{nil}, matching score entries will have
10681 their dates updated.  (This is how Gnus controls expiry---all
10682 non-matching entries will become too old while matching entries will
10683 stay fresh and young.)  However, if you set this variable to @code{nil},
10684 even matching entries will grow old and will have to face that oh-so
10685 grim reaper.  
10686
10687 @item gnus-score-after-write-file-function
10688 @vindex gnus-score-after-write-file-function
10689 Function called with the name of the score file just written.
10690
10691 @end table
10692
10693
10694 @node Score File Format
10695 @section Score File Format
10696 @cindex score file format
10697
10698 A score file is an @code{emacs-lisp} file that normally contains just a
10699 single form.  Casual users are not expected to edit these files;
10700 everything can be changed from the summary buffer.
10701
10702 Anyway, if you'd like to dig into it yourself, here's an example:
10703
10704 @lisp
10705 (("from"
10706   ("Lars Ingebrigtsen" -10000)
10707   ("Per Abrahamsen")
10708   ("larsi\\|lmi" -50000 nil R))
10709  ("subject"
10710   ("Ding is Badd" nil 728373))
10711  ("xref"
10712   ("alt.politics" -1000 728372 s))
10713  ("lines"
10714   (2 -100 nil <))
10715  (mark 0)
10716  (expunge -1000)
10717  (mark-and-expunge -10)
10718  (read-only nil)
10719  (orphan -10)
10720  (adapt t)
10721  (files "/hom/larsi/News/gnu.SCORE")
10722  (exclude-files "all.SCORE")
10723  (local (gnus-newsgroup-auto-expire t)
10724         (gnus-summary-make-false-root 'empty))
10725  (eval (ding)))
10726 @end lisp
10727
10728 This example demonstrates absolutely everything about a score file. 
10729
10730 Even though this looks much like lisp code, nothing here is actually
10731 @code{eval}ed.  The lisp reader is used to read this form, though, so it
10732 has to be legal syntactically, if not semantically.
10733
10734 Six keys are supported by this alist:
10735
10736 @table @code
10737
10738 @item STRING
10739 If the key is a string, it is the name of the header to perform the
10740 match on.  Scoring can only be performed on these eight headers:
10741 @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
10742 @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}.  In addition to
10743 these headers, there are three strings to tell Gnus to fetch the entire
10744 article and do the match on larger parts of the article: @code{Body}
10745 will perform the match on the body of the article, @code{Head} will
10746 perform the match on the head of the article, and @code{All} will
10747 perform the match on the entire article.  Note that using any of these
10748 last three keys will slow down group entry @emph{considerably}.  The
10749 final ``header'' you can score on is @code{Followup}.  These score
10750 entries will result in new score entries being added for all follow-ups
10751 to articles that matches these score entries.
10752
10753 Following this key is a arbitrary number of score entries, where each
10754 score entry has one to four elements.
10755 @enumerate
10756
10757 @item 
10758 The first element is the @dfn{match element}.  On most headers this will
10759 be a string, but on the Lines and Chars headers, this must be an
10760 integer. 
10761
10762 @item 
10763 If the second element is present, it should be a number---the @dfn{score
10764 element}.  This number should be an integer in the neginf to posinf
10765 interval.  This number is added to the score of the article if the match
10766 is successful.  If this element is not present, the
10767 @code{gnus-score-interactive-default-score} number will be used
10768 instead.  This is 1000 by default.
10769
10770 @item 
10771 If the third element is present, it should be a number---the @dfn{date
10772 element}.  This date says when the last time this score entry matched,
10773 which provides a mechanism for expiring the score entries.  It this
10774 element is not present, the score entry is permanent.  The date is
10775 represented by the number of days since December 31, 1 ce.
10776
10777 @item 
10778 If the fourth element is present, it should be a symbol---the @dfn{type
10779 element}.  This element specifies what function should be used to see
10780 whether this score entry matches the article.  What match types that can
10781 be used depends on what header you wish to perform the match on.
10782 @table @dfn
10783
10784 @item From, Subject, References, Xref, Message-ID
10785 For most header types, there are the @code{r} and @code{R} (regexp), as
10786 well as @code{s} and @code{S} (substring) types, and @code{e} and
10787 @code{E} (exact match), and @code{w} (word match) types.  If this
10788 element is not present, Gnus will assume that substring matching should
10789 be used.  @code{R}, @code{S}, and @code{E} differ from the others in
10790 that the matches will be done in a case-sensitive manner.  All these
10791 one-letter types are really just abbreviations for the @code{regexp},
10792 @code{string}, @code{exact}, and @code{word} types, which you can use
10793 instead, if you feel like.
10794
10795 @item Lines, Chars
10796 These two headers use different match types: @code{<}, @code{>},
10797 @code{=}, @code{>=} and @code{<=}.  When matching on @code{Lines}, be
10798 careful because some backends (like @code{nndir}) do not generate
10799 @code{Lines} header, so every article ends up being marked as having 0
10800 lines.  This can lead to strange results if you happen to lower score of
10801 the articles with few lines.
10802
10803 @item Date
10804 For the Date header we have three kinda silly match types:
10805 @code{before}, @code{at} and @code{after}.  I can't really imagine this
10806 ever being useful, but, like, it would feel kinda silly not to provide
10807 this function.  Just in case.  You never know.  Better safe than sorry.
10808 Once burnt, twice shy.  Don't judge a book by its cover.  Never not have
10809 sex on a first date.  (I have been told that at least one person, and I
10810 quote, ``found this function indispensable'', however.)
10811
10812 @cindex ISO8601
10813 @cindex date
10814 A more useful match type is @code{regexp}.  With it, you can match the
10815 date string using a regular expression.  The date is normalized to
10816 ISO8601 compact format first---@samp{YYYYMMDDTHHMMSS}.  If you want to
10817 match all articles that have been posted on April 1st in every year, you
10818 could use @samp{....0401.........} as a match string, for instance.
10819 (Note that the date is kept in its original time zone, so this will
10820 match articles that were posted when it was April 1st where the article
10821 was posted from.  Time zones are such wholesome fun for the whole
10822 family, eh?)
10823
10824 @item Head, Body, All
10825 These three match keys use the same match types as the @code{From} (etc)
10826 header uses.
10827
10828 @item Followup
10829 This match key is somewhat special, in that it will match the
10830 @code{From} header, and affect the score of not only the matching
10831 articles, but also all followups to the matching articles.  This allows
10832 you e.g. increase the score of followups to your own articles, or
10833 decrease the score of followups to the articles of some known
10834 trouble-maker.  Uses the same match types as the @code{From} header
10835 uses.
10836
10837 @item Thread
10838 This match key works along the same lines as the @code{Followup} match
10839 key.  If you say that you want to score on a (sub-)thread that is
10840 started by an article with a @code{Message-ID} @var{X}, then you add a
10841 @samp{thread} match.  This will add a new @samp{thread} match for each
10842 article that has @var{X} in its @code{References} header.  (These new
10843 @samp{thread} matches will use the @code{Message-ID}s of these matching
10844 articles.)  This will ensure that you can raise/lower the score of an
10845 entire thread, even though some articles in the thread may not have
10846 complete @code{References} headers.  Note that using this may lead to
10847 undeterministic scores of the articles in the thread.
10848 @end table
10849 @end enumerate
10850
10851 @item mark
10852 The value of this entry should be a number.  Any articles with a score
10853 lower than this number will be marked as read.
10854
10855 @item expunge
10856 The value of this entry should be a number.  Any articles with a score
10857 lower than this number will be removed from the summary buffer.
10858
10859 @item mark-and-expunge
10860 The value of this entry should be a number.  Any articles with a score
10861 lower than this number will be marked as read and removed from the
10862 summary buffer.
10863
10864 @item thread-mark-and-expunge
10865 The value of this entry should be a number.  All articles that belong to
10866 a thread that has a total score below this number will be marked as read
10867 and removed from the summary buffer.  @code{gnus-thread-score-function}
10868 says how to compute the total score for a thread.
10869
10870 @item files
10871 The value of this entry should be any number of file names.  These files
10872 are assumed to be score files as well, and will be loaded the same way
10873 this one was.
10874
10875 @item exclude-files
10876 The clue of this entry should be any number of files.  These files will
10877 not be loaded, even though they would normally be so, for some reason or
10878 other. 
10879
10880 @item eval
10881 The value of this entry will be @code{eval}el.  This element will be
10882 ignored when handling global score files. 
10883
10884 @item read-only
10885 Read-only score files will not be updated or saved.  Global score files
10886 should feature this atom (@pxref{Global Score Files}).
10887
10888 @item orphan
10889 The value of this entry should be a number.  Articles that do not have
10890 parents will get this number added to their scores.  Imagine you follow
10891 some high-volume newsgroup, like @samp{comp.lang.c}.  Most likely you
10892 will only follow a few of the threads, also want to see any new threads.
10893
10894 You can do this with the following two score file entries:
10895
10896 @example
10897         (orphan -500)
10898         (mark-and-expunge -100)
10899 @end example
10900
10901 When you enter the group the first time, you will only see the new
10902 threads.  You then raise the score of the threads that you find
10903 interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
10904 rest.  Next time you enter the group, you will see new articles in the
10905 interesting threads, plus any new threads.
10906
10907 I.e.---the orphan score atom is for high-volume groups where there
10908 exist a few interesting threads which can't be found automatically by
10909 ordinary scoring rules.
10910
10911 @item adapt
10912 This entry controls the adaptive scoring.  If it is @code{t}, the
10913 default adaptive scoring rules will be used.  If it is @code{ignore}, no
10914 adaptive scoring will be performed on this group.  If it is a list, this
10915 list will be used as the adaptive scoring rules.  If it isn't present,
10916 or is something other than @code{t} or @code{ignore}, the default
10917 adaptive scoring rules will be used.  If you want to use adaptive
10918 scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
10919 @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
10920 not want adaptive scoring.  If you only want adaptive scoring in a few
10921 groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
10922 insert @code{(adapt t)} in the score files of the groups where you want
10923 it. 
10924
10925 @item adapt-file
10926 All adaptive score entries will go to the file named by this entry.  It
10927 will also be applied when entering the group.  This atom might be handy
10928 if you want to adapt on several groups at once, using the same adaptive
10929 file for a number of groups.
10930
10931 @item local
10932 @cindex local variables
10933 The value of this entry should be a list of @code{(VAR VALUE)} pairs.
10934 Each @var{var} will be made buffer-local to the current summary buffer,
10935 and set to the value specified.  This is a convenient, if somewhat
10936 strange, way of setting variables in some groups if you don't like hooks
10937 much.
10938 @end table
10939
10940
10941 @node Score File Editing
10942 @section Score File Editing
10943
10944 You normally enter all scoring commands from the summary buffer, but you
10945 might feel the urge to edit them by hand as well, so we've supplied you
10946 with a mode for that.  
10947
10948 It's simply a slightly customized @code{emacs-lisp} mode, with these
10949 additional commands:
10950
10951 @table @kbd
10952
10953 @item C-c C-c
10954 @kindex C-c C-c (Score)
10955 @findex gnus-score-edit-done
10956 Save the changes you have made and return to the summary buffer
10957 (@code{gnus-score-edit-done}). 
10958
10959 @item C-c C-d
10960 @kindex C-c C-d (Score)
10961 @findex gnus-score-edit-insert-date
10962 Insert the current date in numerical format
10963 (@code{gnus-score-edit-insert-date}).  This is really the day number, if
10964 you were wondering.
10965
10966 @item C-c C-p
10967 @kindex C-c C-p (Score)
10968 @findex gnus-score-pretty-print
10969 The adaptive score files are saved in an unformatted fashion.  If you
10970 intend to read one of these files, you want to @dfn{pretty print} it
10971 first.  This command (@code{gnus-score-pretty-print}) does that for
10972 you. 
10973
10974 @end table
10975
10976 Type @kbd{M-x gnus-score-mode} to use this mode.
10977
10978 @vindex gnus-score-mode-hook
10979 @code{gnus-score-menu-hook} is run in score mode buffers.
10980
10981 In the summary buffer you can use commands like @kbd{V f} and @kbd{V
10982 e} to begin editing score files.
10983
10984
10985 @node Adaptive Scoring
10986 @section Adaptive Scoring
10987 @cindex adaptive scoring
10988
10989 If all this scoring is getting you down, Gnus has a way of making it all
10990 happen automatically---as if by magic.  Or rather, as if by artificial
10991 stupidity, to be precise.
10992
10993 @vindex gnus-use-adaptive-scoring
10994 When you read an article, or mark an article as read, or kill an
10995 article, you leave marks behind.  On exit from the group, Gnus can sniff
10996 these marks and add score elements depending on what marks it finds.
10997 You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
10998 @code{t} or @code{(line)}.  If you want score adaptively on separate
10999 words appearing in the subjects, you should set this variable to
11000 @code{(word)}.  If you want to use both adaptive methods, set this
11001 variable to @code{(word line)}.
11002
11003 @vindex gnus-default-adaptive-score-alist
11004 To give you complete control over the scoring process, you can customize
11005 the @code{gnus-default-adaptive-score-alist} variable.  For instance, it
11006 might look something like this:
11007
11008 @lisp
11009 (defvar gnus-default-adaptive-score-alist
11010   '((gnus-unread-mark)
11011     (gnus-ticked-mark (from 4))
11012     (gnus-dormant-mark (from 5))
11013     (gnus-del-mark (from -4) (subject -1))
11014     (gnus-read-mark (from 4) (subject 2))
11015     (gnus-expirable-mark (from -1) (subject -1))
11016     (gnus-killed-mark (from -1) (subject -3))
11017     (gnus-kill-file-mark)
11018     (gnus-ancient-mark)
11019     (gnus-low-score-mark)
11020     (gnus-catchup-mark (from -1) (subject -1))))
11021 @end lisp
11022
11023 As you see, each element in this alist has a mark as a key (either a
11024 variable name or a ``real'' mark---a character).  Following this key is
11025 a arbitrary number of header/score pairs.  If there are no header/score
11026 pairs following the key, no adaptive scoring will be done on articles
11027 that have that key as the article mark.  For instance, articles with
11028 @code{gnus-unread-mark} in the example above will not get adaptive score
11029 entries.
11030
11031 Each article can have only one mark, so just a single of these rules
11032 will be applied to each article.
11033
11034 To take @code{gnus-del-mark} as an example---this alist says that all
11035 articles that have that mark (i.e., are marked with @samp{D}) will have a
11036 score entry added to lower based on the @code{From} header by -4, and
11037 lowered by @code{Subject} by -1.  Change this to fit your prejudices. 
11038
11039 If you have marked 10 articles with the same subject with
11040 @code{gnus-del-mark}, the rule for that mark will be applied ten times.
11041 That means that that subject will get a score of ten times -1, which
11042 should be, unless I'm much mistaken, -10.
11043
11044 If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
11045 the read articles will be marked with the @samp{E} mark.  This'll
11046 probably make adaptive scoring slightly impossible, so auto-expiring and
11047 adaptive scoring doesn't really mix very well.
11048
11049 The headers you can score on are @code{from}, @code{subject},
11050 @code{message-id}, @code{references}, @code{xref}, @code{lines},
11051 @code{chars} and @code{date}.  In addition, you can score on
11052 @code{followup}, which will create an adaptive score entry that matches
11053 on the @code{References} header using the @code{Message-ID} of the
11054 current article, thereby matching the following thread.  
11055
11056 You can also score on @code{thread}, which will try to score all
11057 articles that appear in a thread.  @code{thread} matches uses a
11058 @code{Message-ID} to match on the @code{References} header of the
11059 article.  If the match is made, the @code{Message-ID} of the article is
11060 added to the @code{thread} rule.  (Think about it.  I'd recommend two
11061 aspirins afterwards.)
11062
11063 If you use this scheme, you should set the score file atom @code{mark}
11064 to something small---like -300, perhaps, to avoid having small random
11065 changes result in articles getting marked as read.
11066
11067 After using adaptive scoring for a week or so, Gnus should start to
11068 become properly trained and enhance the authors you like best, and kill
11069 the authors you like least, without you having to say so explicitly. 
11070
11071 You can control what groups the adaptive scoring is to be performed on
11072 by using the score files (@pxref{Score File Format}).  This will also
11073 let you use different rules in different groups.
11074
11075 @vindex gnus-adaptive-file-suffix
11076 The adaptive score entries will be put into a file where the name is the
11077 group name with @code{gnus-adaptive-file-suffix} appended.  The default
11078 is @samp{ADAPT}.
11079
11080 @vindex gnus-score-exact-adapt-limit
11081 When doing adaptive scoring, substring or fuzzy matching would probably
11082 give you the best results in most cases.  However, if the header one
11083 matches is short, the possibility for false positives is great, so if
11084 the length of the match is less than
11085 @code{gnus-score-exact-adapt-limit}, exact matching will be used.  If
11086 this variable is @code{nil}, exact matching will always be used to avoid
11087 this problem.
11088
11089 @vindex gnus-default-adaptive-word-score-alist
11090 As mentioned above, you can adapt either on individual words or entire
11091 headers.  If you adapt on words, the
11092 @code{gnus-default-adaptive-word-score-alist} variable says what score
11093 each instance of a word should add given a mark.
11094
11095 @lisp
11096 (setq gnus-default-adaptive-word-score-alist  
11097       `((,gnus-read-mark . 30)
11098         (,gnus-catchup-mark . -10)
11099         (,gnus-killed-mark . -20)
11100         (,gnus-del-mark . -15)))
11101 @end lisp
11102
11103 This is the default value.  If you have adaption on words enabled, every
11104 word that appears in subjects of articles that are marked with
11105 @code{gnus-read-mark} will result in a score rule that increase the
11106 score with 30 points.
11107
11108 @vindex gnus-default-ignored-adaptive-words
11109 @vindex gnus-ignored-adaptive-words
11110 Words that appear in the @code{gnus-default-ignored-adaptive-words} list
11111 will be ignored.  If you wish to add more words to be ignored, use the
11112 @code{gnus-ignored-adaptive-words} list instead.
11113
11114 @vindex gnus-adaptive-word-syntax-table
11115 When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
11116 syntax table in effect.  It is similar to the standard syntax table, but
11117 it considers numbers to be non-word-constituent characters.
11118
11119 After using this scheme for a while, it might be nice to write a
11120 @code{gnus-psychoanalyze-user} command to go through the rules and see
11121 what words you like and what words you don't like.  Or perhaps not.
11122
11123
11124 @node Home Score File
11125 @section Home Score File
11126
11127 The score file where new score file entries will go is called the
11128 @dfn{home score file}.  This is normally (and by default) the score file
11129 for the group itself.  For instance, the home score file for
11130 @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
11131
11132 However, this may not be what you want.  It is often convenient to share
11133 a common home score file among many groups---all @samp{emacs} groups
11134 could perhaps use the same home score file.
11135
11136 @vindex gnus-home-score-file
11137 The variable that controls this is @code{gnus-home-score-file}.  It can
11138 be:
11139
11140 @enumerate
11141 @item
11142 A string.  Then this file will be used as the home score file for all
11143 groups. 
11144
11145 @item
11146 A function. The result of this function will be used as the home score
11147 file.  The function will be called with the name of the group as the
11148 parameter. 
11149
11150 @item
11151 A list.  The elements in this list can be:
11152
11153 @enumerate
11154 @item 
11155 @var{(regexp file-name)}.  If the @var{regexp} matches the group name,
11156 the @var{file-name} will will be used as the home score file.
11157
11158 @item 
11159 A function. If the function returns non-nil, the result will be used as
11160 the home score file.
11161
11162 @item 
11163 A string.  Use the string as the home score file.
11164 @end enumerate
11165
11166 The list will be traversed from the beginning towards the end looking
11167 for matches.
11168
11169 @end enumerate
11170
11171 So, if you want to use just a single score file, you could say:
11172
11173 @lisp
11174 (setq gnus-home-score-file
11175       "my-total-score-file.SCORE")
11176 @end lisp
11177
11178 If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
11179 @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
11180
11181 @lisp
11182 (setq gnus-home-score-file
11183       'gnus-hierarchial-home-score-file)
11184 @end lisp
11185
11186 This is a ready-made function provided for your convenience.
11187
11188 If you want to have one score file for the @samp{emacs} groups and
11189 another for the @samp{comp} groups, while letting all other groups use
11190 their own home score files:
11191
11192 @lisp
11193 (setq gnus-home-score-file
11194       ;; All groups that match the regexp "\\.emacs"
11195       '("\\.emacs" "emacs.SCORE")
11196       ;; All the comp groups in one score file
11197        ("^comp" "comp.SCORE"))
11198 @end lisp
11199    
11200 @vindex gnus-home-adapt-file
11201 @code{gnus-home-adapt-file} works exactly the same way as
11202 @code{gnus-home-score-file}, but says what the home adaptive score file
11203 is instead.  All new adaptive file entries will go into the file
11204 specified by this variable, and the same syntax is allowed.
11205
11206 In addition to using @code{gnus-home-score-file} and
11207 @code{gnus-home-adapt-file}, you can also use group parameters
11208 (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
11209 Parameters}) to achieve much the same.  Group and topic parameters take
11210 precedence over this variable.
11211
11212
11213 @node Followups To Yourself
11214 @section Followups To Yourself
11215
11216 Gnus offers two commands for picking out the @code{Message-ID} header in
11217 the current buffer.  Gnus will then add a score rule that scores using
11218 this @code{Message-ID} on the @code{References} header of other
11219 articles.  This will, in effect, increase the score of all articles that
11220 respond to the article in the current buffer.  Quite useful if you want
11221 to easily note when people answer what you've said.
11222
11223 @table @code
11224
11225 @item gnus-score-followup-article
11226 @findex gnus-score-followup-article
11227 This will add a score to articles that directly follow up your own
11228 article. 
11229
11230 @item gnus-score-followup-thread
11231 @findex gnus-score-followup-thread
11232 This will add a score to all articles that appear in a thread ``below''
11233 your own article.
11234 @end table
11235
11236 @vindex message-sent-hook
11237 These two functions are both primarily meant to be used in hooks like
11238 @code{message-sent-hook}.  
11239
11240 If you look closely at your own @code{Message-ID}, you'll notice that
11241 the first two or three characters are always the same.  Here's two of
11242 mine:  
11243
11244 @example
11245 <x6u3u47icf.fsf@@eyesore.no>
11246 <x6sp9o7ibw.fsf@@eyesore.no>
11247 @end example
11248
11249 So ``my'' ident on this machine is @samp{x6}.  This can be
11250 exploited---the following rule will raise the score on all followups to
11251 myself: 
11252
11253 @lisp
11254 ("references" 
11255  "<x6[0-9a-z]+\\.fsf@@.*eyesore.no>" 1000 nil r)
11256 @end lisp
11257
11258 Whether it's the first two or first three characters that are ``yours''
11259 is system-dependent.
11260
11261
11262 @node Scoring Tips
11263 @section Scoring Tips
11264 @cindex scoring tips
11265
11266 @table @dfn
11267
11268 @item Crossposts
11269 @cindex crossposts
11270 @cindex scoring crossposts
11271 If you want to lower the score of crossposts, the line to match on is
11272 the @code{Xref} header.
11273 @lisp
11274 ("xref" (" talk.politics.misc:" -1000))
11275 @end lisp
11276
11277 @item Multiple crossposts
11278 If you want to lower the score of articles that have been crossposted to
11279 more than, say, 3 groups:
11280 @lisp
11281 ("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r))
11282 @end lisp
11283
11284 @item Matching on the body
11285 This is generally not a very good idea---it takes a very long time.
11286 Gnus actually has to fetch each individual article from the server.  But
11287 you might want to anyway, I guess.  Even though there are three match
11288 keys (@code{Head}, @code{Body} and @code{All}), you should choose one
11289 and stick with it in each score file.  If you use any two, each article
11290 will be fetched @emph{twice}.  If you want to match a bit on the
11291 @code{Head} and a bit on the @code{Body}, just use @code{All} for all
11292 the matches.  
11293
11294 @item Marking as read
11295 You will probably want to mark articles that has a score below a certain
11296 number as read.  This is most easily achieved by putting the following
11297 in your @file{all.SCORE} file:
11298 @lisp
11299 ((mark -100))
11300 @end lisp
11301 You may also consider doing something similar with @code{expunge}.  
11302
11303 @item Negated character classes
11304 If you say stuff like @code{[^abcd]*}, you may get unexpected results.
11305 That will match newlines, which might lead to, well, The Unknown.  Say
11306 @code{[^abcd\n]*} instead.
11307 @end table
11308
11309
11310 @node Reverse Scoring
11311 @section Reverse Scoring
11312 @cindex reverse scoring
11313
11314 If you want to keep just articles that have @samp{Sex with Emacs} in the
11315 subject header, and expunge all other articles, you could put something
11316 like this in your score file:
11317
11318 @lisp
11319 (("subject"
11320   ("Sex with Emacs" 2))
11321  (mark 1)
11322  (expunge 1))
11323 @end lisp
11324
11325 So, you raise all articles that match @samp{Sex with Emacs} and mark the
11326 rest as read, and expunge them to boot.
11327
11328
11329 @node Global Score Files
11330 @section Global Score Files
11331 @cindex global score files
11332
11333 Sure, other newsreaders have ``global kill files''.  These are usually
11334 nothing more than a single kill file that applies to all groups, stored
11335 in the user's home directory.  Bah!  Puny, weak newsreaders!
11336
11337 What I'm talking about here are Global Score Files.  Score files from
11338 all over the world, from users everywhere, uniting all nations in one
11339 big, happy score file union!  Ange-score!  New and untested!
11340
11341 @vindex gnus-global-score-files
11342 All you have to do to use other people's score files is to set the
11343 @code{gnus-global-score-files} variable.  One entry for each score file,
11344 or each score file directory.  Gnus will decide by itself what score
11345 files are applicable to which group.
11346
11347 Say you want to use the score file
11348 @file{/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE} and
11349 all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory:
11350
11351 @lisp
11352 (setq gnus-global-score-files
11353       '("/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE"
11354         "/ftp@@ftp.some-where:/pub/score/"))
11355 @end lisp
11356
11357 @findex gnus-score-search-global-directories
11358 Simple, eh?  Directory names must end with a @samp{/}.  These
11359 directories are typically scanned only once during each Gnus session.
11360 If you feel the need to manually re-scan the remote directories, you can
11361 use the @code{gnus-score-search-global-directories} command.
11362
11363 Note that, at present, using this option will slow down group entry
11364 somewhat.  (That is---a lot.)
11365
11366 If you want to start maintaining score files for other people to use,
11367 just put your score file up for anonymous ftp and announce it to the
11368 world.  Become a retro-moderator!  Participate in the retro-moderator
11369 wars sure to ensue, where retro-moderators battle it out for the
11370 sympathy of the people, luring them to use their score files on false
11371 premises!  Yay!  The net is saved!
11372
11373 Here are some tips for the would-be retro-moderator, off the top of my
11374 head: 
11375
11376 @itemize @bullet
11377
11378 @item 
11379 Articles that are heavily crossposted are probably junk. 
11380 @item
11381 To lower a single inappropriate article, lower by @code{Message-ID}.
11382 @item
11383 Particularly brilliant authors can be raised on a permanent basis. 
11384 @item
11385 Authors that repeatedly post off-charter for the group can safely be
11386 lowered out of existence.
11387 @item
11388 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
11389 articles completely.
11390
11391 @item 
11392 Use expiring score entries to keep the size of the file down.  You
11393 should probably have a long expiry period, though, as some sites keep
11394 old articles for a long time.
11395 @end itemize
11396
11397 ... I wonder whether other newsreaders will support global score files
11398 in the future.  @emph{Snicker}.  Yup, any day now, newsreaders like Blue
11399 Wave, xrn and 1stReader are bound to implement scoring.  Should we start
11400 holding our breath yet?
11401
11402
11403 @node Kill Files
11404 @section Kill Files
11405 @cindex kill files
11406
11407 Gnus still supports those pesky old kill files.  In fact, the kill file
11408 entries can now be expiring, which is something I wrote before Daniel
11409 Quinlan thought of doing score files, so I've left the code in there.
11410
11411 In short, kill processing is a lot slower (and I do mean @emph{a lot})
11412 than score processing, so it might be a good idea to rewrite your kill
11413 files into score files.
11414
11415 Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
11416 forms into this file, which means that you can use kill files as some
11417 sort of primitive hook function to be run on group entry, even though
11418 that isn't a very good idea.
11419
11420 Normal kill files look like this:
11421
11422 @lisp
11423 (gnus-kill "From" "Lars Ingebrigtsen")
11424 (gnus-kill "Subject" "ding")
11425 (gnus-expunge "X")
11426 @end lisp
11427
11428 This will mark every article written by me as read, and remove them from
11429 the summary buffer.  Very useful, you'll agree.
11430
11431 Other programs use a totally different kill file syntax.  If Gnus
11432 encounters what looks like a @code{rn} kill file, it will take a stab at
11433 interpreting it. 
11434
11435 Two summary functions for editing a GNUS kill file:
11436
11437 @table @kbd
11438
11439 @item M-k
11440 @kindex M-k (Summary)
11441 @findex gnus-summary-edit-local-kill
11442 Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
11443
11444 @item M-K
11445 @kindex M-K (Summary)
11446 @findex gnus-summary-edit-global-kill
11447 Edit the general kill file (@code{gnus-summary-edit-global-kill}).
11448 @end table
11449
11450 Two group mode functions for editing the kill files:
11451
11452 @table @kbd
11453
11454 @item M-k
11455 @kindex M-k (Group)
11456 @findex gnus-group-edit-local-kill
11457 Edit this group's kill file (@code{gnus-group-edit-local-kill}).
11458
11459 @item M-K
11460 @kindex M-K (Group)
11461 @findex gnus-group-edit-global-kill
11462 Edit the general kill file (@code{gnus-group-edit-global-kill}).
11463 @end table
11464
11465 Kill file variables:
11466
11467 @table @code
11468 @item gnus-kill-file-name
11469 @vindex gnus-kill-file-name
11470 A kill file for the group @samp{soc.motss} is normally called
11471 @file{soc.motss.KILL}.  The suffix appended to the group name to get
11472 this file name is detailed by the @code{gnus-kill-file-name} variable.
11473 The ``global'' kill file (not in the score file sense of ``global'', of
11474 course) is called just @file{KILL}.
11475
11476 @vindex gnus-kill-save-kill-file
11477 @item gnus-kill-save-kill-file
11478 If this variable is non-@code{nil}, Gnus will save the
11479 kill file after processing, which is necessary if you use expiring
11480 kills. 
11481
11482 @item gnus-apply-kill-hook
11483 @vindex gnus-apply-kill-hook
11484 @findex gnus-apply-kill-file-unless-scored
11485 @findex gnus-apply-kill-file
11486 A hook called to apply kill files to a group.  It is
11487 @code{(gnus-apply-kill-file)} by default.  If you want to ignore the
11488 kill file if you have a score file for the same group, you can set this
11489 hook to @code{(gnus-apply-kill-file-unless-scored)}.  If you don't want
11490 kill files to be processed, you should set this variable to @code{nil}.
11491
11492 @item gnus-kill-file-mode-hook
11493 @vindex gnus-kill-file-mode-hook
11494 A hook called in kill-file mode buffers.
11495
11496 @end table
11497
11498
11499 @node Converting Kill Files
11500 @section Converting Kill Files
11501 @cindex kill files
11502 @cindex converting kill files
11503
11504 If you have loads of old kill files, you may want to convert them into
11505 score files.  If they are ``regular'', you can use
11506 the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
11507 by hand.
11508
11509 The kill to score conversion package isn't included in Gnus by default.
11510 You can fetch it from
11511 @file{http://www.ifi.uio.no/~larsi/ding-other/gnus-kill-to-score}.  
11512
11513 If your old kill files are very complex---if they contain more
11514 non-@code{gnus-kill} forms than not, you'll have to convert them by
11515 hand.  Or just let them be as they are.  Gnus will still use them as
11516 before. 
11517
11518
11519 @node GroupLens
11520 @section GroupLens
11521 @cindex GroupLens
11522
11523 GroupLens is a collaborative filtering system that helps you work
11524 together with other people to find the quality news articles out of the
11525 huge volume of news articles generated every day.
11526
11527 To accomplish this the GroupLens system combines your opinions about
11528 articles you have already read with the opinions of others who have done
11529 likewise and gives you a personalized prediction for each unread news
11530 article.  Think of GroupLens as a matchmaker.  GroupLens watches how you
11531 rate articles, and finds other people that rate articles the same way.
11532 Once it has found for you some people you agree with it tells you, in
11533 the form of a prediction, what they thought of the article.  You can use
11534 this prediction to help you decide whether or not you want to read the
11535 article.
11536
11537 @menu
11538 * Using GroupLens::          How to make Gnus use GroupLens.
11539 * Rating Articles::          Letting GroupLens know how you rate articles.
11540 * Displaying Predictions::   Displaying predictions given by GroupLens.
11541 * GroupLens Variables::      Customizing GroupLens.
11542 @end menu
11543
11544
11545 @node Using GroupLens
11546 @subsection Using GroupLens
11547
11548 To use GroupLens you must register a pseudonym with your local Better
11549 Bit Bureau (BBB).
11550 @samp{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only
11551 better bit in town is at the moment.
11552
11553 Once you have registered you'll need to set a couple of variables.
11554
11555 @table @code
11556
11557 @item gnus-use-grouplens
11558 @vindex gnus-use-grouplens
11559 Setting this variable to a non-@code{nil} value will make Gnus hook into
11560 all the relevant GroupLens functions.
11561
11562 @item grouplens-pseudonym
11563 @vindex grouplens-pseudonym
11564 This variable should be set to the pseudonym you got when registering
11565 with the Better Bit Bureau.
11566
11567 @item grouplens-newsgroups
11568 @vindex grouplens-newsgroups
11569 A list of groups that you want to get GroupLens predictions for. 
11570
11571 @end table
11572
11573 Thats the minimum of what you need to get up and running with GroupLens.
11574 Once you've registered, GroupLens will start giving you scores for
11575 articles based on the average of what other people think.  But, to get
11576 the real benefit of GroupLens you need to start rating articles
11577 yourself.  Then the scores GroupLens gives you will be personalized for
11578 you, based on how the people you usually agree with have already rated.
11579
11580
11581 @node Rating Articles
11582 @subsection Rating Articles
11583
11584 In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
11585 Where 1 means something like this article is a waste of bandwidth and 5
11586 means that the article was really good.  The basic question to ask
11587 yourself is, "on a scale from 1 to 5 would I like to see more articles
11588 like this one?"
11589
11590 There are four ways to enter a rating for an article in GroupLens.
11591
11592 @table @kbd
11593
11594 @item r
11595 @kindex r (GroupLens)
11596 @findex bbb-summary-rate-article
11597 This function will prompt you for a rating on a scale of one to five.
11598
11599 @item k
11600 @kindex k (GroupLens)
11601 @findex grouplens-score-thread
11602 This function will prompt you for a rating, and rate all the articles in
11603 the thread.  This is really useful for some of those long running giant
11604 threads in rec.humor.
11605
11606 @end table
11607
11608 The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
11609 the score of the article you're reading.
11610
11611 @table @kbd
11612
11613 @item 1-5 n
11614 @kindex n (GroupLens)
11615 @findex grouplens-next-unread-article
11616 Rate the article and go to the next unread article.
11617
11618 @item 1-5 ,
11619 @kindex , (GroupLens)
11620 @findex grouplens-best-unread-article
11621 Rate the article and go to the next unread article with the highest score.
11622
11623 @end table
11624
11625 If you want to give the current article a score of 4 and then go to the
11626 next article, just type @kbd{4 n}.
11627
11628
11629 @node Displaying Predictions
11630 @subsection Displaying Predictions
11631
11632 GroupLens makes a prediction for you about how much you will like a
11633 news article.  The predictions from GroupLens are on a scale from 1 to
11634 5, where 1 is the worst and 5 is the best.  You can use the predictions
11635 from GroupLens in one of three ways controlled by the variable
11636 @code{gnus-grouplens-override-scoring}.
11637
11638 @vindex gnus-grouplens-override-scoring
11639 There are three ways to display predictions in grouplens.  You may
11640 choose to have the GroupLens scores contribute to, or override the
11641 regular gnus scoring mechanism. override is the default; however, some
11642 people prefer to see the Gnus scores plus the grouplens scores.  To get
11643 the separate scoring behavior you need to set
11644 @code{gnus-grouplens-override-scoring} to @code{'separate}.  To have the
11645 GroupLens predictions combined with the grouplens scores set it to
11646 @code{'override} and to combine the scores set
11647 @code{gnus-grouplens-override-scoring} to @code{'combine}.  When you use
11648 the combine option you will also want to set the values for
11649 @code{grouplens-prediction-offset} and
11650 @code{grouplens-score-scale-factor}.
11651
11652 @vindex grouplens-prediction-display
11653 In either case, GroupLens gives you a few choices for how you would like
11654 to see your predictions displayed.  The display of predictions is
11655 controlled by the @code{grouplens-prediction-display} variable.
11656
11657 The following are legal values for that variable.
11658
11659 @table @code
11660 @item prediction-spot
11661 The higher the prediction, the further to the right an @samp{*} is
11662 displayed. 
11663
11664 @item confidence-interval
11665 A numeric confidence interval.
11666
11667 @item prediction-bar
11668 The higher the prediction, the longer the bar.
11669
11670 @item confidence-bar
11671 Numerical confidence.
11672
11673 @item confidence-spot
11674 The spot gets bigger with more confidence.
11675
11676 @item prediction-num
11677 Plain-old numeric value.
11678
11679 @item confidence-plus-minus
11680 Prediction +/i confidence.
11681
11682 @end table
11683
11684
11685 @node GroupLens Variables
11686 @subsection GroupLens Variables
11687
11688 @table @code
11689
11690 @item gnus-summary-grouplens-line-format
11691 The summary line format used in summary buffers that are GroupLens
11692 enhanced.  It accepts the same specs as the normal summary line format
11693 (@pxref{Summary Buffer Lines}).  The default is
11694 @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%) %s\n}.
11695
11696 @item grouplens-bbb-host
11697 Host running the bbbd server.  @samp{grouplens.cs.umn.edu} is the
11698 default.
11699
11700 @item grouplens-bbb-port
11701 Port of the host running the bbbd server.  The default is 9000.
11702
11703 @item grouplens-score-offset
11704 Offset the prediction by this value.  In other words, subtract the
11705 prediction value by this number to arrive at the effective score.  The
11706 default is 0.
11707
11708 @item grouplens-score-scale-factor 
11709 This variable allows the user to magnify the effect of GroupLens scores.
11710 The scale factor is applied after the offset.  The default is 1.
11711
11712 @end table
11713
11714
11715 @node Advanced Scoring
11716 @section Advanced Scoring
11717
11718 Scoring on Subjects and From headers is nice enough, but what if you're
11719 really interested in what a person has to say only when she's talking
11720 about a particular subject?  Or what about if you really don't want to
11721 read what person A has to say when she's following up to person B, but
11722 want to read what she says when she's following up to person C?
11723
11724 By using advanced scoring rules you may create arbitrarily complex
11725 scoring patterns.
11726
11727 @menu
11728 * Advanced Scoring Syntax::     A definition.
11729 * Advanced Scoring Examples::   What they look like.
11730 * Advanced Scoring Tips::       Getting the most out of it.
11731 @end menu
11732
11733
11734 @node Advanced Scoring Syntax
11735 @subsection Advanced Scoring Syntax
11736
11737 Ordinary scoring rules have a string as the first element in the rule.
11738 Advanced scoring rules have a list as the first element.  The second
11739 element is the score to be applied if the first element evaluated to a
11740 non-@code{nil} value.
11741
11742 These lists may consist of three logical operators, one redirection
11743 operator, and various match operators.
11744
11745 Logical operators:
11746
11747 @table @code
11748 @item &
11749 @itemx and
11750 This logical operator will evaluate each of its arguments until it finds
11751 one that evaluates to @code{false}, and then it'll stop.  If all arguments
11752 evaluate to @code{true} values, then this operator will return
11753 @code{true}. 
11754
11755 @item |
11756 @itemx or
11757 This logical operator will evaluate each of its arguments until it finds
11758 one that evaluates to @code{true}.  If no arguments are @code{true},
11759 then this operator will return @code{false}.
11760
11761 @item !
11762 @itemx not
11763 @itemx Â¬
11764 This logical operator only takes a single argument.  It returns the
11765 inverse of the value of its argument.
11766
11767 @end table
11768
11769 There is an @dfn{indirection operator} that will make its arguments
11770 apply to the ancestors of the current article being scored.  For
11771 instance, @code{1-} will make score rules apply to the parent of the
11772 current article.  @code{2-} will make score fules apply to the
11773 grandparent of the current article.  Alternatively, you can write
11774 @code{^^}, where the number of @code{^}s (carets) say how far back into
11775 the ancestry you want to go.
11776
11777 Finally, we have the match operators.  These are the ones that do the
11778 real work.  Match operators are header name strings followed by a match
11779 and a match type.  A typical match operator looks like @samp{("from"
11780 "Lars Ingebrigtsen" s)}.  The header names are the same as when using
11781 simple scoring, and the match types are also the same.
11782
11783
11784 @node Advanced Scoring Examples
11785 @subsection Advanced Scoring Examples
11786
11787 Let's say you want to increase the score of articles written by Lars
11788 when he's talking about Gnus:
11789
11790 @example
11791 ((& 
11792   ("from" "Lars Ingebrigtsen")
11793   ("subject" "Gnus"))
11794  1000)
11795 @end example
11796
11797 Quite simple, huh?
11798
11799 When he writes long articles, he sometimes has something nice to say: 
11800
11801 @example
11802 ((& 
11803   ("from" "Lars Ingebrigtsen")
11804   (|
11805    ("subject" "Gnus")
11806    ("lines" 100 >)))
11807  1000)
11808 @end example
11809
11810 However, when he responds to things written by Reig Eigil Logge, you
11811 really don't want to read what he's written:
11812
11813 @example
11814 ((&
11815   ("from" "Lars Ingebrigtsen")
11816   (1- ("from" "Reig Eigir Logge")))
11817  -100000)
11818 @end example
11819
11820 Everybody that follows up Redmondo when he writes about disappearing
11821 socks should have their scores raised, but only when they talk about
11822 white socks.  However, when Lars talks about socks, it's usually not
11823 very interesting:
11824
11825 @example
11826 ((&
11827   (1-
11828    (&
11829     ("from" "redmondo@@.*no" r)
11830     ("body" "disappearing.*socks" t)))
11831   (! ("from" "Lars Ingebrigtsen"))
11832   ("body" "white.*socks"))
11833  1000)
11834 @end example
11835
11836 The possibilities are endless.
11837
11838
11839 @node Advanced Scoring Tips
11840 @subsection Advanced Scoring Tips
11841
11842 The @code{&} and @code{|} logical operators do short-circuit logic.
11843 That is, they stop processing their arguments when it's clear what the
11844 result of the operation will be.  For instance, if one of the arguments
11845 of an @code{&} evaluates to @code{false}, there's no point in evaluating
11846 the rest of the arguments.  This means that you should put slow matches
11847 (@samp{body}, @code{header}) last and quick matches (@samp{from},
11848 @samp{subject}) first.
11849
11850 The indirection arguments (@code{1-} and so on) will make their
11851 arguments work on previous generations of the thread.  If you say
11852 something like:
11853
11854 @example
11855 ...
11856 (1-
11857  (1-
11858   ("from" "lars")))
11859 ...
11860 @end example
11861
11862 Then that means "score on the from header of the grandparent of the
11863 current article".  An indirection is quite fast, but it's better to say:
11864
11865 @example
11866 (1-
11867  (& 
11868   ("from" "Lars")
11869   ("subject" "Gnus")))
11870 @end example
11871
11872 than it is to say:
11873
11874 @example
11875 (&
11876  (1- ("from" "Lars"))
11877  (1- ("subject" "Gnus")))
11878 @end example
11879
11880
11881 @node Score Decays
11882 @section Score Decays
11883 @cindex score decays
11884 @cindex decays
11885
11886 You may find that your scores have a tendency to grow without
11887 bounds, especially if you're using adaptive scoring.  If scores get too
11888 big, they lose all meaning---they simply max out and it's difficult to
11889 use them in any sensible way.
11890
11891 @vindex gnus-decay-scores
11892 @findex gnus-decay-score
11893 @vindex gnus-score-decay-function
11894 Gnus provides a mechanism for decaying scores to help with this problem.
11895 When score files are loaded and @code{gnus-decay-scores} is
11896 non-@code{nil}, Gnus will run the score files through the decaying
11897 mechanism thereby lowering the scores of all non-permanent score rules.
11898 The decay itself if performed by the @code{gnus-score-decay-function}
11899 function, which is @code{gnus-decay-score} by default.  Here's the
11900 definition of that function:
11901
11902 @lisp
11903 (defun gnus-decay-score (score)
11904   (floor
11905    (- score
11906       (* (if (< score 0) 1 -1)
11907          (min score
11908               (max gnus-score-decay-constant
11909                    (* (abs score)
11910                       gnus-score-decay-scale)))))))
11911 @end lisp
11912
11913 @vindex gnus-score-decay-scale
11914 @vindex gnus-score-decay-constant
11915 @code{gnus-score-decay-constant} is 3 by default and
11916 @code{gnus-score-decay-scale} is 0.05.  This should cause the following:
11917
11918 @enumerate
11919 @item
11920 Scores between -3 and 3 will be set to 0 when this function is called.
11921
11922 @item
11923 Scores with magnitudes between 3 and 60 will be shrunk by 3.
11924
11925 @item
11926 Scores with magnitudes greater than 60 will be shrunk by 5% of the
11927 score.
11928 @end enumerate
11929
11930 If you don't like this decay function, write your own.  It is called
11931 with the score to be decayed as its only parameter, and it should return
11932 the new score, which should be an integer.
11933
11934 Gnus will try to decay scores once a day.  If you haven't run Gnus for
11935 four days, Gnus will decay the scores four times, for instance.
11936
11937
11938 @node Various
11939 @chapter Various
11940
11941 @menu
11942 * Process/Prefix::             A convention used by many treatment commands.
11943 * Interactive::                Making Gnus ask you many questions.
11944 * Formatting Variables::       You can specify what buffers should look like.
11945 * Windows Configuration::      Configuring the Gnus buffer windows.
11946 * Compilation::                How to speed Gnus up.
11947 * Mode Lines::                 Displaying information in the mode lines.
11948 * Highlighting and Menus::     Making buffers look all nice and cozy.
11949 * Buttons::                    Get tendonitis in ten easy steps!
11950 * Daemons::                    Gnus can do things behind your back.
11951 * NoCeM::                      How to avoid spam and other fatty foods.
11952 * Picons::                     How to display pictures of what your reading.
11953 * Undo::                       Some actions can be undone.
11954 * Moderation::                 What to do if you're a moderator.
11955 * XEmacs Enhancements::        There are more pictures and stuff under XEmacs.
11956 * Various Various::            Things that are really various.
11957 @end menu
11958
11959
11960 @node Process/Prefix
11961 @section Process/Prefix
11962 @cindex process/prefix convention
11963
11964 Many functions, among them functions for moving, decoding and saving
11965 articles, use what is known as the @dfn{Process/Prefix convention}.
11966
11967 This is a method for figuring out what articles that the user wants the
11968 command to be performed on.
11969
11970 It goes like this:
11971
11972 If the numeric prefix is N, perform the operation on the next N
11973 articles, starting with the current one.  If the numeric prefix is
11974 negative, perform the operation on the previous N articles, starting
11975 with the current one.
11976
11977 @vindex transient-mark-mode
11978 If @code{transient-mark-mode} in non-@code{nil} and the region is
11979 active, all articles in the region will be worked upon.
11980
11981 If there is no numeric prefix, but some articles are marked with the
11982 process mark, perform the operation on the articles that are marked with
11983 the process mark.
11984
11985 If there is neither a numeric prefix nor any articles marked with the
11986 process mark, just perform the operation on the current article.
11987
11988 Quite simple, really, but it needs to be made clear so that surprises
11989 are avoided.
11990
11991 Commands that react to the process mark will push the current list of
11992 process marked articles onto a stack and will then clear all process
11993 marked articles.  You can restore the previous configuration with the
11994 @kbd{M P y} command (@pxref{Setting Process Marks}).
11995
11996 @vindex gnus-summary-goto-unread
11997 One thing that seems to shock & horrify lots of people is that, for
11998 instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
11999 Since each @kbd{d} (which marks the current article as read) by default
12000 goes to the next unread article after marking, this means that @kbd{3 d}
12001 will mark the next three unread articles as read, no matter what the
12002 summary buffer looks like.  Set @code{gnus-summary-goto-unread} to
12003 @code{nil} for a more straightforward action.
12004
12005
12006 @node Interactive
12007 @section Interactive
12008 @cindex interaction
12009
12010 @table @code
12011
12012 @item gnus-novice-user
12013 @vindex gnus-novice-user
12014 If this variable is non-@code{nil}, you are either a newcomer to the
12015 World of Usenet, or you are very cautious, which is a nice thing to be,
12016 really.  You will be given questions of the type ``Are you sure you want
12017 to do this?'' before doing anything dangerous.  This is @code{t} by
12018 default.
12019
12020 @item gnus-expert-user
12021 @vindex gnus-expert-user
12022 If this variable is non-@code{nil}, you will never ever be asked any
12023 questions by Gnus.  It will simply assume you know what you're doing, no
12024 matter how strange.
12025
12026 @item gnus-interactive-catchup
12027 @vindex gnus-interactive-catchup
12028 Require confirmation before catching up a group if non-@code{nil}.  It
12029 is @code{t} by default.
12030
12031 @item gnus-interactive-exit
12032 @vindex gnus-interactive-exit
12033 Require confirmation before exiting Gnus.  This variable is @code{t} by
12034 default. 
12035 @end table
12036
12037
12038 @node Formatting Variables
12039 @section Formatting Variables
12040 @cindex formatting variables
12041
12042 Throughout this manual you've probably noticed lots of variables that
12043 are called things like @code{gnus-group-line-format} and
12044 @code{gnus-summary-mode-line-format}.  These control how Gnus is to
12045 output lines in the various buffers.  There's quite a lot of them.
12046 Fortunately, they all use the same syntax, so there's not that much to
12047 be annoyed by.
12048
12049 Here's an example format spec (from the group buffer): @samp{%M%S%5y:
12050 %(%g%)\n}.  We see that it is indeed extremely ugly, and that there are
12051 lots of percentages everywhere.  
12052
12053 @menu 
12054 * Formatting Basics::     A formatting variable is basically a format string.
12055 * Advanced Formatting::   Modifying output in various ways.
12056 * User-Defined Specs::    Having Gnus call your own functions.
12057 * Formatting Fonts::      Making the formatting look colorful and nice.
12058 @end menu
12059
12060 Currently Gnus uses the following formatting variables:
12061 @code{gnus-group-line-format}, @code{gnus-summary-line-format},
12062 @code{gnus-server-line-format}, @code{gnus-topic-line-format},
12063 @code{gnus-group-mode-line-format},
12064 @code{gnus-summary-mode-line-format},
12065 @code{gnus-article-mode-line-format},
12066 @code{gnus-server-mode-line-format}, and
12067 @code{gnus-summary-pick-line-format}.
12068
12069 All these format variables can also be arbitrary elisp forms.  In that
12070 case, they will be @code{eval}ed to insert the required lines.
12071
12072 @kindex M-x gnus-update-format
12073 @findex gnus-update-format
12074 Gnus includes a command to help you while creating your own format
12075 specs.  @kbd{M-x gnus-update-format} will @code{eval} the current form,
12076 update the spec in question and pop you to a buffer where you can
12077 examine the resulting lisp code to be run to generate the line.  
12078
12079
12080
12081 @node Formatting Basics
12082 @subsection Formatting Basics
12083
12084 Each @samp{%} element will be replaced by some string or other when the
12085 buffer in question is generated.  @samp{%5y} means ``insert the @samp{y}
12086 spec, and pad with spaces to get a 5-character field''.
12087
12088 As with normal C and Emacs Lisp formatting strings, the numerical
12089 modifier between the @samp{%} and the formatting type character will
12090 @dfn{pad} the output so that it is always at least that long.
12091 @samp{%5y} will make the field always (at least) five characters wide by
12092 padding with spaces to the left.  If you say @samp{%-5y}, it will pad to
12093 the right instead.
12094
12095 You may also wish to limit the length of the field to protect against
12096 particularly wide values.  For that you can say @samp{%4,6y}, which
12097 means that the field will never be more than 6 characters wide and never
12098 less than 4 characters wide.
12099
12100
12101 @node Advanced Formatting
12102 @subsection Advanced Formatting
12103
12104 It is frequently useful to post-process the fields in some way.
12105 Padding, limiting, cutting off parts and suppressing certain values can
12106 be achieved by using @dfn{tilde modifiers}.  A typical tilde spec might
12107 look like @samp{%~(cut 3)~(ignore "0")y}.
12108
12109 These are the legal modifiers:
12110
12111 @table @code
12112 @item pad
12113 @itemx pad-left
12114 Pad the field to the left with spaces until it reaches the required
12115 length.
12116
12117 @item pad-right
12118 Pad the field to the right with spaces until it reaches the required
12119 length.
12120
12121 @item max
12122 @itemx max-left
12123 Cut off characters from the left until it reaches the specified length.
12124
12125 @item max-right
12126 Cut off characters from the right until it reaches the specified
12127 length. 
12128
12129 @item cut
12130 @itemx cut-left
12131 Cut off the specified number of characters from the left.
12132
12133 @item cut-right
12134 Cut off the specified number of characters from the right.
12135
12136 @item ignore
12137 Return an empty string if the field is equal to the specified value. 
12138
12139 @item form
12140 Use the specified form as the field value when the @samp{@@} spec is
12141 used. 
12142 @end table
12143
12144 Let's take an example.  The @samp{%o} spec in the summary mode lines
12145 will return a date in compact ISO8601 format---@samp{19960809T230410}.
12146 This is quite a mouthful, so we want to shave off the century number and
12147 the time, leaving us with a six-character date.  That would be
12148 @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}.  (Cutting is done before
12149 maxing, and we need the padding to ensure that the date is never less
12150 than 6 characters to make it look nice in columns.)
12151
12152 Ignoring is done first; then cutting; then maxing; and then as the very
12153 last operation, padding.  
12154
12155 If you use lots of these advanced thingies, you'll find that Gnus gets
12156 quite slow.  This can be helped enormously by running @kbd{M-x
12157 gnus-compile} when you are satisfied with the look of your lines.
12158 @xref{Compilation}. 
12159
12160
12161 @node User-Defined Specs
12162 @subsection User-Defined Specs
12163
12164 All the specs allow for inserting user defined specifiers---@samp{u}.
12165 The next character in the format string should be a letter.  Gnus
12166 will call the function @code{gnus-user-format-function-}@samp{X}, where
12167 @samp{X} is the letter following @samp{%u}.  The function will be passed
12168 a single parameter---what the parameter means depends on what buffer
12169 it's being called from.  The function should return a string, which will
12170 be inserted into the buffer just like information from any other
12171 specifier.  This function may also be called with dummy values, so it
12172 should protect against that.
12173
12174 You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
12175 much the same without defining new functions.  Here's an example:
12176 @samp{%~(form (count-lines (point-min) (point)))@@}.  The form
12177 given here will be evaluated to yield the current line number, and then
12178 inserted.
12179
12180
12181 @node Formatting Fonts
12182 @subsection Formatting Fonts
12183
12184 There are specs for highlighting, and these are shared by all the format
12185 variables.  Text inside the @samp{%(} and @samp{%)} specifiers will get
12186 the special @code{mouse-face} property set, which means that it will be
12187 highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
12188 over it.
12189
12190 Text inside the @samp{%[} and @samp{%]} specifiers will have their
12191 normal faces set using @code{gnus-face-0}, which is @code{bold} by
12192 default.  If you say @samp{%1[} instead, you'll get @code{gnus-face-1}
12193 instead, and so on.  Create as many faces as you wish.  The same goes
12194 for the @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
12195 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
12196
12197 Here's an alternative recipe for the group buffer:
12198
12199 @lisp
12200 ;; Create three face types.
12201 (setq gnus-face-1 'bold)
12202 (setq gnus-face-3 'italic)
12203
12204 ;; We want the article count to be in 
12205 ;; a bold and green face.  So we create 
12206 ;; a new face called `my-green-bold'.
12207 (copy-face 'bold 'my-green-bold)
12208 ;; Set the color.
12209 (set-face-foreground 'my-green-bold "ForestGreen")
12210 (setq gnus-face-2 'my-green-bold)
12211
12212 ;; Set the new & fancy format.
12213 (setq gnus-group-line-format 
12214       "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
12215 @end lisp
12216
12217 I'm sure you'll be able to use this scheme to create totally unreadable
12218 and extremely vulgar displays.  Have fun!
12219
12220 Note that the @samp{%(} specs (and friends) do not make any sense on the
12221 mode-line variables.
12222
12223
12224 @node Windows Configuration
12225 @section Windows Configuration
12226 @cindex windows configuration
12227
12228 No, there's nothing here about X, so be quiet.
12229
12230 @vindex gnus-use-full-window
12231 If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
12232 other windows and occupy the entire Emacs screen by itself.  It is
12233 @code{t} by default.
12234
12235 @vindex gnus-buffer-configuration
12236 @code{gnus-buffer-configuration} describes how much space each Gnus
12237 buffer should be given.  Here's an excerpt of this variable:
12238
12239 @lisp
12240 ((group (vertical 1.0 (group 1.0 point)
12241                       (if gnus-carpal (group-carpal 4))))
12242  (article (vertical 1.0 (summary 0.25 point) 
12243                         (article 1.0))))
12244 @end lisp
12245
12246 This is an alist.  The @dfn{key} is a symbol that names some action or
12247 other.  For instance, when displaying the group buffer, the window
12248 configuration function will use @code{group} as the key.  A full list of
12249 possible names is listed below.
12250
12251 The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
12252 should occupy.  To take the @code{article} split as an example -
12253
12254 @lisp
12255 (article (vertical 1.0 (summary 0.25 point)
12256                        (article 1.0)))
12257 @end lisp
12258
12259 This @dfn{split} says that the summary buffer should occupy 25% of upper
12260 half of the screen, and that it is placed over the article buffer.  As
12261 you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
12262 reaching for that calculator there).  However, the special number
12263 @code{1.0} is used to signal that this buffer should soak up all the
12264 rest of the space available after the rest of the buffers have taken
12265 whatever they need.  There should be only one buffer with the @code{1.0}
12266 size spec per split.
12267
12268 Point will be put in the buffer that has the optional third element
12269 @code{point}. 
12270
12271 Here's a more complicated example:
12272
12273 @lisp
12274 (article (vertical 1.0 (group 4)
12275                        (summary 0.25 point)
12276                        (if gnus-carpal (summary-carpal 4))
12277                        (article 1.0)))
12278 @end lisp
12279
12280 If the size spec is an integer instead of a floating point number, 
12281 then that number will be used to say how many lines a buffer should
12282 occupy, not a percentage.
12283
12284 If the @dfn{split} looks like something that can be @code{eval}ed (to be
12285 precise---if the @code{car} of the split is a function or a subr), this
12286 split will be @code{eval}ed.  If the result is non-@code{nil}, it will
12287 be used as a split.  This means that there will be three buffers if
12288 @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
12289 is non-@code{nil}.
12290
12291 Not complicated enough for you?  Well, try this on for size:
12292
12293 @lisp
12294 (article (horizontal 1.0 
12295              (vertical 0.5
12296                  (group 1.0)
12297                  (gnus-carpal 4))
12298              (vertical 1.0
12299                  (summary 0.25 point)
12300                  (summary-carpal 4)
12301                  (article 1.0))))
12302 @end lisp
12303
12304 Whoops.  Two buffers with the mystery 100% tag.  And what's that
12305 @code{horizontal} thingie?  
12306
12307 If the first element in one of the split is @code{horizontal}, Gnus will
12308 split the window horizontally, giving you two windows side-by-side.
12309 Inside each of these strips you may carry on all you like in the normal
12310 fashion.  The number following @code{horizontal} says what percentage of
12311 the screen is to be given to this strip.
12312
12313 For each split, there @emph{must} be one element that has the 100% tag.
12314 The splitting is never accurate, and this buffer will eat any leftover
12315 lines from the splits.
12316
12317 To be slightly more formal, here's a definition of what a legal split
12318 may look like:
12319
12320 @example
12321 split       = frame | horizontal | vertical | buffer | form
12322 frame       = "(frame " size *split ")"
12323 horizontal  = "(horizontal " size *split ")"
12324 vertical    = "(vertical " size *split ")"
12325 buffer      = "(" buffer-name " " size *[ "point" ] ")"
12326 size        = number | frame-params
12327 buffer-name = group | article | summary ...
12328 @end example
12329
12330 The limitations are that the @code{frame} split can only appear as the
12331 top-level split.  @var{form} should be an Emacs Lisp form that should
12332 return a valid split.  We see that each split is fully recursive, and
12333 may contain any number of @code{vertical} and @code{horizontal} splits. 
12334
12335 @vindex gnus-window-min-width
12336 @vindex gnus-window-min-height
12337 @cindex window height
12338 @cindex window width
12339 Finding the right sizes can be a bit complicated.  No window may be less
12340 than @code{gnus-window-min-height} (default 1) characters high, and all
12341 windows must be at least @code{gnus-window-min-width} (default 1)
12342 characters wide.  Gnus will try to enforce this before applying the
12343 splits.  If you want to use the normal Emacs window width/height limit,
12344 you can just set these two variables to @code{nil}.
12345
12346 If you're not familiar with Emacs terminology, @code{horizontal} and
12347 @code{vertical} splits may work the opposite way of what you'd expect.
12348 Windows inside a @code{horizontal} split are shown side-by-side, and
12349 windows within a @code{vertical} split are shown above each other.
12350
12351 @findex gnus-configure-frame
12352 If you want to experiment with window placement, a good tip is to call
12353 @code{gnus-configure-frame} directly with a split.  This is the function
12354 that does all the real work when splitting buffers.  Below is a pretty
12355 nonsensical configuration with 5 windows; two for the group buffer and
12356 three for the article buffer.  (I said it was nonsensical.)  If you
12357 @code{eval} the statement below, you can get an idea of how that would
12358 look straight away, without going through the normal Gnus channels.
12359 Play with it until you're satisfied, and then use
12360 @code{gnus-add-configuration} to add your new creation to the buffer
12361 configuration list. 
12362
12363 @lisp
12364 (gnus-configure-frame
12365  '(horizontal 1.0
12366     (vertical 10
12367       (group 1.0)
12368       (article 0.3 point))
12369     (vertical 1.0
12370       (article 1.0)
12371       (horizontal 4
12372         (group 1.0)
12373         (article 10)))))
12374 @end lisp
12375
12376 You might want to have several frames as well.  No prob---just use the
12377 @code{frame} split:
12378
12379 @lisp
12380 (gnus-configure-frame
12381  '(frame 1.0
12382          (vertical 1.0
12383                    (summary 0.25 point)
12384                    (article 1.0))
12385          (vertical ((height . 5) (width . 15)
12386                     (user-position . t)
12387                     (left . -1) (top . 1))
12388                    (picon 1.0))))
12389
12390 @end lisp
12391
12392 This split will result in the familiar summary/article window
12393 configuration in the first (or ``main'') frame, while a small additional
12394 frame will be created where picons will be shown.  As you can see,
12395 instead of the normal @code{1.0} top-level spec, each additional split
12396 should have a frame parameter alist as the size spec.
12397 @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
12398 Reference Manual}.
12399
12400 Here's a list of all possible keys for
12401 @code{gnus-buffer-configuration}:
12402
12403 @code{group}, @code{summary}, @code{article}, @code{server},
12404 @code{browse}, @code{message}, @code{pick}, @code{info},
12405 @code{summary-faq}, @code{edit-group}, @code{edit-server},
12406 @code{edit-score}, @code{post}, @code{reply}, @code{forward},
12407 @code{reply-yank}, @code{mail-bounce}, @code{draft},
12408 @code{pipe}, @code{bug}, @code{compose-bounce}.  
12409
12410 Note that the @code{message} key is used for both
12411 @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}.  If
12412 it is desirable to distinguish between the two, something like this
12413 might be used:
12414
12415 @lisp
12416 (message (horizontal 1.0
12417                      (vertical 1.0 (message 1.0 point))
12418                      (vertical 0.24
12419                                (if (buffer-live-p gnus-summary-buffer)
12420                                    '(summary 0.5))
12421                                (group 1.0)))))
12422 @end lisp
12423
12424 @findex gnus-add-configuration
12425 Since the @code{gnus-buffer-configuration} variable is so long and
12426 complicated, there's a function you can use to ease changing the config
12427 of a single setting: @code{gnus-add-configuration}.  If, for instance,
12428 you want to change the @code{article} setting, you could say:
12429
12430 @lisp
12431 (gnus-add-configuration
12432  '(article (vertical 1.0
12433                (group 4)
12434                (summary .25 point)
12435                (article 1.0))))
12436 @end lisp
12437
12438 You'd typically stick these @code{gnus-add-configuration} calls in your
12439 @file{.gnus.el} file or in some startup hook---they should be run after
12440 Gnus has been loaded.
12441
12442 @vindex gnus-always-force-window-configuration
12443 If all windows mentioned in the configuration are already visible, Gnus
12444 won't change the window configuration.  If you always want to force the
12445 ``right'' window configuration, you can set
12446 @code{gnus-always-force-window-configuration} to non-@code{nil}.
12447
12448
12449 @node Compilation
12450 @section Compilation
12451 @cindex compilation
12452 @cindex byte-compilation
12453
12454 @findex gnus-compile
12455
12456 Remember all those line format specification variables?
12457 @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
12458 on.  Now, Gnus will of course heed whatever these variables are, but,
12459 unfortunately, changing them will mean a quite significant slow-down.
12460 (The default values of these variables have byte-compiled functions
12461 associated with them, while the user-generated versions do not, of
12462 course.) 
12463
12464 To help with this, you can run @kbd{M-x gnus-compile} after you've
12465 fiddled around with the variables and feel that you're (kind of)
12466 satisfied.  This will result in the new specs being byte-compiled, and
12467 you'll get top speed again.  Gnus will save these compiled specs in the
12468 @file{.newsrc.eld} file.  (User-defined functions aren't compiled by
12469 this function, though---you should compile them yourself by sticking
12470 them into the @code{.gnus.el} file and byte-compiling that file.)
12471
12472
12473 @node Mode Lines
12474 @section Mode Lines
12475 @cindex mode lines
12476
12477 @vindex gnus-updated-mode-lines
12478 @code{gnus-updated-mode-lines} says what buffers should keep their mode
12479 lines updated.  It is a list of symbols.  Supported symbols include
12480 @code{group}, @code{article}, @code{summary}, @code{server},
12481 @code{browse}, and @code{tree}.  If the corresponding symbol is present,
12482 Gnus will keep that mode line updated with information that may be
12483 pertinent.  If this variable is @code{nil}, screen refresh may be
12484 quicker.
12485
12486 @cindex display-time
12487
12488 @vindex gnus-mode-non-string-length
12489 By default, Gnus displays information on the current article in the mode
12490 lines of the summary and article buffers.  The information Gnus wishes
12491 to display (e.g. the subject of the article) is often longer than the
12492 mode lines, and therefore have to be cut off at some point.  The
12493 @code{gnus-mode-non-string-length} variable says how long the other
12494 elements on the line is (i.e., the non-info part).  If you put
12495 additional elements on the mode line (e.g. a clock), you should modify
12496 this variable:
12497
12498 @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
12499 @lisp
12500 (add-hook 'display-time-hook
12501           (lambda () (setq gnus-mode-non-string-length
12502                            (+ 21
12503                               (if line-number-mode 5 0)
12504                               (if column-number-mode 4 0)
12505                               (length display-time-string)))))
12506 @end lisp
12507
12508 If this variable is @code{nil} (which is the default), the mode line
12509 strings won't be chopped off, and they won't be padded either.
12510
12511
12512 @node Highlighting and Menus
12513 @section Highlighting and Menus
12514 @cindex visual
12515 @cindex highlighting
12516 @cindex menus
12517
12518 @vindex gnus-visual
12519 The @code{gnus-visual} variable controls most of the prettifying Gnus
12520 aspects.  If @code{nil}, Gnus won't attempt to create menus or use fancy
12521 colors or fonts.  This will also inhibit loading the @file{gnus-vis.el}
12522 file.
12523
12524 This variable can be a list of visual properties that are enabled.  The
12525 following elements are legal, and are all included by default:
12526
12527 @table @code
12528 @item group-highlight
12529 Do highlights in the group buffer.
12530 @item summary-highlight
12531 Do highlights in the summary buffer.
12532 @item article-highlight
12533 Do highlights in the article buffer.
12534 @item highlight
12535 Turn on highlighting in all buffers.
12536 @item group-menu
12537 Create menus in the group buffer.
12538 @item summary-menu
12539 Create menus in the summary buffers.
12540 @item article-menu
12541 Create menus in the article buffer.
12542 @item browse-menu
12543 Create menus in the browse buffer.
12544 @item server-menu
12545 Create menus in the server buffer.
12546 @item score-menu
12547 Create menus in the score buffers.
12548 @item menu
12549 Create menus in all buffers.
12550 @end table
12551
12552 So if you only want highlighting in the article buffer and menus in all
12553 buffers, you could say something like:
12554
12555 @lisp
12556 (setq gnus-visual '(article-highlight menu))
12557 @end lisp
12558
12559 If you want only highlighting and no menus whatsoever, you'd say:
12560
12561 @lisp
12562 (setq gnus-visual '(highlight))
12563 @end lisp
12564
12565 If @code{gnus-visual} is @code{t}, highlighting and menus will be used
12566 in all Gnus buffers.
12567
12568 Other general variables that influence the look of all buffers include:
12569
12570 @table @code
12571 @item gnus-mouse-face
12572 @vindex gnus-mouse-face
12573 This is the face (i.e., font) used for mouse highlighting in Gnus.  No
12574 mouse highlights will be done if @code{gnus-visual} is @code{nil}.
12575
12576 @item gnus-display-type
12577 @vindex gnus-display-type
12578 This variable is symbol indicating the display type Emacs is running
12579 under.  The symbol should be one of @code{color}, @code{grayscale} or
12580 @code{mono}.  If Gnus guesses this display attribute wrongly, either set
12581 this variable in your @file{~/.emacs} or set the resource
12582 @code{Emacs.displayType} in your @file{~/.Xdefaults}.
12583
12584 @item gnus-background-mode 
12585 @vindex gnus-background-mode 
12586 This is a symbol indicating the Emacs background brightness.  The symbol
12587 should be one of @code{light} or @code{dark}.  If Gnus guesses this
12588 frame attribute wrongly, either set this variable in your @file{~/.emacs} or
12589 set the resource @code{Emacs.backgroundMode} in your @file{~/.Xdefaults}. 
12590 `gnus-display-type'.
12591 @end table
12592
12593 There are hooks associated with the creation of all the different menus:
12594
12595 @table @code
12596
12597 @item gnus-article-menu-hook
12598 @vindex gnus-article-menu-hook
12599 Hook called after creating the article mode menu.
12600
12601 @item gnus-group-menu-hook
12602 @vindex gnus-group-menu-hook
12603 Hook called after creating the group mode menu.
12604
12605 @item gnus-summary-menu-hook
12606 @vindex gnus-summary-menu-hook
12607 Hook called after creating the summary mode menu.
12608
12609 @item gnus-server-menu-hook
12610 @vindex gnus-server-menu-hook
12611 Hook called after creating the server mode menu.
12612
12613 @item gnus-browse-menu-hook
12614 @vindex gnus-browse-menu-hook
12615 Hook called after creating the browse mode menu.
12616
12617 @item gnus-score-menu-hook
12618 @vindex gnus-score-menu-hook
12619 Hook called after creating the score mode menu.
12620
12621 @end table
12622
12623
12624 @node Buttons
12625 @section Buttons
12626 @cindex buttons
12627 @cindex mouse
12628 @cindex click
12629
12630 Those new-fangled @dfn{mouse} contraptions is very popular with the
12631 young, hep kids who don't want to learn the proper way to do things
12632 these days.  Why, I remember way back in the summer of '89, when I was
12633 using Emacs on a Tops 20 system.  Three hundred users on one single
12634 machine, and every user was running Simula compilers.  Bah!
12635
12636 Right.
12637
12638 @vindex gnus-carpal
12639 Well, you can make Gnus display bufferfuls of buttons you can click to
12640 do anything by setting @code{gnus-carpal} to @code{t}.  Pretty simple,
12641 really.  Tell the chiropractor I sent you.
12642
12643
12644 @table @code
12645
12646 @item gnus-carpal-mode-hook
12647 @vindex gnus-carpal-mode-hook
12648 Hook run in all carpal mode buffers.
12649
12650 @item gnus-carpal-button-face
12651 @vindex gnus-carpal-button-face
12652 Face used on buttons.
12653
12654 @item gnus-carpal-header-face
12655 @vindex gnus-carpal-header-face
12656 Face used on carpal buffer headers.
12657
12658 @item gnus-carpal-group-buffer-buttons
12659 @vindex gnus-carpal-group-buffer-buttons
12660 Buttons in the group buffer.
12661
12662 @item gnus-carpal-summary-buffer-buttons
12663 @vindex gnus-carpal-summary-buffer-buttons
12664 Buttons in the summary buffer.
12665
12666 @item gnus-carpal-server-buffer-buttons
12667 @vindex gnus-carpal-server-buffer-buttons
12668 Buttons in the server buffer.
12669
12670 @item gnus-carpal-browse-buffer-buttons
12671 @vindex gnus-carpal-browse-buffer-buttons
12672 Buttons in the browse buffer.
12673 @end table
12674
12675 All the @code{buttons} variables are lists.  The elements in these list
12676 is either a cons cell where the car contains a text to be displayed and
12677 the cdr contains a function symbol, or a simple string.
12678
12679
12680 @node Daemons
12681 @section Daemons
12682 @cindex demons
12683 @cindex daemons
12684
12685 Gnus, being larger than any program ever written (allegedly), does lots
12686 of strange stuff that you may wish to have done while you're not
12687 present.  For instance, you may want it to check for new mail once in a
12688 while.  Or you may want it to close down all connections to all servers
12689 when you leave Emacs idle.  And stuff like that.
12690
12691 Gnus will let you do stuff like that by defining various
12692 @dfn{handlers}.  Each handler consists of three elements:  A
12693 @var{function}, a @var{time}, and an @var{idle} parameter.
12694
12695 Here's an example of a handler that closes connections when Emacs has
12696 been idle for thirty minutes:
12697
12698 @lisp
12699 (gnus-demon-close-connections nil 30)
12700 @end lisp
12701
12702 Here's a handler that scans for PGP headers every hour when Emacs is
12703 idle: 
12704
12705 @lisp
12706 (gnus-demon-scan-pgp 60 t)
12707 @end lisp
12708
12709 This @var{time} parameter and than @var{idle} parameter works together
12710 in a strange, but wonderful fashion.  Basically, if @var{idle} is
12711 @code{nil}, then the function will be called every @var{time} minutes.
12712
12713 If @var{idle} is @code{t}, then the function will be called after
12714 @var{time} minutes only if Emacs is idle.  So if Emacs is never idle,
12715 the function will never be called.  But once Emacs goes idle, the
12716 function will be called every @var{time} minutes.
12717
12718 If @var{idle} is a number and @var{time} is a number, the function will
12719 be called every @var{time} minutes only when Emacs has been idle for
12720 @var{idle} minutes.
12721
12722 If @var{idle} is a number and @var{time} is @code{nil}, the function
12723 will be called once every time Emacs has been idle for @var{idle}
12724 minutes.  
12725
12726 And if @var{time} is a string, it should look like @samp{07:31}, and
12727 the function will then be called once every day somewhere near that
12728 time.  Modified by the @var{idle} parameter, of course.
12729
12730 @vindex gnus-demon-timestep
12731 (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
12732 seconds.  This is 60 by default.  If you change that variable,
12733 all the timings in the handlers will be affected.)
12734
12735 @vindex gnus-use-demon
12736 To set the whole thing in motion, though, you have to set
12737 @code{gnus-use-demon} to @code{t}.
12738
12739 So, if you want to add a handler, you could put something like this in
12740 your @file{.gnus} file:
12741
12742 @findex gnus-demon-add-handler
12743 @lisp
12744 (gnus-demon-add-handler 'gnus-demon-close-connections nil 30)
12745 @end lisp
12746
12747 @findex gnus-demon-add-nocem
12748 @findex gnus-demon-add-scanmail
12749 @findex gnus-demon-add-rescan
12750 @findex gnus-demon-add-disconnection
12751 Some ready-made functions to do this has been created:
12752 @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
12753 @code{gnus-demon-add-rescan}, and @code{gnus-demon-add-scanmail}.  Just
12754 put those functions in your @file{.gnus} if you want those abilities.
12755
12756 @findex gnus-demon-init
12757 @findex gnus-demon-cancel
12758 @vindex gnus-demon-handlers
12759 If you add handlers to @code{gnus-demon-handlers} directly, you should
12760 run @code{gnus-demon-init} to make the changes take hold.  To cancel all
12761 daemons, you can use the @code{gnus-demon-cancel} function.
12762
12763 Note that adding daemons can be pretty naughty if you overdo it.  Adding
12764 functions that scan all news and mail from all servers every two seconds
12765 is a sure-fire way of getting booted off any respectable system.  So
12766 behave. 
12767
12768
12769 @node NoCeM
12770 @section NoCeM
12771 @cindex nocem
12772 @cindex spam
12773
12774 @dfn{Spamming} is posting the same article lots and lots of times.
12775 Spamming is bad.  Spamming is evil.  
12776
12777 Spamming is usually canceled within a day or so by various anti-spamming
12778 agencies.  These agencies usually also send out @dfn{NoCeM} messages.
12779 NoCeM is pronounced ``no see-'em'', and means what the name
12780 implies---these are messages that make the offending articles, like, go
12781 away.  
12782
12783 What use are these NoCeM messages if the articles are canceled anyway?
12784 Some sites do not honor cancel messages and some sites just honor cancels
12785 from a select few people.  Then you may wish to make use of the NoCeM
12786 messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
12787
12788 Gnus can read and parse the messages in this group automatically, and
12789 this will make spam disappear.  
12790
12791 There are some variables to customize, of course:
12792
12793 @table @code
12794 @item gnus-use-nocem
12795 @vindex gnus-use-nocem
12796 Set this variable to @code{t} to set the ball rolling.  It is @code{nil}
12797 by default. 
12798
12799 @item gnus-nocem-groups
12800 @vindex gnus-nocem-groups
12801 Gnus will look for NoCeM messages in the groups in this list.  The
12802 default is @code{("alt.nocem.misc" "news.admin.net-abuse.announce")}. 
12803
12804 @item gnus-nocem-issuers
12805 @vindex gnus-nocem-issuers
12806 There are many people issuing NoCeM messages.  This list says what
12807 people you want to listen to.  The default is @code{("Automoose-1"
12808 "clewis@@ferret.ocunix.on.ca;" "jem@@xpat.com;" "red@@redpoll.mrfs.oh.us
12809 (Richard E. Depew)")}; fine, upstanding citizens all of them.
12810
12811 Known despammers that you can put in this list include:
12812
12813 @table @samp
12814 @item clewis@@ferret.ocunix.on.ca;
12815 @cindex Chris Lewis
12816 Chris Lewis---Major Canadian despammer who has probably canceled more
12817 usenet abuse than anybody else.
12818
12819 @item Automoose-1
12820 @cindex CancelMoose[tm]
12821 The CancelMoose[tm] on autopilot.  The CancelMoose[tm] is reputed to be
12822 Norwegian, and was the person(s) who invented NoCeM.  
12823
12824 @item jem@@xpat.com;
12825 @cindex Jem
12826 John Milburn---despammer located in Korea who is getting very busy these
12827 days.
12828
12829 @item red@@redpoll.mrfs.oh.us (Richard E. Depew)
12830 Richard E. Depew---lone American despammer.  He mostly cancels binary
12831 postings to non-binary groups and removes spews (regurgitated articles).
12832 @end table
12833
12834 You do not have to heed NoCeM messages from all these people---just the
12835 ones you want to listen to.
12836
12837 @item gnus-nocem-directory
12838 @vindex gnus-nocem-directory
12839 This is where Gnus will store its NoCeM cache files.  The default is
12840 @file{~/News/NoCeM/}. 
12841
12842 @item gnus-nocem-expiry-wait
12843 @vindex gnus-nocem-expiry-wait
12844 The number of days before removing old NoCeM entries from the cache.
12845 The default is 15.  If you make it shorter Gnus will be faster, but you
12846 might then see old spam.
12847
12848 @end table
12849
12850
12851 @node Picons
12852 @section Picons
12853
12854 So...  You want to slow down your news reader even more!  This is a
12855 good way to do so.  Its also a great way to impress people staring
12856 over your shoulder as you read news.
12857
12858 @menu
12859 * Picon Basics::           What are picons and How do I get them.
12860 * Picon Requirements::     Don't go further if you aren't using XEmacs.
12861 * Easy Picons::            Displaying Picons---the easy way.
12862 * Hard Picons::            The way you should do it.  You'll learn something.
12863 * Picon Configuration::    Other variables you can trash/tweak/munge/play with.
12864 @end menu
12865
12866
12867 @node Picon Basics
12868 @subsection Picon Basics
12869
12870 What are Picons?  To quote directly from the Picons Web site:
12871
12872 @quotation 
12873 @dfn{Picons} is short for ``personal icons''.  They're small,
12874 constrained images used to represent users and domains on the net,
12875 organized into databases so that the appropriate image for a given
12876 e-mail address can be found.  Besides users and domains, there are picon
12877 databases for Usenet newsgroups and weather forecasts.  The picons are
12878 in either monochrome @code{XBM} format or color @code{XPM} and
12879 @code{GIF} formats.
12880 @end quotation
12881
12882 For instructions on obtaining and installing the picons databases, point
12883 your Web browser at
12884 @file{http://www.cs.indiana.edu/picons/ftp/index.html}.
12885
12886 @vindex gnus-picons-database
12887 Gnus expects picons to be installed into a location pointed to by
12888 @code{gnus-picons-database}.
12889
12890
12891 @node Picon Requirements
12892 @subsection Picon Requirements
12893
12894 To use have Gnus display Picons for you, you must be running XEmacs
12895 19.13 or greater since all other versions of Emacs aren't yet able to
12896 display images.
12897
12898 Additionally, you must have @code{xpm} support compiled into XEmacs.
12899
12900 @vindex gnus-picons-convert-x-face
12901 If you want to display faces from @code{X-Face} headers, you must have
12902 the @code{netpbm} utilities installed, or munge the
12903 @code{gnus-picons-convert-x-face} variable to use something else.
12904
12905
12906 @node Easy Picons
12907 @subsection Easy Picons
12908
12909 To enable displaying picons, simply put the following line in your
12910 @file{~/.gnus} file and start Gnus.
12911
12912 @lisp
12913 (setq gnus-use-picons t)
12914 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
12915 (add-hook 'gnus-summary-prepare-hook 'gnus-group-display-picons t)
12916 (add-hook 'gnus-article-display-hook 'gnus-picons-article-display-x-face)
12917 @end lisp
12918
12919
12920 @node Hard Picons
12921 @subsection Hard Picons 
12922
12923 Gnus can display picons for you as you enter and leave groups and
12924 articles.  It knows how to interact with three sections of the picons
12925 database.  Namely, it can display the picons newsgroup pictures,
12926 author's face picture(s), and the authors domain.  To enable this
12927 feature, you need to first decide where to display them.
12928
12929 @table @code 
12930
12931 @item gnus-picons-display-where 
12932 @vindex gnus-picons-display-where 
12933 Where the picon images should be displayed.  It is @code{picons} by
12934 default (which by default maps to the buffer @samp{*Picons*}).  Other
12935 valid places could be @code{article}, @code{summary}, or
12936 @samp{*scratch*} for all I care.  Just make sure that you've made the
12937 buffer visible using the standard Gnus window configuration
12938 routines---@pxref{Windows Configuration}.
12939
12940 @end table
12941
12942 Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your
12943 window configuration for you to include the @code{picons} buffer.
12944
12945 Now that you've made that decision, you need to add the following
12946 functions to the appropriate hooks so these pictures will get
12947 displayed at the right time.
12948
12949 @vindex gnus-article-display-hook
12950 @vindex gnus-picons-display-where
12951 @table @code
12952 @item gnus-article-display-picons
12953 @findex gnus-article-display-picons
12954 Looks up and display the picons for the author and the author's domain
12955 in the @code{gnus-picons-display-where} buffer.  Should be added to
12956 the @code{gnus-article-display-hook}.
12957
12958 @item gnus-group-display-picons
12959 @findex gnus-article-display-picons
12960 Displays picons representing the current group.  This function should
12961 be added to the @code{gnus-summary-prepare-hook} or to the
12962 @code{gnus-article-display-hook} if @code{gnus-picons-display-where}
12963 is set to @code{article}.
12964
12965 @item gnus-picons-article-display-x-face
12966 @findex gnus-article-display-picons
12967 Decodes and displays the X-Face header if present.  This function
12968 should be added to @code{gnus-article-display-hook}.
12969
12970 @end table
12971
12972 Note:  You must append them to the hook, so make sure to specify 't'
12973 to the append flag of @code{add-hook}:
12974
12975 @lisp
12976 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
12977 @end lisp
12978
12979
12980 @node Picon Configuration
12981 @subsection Picon Configuration
12982
12983 The following variables offer further control over how things are
12984 done, where things are located, and other useless stuff you really
12985 don't need to worry about.
12986
12987 @table @code
12988 @item gnus-picons-database
12989 @vindex gnus-picons-database
12990 The location of the picons database.  Should point to a directory
12991 containing the @file{news}, @file{domains}, @file{users} (and so on)
12992 subdirectories.  Defaults to @file{/usr/local/faces}.
12993
12994 @item gnus-picons-news-directory
12995 @vindex gnus-picons-news-directory
12996 Sub-directory of the faces database containing the icons for
12997 newsgroups.
12998
12999 @item gnus-picons-user-directories
13000 @vindex gnus-picons-user-directories
13001 List of subdirectories to search in @code{gnus-picons-database} for user
13002 faces.  @code{("local" "users" "usenix" "misc/MISC")} is the default.
13003
13004 @item gnus-picons-domain-directories
13005 @vindex gnus-picons-domain-directories
13006 List of subdirectories to search in @code{gnus-picons-database} for
13007 domain name faces.  Defaults to @code{("domains")}.  Some people may
13008 want to add @samp{unknown} to this list.
13009
13010 @item gnus-picons-convert-x-face
13011 @vindex gnus-picons-convert-x-face
13012 The command to use to convert the @code{X-Face} header to an X bitmap
13013 (@code{xbm}).  Defaults to @code{(format "@{ echo '/* Width=48,
13014 Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
13015 gnus-picons-x-face-file-name)}
13016
13017 @item gnus-picons-x-face-file-name
13018 @vindex gnus-picons-x-face-file-name
13019 Names a temporary file to store the @code{X-Face} bitmap in.  Defaults
13020 to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.
13021
13022 @item gnus-picons-buffer
13023 @vindex gnus-picons-buffer
13024 The name of the buffer that @code{picons} points to.  Defaults to
13025 @samp{*Icon Buffer*}.
13026
13027 @end table
13028
13029
13030 @node Undo
13031 @section Undo
13032 @cindex undo
13033
13034 It is very useful to be able to undo actions one has done.  In normal
13035 Emacs buffers, it's easy enough---you just push the @code{undo} button.
13036 In Gnus buffers, however, it isn't that simple.
13037
13038 The things Gnus displays in its buffer is of no value whatsoever to
13039 Gnus---it's all just data that is designed to look nice to the user.
13040 Killing a group in the group buffer with @kbd{C-k} makes the line
13041 disappear, but that's just a side-effect of the real action---the
13042 removal of the group in question from the internal Gnus structures.
13043 Undoing something like that can't be done by the normal Emacs
13044 @code{undo} function.
13045
13046 Gnus tries to remedy this somewhat by keeping track of what the user
13047 does and coming up with actions that would reverse the actions the user
13048 takes.  When the user then presses the @code{undo} key, Gnus will run
13049 the code to reverse the previous action, or the previous actions.
13050 However, not all actions are easily reversible, so Gnus currently offers
13051 a few key functions to be undoable.  These include killing groups,
13052 yanking groups, and changing the list of read articles of groups.
13053 That's it, really.  More functions may be added in the future, but each
13054 added function means an increase in data to be stored, so Gnus will
13055 never be totally undoable.
13056
13057 @findex gnus-undo-mode
13058 @vindex gnus-use-undo
13059 @findex gnus-undo
13060 The undoability is provided by the @code{gnus-undo-mode} minor mode.  It
13061 is used if @code{gnus-use-undo} is non-@code{nil}, which is the
13062 default.  The @kbd{M-C-_} key performs the @code{gnus-undo} command
13063 command, which should feel kinda like the normal Emacs @code{undo}
13064 command. 
13065
13066
13067 @node Moderation
13068 @section Moderation
13069 @cindex moderation
13070
13071 If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
13072 It is not included in the standard Gnus package.  Write a mail to
13073 @samp{larsi@@ifi.uio.no} and state what group you moderate, and you'll
13074 get a copy.
13075
13076 The moderation package is implemented as a minor mode for summary
13077 buffers.  Put
13078
13079 @lisp
13080 (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
13081 @end lisp
13082
13083 in your @file{.gnus.el} file.
13084
13085 If you are the moderation of @samp{rec.zoofle}, this is how it's
13086 supposed to work:
13087
13088 @enumerate
13089 @item 
13090 You split your incoming mail by matching on
13091 @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
13092 articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
13093
13094 @item
13095 You enter that group once in a while and post articles using the @kbd{e}
13096 (edit-and-post) or @kbd{s} (just send unedited) commands.
13097
13098 @item
13099 If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
13100 articles that weren't approved by you, you can cancel them with the
13101 @kbd{c} command.
13102 @end enumerate
13103
13104 To use moderation mode in these two groups, say:
13105
13106 @lisp
13107 (setq gnus-moderated-list
13108       "^nnml:rec.zoofle$\\|^rec.zoofle$")
13109 @end lisp
13110
13111
13112 @node XEmacs Enhancements
13113 @section XEmacs Enhancements
13114 @cindex XEmacs
13115
13116 XEmacs is able to display pictures and stuff, so Gnus has taken
13117 advantage of that.  Relevant variables include:
13118
13119 @table @code
13120 @item gnus-xmas-glyph-directory
13121 @vindex gnus-xmas-glyph-directory
13122 This is where Gnus will look for pictures.  Gnus will normally
13123 auto-detect this directory, but you may set it manually if you have an
13124 unusual directory structure.
13125
13126 @item gnus-xmas-logo-color-alist
13127 @vindex gnus-xmas-logo-color-alist
13128 This is an alist where the key is a type symbol and the values are the
13129 foreground and background color of the splash page glyph.
13130
13131 @item gnus-xmas-logo-color-style
13132 @vindex gnus-xmas-logo-color-style
13133 This is the key used to look up the color in the alist described above.
13134 Legal values include @code{flame}, @code{pine}, @code{moss},
13135 @code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
13136 @code{labia}, @code{berry}, @code{neutral}, and @code{september}.
13137
13138 @item gnus-use-toolbar
13139 @vindex gnus-use-toolbar
13140 If @code{nil}, don't display toolbars.  If non-@code{nil}, it should be
13141 one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
13142 @code{right-toolbar}, or @code{left-toolbar}.
13143
13144 @item gnus-group-toolbar
13145 @vindex gnus-group-toolbar
13146 The toolbar in the group buffer.
13147
13148 @item gnus-summary-toolbar
13149 @vindex gnus-summary-toolbar
13150 The toolbar in the summary buffer.
13151
13152 @item gnus-summary-mail-toolbar
13153 @vindex gnus-summary-mail-toolbar
13154 The toolbar in the summary buffer of mail groups.
13155
13156 @item gnus-xmas-modeline-glyph
13157 @vindex gnus-xmas-modeline-glyph
13158 A glyph displayed in all Gnus mode lines.  It is a tiny gnu head by
13159 default. 
13160
13161 @end table
13162
13163
13164 @node Various Various
13165 @section Various Various
13166 @cindex mode lines
13167 @cindex highlights
13168
13169 @table @code
13170
13171 @item gnus-directory
13172 @vindex gnus-directory
13173 All Gnus directories will be initialized from this variable, which
13174 defaults to the @samp{SAVEDIR} environment variable, or @file{~/News/}
13175 if that variable isn't set.
13176
13177 @item gnus-default-directory
13178 @vindex gnus-default-directory
13179 Not related to the above variable at all---this variable says what the
13180 default directory of all Gnus buffers should be.  If you issue commands
13181 like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
13182 default directory.  If this variable is @code{nil} (which is the
13183 default), the default directory will be the default directory of the
13184 buffer you were in when you started Gnus.
13185
13186 @item gnus-verbose
13187 @vindex gnus-verbose
13188 This variable is an integer between zero and ten.  The higher the value,
13189 the more messages will be displayed.  If this variable is zero, Gnus
13190 will never flash any messages, if it is seven (which is the default),
13191 most important messages will be shown, and if it is ten, Gnus won't ever
13192 shut up, but will flash so many messages it will make your head swim.
13193
13194 @item gnus-verbose-backends
13195 @vindex gnus-verbose-backends
13196 This variable works the same way as @code{gnus-verbose}, but it applies
13197 to the Gnus backends instead of Gnus proper.
13198
13199 @item nnheader-max-head-length
13200 @vindex nnheader-max-head-length
13201 When the backends read straight heads of articles, they all try to read
13202 as little as possible.  This variable (default 4096) specifies
13203 the absolute max length the backends will try to read before giving up
13204 on finding a separator line between the head and the body.  If this
13205 variable is @code{nil}, there is no upper read bound.  If it is
13206 @code{t}, the backends won't try to read the articles piece by piece,
13207 but read the entire articles.  This makes sense with some versions of
13208 @code{ange-ftp}. 
13209
13210 @item nnheader-head-chop-length
13211 @vindex nnheader-head-chop-length
13212 This variable says how big a piece of each article to read when doing
13213 the operation described above.
13214
13215 @item nnheader-file-name-translation-alist 
13216 @vindex nnheader-file-name-translation-alist 
13217 @cindex file names
13218 @cindex illegal characters in file names
13219 @cindex characters in file names
13220 This is an alist that says how to translate characters in file names.
13221 For instance, if @samp{:} is illegal as a file character in file names
13222 on your system (you OS/2 user you), you could say something like:
13223
13224 @lisp
13225 (setq nnheader-file-name-translation-alist 
13226       '((?: . ?_)))
13227 @end lisp
13228
13229 In fact, this is the default value for this variable on OS/2 and MS
13230 Windows (phooey) systems.
13231
13232 @item gnus-hidden-properties
13233 @vindex gnus-hidden-properties
13234 This is a list of properties to use to hide ``invisible'' text.  It is
13235 @code{(invisible t intangible t)} by default on most systems, which
13236 makes invisible text invisible and intangible.
13237
13238 @item gnus-parse-headers-hook
13239 @vindex gnus-parse-headers-hook
13240 A hook called before parsing headers.  It can be used, for instance, to
13241 gather statistics on the headers fetched, or perhaps you'd like to prune
13242 some headers.  I don't see why you'd want that, though.
13243
13244 @item gnus-shell-command-separator
13245 @vindex gnus-shell-command-separator
13246 String used to separate to shell commands.  The default is @samp{;}. 
13247
13248
13249 @end table
13250
13251
13252 @node The End
13253 @chapter The End
13254
13255 Well, that's the manual---you can get on with your life now.  Keep in
13256 touch.  Say hello to your cats from me.  
13257
13258 My @strong{ghod}---I just can't stand goodbyes.  Sniffle.
13259
13260 Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
13261
13262 @quotation
13263 @strong{Te Deum}
13264
13265 @sp 1
13266 Not because of victories @*
13267 I sing,@*
13268 having none,@*
13269 but for the common sunshine,@*
13270 the breeze,@*
13271 the largess of the spring.
13272
13273 @sp 1
13274 Not for victory@*
13275 but for the day's work done@*
13276 as well as I was able;@*
13277 not for a seat upon the dais@*
13278 but at the common table.@*
13279 @end quotation
13280
13281
13282 @node Appendices
13283 @chapter Appendices
13284
13285 @menu
13286 * History::                        How Gnus got where it is today.
13287 * Terminology::                    We use really difficult, like, words here.
13288 * Customization::                  Tailoring Gnus to your needs.
13289 * Troubleshooting::                What you might try if things do not work.
13290 * A Programmers Guide to Gnus::    Rilly, rilly technical stuff.
13291 * Emacs for Heathens::             A short introduction to Emacsian terms.
13292 * Frequently Asked Questions::     A question-and-answer session.
13293 @end menu
13294
13295
13296 @node History
13297 @section History
13298
13299 @cindex history
13300 @sc{gnus} was written by Masanobu @sc{Umeda}.  When autumn crept up in
13301 '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
13302
13303 If you want to investigate the person responsible for this outrage, you
13304 can point your (feh!) web browser to
13305 @file{http://www.ifi.uio.no/~larsi/}.  This is also the primary
13306 distribution point for the new and spiffy versions of Gnus, and is known
13307 as The Site That Destroys Newsrcs And Drives People Mad.
13308
13309 During the first extended alpha period of development, the new Gnus was
13310 called ``(ding) Gnus''.  @dfn{(ding)} is, of course, short for
13311 @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
13312 (Besides, the ``Gnus'' in this abbreviation should probably be
13313 pronounced ``news'' as @sc{Umeda} intended, which makes it a more
13314 appropriate name, don't you think?)
13315
13316 In any case, after spending all that energy on coming up with a new and
13317 spunky name, we decided that the name was @emph{too} spunky, so we
13318 renamed it back again to ``Gnus''.  But in mixed case.  ``Gnus'' vs.
13319 ``@sc{gnus}''.  New vs. old.
13320
13321 The first ``proper'' release of Gnus 5 was done in November 1995 when it
13322 was included in the Emacs 19.30 distribution.
13323
13324 In May 1996 the next Gnus generation (aka.  ``September Gnus'') was
13325 released under the name ``Gnus 5.2''.  
13326
13327 On July 28th 1996 work on Red Gnus was begun.
13328
13329 If you happen upon a version of Gnus that has a name that is prefixed --
13330 ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Mamey Sapote Gnus''
13331 -- don't panic.  Don't let it know that you're frightened.  Back away.
13332 Slowly.  Whatever you do, don't run.  Walk away, calmly, until you're
13333 out of its reach.  Find a proper released version of Gnus and snuggle up
13334 to that instead.
13335
13336 @menu
13337 * Why?::                What's the point of Gnus?
13338 * Compatibility::       Just how compatible is Gnus with @sc{gnus}?
13339 * Conformity::          Gnus tries to conform to all standards.
13340 * Emacsen::             Gnus can be run on a few modern Emacsen.
13341 * Contributors::        Oodles of people.  
13342 * New Features::        Pointers to some of the new stuff in Gnus.
13343 * Newest Features::     Features so new that they haven't been written yet.
13344 @end menu
13345
13346
13347 @node Why?
13348 @subsection Why?
13349
13350 What's the point of Gnus?  
13351
13352 I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
13353 newsreader, that lets you do anything you can think of.  That was my
13354 original motivation, but while working on Gnus, it has become clear to
13355 me that this generation of newsreaders really belong in the stone age.
13356 Newsreaders haven't developed much since the infancy of the net.  If the
13357 volume continues to rise with the current rate of increase, all current
13358 newsreaders will be pretty much useless.  How do you deal with
13359 newsgroups that have thousands of new articles each day?  How do you
13360 keep track of millions of people who post?
13361
13362 Gnus offers no real solutions to these questions, but I would very much
13363 like to see Gnus being used as a testing ground for new methods of
13364 reading and fetching news.  Expanding on @sc{Umeda}-san's wise decision
13365 to separate the newsreader from the backends, Gnus now offers a simple
13366 interface for anybody who wants to write new backends for fetching mail
13367 and news from different sources.  I have added hooks for customizations
13368 everywhere I could imagine useful.  By doing so, I'm inviting every one
13369 of you to explore and invent.
13370
13371 May Gnus never be complete. @kbd{C-u 100 M-x hail-emacs}. 
13372
13373
13374 @node Compatibility
13375 @subsection Compatibility
13376
13377 @cindex compatibility
13378 Gnus was designed to be fully compatible with @sc{gnus}.  Almost all key
13379 bindings have been kept.  More key bindings have been added, of course,
13380 but only in one or two obscure cases have old bindings been changed.
13381
13382 Our motto is:
13383 @quotation
13384 @cartouche
13385 @center In a cloud bones of steel.
13386 @end cartouche
13387 @end quotation
13388
13389 All commands have kept their names.  Some internal functions have changed
13390 their names.
13391
13392 The @code{gnus-uu} package has changed drastically. @pxref{Decoding
13393 Articles}. 
13394
13395 One major compatibility question is the presence of several summary
13396 buffers.  All variables that are relevant while reading a group are
13397 buffer-local to the summary buffer they belong in.  Although many
13398 important variables have their values copied into their global
13399 counterparts whenever a command is executed in the summary buffer, this
13400 change might lead to incorrect values being used unless you are careful.
13401
13402 All code that relies on knowledge of @sc{gnus} internals will probably
13403 fail.  To take two examples: Sorting @code{gnus-newsrc-alist} (or
13404 changing it in any way, as a matter of fact) is strictly verboten.  Gnus
13405 maintains a hash table that points to the entries in this alist (which
13406 speeds up many functions), and changing the alist directly will lead to
13407 peculiar results.
13408
13409 @cindex hilit19
13410 @cindex highlighting
13411 Old hilit19 code does not work at all.  In fact, you should probably
13412 remove all hilit code from all Gnus hooks
13413 (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
13414 Gnus provides various integrated functions for highlighting.  These are
13415 faster and more accurate.  To make life easier for everybody, Gnus will
13416 by default remove all hilit calls from all hilit hooks.  Uncleanliness!
13417 Away!
13418
13419 Packages like @code{expire-kill} will no longer work.  As a matter of
13420 fact, you should probably remove all old @sc{gnus} packages (and other
13421 code) when you start using Gnus.  More likely than not, Gnus already
13422 does what you have written code to make @sc{gnus} do.  (Snicker.)
13423
13424 Even though old methods of doing things are still supported, only the
13425 new methods are documented in this manual.  If you detect a new method of
13426 doing something while reading this manual, that does not mean you have
13427 to stop doing it the old way.
13428
13429 Gnus understands all @sc{gnus} startup files.
13430
13431 @kindex M-x gnus-bug
13432 @findex gnus-bug
13433 @cindex reporting bugs
13434 @cindex bugs
13435 Overall, a casual user who hasn't written much code that depends on
13436 @sc{gnus} internals should suffer no problems.  If problems occur,
13437 please let me know by issuing that magic command @kbd{M-x gnus-bug}.
13438
13439
13440 @node Conformity
13441 @subsection Conformity
13442
13443 No rebels without a clue here, ma'am.  We conform to all standards known
13444 to (wo)man.  Except for those standards and/or conventions we disagree
13445 with, of course.
13446
13447 @table @strong
13448
13449 @item RFC 822
13450 @cindex RFC 822
13451 There are no known breaches of this standard.
13452
13453 @item RFC 1036
13454 @cindex RFC 1036
13455 There are no known breaches of this standard, either.
13456
13457 @item Good Net-Keeping Seal of Approval
13458 @cindex Good Net-Keeping Seal of Approval
13459 Gnus has been through the Seal process and failed.  I think it'll pass
13460 the next inspection.
13461
13462 @item Son-of-RFC 1036
13463 @cindex Son-of-RFC 1036
13464 We do have some breaches to this one.
13465
13466 @table @emph
13467
13468 @item MIME
13469 Gnus does no MIME handling, and this standard-to-be seems to think that
13470 MIME is the bees' knees, so we have major breakage here.
13471
13472 @item X-Newsreader
13473 This is considered to be a ``vanity header'', while I consider it to be
13474 consumer information.  After seeing so many badly formatted articles
13475 coming from @code{tin} and @code{Netscape} I know not to use either of
13476 those for posting articles.  I would not have known that if it wasn't
13477 for the @code{X-Newsreader} header.
13478
13479 @item References
13480 Gnus does line breaking on this header.  I infer from RFC1036 that being
13481 conservative in what you output is not creating 5000-character lines, so
13482 it seems like a good idea to me.  However, this standard-to-be says that
13483 whitespace in the @code{References} header is to be preserved, so...  It
13484 doesn't matter one way or the other to Gnus, so if somebody tells me
13485 what The Way is, I'll change it.  Or not.
13486 @end table
13487
13488 @end table
13489
13490 If you ever notice Gnus acting non-compliantly with regards to the texts
13491 mentioned above, don't hesitate to drop a note to Gnus Towers and let us
13492 know.
13493
13494
13495 @node Emacsen
13496 @subsection Emacsen
13497 @cindex Emacsen
13498 @cindex XEmacs
13499 @cindex Mule
13500 @cindex Emacs
13501
13502 Gnus should work on :
13503
13504 @itemize @bullet 
13505
13506 @item
13507 Emacs 19.32 and up.
13508
13509 @item
13510 XEmacs 19.14 and up.
13511
13512 @item 
13513 Mule versions based on Emacs 19.32 and up.
13514
13515 @end itemize
13516
13517 Gnus will absolutely not work on any Emacsen older than that.  Not
13518 reliably, at least. 
13519
13520 There are some vague differences between Gnus on the various
13521 platforms---XEmacs features more graphics (a logo and a toolbar)---but
13522 other than that, things should look pretty much the same under all
13523 Emacsen. 
13524
13525
13526 @node Contributors
13527 @subsection Contributors
13528 @cindex contributors
13529
13530 The new Gnus version couldn't have been done without the help of all the
13531 people on the (ding) mailing list.  Every day for over a year I have
13532 gotten billions of nice bug reports from them, filling me with joy,
13533 every single one of them.  Smooches.  The people on the list have been
13534 tried beyond endurance, what with my ``oh, that's a neat idea <type
13535 type>, yup, I'll release it right away <ship off> no wait, that doesn't
13536 work at all <type type>, yup, I'll ship that one off right away <ship
13537 off> no, wait, that absolutely does not work'' policy for releases.
13538 Micro$oft---bah.  Amateurs.  I'm @emph{much} worse.  (Or is that
13539 ``worser''? ``much worser''?  ``worsest''?)
13540
13541 I would like to take this opportunity to thank the Academy for...  oops,
13542 wrong show.
13543
13544 @itemize @bullet
13545
13546 @item 
13547 Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
13548
13549 @item 
13550 Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
13551 well as numerous other things).
13552
13553 @item 
13554 Luis Fernandes---design and graphics.
13555
13556 @item
13557 Erik Naggum---help, ideas, support, code and stuff.
13558
13559 @item 
13560 Wes Hardaker---@file{gnus-picon.el} and the manual section on
13561 @dfn{picons} (@pxref{Picons}).
13562
13563 @item 
13564 Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
13565 (@pxref{GroupLens}).
13566
13567 @item 
13568 Sudish Joseph---innumerable bug fixes.
13569
13570 @item 
13571 Ilja Weis---@file{gnus-topic.el}.
13572
13573 @item 
13574 Steven L. Baur---lots and lots and lots of bugs detections and fixes.
13575
13576 @item 
13577 Vladimir Alexiev---the refcard and reference booklets.
13578
13579 @item 
13580 Felix Lee & Jamie Zawinsky---I stole some pieces from the XGnus
13581 distribution by Felix Lee and JWZ.
13582
13583 @item 
13584 Scott Byer---@file{nnfolder.el} enhancements & rewrite.
13585
13586 @item 
13587 Peter Mutsaers---orphan article scoring code.
13588
13589 @item 
13590 Ken Raeburn---POP mail support.
13591
13592 @item 
13593 Hallvard B Furuseth---various bits and pieces, especially dealing with
13594 .newsrc files.
13595
13596 @item 
13597 Brian Edmonds---@file{gnus-bbdb.el}.
13598
13599 @item
13600 David Moore---rewrite of @file{nnvirtual.el} and many other things. 
13601
13602 @item 
13603 Ricardo Nassif, Mark Borges, and Jost Krieger---proof-reading.
13604
13605 @item 
13606 Kevin Davidson---came up with the name @dfn{ding}, so blame him.
13607
13608 @item
13609 François Pinard---many, many interesting and thorough bug reports.
13610
13611 @end itemize
13612
13613 The following people have contributed many patches and suggestions: 
13614
13615 Christopher Davis,
13616 Andrew Eskilsson,
13617 Kai Grossjohann,
13618 David KÃ¥gedal,
13619 Richard Pieri,
13620 Fabrice Popineau, 
13621 Daniel Quinlan, 
13622 Jason L. Tibbitts, III,
13623 and
13624 Jack Vinson.
13625
13626 Also thanks to the following for patches and stuff:
13627
13628 Peter Arius, 
13629 Marc Auslander,
13630 Mark Borges,
13631 Lance A. Brown,
13632 Kees de Bruin,
13633 Martin Buchholz,
13634 Kevin Buhr,
13635 Alastair Burt,
13636 Joao Cachopo,
13637 Massimo Campostrini,
13638 Michael R. Cook,
13639 Glenn Coombs, 
13640 Frank D. Cringle, 
13641 Geoffrey T. Dairiki,
13642 Ulrik Dickow,
13643 Dave Disser,
13644 Joev Dubach,
13645 Paul Eggert,
13646 Michael Ernst,
13647 Luc Van Eycken,
13648 Sam Falkner,
13649 Paul Franklin, 
13650 David S. Goldberg,
13651 D. Hall, 
13652 Magnus Hammerin,
13653 Raja R. Harinath,
13654 Marc Horowitz,
13655 Ishikawa Ichiro, @c Ishikawa
13656 Francois Felix Ingrand,
13657 Lee Iverson, 
13658 Randell Jesup,
13659 Fred Johansen, 
13660 Thor Kristoffersen,
13661 Jens Lautenbacher,
13662 Carsten Leonhardt,
13663 Christian Limpach,
13664 Tonny Madsen,
13665 Shlomo Mahlab,
13666 Nat Makarevitch,
13667 Timo Metzemakers,
13668 Richard Mlynarik,
13669 Lantz Moore,
13670 Morioka Tomohiko, @c Morioka
13671 Hrvoje Niksic,
13672 Andy Norman,
13673 C. R. Oldham,
13674 Alexandre Oliva,
13675 Ken Olstad,
13676 Masaharu Onishi, @c Onishi
13677 Hideki Ono, @c Ono
13678 William Perry,
13679 Stephen Peters,
13680 Ulrich Pfeifer,
13681 Colin Rafferty,
13682 Bart Robinson,
13683 Ralph Schleicher,
13684 Randal L. Schwartz,
13685 Danny Siu, 
13686 Paul D. Smith,
13687 Jeff Sparkes,
13688 Michael Sperber,
13689 Richard Stallman,
13690 Greg Stark, 
13691 Kurt Swanson,
13692 Samuel Tardieu, 
13693 Teddy,
13694 Chuck Thompson,
13695 Philippe Troin,
13696 Jan Vroonhof,
13697 Barry A. Warsaw,
13698 Christoph Wedler,
13699 Joe Wells,
13700 and
13701 Katsumi Yamaoka. @c Yamaoka
13702
13703
13704 Apologies to everybody that I've forgotten, of which there are many, I'm
13705 sure.  
13706
13707 Gee, that's quite a list of people.  I guess that must mean that there
13708 actually are people who are using Gnus.  Who'd'a thunk it!
13709
13710
13711 @node New Features
13712 @subsection New Features
13713 @cindex new features
13714
13715 @menu
13716 * ding Gnus::          New things in Gnus 5.0/5.1, the first new Gnus.
13717 * September Gnus::     The Thing Formally Known As Gnus 5.3/5.3.
13718 * Red Gnus::           The future---Gnus 5.4/5.5.
13719 @end menu
13720
13721 These lists are, of course, just @emph{short} overviews of the
13722 @emph{most} important new features.  No, really.  There are tons more.
13723 Yes, we have feeping creaturism in full effect.
13724
13725
13726 @node ding Gnus
13727 @subsubsection (ding) Gnus
13728
13729 New features in Gnus 5.0/5.1:
13730
13731 @itemize @bullet
13732
13733 @item
13734 The look of all buffers can be changed by setting format-like variables
13735 (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}). 
13736  
13737 @item 
13738 Local spool and several @sc{nntp} servers can be used at once
13739 (@pxref{Select Methods}).  
13740
13741 @item 
13742 You can combine groups into virtual groups (@pxref{Virtual Groups}).
13743
13744 @item 
13745 You can read a number of different mail formats (@pxref{Getting Mail}).
13746 All the mail backends implement a convenient mail expiry scheme
13747 (@pxref{Expiring Mail}). 
13748
13749 @item
13750 Gnus can use various strategies for gathering threads that have lost
13751 their roots (thereby gathering loose sub-threads into one thread) or it
13752 can go back and retrieve enough headers to build a complete thread
13753 (@pxref{Customizing Threading}).
13754
13755 @item 
13756 Killed groups can be displayed in the group buffer, and you can read
13757 them as well (@pxref{Listing Groups}).
13758
13759 @item 
13760 Gnus can do partial group updates---you do not have to retrieve the
13761 entire active file just to check for new articles in a few groups
13762 (@pxref{The Active File}).
13763
13764 @item 
13765 Gnus implements a sliding scale of subscribedness to groups
13766 (@pxref{Group Levels}).
13767
13768 @item 
13769 You can score articles according to any number of criteria
13770 (@pxref{Scoring}).  You can even get Gnus to find out how to score
13771 articles for you (@pxref{Adaptive Scoring}).
13772
13773 @item 
13774 Gnus maintains a dribble buffer that is auto-saved the normal Emacs
13775 manner, so it should be difficult to lose much data on what you have
13776 read if your machine should go down (@pxref{Auto Save}). 
13777
13778 @item 
13779 Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up
13780 the @file{.emacs} file.
13781
13782 @item 
13783 You can set the process mark on both groups and articles and perform
13784 operations on all the marked items (@pxref{Process/Prefix}).
13785
13786 @item 
13787 You can grep through a subset of groups and create a group from the
13788 results (@pxref{Kibozed Groups}). 
13789
13790 @item 
13791 You can list subsets of groups according to, well, anything
13792 (@pxref{Listing Groups}). 
13793
13794 @item 
13795 You can browse foreign servers and subscribe to groups from those
13796 servers (@pxref{Browse Foreign Server}). 
13797
13798 @item 
13799 Gnus can fetch articles asynchronously on a second connection to the
13800 server (@pxref{Asynchronous Fetching}).
13801
13802 @item 
13803 You can cache articles locally (@pxref{Article Caching}). 
13804
13805 @item 
13806 The uudecode functions have been expanded and generalized
13807 (@pxref{Decoding Articles}). 
13808
13809 @item
13810 You can still post uuencoded articles, which was a little-known feature
13811 of @sc{gnus}' past (@pxref{Uuencoding and Posting}). 
13812
13813 @item
13814 Fetching parents (and other articles) now actually works without
13815 glitches (@pxref{Finding the Parent}). 
13816
13817 @item
13818 Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
13819
13820 @item
13821 Digests (and other files) can be used as the basis for groups
13822 (@pxref{Document Groups}).
13823
13824 @item 
13825 Articles can be highlighted and customized (@pxref{Customizing
13826 Articles}). 
13827
13828 @item 
13829 URLs and other external references can be buttonized (@pxref{Article
13830 Buttons}). 
13831
13832 @item
13833 You can do lots of strange stuff with the Gnus window & frame
13834 configuration (@pxref{Windows Configuration}).
13835
13836 @item
13837 You can click on buttons instead of using the keyboard
13838 (@pxref{Buttons}). 
13839
13840 @end itemize
13841
13842
13843 @node September Gnus
13844 @subsubsection September Gnus
13845
13846 New features in Gnus 5.2/5.3:
13847
13848 @itemize @bullet
13849
13850 @item
13851 A new message composition mode is used.  All old customization variables
13852 for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
13853 now obsolete.
13854
13855 @item
13856 Gnus is now able to generate @dfn{sparse} threads---threads where
13857 missing articles are represented by empty nodes (@pxref{Customizing
13858 Threading}). 
13859
13860 @lisp
13861 (setq gnus-build-sparse-threads 'some)
13862 @end lisp
13863
13864 @item
13865 Outgoing articles are stored on a special archive server
13866 (@pxref{Archived Messages}). 
13867
13868 @item
13869 Partial thread regeneration now happens when articles are
13870 referred. 
13871
13872 @item
13873 Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
13874
13875 @item
13876 Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}). 
13877
13878 @item
13879 A @code{trn}-line tree buffer can be displayed (@pxref{Tree Display}).
13880
13881 @lisp
13882 (setq gnus-use-trees t)
13883 @end lisp
13884
13885 @item
13886 An @code{nn}-like pick-and-read minor mode is available for the summary
13887 buffers (@pxref{Pick and Read}).
13888
13889 @lisp
13890 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
13891 @end lisp
13892
13893 @item
13894 In binary groups you can use a special binary minor mode (@pxref{Binary
13895 Groups}). 
13896
13897 @item
13898 Groups can be grouped in a folding topic hierarchy (@pxref{Group
13899 Topics}).
13900
13901 @lisp
13902 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
13903 @end lisp
13904
13905 @item
13906 Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
13907
13908 @item
13909 Groups can now have a score, and bubbling based on entry frequency
13910 is possible (@pxref{Group Score}).
13911
13912 @lisp
13913 (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
13914 @end lisp
13915
13916 @item
13917 Groups can be process-marked, and commands can be performed on
13918 groups of groups (@pxref{Marking Groups}).
13919
13920 @item
13921 Caching is possible in virtual groups.
13922
13923 @item
13924 @code{nndoc} now understands all kinds of digests, mail boxes, rnews
13925 news batches, ClariNet briefs collections, and just about everything
13926 else (@pxref{Document Groups}).
13927
13928 @item
13929 Gnus has a new backend (@code{nnsoup}) to create/read SOUP packets
13930 (@pxref{SOUP}).
13931
13932 @item
13933 The Gnus cache is much faster.
13934
13935 @item
13936 Groups can be sorted according to many criteria (@pxref{Sorting
13937 Groups}).
13938
13939 @item
13940 New group parameters have been introduced to set list-address and
13941 expiry times (@pxref{Group Parameters}).
13942
13943 @item
13944 All formatting specs allow specifying faces to be used
13945 (@pxref{Formatting Fonts}).
13946
13947 @item
13948 There are several more commands for setting/removing/acting on process
13949 marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
13950
13951 @item
13952 The summary buffer can be limited to show parts of the available
13953 articles based on a wide range of criteria.  These commands have been
13954 bound to keys on the @kbd{/} submap (@pxref{Limiting}).
13955
13956 @item
13957 Articles can be made persistent with the @kbd{*} command
13958 (@pxref{Persistent Articles}).
13959
13960 @item
13961 All functions for hiding article elements are now toggles.
13962
13963 @item
13964 Article headers can be buttonized (@pxref{Article Washing}).
13965
13966 @lisp
13967 (add-hook 'gnus-article-display-hook 
13968           'gnus-article-add-buttons-to-head)
13969 @end lisp
13970
13971 @item
13972 All mail backends support fetching articles by @code{Message-ID}.
13973
13974 @item
13975 Duplicate mail can now be treated properly (@pxref{Duplicates}).
13976
13977 @item
13978 All summary mode commands are available directly from the article
13979 buffer (@pxref{Article Keymap}). 
13980
13981 @item
13982 Frames can be part of @code{gnus-buffer-configuration} (@pxref{Windows
13983 Configuration}).
13984
13985 @item
13986 Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
13987
13988 @item
13989 Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
13990
13991 @lisp
13992 (setq gnus-use-nocem t)
13993 @end lisp
13994
13995 @item
13996 Groups can be made permanently visible (@pxref{Listing Groups}).
13997
13998 @lisp
13999 (setq gnus-permanently-visible-groups "^nnml:")
14000 @end lisp
14001
14002 @item
14003 Many new hooks have been introduced to make customizing easier. 
14004
14005 @item
14006 Gnus respects the @code{Mail-Copies-To} header.
14007
14008 @item
14009 Threads can be gathered by looking at the @code{References} header
14010 (@pxref{Customizing Threading}).
14011
14012 @lisp
14013 (setq gnus-summary-thread-gathering-function 
14014       'gnus-gather-threads-by-references)
14015 @end lisp
14016
14017 @item
14018 Read articles can be stored in a special backlog buffer to avoid
14019 refetching (@pxref{Article Backlog}).  
14020
14021 @lisp
14022 (setq gnus-keep-backlog 50)
14023 @end lisp
14024
14025 @item
14026 A clean copy of the current article is always stored in a separate
14027 buffer to allow easier treatment.
14028
14029 @item
14030 Gnus can suggest where to save articles (@pxref{Saving Articles}).
14031
14032 @item
14033 Gnus doesn't have to do as much prompting when saving (@pxref{Saving
14034 Articles}). 
14035
14036 @lisp
14037 (setq gnus-prompt-before-saving t)
14038 @end lisp
14039
14040 @item
14041 @code{gnus-uu} can view decoded files asynchronously while fetching
14042 articles (@pxref{Other Decode Variables}). 
14043
14044 @lisp
14045 (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
14046 @end lisp
14047
14048 @item
14049 Filling in the article buffer now works properly on cited text
14050 (@pxref{Article Washing}).
14051
14052 @item
14053 Hiding cited text adds buttons to toggle hiding, and how much
14054 cited text to hide is now customizable (@pxref{Article Hiding}).
14055
14056 @lisp
14057 (setq gnus-cited-lines-visible 2)
14058 @end lisp
14059
14060 @item
14061 Boring headers can be hidden (@pxref{Article Hiding}).
14062
14063 @lisp
14064 (add-hook 'gnus-article-display-hook 
14065           'gnus-article-hide-boring-headers t)
14066 @end lisp
14067
14068 @item
14069 Default scoring values can now be set from the menu bar.
14070
14071 @item
14072 Further syntax checking of outgoing articles have been added.
14073
14074 @end itemize
14075
14076
14077 @node Red Gnus
14078 @subsubsection Red Gnus
14079
14080 New features in Gnus 5.4/5.5:
14081
14082 @itemize @bullet
14083
14084 @item
14085 @file{nntp.el} has been totally rewritten in an asynchronous fashion.
14086
14087 @item
14088 Article prefetching functionality has been moved up into 
14089 Gnus (@pxref{Asynchronous Fetching}).  
14090
14091 @item
14092 Scoring can now be performed with logical operators like @code{and},
14093 @code{or}, @code{not}, and parent redirection (@pxref{Advanced
14094 Scoring}).
14095
14096 @item
14097 Article washing status can be displayed in the
14098 article mode line (@pxref{Misc Article}).
14099
14100 @item
14101 @file{gnus.el} has been split into many smaller files.
14102
14103 @item
14104 Suppression of duplicate articles based on Message-ID can be done
14105 (@pxref{Duplicate Suppression}).
14106
14107 @lisp
14108 (setq gnus-suppress-duplicates t)
14109 @end lisp
14110
14111 @item
14112 New variables for specifying what score and adapt files are to be
14113 considered home score and adapt files (@pxref{Home Score File}).
14114
14115 @item
14116 @code{nndoc} was rewritten to be easily extendable (@pxref{Document
14117 Server Internals}). 
14118
14119 @item
14120 Groups can inherit group parameters from parent topics (@pxref{Topic
14121 Parameters}).
14122
14123 @item
14124 Article editing has been revamped and is now actually usable.
14125
14126 @item
14127 Signatures can be recognized in more intelligent fashions
14128 (@pxref{Article Signature}).
14129
14130 @item
14131 Summary pick mode has been made to look more @code{nn}-like.  Line
14132 numbers are displayed and the @kbd{.} command can be used to pick
14133 articles (@code{Pick and Read}).
14134
14135 @item
14136 Commands for moving the @file{.newsrc.eld} from one server to
14137 another have been added (@pxref{Changing Servers}).
14138
14139 @item
14140 A way to specify that ``uninteresting'' fields be suppressed when
14141 generating lines in buffers (@pxref{Advanced Formatting}).
14142
14143 @item
14144 Several commands in the group buffer can be undone with @kbd{M-C-_}
14145 (@pxref{Undo}).
14146
14147 @item
14148 Scoring can be done on words using the new score type @code{w}
14149 (@pxref{Score File Format}).
14150
14151 @item
14152 Adaptive scoring can be done on a Subject word-by-word basis
14153 (@pxref{Adaptive Scoring}). 
14154
14155 @lisp
14156 (setq gnus-use-adaptive-scoring '(word))
14157 @end lisp
14158
14159 @item
14160 Scores can be decayed (@pxref{Score Decays}).
14161  
14162 @lisp
14163 (setq gnus-decay-scores t)
14164 @end lisp
14165
14166 @item
14167 Scoring can be performed using a regexp on the Date header.  The Date is
14168 normalized to compact ISO 8601 format first (@pxref{Score File Format}).
14169
14170 @item
14171 A new command has been added to remove all data on articles from
14172 the native server (@pxref{Changing Servers}).
14173
14174 @item
14175 A new command for reading collections of documents
14176 (@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{M-C-d}
14177 (@pxref{Really Various Summary Commands}). 
14178
14179 @item
14180 Process mark sets can be pushed and popped (@pxref{Setting Process
14181 Marks}).
14182
14183 @item
14184 A new mail-to-news backend makes it possible to post even when the NNTP
14185 server doesn't allow posting (@pxref{Mail-To-News Gateways}).
14186
14187 @item
14188 A new backend for reading searches from Web search engines
14189 (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
14190 (@pxref{Web Searches}).
14191
14192 @item
14193 Groups inside topics can now be sorted using the standard sorting
14194 functions, and each topic can be sorted independently (@pxref{Topic
14195 Sorting}).
14196
14197 @item
14198 Subsets of the groups can be sorted independently (@code{Sorting
14199 Groups}).
14200
14201 @item
14202 Cached articles can be pulled into the groups (@pxref{Summary Generation
14203 Commands}).
14204   
14205 @item
14206 Score files are now applied in a more reliable order (@pxref{Score
14207 Variables}).
14208
14209 @item
14210 Reports on where mail messages end up can be generated (@pxref{Splitting
14211 Mail}).
14212
14213 @item
14214 More hooks and functions have been added to remove junk from incoming
14215 mail before saving the mail (@pxref{Washing Mail}).
14216
14217 @item
14218 Emphasized text can be properly fontisized:
14219
14220 @lisp
14221 (add-hook 'gnus-article-display-hook 'gnus-article-emphasize)
14222 @end lisp
14223  
14224 @end itemize
14225
14226
14227 @node Newest Features
14228 @subsection Newest Features
14229 @cindex todo
14230
14231 Also known as the @dfn{todo list}.  Sure to be implemented before the
14232 next millennium. 
14233
14234 Be afraid.  Be very afraid.
14235
14236 @itemize @bullet
14237 @item
14238 Native @sc{mime} support is something that should be done.  
14239 @item
14240 Really do unbinhexing.
14241 @end itemize
14242
14243 And much, much, much more.  There is more to come than has already been
14244 implemented.  (But that's always true, isn't it?)
14245
14246 @file{<URL:http://www.ifi.uio.no/~larsi/rgnus/todo>} is where the actual
14247 up-to-the-second todo list is located, so if you're really curious, you
14248 could point your Web browser over that-a-way.
14249
14250 @iftex
14251
14252 @node The Manual
14253 @section The Manual
14254 @cindex colophon
14255 @cindex manual
14256
14257 This manual was generated from a TeXinfo file and then run through
14258 either @code{texi2dvi}
14259 @iflatex
14260 or my own home-brewed TeXinfo to \LaTeX\ transformer,
14261 and then run through @code{latex} and @code{dvips} 
14262 @end iflatex
14263 to get what you hold in your hands now.
14264
14265 The following conventions have been used:
14266
14267 @enumerate
14268
14269 @item
14270 This is a @samp{string}
14271
14272 @item
14273 This is a @kbd{keystroke}
14274
14275 @item
14276 This is a @file{file}
14277
14278 @item 
14279 This is a @code{symbol}
14280
14281 @end enumerate
14282
14283 So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
14284 mean:
14285
14286 @lisp
14287 (setq flargnoze "yes")
14288 @end lisp
14289
14290 If I say ``set @code{flumphel} to @code{yes}'', that would mean:
14291
14292 @lisp
14293 (setq flumphel 'yes)
14294 @end lisp
14295
14296 @samp{yes} and @code{yes} are two @emph{very} different things---don't
14297 ever get them confused.
14298
14299 @iflatex
14300 @c @head
14301 Of course, everything in this manual is of vital interest, so you should
14302 read it all.  Several times.  However, if you feel like skimming the
14303 manual, look for that gnu head you should see in the margin over
14304 there---it means that what's being discussed is of more importance than
14305 the rest of the stuff.  (On the other hand, if everything is infinitely
14306 important, how can anything be more important than that?  Just one more
14307 of the mysteries of this world, I guess.)
14308 @end iflatex
14309
14310 @end iftex
14311
14312
14313 @node Terminology
14314 @section Terminology
14315
14316 @cindex terminology
14317 @table @dfn
14318
14319 @item news
14320 @cindex news
14321 This is what you are supposed to use this thing for---reading news.
14322 News is generally fetched from a nearby @sc{nntp} server, and is
14323 generally publicly available to everybody.  If you post news, the entire
14324 world is likely to read just what you have written, and they'll all
14325 snigger mischievously.  Behind your back.
14326
14327 @item mail
14328 @cindex mail
14329 Everything that's delivered to you personally is mail.  Some news/mail
14330 readers (like Gnus) blur the distinction between mail and news, but
14331 there is a difference.  Mail is private.  News is public.  Mailing is
14332 not posting, and replying is not following up.
14333
14334 @item reply
14335 @cindex reply
14336 Send a mail to the person who has written what you are reading.
14337
14338 @item follow up
14339 @cindex follow up
14340 Post an article to the current newsgroup responding to the article you
14341 are reading.
14342
14343 @item backend
14344 @cindex backend
14345 Gnus gets fed articles from a number of backends, both news and mail
14346 backends.  Gnus does not handle the underlying media, so to speak---this
14347 is all done by the backends.
14348
14349 @item native
14350 @cindex native
14351 Gnus will always use one method (and backend) as the @dfn{native}, or
14352 default, way of getting news.
14353
14354 @item foreign
14355 @cindex foreign
14356 You can also have any number of foreign groups active at the same time.
14357 These are groups that use different backends for getting news.
14358
14359 @item secondary
14360 @cindex secondary
14361 Secondary backends are somewhere half-way between being native and being
14362 foreign, but they mostly act like they are native.
14363
14364 @item article
14365 @cindex article
14366 A message that has been posted as news.
14367
14368 @item mail message
14369 @cindex mail message
14370 A message that has been mailed.
14371
14372 @item message 
14373 @cindex message
14374 A mail message or news article
14375
14376 @item head
14377 @cindex head
14378 The top part of a message, where administrative information (etc.) is
14379 put.
14380
14381 @item body
14382 @cindex body
14383 The rest of an article.  Everything that is not in the head is in the
14384 body. 
14385
14386 @item header
14387 @cindex header
14388 A line from the head of an article. 
14389
14390 @item headers
14391 @cindex headers
14392 A collection of such lines, or a collection of heads.  Or even a
14393 collection of @sc{nov} lines.
14394
14395 @item @sc{nov}
14396 @cindex nov
14397 When Gnus enters a group, it asks the backend for the headers of all
14398 unread articles in the group.  Most servers support the News OverView
14399 format, which is more compact and much faster to read and parse than the
14400 normal @sc{head} format.
14401
14402 @item level
14403 @cindex levels
14404 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
14405 that have a lower level are ``more'' subscribed than the groups with a
14406 higher level.  In fact, groups on levels 1-5 are considered
14407 @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
14408 are @dfn{killed}.  Commands for listing groups and scanning for new
14409 articles will all use the numeric prefix as @dfn{working level}.
14410
14411 @item killed groups
14412 @cindex killed groups
14413 No information on killed groups is stored or updated, which makes killed
14414 groups much easier to handle than subscribed groups.
14415
14416 @item zombie groups
14417 @cindex zombie groups
14418 Just like killed groups, only slightly less dead.
14419
14420 @item active file
14421 @cindex active file
14422 The news server has to keep track of what articles it carries, and what
14423 groups exist.  All this information in stored in the active file, which
14424 is rather large, as you might surmise.
14425
14426 @item bogus groups
14427 @cindex bogus groups
14428 A group that exists in the @file{.newsrc} file, but isn't known to the
14429 server (i.e.,  it isn't in the active file), is a @emph{bogus group}.
14430 This means that the group probably doesn't exist (any more).
14431
14432 @item server 
14433 @cindex server
14434 A machine than one can connect to and get news (or mail) from.
14435
14436 @item select method
14437 @cindex select method
14438 A structure that specifies the backend, the server and the virtual
14439 server parameters.
14440
14441 @item virtual server
14442 @cindex virtual server
14443 A named select method.  Since a select methods defines all there is to
14444 know about connecting to a (physical) server, taking the things as a
14445 whole is a virtual server.
14446
14447 @item washing
14448 @cindex washing
14449 Taking a buffer and running it through a filter of some sort.  The
14450 result will (more often than not) be cleaner and more pleasing than the
14451 original. 
14452
14453 @item ephemeral groups
14454 @cindex ephemeral groups
14455 Most groups store data on what articles you have read.  @dfn{Ephemeral}
14456 groups are groups that will have no data stored---when you exit the
14457 group, it'll disappear into the aether.  
14458
14459 @item solid groups
14460 @cindex solid groups
14461 This is the opposite of ephemeral groups.  All groups listed in the
14462 group buffer are solid groups.
14463
14464 @end table
14465
14466
14467 @node Customization
14468 @section Customization
14469 @cindex general customization
14470
14471 All variables are properly documented elsewhere in this manual.  This
14472 section is designed to give general pointers on how to customize Gnus
14473 for some quite common situations.
14474
14475 @menu
14476 * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
14477 * Slow Terminal Connection::  You run a remote Emacs.
14478 * Little Disk Space::         You feel that having large setup files is icky.
14479 * Slow Machine::              You feel like buying a faster machine.
14480 @end menu
14481
14482
14483 @node Slow/Expensive Connection
14484 @subsection Slow/Expensive @sc{nntp} Connection
14485
14486 If you run Emacs on a machine locally, and get your news from a machine
14487 over some very thin strings, you want to cut down on the amount of data
14488 Gnus has to get from the @sc{nntp} server.
14489
14490 @table @code
14491
14492 @item gnus-read-active-file
14493 Set this to @code{nil}, which will inhibit Gnus from requesting the
14494 entire active file from the server.  This file is often v.  large.  You
14495 also have to set @code{gnus-check-new-news} and
14496 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
14497 doesn't suddenly decide to fetch the active file anyway.
14498
14499 @item gnus-nov-is-evil
14500 This one has to be @code{nil}.  If not, grabbing article headers from
14501 the @sc{nntp} server will not be very fast.  Not all @sc{nntp} servers
14502 support @sc{xover}; Gnus will detect this by itself.
14503 @end table
14504
14505
14506 @node Slow Terminal Connection
14507 @subsection Slow Terminal Connection
14508
14509 Let's say you use your home computer for dialing up the system that
14510 runs Emacs and Gnus.  If your modem is slow, you want to reduce the
14511 amount of data that is sent over the wires as much as possible.
14512
14513 @table @code
14514
14515 @item gnus-auto-center-summary
14516 Set this to @code{nil} to inhibit Gnus from re-centering the summary
14517 buffer all the time.  If it is @code{vertical}, do only vertical
14518 re-centering.  If it is neither @code{nil} nor @code{vertical}, do both
14519 horizontal and vertical recentering.
14520
14521 @item gnus-visible-headers
14522 Cut down on the headers that are included in the articles to the
14523 minimum.  You can, in fact, make do without them altogether---most of the
14524 useful data is in the summary buffer, anyway.  Set this variable to
14525 @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
14526
14527 @item gnus-article-display-hook
14528 Set this hook to all the available hiding commands:
14529 @lisp
14530 (setq gnus-article-display-hook 
14531       '(gnus-article-hide-headers gnus-article-hide-signature
14532         gnus-article-hide-citation))
14533 @end lisp
14534
14535 @item gnus-use-full-window
14536 By setting this to @code{nil}, you can make all the windows smaller.
14537 While this doesn't really cut down much generally, it means that you
14538 have to see smaller portions of articles before deciding that you didn't
14539 want to read them anyway.
14540
14541 @item gnus-thread-hide-subtree
14542 If this is non-@code{nil}, all threads in the summary buffer will be
14543 hidden initially.
14544
14545 @item gnus-updated-mode-lines
14546 If this is @code{nil}, Gnus will not put information in the buffer mode
14547 lines, which might save some time.
14548 @end table
14549
14550
14551 @node Little Disk Space
14552 @subsection Little Disk Space
14553 @cindex disk space
14554
14555 The startup files can get rather large, so you may want to cut their
14556 sizes a bit if you are running out of space.
14557
14558 @table @code
14559
14560 @item gnus-save-newsrc-file
14561 If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
14562 only save @file{.newsrc.eld}.  This means that you will not be able to
14563 use any other newsreaders than Gnus.  This variable is @code{t} by
14564 default. 
14565
14566 @item gnus-save-killed-list
14567 If this is @code{nil}, Gnus will not save the list of dead groups.  You
14568 should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
14569 and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
14570 variable to @code{nil}.  This variable is @code{t} by default.
14571
14572 @end table
14573
14574
14575 @node Slow Machine
14576 @subsection Slow Machine
14577 @cindex slow machine
14578
14579 If you have a slow machine, or are just really impatient, there are a
14580 few things you can do to make Gnus run faster.
14581
14582 Set@code{gnus-check-new-newsgroups} and
14583 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
14584
14585 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
14586 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
14587 summary buffer faster.
14588
14589 Set @code{gnus-article-display-hook} to @code{nil} to make article
14590 processing a bit faster.
14591
14592
14593 @node Troubleshooting
14594 @section Troubleshooting
14595 @cindex troubleshooting
14596
14597 Gnus works @emph{so} well straight out of the box---I can't imagine any
14598 problems, really.
14599
14600 Ahem.
14601
14602 @enumerate
14603
14604 @item
14605 Make sure your computer is switched on.
14606
14607 @item
14608 Make sure that you really load the current Gnus version.  If you have
14609 been running @sc{gnus}, you need to exit Emacs and start it up again before
14610 Gnus will work.
14611
14612 @item
14613 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
14614 like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded.  If,
14615 on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp
14616 flee}, you have some old @file{.el} files lying around.  Delete these.
14617
14618 @item
14619 Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
14620 how-to. 
14621
14622 @item
14623 @vindex max-lisp-eval-depth
14624 Gnus works on many recursive structures, and in some extreme (and very
14625 rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
14626 you.  If this happens to you, set @code{max-lisp-eval-depth} to 500 or
14627 something like that.
14628 @end enumerate
14629
14630 If all else fails, report the problem as a bug.
14631
14632 @cindex bugs
14633 @cindex reporting bugs
14634
14635 @kindex M-x gnus-bug
14636 @findex gnus-bug
14637 If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
14638 command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send
14639 me the backtrace.  I will fix bugs, but I can only fix them if you send
14640 me a precise description as to how to reproduce the bug.
14641
14642 You really can never be too detailed in a bug report.  Always use the
14643 @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
14644 a 10Kb mail each time you use it, and even if you have sent me your
14645 environment 500 times before.  I don't care.  I want the full info each
14646 time.  
14647
14648 It is also important to remember that I have no memory whatsoever.  If
14649 you send a bug report, and I send you a reply, and then you send back
14650 just ``No, it's not! Moron!'', I will have no idea what you are
14651 insulting me about.  Always over-explain everything.  It's much easier
14652 for all of us---if I don't have all the information I need, I will just
14653 mail you and ask for more info, and everything takes more time.
14654
14655 If the problem you're seeing is very visual, and you can't quite explain
14656 it, copy the Emacs window to a file (with @code{xwd}, for instance), put
14657 it somewhere it can be reached, and include the URL of the picture in
14658 the bug report.
14659
14660 If you just need help, you are better off asking on
14661 @samp{gnu.emacs.gnus}.  I'm not very helpful.
14662
14663 @cindex gnu.emacs.gnus
14664 @cindex ding mailing list
14665 You can also ask on the ding mailing list---@samp{ding@@ifi.uio.no}.
14666 Write to @samp{ding-request@@ifi.uio.no} to subscribe.
14667
14668
14669 @node A Programmers Guide to Gnus
14670 @section A Programmer@'s Guide to Gnus
14671
14672 It is my hope that other people will figure out smart stuff that Gnus
14673 can do, and that other people will write those smart things as well.  To
14674 facilitate that I thought it would be a good idea to describe the inner
14675 workings of Gnus.  And some of the not-so-inner workings, while I'm at
14676 it.
14677
14678 You can never expect the internals of a program not to change, but I
14679 will be defining (in some details) the interface between Gnus and its
14680 backends (this is written in stone), the format of the score files
14681 (ditto), data structures (some are less likely to change than others)
14682 and general method of operations.
14683
14684 @menu 
14685 * Backend Interface::        How Gnus communicates with the servers.
14686 * Score File Syntax::        A BNF definition of the score file standard.
14687 * Headers::                  How Gnus stores headers internally.
14688 * Ranges::                   A handy format for storing mucho numbers.
14689 * Group Info::               The group info format.
14690 * Emacs/XEmacs Code::        Gnus can be run under all modern Emacsen.
14691 * Various File Formats::     Formats of files that Gnus use.
14692 @end menu
14693
14694
14695 @node Backend Interface
14696 @subsection Backend Interface
14697
14698 Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
14699 groups.  It only knows how to talk to @dfn{virtual servers}.  A virtual
14700 server is a @dfn{backend} and some @dfn{backend variables}.  As examples
14701 of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}.  As
14702 examples of the latter we have @code{nntp-port-number} and
14703 @code{nnmbox-directory}.
14704
14705 When Gnus asks for information from a backend---say @code{nntp}---on
14706 something, it will normally include a virtual server name in the
14707 function parameters.  (If not, the backend should use the ``current''
14708 virtual server.)  For instance, @code{nntp-request-list} takes a virtual
14709 server as its only (optional) parameter.  If this virtual server hasn't
14710 been opened, the function should fail.
14711
14712 Note that a virtual server name has no relation to some physical server
14713 name.  Take this example:
14714
14715 @lisp
14716 (nntp "odd-one" 
14717       (nntp-address "ifi.uio.no") 
14718       (nntp-port-number 4324))
14719 @end lisp
14720
14721 Here the virtual server name is @samp{odd-one} while the name of
14722 the physical server is @samp{ifi.uio.no}. 
14723
14724 The backends should be able to switch between several virtual servers.
14725 The standard backends implement this by keeping an alist of virtual
14726 server environments that it pulls down/pushes up when needed.  
14727
14728 There are two groups of interface functions: @dfn{required functions},
14729 which must be present, and @dfn{optional functions}, which Gnus will
14730 always check whether are present before attempting to call.
14731
14732 All these functions are expected to return data in the buffer
14733 @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
14734 unfortunately named, but we'll have to live with it.  When I talk about
14735 @dfn{resulting data}, I always refer to the data in that buffer.  When I
14736 talk about @dfn{return value}, I talk about the function value returned by
14737 the function call.  Functions that fail should return @code{nil} as the
14738 return value.
14739
14740 Some backends could be said to be @dfn{server-forming} backends, and
14741 some might be said to not be.  The latter are backends that generally
14742 only operate on one group at a time, and have no concept of ``server''
14743 -- they have a group, and they deliver info on that group and nothing
14744 more.
14745
14746 In the examples and definitions I will refer to the imaginary backend
14747 @code{nnchoke}. 
14748
14749 @cindex @code{nnchoke}
14750
14751 @menu
14752 * Required Backend Functions::        Functions that must be implemented.
14753 * Optional Backend Functions::        Functions that need not be implemented.
14754 * Error Messaging::                   How to get messages and report errors.
14755 * Writing New Backends::              Extending old backends.
14756 * Hooking New Backends Into Gnus::    What has to be done on the Gnus end.
14757 * Mail-like Backends::                Some tips on mail backends.
14758 @end menu
14759
14760
14761 @node Required Backend Functions
14762 @subsubsection Required Backend Functions
14763
14764 @table @code
14765
14766 @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
14767
14768 @var{articles} is either a range of article numbers or a list of
14769 @code{Message-ID}s.  Current backends do not fully support either---only
14770 sequences (lists) of article numbers, and most backends do not support
14771 retrieval of @code{Message-ID}s.  But they should try for both. 
14772
14773 The result data should either be HEADs or NOV lines, and the result
14774 value should either be @code{headers} or @code{nov} to reflect this.
14775 This might later be expanded to @code{various}, which will be a mixture
14776 of HEADs and NOV lines, but this is currently not supported by Gnus.  
14777
14778 If @var{fetch-old} is non-@code{nil} it says to try to fetch "extra
14779 headers, in some meaning of the word.  This is generally done by
14780 fetching (at most) @var{fetch-old} extra headers less than the smallest
14781 article number in @code{articles}, and fill in the gaps as well.  The
14782 presence of this parameter can be ignored if the backend finds it
14783 cumbersome to follow the request.  If this is non-@code{nil} and not a
14784 number, do maximum fetches.
14785
14786 Here's an example HEAD:
14787
14788 @example
14789 221 1056 Article retrieved.
14790 Path: ifi.uio.no!sturles
14791 From: sturles@@ifi.uio.no (Sturle Sunde)
14792 Newsgroups: ifi.discussion
14793 Subject: Re: Something very droll
14794 Date: 27 Oct 1994 14:02:57 +0100
14795 Organization: Dept. of Informatics, University of Oslo, Norway
14796 Lines: 26
14797 Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
14798 References: <38jdmq$4qu@@visbur.ifi.uio.no>
14799 NNTP-Posting-Host: holmenkollen.ifi.uio.no
14800 .
14801 @end example
14802
14803 So a @code{headers} return value would imply that there's a number of
14804 these in the data buffer.
14805
14806 Here's a BNF definition of such a buffer:
14807
14808 @example
14809 headers        = *head
14810 head           = error / valid-head
14811 error-message  = [ "4" / "5" ] 2number " " <error message> eol
14812 valid-head     = valid-message *header "." eol
14813 valid-message  = "221 " <number> " Article retrieved." eol
14814 header         = <text> eol
14815 @end example
14816
14817 If the return value is @code{nov}, the data buffer should contain
14818 @dfn{network overview database} lines.  These are basically fields
14819 separated by tabs. 
14820
14821 @example
14822 nov-buffer = *nov-line
14823 nov-line   = 8*9 [ field <TAB> ] eol
14824 field      = <text except TAB>
14825 @end example
14826
14827 For a closer explanation what should be in those fields,
14828 @pxref{Headers}. 
14829
14830
14831 @item (nnchoke-open-server SERVER &optional DEFINITIONS)
14832
14833 @var{server} is here the virtual server name.  @var{definitions} is a
14834 list of @code{(VARIABLE VALUE)} pairs that defines this virtual server. 
14835
14836 If the server can't be opened, no error should be signaled.  The backend
14837 may then choose to refuse further attempts at connecting to this
14838 server.  In fact, it should do so. 
14839
14840 If the server is opened already, this function should return a
14841 non-@code{nil} value.  There should be no data returned.
14842
14843
14844 @item (nnchoke-close-server &optional SERVER)
14845
14846 Close connection to @var{server} and free all resources connected
14847 to it.  Return @code{nil} if the server couldn't be closed for some
14848 reason.
14849
14850 There should be no data returned.
14851
14852
14853 @item (nnchoke-request-close)
14854
14855 Close connection to all servers and free all resources that the backend
14856 have reserved.  All buffers that have been created by that backend
14857 should be killed.  (Not the @code{nntp-server-buffer}, though.)  This
14858 function is generally only called when Gnus is shutting down.
14859
14860 There should be no data returned. 
14861
14862
14863 @item (nnchoke-server-opened &optional SERVER)
14864
14865 If @var{server} is the current virtual server, and the connection to the
14866 physical server is alive, then this function should return a
14867 non-@code{nil} vlue.  This function should under no circumstances
14868 attempt to reconnect to a server that is has lost connection to.
14869
14870 There should be no data returned.
14871
14872
14873 @item (nnchoke-status-message &optional SERVER)
14874
14875 This function should return the last error message from @var{server}. 
14876
14877 There should be no data returned.
14878
14879
14880 @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
14881
14882 The result data from this function should be the article specified by
14883 @var{article}.  This might either be a @code{Message-ID} or a number.
14884 It is optional whether to implement retrieval by @code{Message-ID}, but
14885 it would be nice if that were possible.
14886
14887 If @var{to-buffer} is non-@code{nil}, the result data should be returned
14888 in this buffer instead of the normal data buffer.  This is to make it
14889 possible to avoid copying large amounts of data from one buffer to
14890 another, and Gnus mainly request articles to be inserted directly into
14891 its article buffer.
14892
14893 If it is at all possible, this function should return a cons cell where
14894 the car is the group name the article was fetched from, and the cdr is
14895 the article number.  This will enable Gnus to find out what the real
14896 group and article numbers are when fetching articles by
14897 @code{Message-ID}.  If this isn't possible, @code{t} should be returned
14898 on successful article retrievement.
14899
14900
14901 @item (nnchoke-open-group GROUP &optional SERVER)
14902
14903 Make @var{group} the current group.  
14904
14905 There should be no data returned by this function.
14906
14907
14908 @item (nnchoke-request-group GROUP &optional SERVER FAST)
14909
14910 Get data on @var{group}.  This function also has the side effect of
14911 making @var{group} the current group. 
14912
14913 If @var{FAST}, don't bother to return useful data, just make @var{group}
14914 the current group.
14915
14916 Here's an example of some result data and a definition of the same:
14917
14918 @example
14919 211 56 1000 1059 ifi.discussion
14920 @end example
14921
14922 The first number is the status, which should be 211.  Next is the
14923 total number of articles in the group, the lowest article number, the
14924 highest article number, and finally the group name.  Note that the total
14925 number of articles may be less than one might think while just
14926 considering the highest and lowest article numbers, but some articles
14927 may have been canceled.  Gnus just discards the total-number, so
14928 whether one should take the bother to generate it properly (if that is a
14929 problem) is left as an exercise to the reader.
14930
14931 @example
14932 group-status = [ error / info ] eol
14933 error        = [ "4" / "5" ] 2<number> " " <Error message>
14934 info         = "211 " 3* [ <number> " " ] <string>
14935 @end example
14936
14937
14938 @item (nnchoke-close-group GROUP &optional SERVER)
14939
14940 Close @var{group} and free any resources connected to it.  This will be
14941 a no-op on most backends. 
14942
14943 There should be no data returned.
14944
14945
14946 @item (nnchoke-request-list &optional SERVER)
14947
14948 Return a list of all groups available on @var{server}.  And that means
14949 @emph{all}. 
14950
14951 Here's an example from a server that only carries two groups:
14952
14953 @example
14954 ifi.test 0000002200 0000002000 y
14955 ifi.discussion 3324 3300 n
14956 @end example
14957
14958 On each line we have a group name, then the highest article number in
14959 that group, the lowest article number, and finally a flag.
14960
14961 @example
14962 active-file = *active-line
14963 active-line = name " " <number> " " <number> " " flags eol
14964 name        = <string>
14965 flags       = "n" / "y" / "m" / "x" / "j" / "=" name
14966 @end example
14967
14968 The flag says whether the group is read-only (@samp{n}), is moderated
14969 (@samp{m}), is dead (@samp{x}), is aliased to some other group
14970 (@samp{=other-group} or none of the above (@samp{y}). 
14971
14972
14973 @item (nnchoke-request-post &optional SERVER)
14974
14975 This function should post the current buffer.  It might return whether
14976 the posting was successful or not, but that's not required.  If, for
14977 instance, the posting is done asynchronously, it has generally not been
14978 completed by the time this function concludes.  In that case, this
14979 function should set up some kind of sentinel to beep the user loud and
14980 clear if the posting could not be completed.
14981
14982 There should be no result data from this function. 
14983
14984 @end table
14985
14986
14987 @node Optional Backend Functions
14988 @subsubsection Optional Backend Functions
14989
14990 @table @code
14991
14992 @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
14993
14994 @var{groups} is a list of groups, and this function should request data
14995 on all those groups.  How it does it is of no concern to Gnus, but it
14996 should attempt to do this in a speedy fashion.
14997
14998 The return value of this function can be either @code{active} or
14999 @code{group}, which says what the format of the result data is.  The
15000 former is in the same format as the data from
15001 @code{nnchoke-request-list}, while the latter is a buffer full of lines
15002 in the same format as @code{nnchoke-request-group} gives.
15003
15004 @example
15005 group-buffer = *active-line / *group-status
15006 @end example
15007
15008
15009 @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
15010
15011 A Gnus group info (@pxref{Group Info}) is handed to the backend for
15012 alterations.  This comes in handy if the backend really carries all the
15013 information (as is the case with virtual an imap groups).  This function
15014 may alter the info in any manner it sees fit, and should return the
15015 (altered) group info.  This function may alter the group info
15016 destructively, so no copying is needed before boogeying. 
15017
15018 There should be no result data from this function.
15019
15020
15021 @item (nnchoke-request-type GROUP &optional ARTICLE)
15022
15023 When the user issues commands for ``sending news'' (@kbd{F} in the
15024 summary buffer, for instance), Gnus has to know whether the article the
15025 user is following up is news or mail.  This function should return
15026 @code{news} if @var{article} in @var{group} is news, @code{mail} if it
15027 is mail and @code{unknown} if the type can't be decided.  (The
15028 @var{article} parameter is necessary in @code{nnvirtual} groups which
15029 might very well combine mail groups and news groups.)  Both @var{group}
15030 and @var{article} may be @code{nil}.
15031
15032 There should be no result data from this function.
15033
15034
15035 @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
15036
15037 If the user tries to set a mark that the backend doesn't like, this
15038 function may change the mark.  Gnus will use whatever this function
15039 returns as the mark for @var{article} instead of the original
15040 @var{mark}.  If the backend doesn't care, it must return the original
15041 @var{mark}, and not @code{nil} or any other type of garbage.  
15042
15043 The only use for this that I can see is what @code{nnvirtual} does with
15044 it---if a component group is auto-expirable, marking an article as read
15045 in the virtual group should result in the article being marked as
15046 expirable. 
15047
15048 There should be no result data from this function.
15049
15050
15051 @item (nnchoke-request-scan &optional GROUP SERVER)
15052
15053 This function may be called at any time (by Gnus or anything else) to
15054 request that the backend check for incoming articles, in one way or
15055 another.  A mail backend will typically read the spool file or query the
15056 POP server when this function is invoked.  The @var{group} doesn't have
15057 to be heeded---if the backend decides that it is too much work just
15058 scanning for a single group, it may do a total scan of all groups.  It
15059 would be nice, however, to keep things local if that's practical.
15060
15061 There should be no result data from this function.
15062
15063
15064 @item (nnchoke-request-group-description GROUP &optional SERVER)
15065
15066 The result data from this function should be a description of
15067 @var{group}. 
15068
15069 @example
15070 description-line = name <TAB> description eol
15071 name             = <string>
15072 description      = <text>
15073 @end example
15074
15075 @item (nnchoke-request-list-newsgroups &optional SERVER)
15076
15077 The result data from this function should be the description of all
15078 groups available on the server.
15079
15080 @example
15081 description-buffer = *description-line
15082 @end example
15083
15084
15085 @item (nnchoke-request-newgroups DATE &optional SERVER)
15086
15087 The result data from this function should be all groups that were
15088 created after @samp{date}, which is in normal human-readable date
15089 format.  The data should be in the active buffer format.
15090
15091
15092 @item (nnchoke-request-create-group GROUP &optional SERVER)
15093
15094 This function should create an empty group with name @var{group}.  
15095
15096 There should be no return data.
15097
15098
15099 @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
15100
15101 This function should run the expiry process on all articles in the
15102 @var{articles} range (which is currently a simple list of article
15103 numbers.)  It is left up to the backend to decide how old articles
15104 should be before they are removed by this function.  If @var{force} is
15105 non-@code{nil}, all @var{articles} should be deleted, no matter how new
15106 they are. 
15107
15108 This function should return a list of articles that it did not/was not
15109 able to delete.
15110
15111 There should be no result data returned.
15112
15113
15114 @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
15115 &optional LAST)
15116
15117 This function should move @var{article} (which is a number) from
15118 @var{group} by calling @var{accept-form}.  
15119
15120 This function should ready the article in question for moving by
15121 removing any header lines it has added to the article, and generally
15122 should ``tidy up'' the article.  Then it should @code{eval}
15123 @var{accept-form} in the buffer where the ``tidy'' article is.  This
15124 will do the actual copying.  If this @code{eval} returns a
15125 non-@code{nil} value, the article should be removed.
15126
15127 If @var{last} is @code{nil}, that means that there is a high likelihood
15128 that there will be more requests issued shortly, so that allows some
15129 optimizations. 
15130
15131 The function should return a cons where the car is the group name and
15132 the cdr is the article number that the article was entered as.
15133
15134 There should be no data returned. 
15135
15136
15137 @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
15138
15139 This function takes the current buffer and inserts it into @var{group}.
15140 If @var{last} in @code{nil}, that means that there will be more calls to
15141 this function in short order.
15142
15143 The function should return a cons where the car is the group name and
15144 the cdr is the article number that the article was entered as.
15145
15146 There should be no data returned.
15147
15148
15149 @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
15150
15151 This function should remove @var{article} (which is a number) from
15152 @var{group} and insert @var{buffer} there instead.
15153
15154 There should be no data returned.
15155
15156
15157 @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
15158
15159 This function should delete @var{group}.  If @var{force}, it should
15160 really delete all the articles in the group, and then delete the group
15161 itself.  (If there is such a thing as ``the group itself''.)
15162
15163 There should be no data returned.
15164
15165
15166 @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
15167
15168 This function should rename @var{group} into @var{new-name}.  All
15169 articles that are in @var{group} should move to @var{new-name}.
15170
15171 There should be no data returned.
15172
15173 @end table
15174
15175
15176 @node Error Messaging
15177 @subsubsection Error Messaging
15178
15179 @findex nnheader-report
15180 @findex nnheader-get-report
15181 The backends should use the function @code{nnheader-report} to report
15182 error conditions---they should not raise errors when they aren't able to
15183 perform a request.  The first argument to this function is the backend
15184 symbol, and the rest are interpreted as arguments to @code{format} if
15185 there are many of them, or just a string if there is one of them.
15186 This function always returns @code{nil}.
15187
15188 @lisp
15189 (nnheader-report 'nnchoke "You did something totally bogus")
15190
15191 (nnheader-report 'nnchoke "Could not request group %s" group)
15192 @end lisp
15193
15194 Gnus, in turn, will call @code{nnheader-get-report} when it gets a
15195 @code{nil} back from a server, and this function returns the most
15196 recently reported message for the backend in question.  This function
15197 takes one argument---the server symbol.
15198
15199 Internally, these function access @var{backend}@code{-status-string}, so
15200 the @code{nnchoke} backend will have its error message stored in
15201 @code{nnchoke-status-string}. 
15202
15203
15204 @node Writing New Backends
15205 @subsubsection Writing New Backends
15206
15207 Many backends are quite similar.  @code{nnml} is just like
15208 @code{nnspool}, but it allows you to edit the articles on the server.
15209 @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
15210 and it doesn't maintain overview databases.  @code{nndir} is just like
15211 @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
15212 editing articles.
15213
15214 It would make sense if it were possible to ``inherit'' functions from
15215 backends when writing new backends.  And, indeed, you can do that if you
15216 want to.  (You don't have to if you don't want to, of course.)  
15217
15218 All the backends declare their public variables and functions by using a
15219 package called @code{nnoo}.  
15220
15221 To inherit functions from other backends (and allow other backends to
15222 inherit functions from the current backend), you should use the
15223 following macros:
15224 following. 
15225
15226 @table @code
15227
15228 @item nnoo-declare
15229 This macro declares the first parameter to be a child of the subsequent
15230 parameters.  For instance:
15231
15232 @lisp
15233 (nnoo-declare nndir
15234   nnml nnmh)
15235 @end lisp
15236
15237 @code{nndir} has here declared that it intends to inherit functions from
15238 both @code{nnml} and @code{nnmh}.
15239
15240 @item defvoo
15241 This macro is equivalent to @code{defvar}, but registers the variable as
15242 a public server variable.  Most state-oriented variables should be
15243 declared with @code{defvoo} instead of @code{defvar}.  
15244
15245 In addition to the normal @code{defvar} parameters, it takes a list of
15246 variables in the parent backends to map the variable to when executing
15247 a function in those backends.
15248
15249 @lisp
15250 (defvoo nndir-directory nil
15251   "Where nndir will look for groups."
15252   nnml-current-directory nnmh-current-directory)
15253 @end lisp
15254
15255 This means that @code{nnml-current-directory} will be set to
15256 @code{nndir-directory} when an @code{nnml} function is called on behalf
15257 of @code{nndir}.  (The same with @code{nnmh}.)  
15258
15259 @item nnoo-define-basics
15260 This macro defines some common functions that almost all backends should
15261 have.
15262
15263 @example
15264 (nnoo-define-basics nndir)
15265 @end example
15266
15267 @item deffoo
15268 This macro is just like @code{defun} and takes the same parameters.  In
15269 addition to doing the normal @code{defun} things, it registers the
15270 function as being public so that other backends can inherit it.
15271
15272 @item nnoo-map-functions
15273 This macro allows mapping of functions from the current backend to
15274 functions from the parent backends.
15275
15276 @example
15277 (nnoo-map-functions nndir
15278   (nnml-retrieve-headers 0 nndir-current-group 0 0)
15279   (nnmh-request-article 0 nndir-current-group 0 0))
15280 @end example
15281
15282 This means that when @code{nndir-retrieve-headers} is called, the first,
15283 third, and fourth parameters will be passed on to
15284 @code{nnml-retrieve-headers}, while the second parameter is set to the
15285 value of @code{nndir-current-group}.
15286
15287 @item nnoo-import
15288 This macro allows importing functions from backends.  It should be the
15289 last thing in the source file, since it will only define functions that
15290 haven't already been defined.
15291
15292 @example
15293 (nnoo-import nndir
15294   (nnmh
15295    nnmh-request-list
15296    nnmh-request-newgroups)
15297   (nnml))
15298 @end example
15299
15300 This means that calls to @code{nndir-request-list} should just be passed
15301 on to @code{nnmh-request-list}, while all public functions from
15302 @code{nnml} that haven't been defined in @code{nndir} yet should be
15303 defined now.
15304
15305 @end table
15306
15307 Below is a slightly shortened version of the @code{nndir} backend.
15308
15309 @lisp
15310 ;;; nndir.el --- single directory newsgroup access for Gnus
15311 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
15312
15313 ;;; Code:
15314
15315 (require 'nnheader)
15316 (require 'nnmh)
15317 (require 'nnml)
15318 (require 'nnoo)
15319 (eval-when-compile (require 'cl))
15320
15321 (nnoo-declare nndir
15322   nnml nnmh)
15323
15324 (defvoo nndir-directory nil
15325   "Where nndir will look for groups."
15326   nnml-current-directory nnmh-current-directory)
15327
15328 (defvoo nndir-nov-is-evil nil
15329   "*Non-nil means that nndir will never retrieve NOV headers."
15330   nnml-nov-is-evil)
15331
15332 (defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group)
15333 (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
15334 (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
15335
15336 (defvoo nndir-status-string "" nil nnmh-status-string)
15337 (defconst nndir-version "nndir 1.0")
15338
15339 ;;; Interface functions.
15340
15341 (nnoo-define-basics nndir)
15342
15343 (deffoo nndir-open-server (server &optional defs)
15344   (setq nndir-directory
15345         (or (cadr (assq 'nndir-directory defs))
15346             server))
15347   (unless (assq 'nndir-directory defs)
15348     (push `(nndir-directory ,server) defs))
15349   (push `(nndir-current-group
15350           ,(file-name-nondirectory (directory-file-name nndir-directory)))
15351         defs)
15352   (push `(nndir-top-directory
15353           ,(file-name-directory (directory-file-name nndir-directory)))
15354         defs)
15355   (nnoo-change-server 'nndir server defs))
15356
15357 (nnoo-map-functions nndir
15358   (nnml-retrieve-headers 0 nndir-current-group 0 0)
15359   (nnmh-request-article 0 nndir-current-group 0 0)
15360   (nnmh-request-group nndir-current-group 0 0)
15361   (nnmh-close-group nndir-current-group 0))
15362
15363 (nnoo-import nndir
15364   (nnmh
15365    nnmh-status-message
15366    nnmh-request-list
15367    nnmh-request-newgroups))
15368
15369 (provide 'nndir)
15370 @end lisp
15371
15372
15373 @node Hooking New Backends Into Gnus
15374 @subsubsection Hooking New Backends Into Gnus
15375
15376 @vindex gnus-valid-select-methods
15377 Having Gnus start using your new backend is rather easy---you just
15378 declare it with the @code{gnus-declare-backend} functions.  This will
15379 enter the backend into the @code{gnus-valid-select-methods} variable.
15380
15381 @code{gnus-declare-backend} takes two parameters---the backend name and
15382 an arbitrary number of @dfn{abilities}.
15383
15384 Here's an example:
15385
15386 @lisp
15387 (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
15388 @end lisp
15389
15390 The abilities can be:
15391
15392 @table @code
15393 @item mail
15394 This is a mailish backend---followups should (probably) go via mail.
15395 @item post
15396 This is a newsish backend---followups should (probably) go via news. 
15397 @item post-mail
15398 This backend supports both mail and news.
15399 @item none
15400 This is neither a post or mail backend---it's something completely
15401 different. 
15402 @item respool
15403 It supports respooling---or rather, it is able to modify its source
15404 articles and groups.
15405 @item address
15406 The name of the server should be in the virtual server name.  This is
15407 true for almost all backends.
15408 @item prompt-address
15409 The user should be prompted for an address when doing commands like
15410 @kbd{B} in the group buffer.  This is true for backends like
15411 @code{nntp}, but not @code{nnmbox}, for instance. 
15412 @end table
15413
15414
15415 @node Mail-like Backends
15416 @subsubsection Mail-like Backends
15417
15418 One of the things that separate the mail backends from the rest of the
15419 backends is the heavy dependence by the mail backends on common
15420 functions in @file{nnmail.el}.  For instance, here's the definition of
15421 @code{nnml-request-scan}: 
15422
15423 @lisp
15424 (deffoo nnml-request-scan (&optional group server)
15425   (setq nnml-article-file-alist nil)
15426   (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
15427 @end lisp
15428
15429 It simply just calls @code{nnmail-get-new-mail} will a few parameters,
15430 and @code{nnmail} takes care of all the moving and splitting of the
15431 mail.  
15432
15433 This function takes four parameters.
15434
15435 @table @var
15436 @item method
15437 This should be a symbol to designate which backend is responsible for
15438 the call.
15439
15440 @item exit-function
15441 This function should be called after the splitting has been performed.
15442
15443 @item temp-directory
15444 Where the temporary files should be stored.
15445
15446 @item group
15447 This optional argument should be a group name if the splitting is to be
15448 performed for one group only.
15449 @end table
15450
15451 @code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to
15452 save each article.  @var{backend}@code{-active-number} will be called to
15453 find the article number assigned to this article.  
15454
15455 The function also uses the following variables:
15456 @var{backend}@code{-get-new-mail} (to see whether to get new mail for
15457 this backend); and @var{backend}@code{-group-alist} and
15458 @var{backend}@code{-active-file} to generate the new active file.
15459 @var{backend}@code{-group-alist} should be a group-active alist, like
15460 this:
15461
15462 @example
15463 (("a-group" (1 . 10))
15464  ("some-group" (34 . 39)))
15465 @end example
15466
15467
15468 @node Score File Syntax
15469 @subsection Score File Syntax
15470
15471 Score files are meant to be easily parsable, but yet extremely
15472 mallable.   It was decided that something that had the same read syntax
15473 as an Emacs Lisp list would fit that spec.
15474
15475 Here's a typical score file:
15476
15477 @lisp
15478 (("summary"
15479   ("win95" -10000 nil s)
15480   ("Gnus"))
15481  ("from"
15482   ("Lars" -1000))
15483  (mark -100))
15484 @end lisp
15485
15486 BNF definition of a score file:
15487
15488 @example
15489 score-file       = "" / "(" *element ")"
15490 element          = rule / atom
15491 rule             = string-rule / number-rule / date-rule
15492 string-rule      = "(" quote string-header quote space *string-match ")"
15493 number-rule      = "(" quote number-header quote space *number-match ")"
15494 date-rule        = "(" quote date-header quote space *date-match ")"
15495 quote            = <ascii 34>
15496 string-header    = "subject" / "from" / "references" / "message-id" / 
15497                    "xref" / "body" / "head" / "all" / "followup"
15498 number-header    = "lines" / "chars"
15499 date-header      = "date"
15500 string-match     = "(" quote <string> quote [ "" / [ space score [ "" / 
15501                    space date [ "" / [ space string-match-t ] ] ] ] ] ")"
15502 score            = "nil" / <integer>
15503 date             = "nil" / <natural number>
15504 string-match-t   = "nil" / "s" / "substring" / "S" / "Substring" / 
15505                    "r" / "regex" / "R" / "Regex" /
15506                    "e" / "exact" / "E" / "Exact" /
15507                    "f" / "fuzzy" / "F" / "Fuzzy"
15508 number-match     = "(" <integer> [ "" / [ space score [ "" / 
15509                    space date [ "" / [ space number-match-t ] ] ] ] ] ")"
15510 number-match-t   = "nil" / "=" / "<" / ">" / ">=" / "<="
15511 date-match       = "(" quote <string> quote [ "" / [ space score [ "" / 
15512                    space date [ "" / [ space date-match-t ] ] ] ] ")"
15513 date-match-t     = "nil" / "at" / "before" / "after"
15514 atom             = "(" [ required-atom / optional-atom ] ")"
15515 required-atom    = mark / expunge / mark-and-expunge / files /
15516                    exclude-files / read-only / touched
15517 optional-atom    = adapt / local / eval 
15518 mark             = "mark" space nil-or-number
15519 nil-or-number    = "nil" / <integer>
15520 expunge          = "expunge" space nil-or-number
15521 mark-and-expunge = "mark-and-expunge" space nil-or-number
15522 files            = "files" *[ space <string> ]
15523 exclude-files    = "exclude-files" *[ space <string> ]
15524 read-only        = "read-only" [ space "nil" / space "t" ]
15525 adapt            = "adapt" [ space "nil" / space "t" / space adapt-rule ]
15526 adapt-rule       = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
15527 local            = "local" *[ space "(" <string> space <form> ")" ]
15528 eval             = "eval" space <form>
15529 space            = *[ " " / <TAB> / <NEWLINE> ]
15530 @end example
15531
15532 Any unrecognized elements in a score file should be ignored, but not
15533 discarded.  
15534
15535 As you can see, white space is needed, but the type and amount of white
15536 space is irrelevant.  This means that formatting of the score file is
15537 left up to the programmer---if it's simpler to just spew it all out on
15538 one looong line, then that's ok.
15539
15540 The meaning of the various atoms are explained elsewhere in this
15541 manual. 
15542
15543
15544 @node Headers
15545 @subsection Headers
15546
15547 Gnus uses internally a format for storing article headers that
15548 corresponds to the @sc{nov} format in a mysterious fashion.  One could
15549 almost suspect that the author looked at the @sc{nov} specification and
15550 just shamelessly @emph{stole} the entire thing, and one would be right.
15551
15552 @dfn{Header} is a severely overloaded term.  ``Header'' is used in
15553 RFC1036 to talk about lines in the head of an article (e.g.,
15554 @code{From}).  It is used by many people as a synonym for
15555 ``head''---``the header and the body''.  (That should be avoided, in my
15556 opinion.)  And Gnus uses a format internally that it calls ``header'',
15557 which is what I'm talking about here.  This is a 9-element vector,
15558 basically, with each header (ouch) having one slot.
15559
15560 These slots are, in order: @code{number}, @code{subject}, @code{from},
15561 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
15562 @code{xref}.  There are macros for accessing and setting these
15563 slots---they all have predictable names beginning with
15564 @code{mail-header-} and @code{mail-header-set-}, respectively.
15565
15566 The @code{xref} slot is really a @code{misc} slot.  Any extra info will
15567 be put in there.
15568
15569
15570 @node Ranges
15571 @subsection Ranges
15572
15573 @sc{gnus} introduced a concept that I found so useful that I've started
15574 using it a lot and have elaborated on it greatly. 
15575
15576 The question is simple: If you have a large amount of objects that are
15577 identified by numbers (say, articles, to take a @emph{wild} example)
15578 that you want to qualify as being ``included'', a normal sequence isn't
15579 very useful.  (A 200,000 length sequence is a bit long-winded.)
15580
15581 The solution is as simple as the question: You just collapse the
15582 sequence. 
15583
15584 @example
15585 (1 2 3 4 5 6 10 11 12)
15586 @end example
15587
15588 is transformed into
15589
15590 @example
15591 ((1 . 6) (10 . 12))
15592 @end example
15593
15594 To avoid having those nasty @samp{(13 . 13)} elements to denote a
15595 lonesome object, a @samp{13} is a valid element:
15596
15597 @example
15598 ((1 . 6) 7 (10 . 12))
15599 @end example
15600
15601 This means that comparing two ranges to find out whether they are equal
15602 is slightly tricky:
15603
15604 @example
15605 ((1 . 5) 7 8 (10 . 12))
15606 @end example
15607
15608 and
15609
15610 @example
15611 ((1 . 5) (7 . 8) (10 . 12))
15612 @end example
15613
15614 are equal.  In fact, any non-descending list is a range:
15615
15616 @example
15617 (1 2 3 4 5)
15618 @end example
15619
15620 is a perfectly valid range, although a pretty long-winded one.  This is
15621 also legal:
15622
15623 @example
15624 (1 . 5)
15625 @end example
15626
15627 and is equal to the previous range.
15628
15629 Here's a BNF definition of ranges.  Of course, one must remember the
15630 semantic requirement that the numbers are non-descending.  (Any number
15631 of repetition of the same number is allowed, but apt to disappear in
15632 range handling.)
15633
15634 @example
15635 range           = simple-range / normal-range
15636 simple-range    = "(" number " . " number ")"
15637 normal-range    = "(" start-contents ")"
15638 contents        = "" / simple-range *[ " " contents ] / 
15639                   number *[ " " contents ]
15640 @end example
15641
15642 Gnus currently uses ranges to keep track of read articles and article
15643 marks.  I plan on implementing a number of range operators in C if The
15644 Powers That Be are willing to let me.  (I haven't asked yet, because I
15645 need to do some more thinking on what operators I need to make life
15646 totally range-based without ever having to convert back to normal
15647 sequences.) 
15648
15649
15650 @node Group Info
15651 @subsection Group Info
15652
15653 Gnus stores all permanent info on groups in a @dfn{group info} list.
15654 This list is from three to six elements (or more) long and exhaustively
15655 describes the group.
15656
15657 Here are two example group infos; one is a very simple group while the
15658 second is a more complex one:
15659
15660 @example
15661 ("no.group" 5 (1 . 54324))
15662
15663 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
15664                 ((tick (15 . 19)) (replied 3 6 (19 . 3)))
15665                 (nnml "")
15666                 (auto-expire (to-address "ding@@ifi.uio.no")))
15667 @end example
15668
15669 The first element is the @dfn{group name}---as Gnus knows the group,
15670 anyway.  The second element is the @dfn{subscription level}, which
15671 normally is a small integer.  The third element is a list of ranges of
15672 read articles.  The fourth element is a list of lists of article marks
15673 of various kinds.  The fifth element is the select method (or virtual
15674 server, if you like).  The sixth element is a list of @dfn{group
15675 parameters}, which is what this section is about.
15676
15677 Any of the last three elements may be missing if they are not required.
15678 In fact, the vast majority of groups will normally only have the first
15679 three elements, which saves quite a lot of cons cells.
15680
15681 Here's a BNF definition of the group info format:
15682
15683 @example
15684 info          = "(" group space level space read 
15685                 [ "" / [ space marks-list [ "" / [ space method [ "" /
15686                 space parameters ] ] ] ] ] ")" 
15687 group         = quote <string> quote
15688 level         = <integer in the range of 1 to inf>
15689 read          = range
15690 marks-lists   = nil / "(" *marks ")"
15691 marks         = "(" <string> range ")"
15692 method        = "(" <string> *elisp-forms ")"
15693 parameters    = "(" *elisp-forms ")"
15694 @end example
15695
15696 Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
15697 @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
15698 in pseudo-BNF.
15699
15700
15701 @node Emacs/XEmacs Code
15702 @subsection Emacs/XEmacs Code
15703 @cindex XEmacs
15704 @cindex Emacsen
15705
15706 While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
15707 platforms must be the primary one.  I chose Emacs.  Not because I don't
15708 like XEmacs or Mule, but because it comes first alphabetically.
15709
15710 This means that Gnus will byte-compile under Emacs with nary a warning,
15711 while XEmacs will pump out gigabytes of warnings while byte-compiling.
15712 As I use byte-compilation warnings to help me root out trivial errors in
15713 Gnus, that's very useful.  
15714
15715 I've also consistently used Emacs function interfaces, but have used
15716 Gnusey aliases for the functions.  To take an example:  Emacs defines a
15717 @code{run-at-time} function while XEmacs defines a @code{start-itimer}
15718 function.  I then define a function called @code{gnus-run-at-time} that
15719 takes the same parameters as the Emacs @code{run-at-time}.  When running
15720 Gnus under Emacs, the former function is just an alias for the latter.
15721 However, when running under XEmacs, the former is an alias for the
15722 following function:
15723
15724 @lisp
15725 (defun gnus-xmas-run-at-time (time repeat function &rest args)
15726   (start-itimer
15727    "gnus-run-at-time"
15728    `(lambda ()
15729       (,function ,@@args))
15730    time repeat))
15731 @end lisp
15732
15733 This sort of thing has been done for bunches of functions.  Gnus does
15734 not redefine any native Emacs functions while running under XEmacs---it
15735 does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
15736 all over.
15737
15738 Of course, I could have chosen XEmacs as my native platform and done
15739 mapping functions the other way around.  But I didn't.  The performance
15740 hit these indirections impose on Gnus under XEmacs should be slight.
15741
15742
15743 @node Various File Formats
15744 @subsection Various File Formats
15745
15746 @menu
15747 * Active File Format::      Information on articles and groups available.
15748 * Newsgroups File Format::  Group descriptions.
15749 @end menu
15750
15751
15752 @node Active File Format
15753 @subsubsection Active File Format
15754
15755 The active file lists all groups that are available on the server in
15756 question.  It also lists the highest and lowest current article numbers
15757 in each group.  
15758
15759 Here's an excerpt from a typical active file:
15760
15761 @example
15762 soc.motss 296030 293865 y
15763 alt.binaries.pictures.fractals 3922 3913 n
15764 comp.sources.unix 1605 1593 m
15765 comp.binaries.ibm.pc 5097 5089 y
15766 no.general 1000 900 y
15767 @end example
15768
15769 Here's a pseudo-BNF definition of this file:
15770
15771 @example
15772 active      = *group-line
15773 group-line  = group space high-number space low-number space flag <NEWLINE>
15774 group       = <non-white-space string>
15775 space       = " "
15776 high-number = <non-negative integer>
15777 low-number  = <positive integer>
15778 flag        = "y" / "n" / "m" / "j" / "x" / "=" group
15779 @end example
15780
15781
15782 @node Newsgroups File Format
15783 @subsubsection Newsgroups File Format
15784
15785 The newsgroups file lists groups along with their descriptions.  Not all
15786 groups on the server have to be listed,  and not all groups in the file
15787 have to exist on the server.  The file is meant purely as information to
15788 the user.
15789
15790 The format is quite simple; a group name, a tab, and the description.
15791 Here's the definition:
15792
15793 @example
15794 newsgroups    = *line
15795 line          = group tab description <NEWLINE>
15796 group         = <non-white-space string>
15797 tab           = <TAB>
15798 description   = <string>
15799 @end example
15800
15801
15802 @node Emacs for Heathens
15803 @section Emacs for Heathens
15804
15805 Believe it or not, but some people who use Gnus haven't really used
15806 Emacs much before they embarked on their journey on the Gnus Love Boat.
15807 If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the
15808 region'', and ``set @code{gnus-flargblossen} to an alist where the key
15809 is a regexp that is used for matching on the group name'' are magical
15810 phrases with little or no meaning, then this appendix is for you.  If
15811 you are already familiar with Emacs, just ignore this and go fondle your
15812 cat instead.
15813
15814 @menu
15815 * Keystrokes::      Entering text and executing commands.
15816 * Emacs Lisp::      The built-in Emacs programming language.
15817 @end menu
15818
15819
15820 @node Keystrokes
15821 @subsection Keystrokes
15822
15823 @itemize @bullet
15824 @item
15825 Q: What is an experienced Emacs user?
15826
15827 @item 
15828 A: A person who wishes that the terminal had pedals.
15829 @end itemize
15830
15831 Yes, when you use Emacs, you are apt to use the control key, the shift
15832 key and the meta key a lot.  This is very annoying to some people
15833 (notably @code{vi}le users), and the rest of us just love the hell out
15834 of it.  Just give up and submit.  Emacs really does stand for
15835 ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
15836 may have heard from other disreputable sources (like the Emacs author).
15837
15838 The shift key is normally located near your pinky fingers, and are
15839 normally used to get capital letters and stuff.  You probably use it all
15840 the time.  The control key is normally marked ``CTRL'' or something like
15841 that.  The meta key is, funnily enough, never marked as such on any
15842 keyboards.  The one I'm currently at has a key that's marked ``Alt'',
15843 which is the meta key on this keyboard.  It's usually located somewhere
15844 to the left hand side of the keyboard, usually on the bottom row.
15845
15846 Now, us Emacs people doesn't say ``press the meta-control-m key'',
15847 because that's just too inconvenient.  We say ``press the @kbd{M-C-m}
15848 key''.  @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
15849 prefix that means ``control''.  So ``press @kbd{C-k}'' means ``press
15850 down the control key, and hold it down while you press @kbd{k}''.
15851 ``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and
15852 the control key and then press @kbd{k}''.  Simple, ay?
15853
15854 This is somewhat complicated by the fact that not all keyboards have a
15855 meta key.  In that case you can use the ``escape'' key.  Then @kbd{M-k}
15856 means ``press escape, release escape, press @kbd{k}''.  That's much more
15857 work than if you have a meta key, so if that's the case, I respectfully
15858 suggest you get a real keyboard with a meta key.  You can't live without
15859 it.
15860
15861
15862
15863 @node Emacs Lisp
15864 @subsection Emacs Lisp
15865
15866 Emacs is the King of Editors because it's really a Lisp interpreter.
15867 Each and every key you tap runs some Emacs Lisp code snippet, and since
15868 Emacs Lisp is an interpreted language, that means that you can configure
15869 any key to run any arbitrary code.  You just, like, do it.
15870
15871 Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
15872 functions.  (These are byte-compiled for speed, but it's still
15873 interpreted.)  If you decide that you don't like the way Gnus does
15874 certain things, it's trivial to have it do something a different way.
15875 (Well, at least if you know how to write Lisp code.)  However, that's
15876 beyond the scope of this manual, so we are simply going to talk about
15877 some common constructs that you normally use in your @file{.emacs} file
15878 to customize Gnus.
15879
15880 If you want to set the variable @code{gnus-florgbnize} to four (4), you
15881 write the following:
15882
15883 @lisp
15884 (setq gnus-florgbnize 4)
15885 @end lisp
15886
15887 This function (really ``special form'') @code{setq} is the one that can
15888 set a variable to some value.  This is really all you need to know.  Now
15889 you can go and fill your @code{.emacs} file with lots of these to change
15890 how Gnus works.
15891
15892 If you have put that thing in your @code{.emacs} file, it will be read
15893 and @code{eval}ed (which is lisp-ese for ``run'') the next time you
15894 start Emacs.  If you want to change the variable right away, simply say
15895 @kbd{C-x C-e} after the closing parenthesis.  That will @code{eval} the
15896 previous ``form'', which here is a simple @code{setq} statement.
15897
15898 Go ahead---just try it, if you're located at your Emacs.  After you
15899 @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
15900 is the return value of the form you @code{eval}ed.
15901
15902 Some pitfalls:
15903
15904 If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
15905 that means:
15906
15907 @lisp
15908 (setq gnus-read-active-file 'some)
15909 @end lisp
15910
15911 On the other hand, if the manual says ``set @code{gnus-nntp-server} to
15912 @samp{nntp.ifi.uio.no}'', that means:
15913
15914 @lisp
15915 (setq gnus-nntp-server "nntp.ifi.uio.no")
15916 @end lisp
15917
15918 So be careful not to mix up strings (the latter) with symbols (the
15919 former).  The manual is unambiguous, but it can be confusing.
15920
15921
15922 @include gnus-faq.texi
15923
15924 @node Index
15925 @chapter Index
15926 @printindex cp
15927
15928 @node Key Index
15929 @chapter Key Index
15930 @printindex ky
15931
15932 @summarycontents
15933 @contents
15934 @bye
15935
15936 @iftex
15937 @iflatex
15938 \end{document}
15939 @end iflatex
15940 @end iftex
15941
15942 @c End:
15943