Importing pgnus-0.79
[elisp/gnus.git-] / texi / gnus.texi
1 \input texinfo                  @c -*-texinfo-*-
2
3 @setfilename gnus
4 @settitle Pterodactyl Gnus 0.79 Manual
5 @synindex fn cp
6 @synindex vr cp
7 @synindex pg cp
8 @c @direntry
9 @c * Gnus: (gnus).         The newsreader Gnus.
10 @c @end direntry
11 @iftex
12 @finalout
13 @end iftex
14 @setchapternewpage odd
15
16 @iftex
17 @iflatex
18 \documentclass[twoside,a4paper,openright,11pt]{book}
19 \usepackage[latin1]{inputenc}
20 \usepackage{pagestyle}
21 \usepackage{epsfig}
22 \usepackage{bembo}
23 \usepackage{pixidx}
24
25 \makeindex
26 \begin{document}
27
28 \newcommand{\gnuschaptername}{}
29 \newcommand{\gnussectionname}{}
30
31 \newcommand{\gnusbackslash}{/}
32
33 \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
34 \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
35
36 \newcommand{\gnuskindex}[1]{\index{#1}}
37 \newcommand{\gnusindex}[1]{\index{#1}}
38
39 \newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}}
40 \newcommand{\gnuscode}[1]{\gnustt{#1}}
41 \newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''}
42 \newcommand{\gnuslisp}[1]{\gnustt{#1}}
43 \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
44 \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
45 \newcommand{\gnusdfn}[1]{\textit{#1}}
46 \newcommand{\gnusi}[1]{\textit{#1}}
47 \newcommand{\gnusstrong}[1]{\textbf{#1}}
48 \newcommand{\gnusemph}[1]{\textit{#1}}
49 \newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
50 \newcommand{\gnussc}[1]{\textsc{#1}}
51 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
52 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
53
54 \newcommand{\gnusbullet}{{${\bullet}$}}
55 \newcommand{\gnusdollar}{\$}
56 \newcommand{\gnusampersand}{\&}
57 \newcommand{\gnuspercent}{\%}
58 \newcommand{\gnushash}{\#}
59 \newcommand{\gnushat}{\symbol{"5E}}
60 \newcommand{\gnusunderline}{\symbol{"5F}}
61 \newcommand{\gnusnot}{$\neg$}
62 \newcommand{\gnustilde}{\symbol{"7E}}
63 \newcommand{\gnusless}{{$<$}}
64 \newcommand{\gnusgreater}{{$>$}}
65 \newcommand{\gnusbraceleft}{{$>$}}
66 \newcommand{\gnusbraceright}{{$>$}}
67
68 \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}}
69 \newcommand{\gnusinteresting}{
70 \marginpar[\mbox{}\hfill\gnushead]{\gnushead}
71 }
72
73 \newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
74
75 \newcommand{\gnuspagechapter}[1]{
76 {\mbox{}}
77 }
78
79 \newdimen{\gnusdimen}
80 \gnusdimen 0pt
81
82 \newcommand{\gnuschapter}[2]{
83 \gnuscleardoublepage
84 \ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
85 \chapter{#2}
86 \renewcommand{\gnussectionname}{}
87 \renewcommand{\gnuschaptername}{#2}
88 \thispagestyle{empty}
89 \hspace*{-2cm}
90 \begin{picture}(500,500)(0,0)
91 \put(480,350){\makebox(0,0)[tr]{#1}}
92 \put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
93 \end{picture}
94 \clearpage
95 }
96
97 \newcommand{\gnusfigure}[3]{
98 \begin{figure}
99 \mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
100 #3
101 \end{picture}
102 \caption{#1}
103 \end{figure}
104 }
105
106 \newcommand{\gnusicon}[1]{
107 \marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}}
108 }
109
110 \newcommand{\gnuspicon}[1]{
111 \margindex{\epsfig{figure=#1,width=2cm}}
112 }
113
114 \newcommand{\gnusxface}[2]{
115 \margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
116 }
117
118 \newcommand{\gnussmiley}[2]{
119 \margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
120 }
121
122 \newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
123
124 \newcommand{\gnussection}[1]{
125 \renewcommand{\gnussectionname}{#1}
126 \section{#1}
127 }
128
129 \newenvironment{codelist}%
130 {\begin{list}{}{
131 }
132 }{\end{list}}
133
134 \newenvironment{kbdlist}%
135 {\begin{list}{}{
136 \labelwidth=0cm
137 }
138 }{\end{list}}
139
140 \newenvironment{dfnlist}%
141 {\begin{list}{}{
142 }
143 }{\end{list}}
144
145 \newenvironment{stronglist}%
146 {\begin{list}{}{
147 }
148 }{\end{list}}
149
150 \newenvironment{samplist}%
151 {\begin{list}{}{
152 }
153 }{\end{list}}
154
155 \newenvironment{varlist}%
156 {\begin{list}{}{
157 }
158 }{\end{list}}
159
160 \newenvironment{emphlist}%
161 {\begin{list}{}{
162 }
163 }{\end{list}}
164
165 \newlength\gnusheadtextwidth
166 \setlength{\gnusheadtextwidth}{\headtextwidth}
167 \addtolength{\gnusheadtextwidth}{1cm}
168
169 \newpagestyle{gnuspreamble}%
170 {
171 {
172 \ifodd\count0
173 {
174 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
175 }
176 \else
177 {
178 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
179 }
180 }
181 \fi
182 }
183 }
184 {
185 \ifodd\count0
186 \mbox{} \hfill
187 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
188 \else
189 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
190 \hfill \mbox{}
191 \fi
192 }
193
194 \newpagestyle{gnusindex}%
195 {
196 {
197 \ifodd\count0
198 {
199 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
200 }
201 \else
202 {
203 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
204 }
205 \fi
206 }
207 }
208 {
209 \ifodd\count0
210 \mbox{} \hfill
211 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
212 \else
213 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
214 \hfill \mbox{}
215 \fi
216 }
217
218 \newpagestyle{gnus}%
219 {
220 {
221 \ifodd\count0
222 {
223 \makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
224 }
225 \else
226 {
227 \makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
228 }
229 \fi
230 }
231 }
232 {
233 \ifodd\count0
234 \mbox{} \hfill
235 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
236 \else
237 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
238 \hfill \mbox{}
239 \fi
240 }
241
242 \pagenumbering{roman}
243 \pagestyle{gnuspreamble}
244
245 @end iflatex
246 @end iftex
247
248 @iftex
249 @iflatex
250 \begin{titlepage}
251 {
252
253 %\addtolength{\oddsidemargin}{-5cm}
254 %\addtolength{\evensidemargin}{-5cm}
255 \parindent=0cm
256 \addtolength{\textheight}{2cm}
257
258 \gnustitle{\gnustitlename}\\
259 \rule{15cm}{1mm}\\
260 \vfill
261 \hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm}
262 \vfill
263 \rule{15cm}{1mm}\\
264 \gnusauthor{by Lars Magne Ingebrigtsen}
265 \newpage
266 }
267
268 \mbox{}
269 \vfill
270
271 \thispagestyle{empty}
272
273 Copyright \copyright{} 1995,96,97,98,99 Free Software Foundation, Inc.
274
275 Permission is granted to make and distribute verbatim copies of
276 this manual provided the copyright notice and this permission notice
277 are preserved on all copies.
278
279 Permission is granted to copy and distribute modified versions of this
280 manual under the conditions for verbatim copying, provided that the
281 entire resulting derived work is distributed under the terms of a
282 permission notice identical to this one.
283
284 Permission is granted to copy and distribute translations of this manual
285 into another language, under the above conditions for modified versions.
286
287 \newpage
288 \end{titlepage}
289 @end iflatex
290 @end iftex
291
292 @ifinfo
293
294 This file documents Gnus, the GNU Emacs newsreader.
295
296 Copyright (C) 1995,96,97,98,99 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 @ignore
303 Permission is granted to process this file through Tex and print the
304 results, provided the printed document carries copying permission
305 notice identical to this one except for the removal of this paragraph
306 (this paragraph not being relevant to the printed manual).
307
308 @end ignore
309 Permission is granted to copy and distribute modified versions of this
310 manual under the conditions for verbatim copying, provided also that the
311 entire resulting derived work is distributed under the terms of a
312 permission notice identical to this one.
313
314 Permission is granted to copy and distribute translations of this manual
315 into another language, under the above conditions for modified versions.
316 @end ifinfo
317
318 @tex
319
320 @titlepage
321 @title Pterodactyl Gnus 0.79 Manual
322
323 @author by Lars Magne Ingebrigtsen
324 @page
325
326 @vskip 0pt plus 1filll
327 Copyright @copyright{} 1995,96,97,98,99 Free Software Foundation, Inc.
328
329 Permission is granted to make and distribute verbatim copies of
330 this manual provided the copyright notice and this permission notice
331 are preserved on all copies.
332
333 Permission is granted to copy and distribute modified versions of this
334 manual under the conditions for verbatim copying, provided that the
335 entire resulting derived work is distributed under the terms of a
336 permission notice identical to this one.
337
338 Permission is granted to copy and distribute translations of this manual
339 into another language, under the above conditions for modified versions.
340
341 @end titlepage
342 @page
343
344 @end tex
345
346
347 @node Top
348 @top The Gnus Newsreader
349
350 @ifinfo
351
352 You can read news (and mail) from within Emacs by using Gnus.  The news
353 can be gotten by any nefarious means you can think of---@sc{nntp}, local
354 spool or your mbox file.  All at the same time, if you want to push your
355 luck.
356
357 This manual corresponds to Pterodactyl Gnus 0.79.
358
359 @end ifinfo
360
361 @iftex
362
363 @iflatex
364 \tableofcontents
365 \gnuscleardoublepage
366 @end iflatex
367
368 Gnus is the advanced, self-documenting, customizable, extensible
369 unreal-time newsreader for GNU Emacs.
370
371 Oops.  That sounds oddly familiar, so let's start over again to avoid
372 being accused of plagiarism:
373
374 Gnus is a message-reading laboratory.  It will let you look at just
375 about anything as if it were a newsgroup.  You can read mail with it,
376 you can browse directories with it, you can @code{ftp} with it---you can
377 even read news with it!
378
379 Gnus tries to empower people who read news the same way Emacs empowers
380 people who edit text.  Gnus sets no limits to what the user should be
381 allowed to do.  Users are encouraged to extend Gnus to make it behave
382 like they want it to behave.  A program should not control people;
383 people should be empowered to do what they want by using (or abusing)
384 the program.
385
386 @end iftex
387
388
389 @menu
390 * Starting Up::           Finding news can be a pain.
391 * The Group Buffer::      Selecting, subscribing and killing groups.
392 * The Summary Buffer::    Reading, saving and posting articles.
393 * The Article Buffer::    Displaying and handling articles.
394 * Composing Messages::    Information on sending mail and news.
395 * Select Methods::        Gnus reads all messages from various select methods.
396 * Scoring::               Assigning values to articles.
397 * Various::               General purpose settings.
398 * The End::               Farewell and goodbye.
399 * Appendices::            Terminology, Emacs intro, FAQ, History, Internals.
400 * Index::                 Variable, function and concept index.
401 * Key Index::             Key Index.
402 @end menu
403
404 @node Starting Up
405 @chapter Starting Gnus
406 @cindex starting up
407
408 @kindex M-x gnus
409 @findex gnus
410 If your system administrator has set things up properly, starting Gnus
411 and reading news is extremely easy---you just type @kbd{M-x gnus} in
412 your Emacs.
413
414 @findex gnus-other-frame
415 @kindex M-x gnus-other-frame
416 If you want to start Gnus in a different frame, you can use the command
417 @kbd{M-x gnus-other-frame} instead.
418
419 If things do not go smoothly at startup, you have to twiddle some
420 variables in your @file{~/.gnus} file.  This file is similar to
421 @file{~/.emacs}, but is read when gnus starts.
422
423 If you puzzle at any terms used in this manual, please refer to the
424 terminology section (@pxref{Terminology}).
425
426 @menu
427 * Finding the News::    Choosing a method for getting news.
428 * The First Time::      What does Gnus do the first time you start it?
429 * The Server is Down::  How can I read my mail then?
430 * Slave Gnusae::        You can have more than one Gnus active at a time.
431 * Fetching a Group::    Starting Gnus just to read a group.
432 * New Groups::          What is Gnus supposed to do with new groups?
433 * Startup Files::       Those pesky startup files---@file{.newsrc}.
434 * Auto Save::           Recovering from a crash.
435 * The Active File::     Reading the active file over a slow line Takes Time.
436 * Changing Servers::    You may want to move from one server to another.
437 * Startup Variables::   Other variables you might change.
438 @end menu
439
440
441 @node Finding the News
442 @section Finding the News
443 @cindex finding news
444
445 @vindex gnus-select-method
446 @c @head
447 The @code{gnus-select-method} variable says where Gnus should look for
448 news.  This variable should be a list where the first element says
449 @dfn{how} and the second element says @dfn{where}.  This method is your
450 native method.  All groups not fetched with this method are
451 foreign groups.
452
453 For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
454 you want to get your daily dosage of news from, you'd say:
455
456 @lisp
457 (setq gnus-select-method '(nntp "news.somewhere.edu"))
458 @end lisp
459
460 If you want to read directly from the local spool, say:
461
462 @lisp
463 (setq gnus-select-method '(nnspool ""))
464 @end lisp
465
466 If you can use a local spool, you probably should, as it will almost
467 certainly be much faster.
468
469 @vindex gnus-nntpserver-file
470 @cindex NNTPSERVER
471 @cindex @sc{nntp} server
472 If this variable is not set, Gnus will take a look at the
473 @code{NNTPSERVER} environment variable.  If that variable isn't set,
474 Gnus will see whether @code{gnus-nntpserver-file}
475 (@file{/etc/nntpserver} by default) has any opinions on the matter.  If
476 that fails as well, Gnus will try to use the machine running Emacs as an @sc{nntp} server.  That's a long shot, though.
477
478 @vindex gnus-nntp-server
479 If @code{gnus-nntp-server} is set, this variable will override
480 @code{gnus-select-method}.  You should therefore set
481 @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
482
483 @vindex gnus-secondary-servers
484 @vindex gnus-nntp-server
485 You can also make Gnus prompt you interactively for the name of an
486 @sc{nntp} server.  If you give a non-numerical prefix to @code{gnus}
487 (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
488 in the @code{gnus-secondary-servers} list (if any).  You can also just
489 type in the name of any server you feel like visiting.  (Note that this
490 will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
491 gnus} later in the same Emacs session, Gnus will contact the same
492 server.)
493
494 @findex gnus-group-browse-foreign-server
495 @kindex B (Group)
496 However, if you use one @sc{nntp} server regularly and are just
497 interested in a couple of groups from a different server, you would be
498 better served by using the @kbd{B} command in the group buffer.  It will
499 let you have a look at what groups are available, and you can subscribe
500 to any of the groups you want to.  This also makes @file{.newsrc}
501 maintenance much tidier.  @xref{Foreign Groups}.
502
503 @vindex gnus-secondary-select-methods
504 @c @head
505 A slightly different approach to foreign groups is to set the
506 @code{gnus-secondary-select-methods} variable.  The select methods
507 listed in this variable are in many ways just as native as the
508 @code{gnus-select-method} server.  They will also be queried for active
509 files during startup (if that's required), and new newsgroups that
510 appear on these servers will be subscribed (or not) just as native
511 groups are.
512
513 For instance, if you use the @code{nnmbox} backend to read your mail, you
514 would typically set this variable to
515
516 @lisp
517 (setq gnus-secondary-select-methods '((nnmbox "")))
518 @end lisp
519
520
521 @node The First Time
522 @section The First Time
523 @cindex first time usage
524
525 If no startup files exist, Gnus will try to determine what groups should
526 be subscribed by default.
527
528 @vindex gnus-default-subscribed-newsgroups
529 If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
530 will subscribe you to just those groups in that list, leaving the rest
531 killed.  Your system administrator should have set this variable to
532 something useful.
533
534 Since she hasn't, Gnus will just subscribe you to a few arbitrarily
535 picked groups (i.e., @samp{*.newusers}).  (@dfn{Arbitrary} is defined
536 here as @dfn{whatever Lars thinks you should read}.)
537
538 You'll also be subscribed to the Gnus documentation group, which should
539 help you with most common problems.
540
541 If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
542 use the normal functions for handling new groups, and not do anything
543 special.
544
545
546 @node The Server is Down
547 @section The Server is Down
548 @cindex server errors
549
550 If the default server is down, Gnus will understandably have some
551 problems starting.  However, if you have some mail groups in addition to
552 the news groups, you may want to start Gnus anyway.
553
554 Gnus, being the trusting sort of program, will ask whether to proceed
555 without a native select method if that server can't be contacted.  This
556 will happen whether the server doesn't actually exist (i.e., you have
557 given the wrong address) or the server has just momentarily taken ill
558 for some reason or other.  If you decide to continue and have no foreign
559 groups, you'll find it difficult to actually do anything in the group
560 buffer.  But, hey, that's your problem.  Blllrph!
561
562 @findex gnus-no-server
563 @kindex M-x gnus-no-server
564 @c @head
565 If you know that the server is definitely down, or you just want to read
566 your mail without bothering with the server at all, you can use the
567 @code{gnus-no-server} command to start Gnus.  That might come in handy
568 if you're in a hurry as well.  This command will not attempt to contact
569 your primary server---instead, it will just activate all groups on level
570 1 and 2.  (You should preferably keep no native groups on those two
571 levels.)
572
573
574 @node Slave Gnusae
575 @section Slave Gnusae
576 @cindex slave
577
578 You might want to run more than one Emacs with more than one Gnus at the
579 same time.  If you are using different @file{.newsrc} files (e.g., if you
580 are using the two different Gnusae to read from two different servers),
581 that is no problem whatsoever.  You just do it.
582
583 The problem appears when you want to run two Gnusae that use the same
584 @code{.newsrc} file.
585
586 To work around that problem some, we here at the Think-Tank at the Gnus
587 Towers have come up with a new concept: @dfn{Masters} and
588 @dfn{slaves}.  (We have applied for a patent on this concept, and have
589 taken out a copyright on those words.  If you wish to use those words in
590 conjunction with each other, you have to send $1 per usage instance to
591 me.  Usage of the patent (@dfn{Master/Slave Relationships In Computer
592 Applications}) will be much more expensive, of course.)
593
594 Anyways, you start one Gnus up the normal way with @kbd{M-x gnus} (or
595 however you do it).  Each subsequent slave Gnusae should be started with
596 @kbd{M-x gnus-slave}.  These slaves won't save normal @file{.newsrc}
597 files, but instead save @dfn{slave files} that contain information only
598 on what groups have been read in the slave session.  When a master Gnus
599 starts, it will read (and delete) these slave files, incorporating all
600 information from them.  (The slave files will be read in the sequence
601 they were created, so the latest changes will have precedence.)
602
603 Information from the slave files has, of course, precedence over the
604 information in the normal (i.e., master) @code{.newsrc} file.
605
606
607 @node Fetching a Group
608 @section Fetching a Group
609 @cindex fetching a group
610
611 @findex gnus-fetch-group
612 It is sometimes convenient to be able to just say ``I want to read this
613 group and I don't care whether Gnus has been started or not''.  This is
614 perhaps more useful for people who write code than for users, but the
615 command @code{gnus-fetch-group} provides this functionality in any case.
616 It takes the group name as a parameter.
617
618
619 @node New Groups
620 @section New Groups
621 @cindex new groups
622 @cindex subscription
623
624 @vindex gnus-check-new-newsgroups
625 If you are satisfied that you really never want to see any new groups,
626 you can set @code{gnus-check-new-newsgroups} to @code{nil}.  This will
627 also save you some time at startup.  Even if this variable is
628 @code{nil}, you can always subscribe to the new groups just by pressing
629 @kbd{U} in the group buffer (@pxref{Group Maintenance}).  This variable
630 is @code{ask-server} by default.  If you set this variable to
631 @code{always}, then Gnus will query the backends for new groups even
632 when you do the @kbd{g} command (@pxref{Scanning New Messages}).
633
634 @menu
635 * Checking New Groups::      Determining what groups are new.
636 * Subscription Methods::     What Gnus should do with new groups.
637 * Filtering New Groups::     Making Gnus ignore certain new groups.
638 @end menu
639
640
641 @node Checking New Groups
642 @subsection Checking New Groups
643
644 Gnus normally determines whether a group is new or not by comparing the
645 list of groups from the active file(s) with the lists of subscribed and
646 dead groups.  This isn't a particularly fast method.  If
647 @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
648 server for new groups since the last time.  This is both faster and
649 cheaper.  This also means that you can get rid of the list of killed
650 groups altogether, so you may set @code{gnus-save-killed-list} to
651 @code{nil}, which will save time both at startup, at exit, and all over.
652 Saves disk space, too.  Why isn't this the default, then?
653 Unfortunately, not all servers support this command.
654
655 I bet I know what you're thinking now: How do I find out whether my
656 server supports @code{ask-server}?  No?  Good, because I don't have a
657 fail-safe answer.  I would suggest just setting this variable to
658 @code{ask-server} and see whether any new groups appear within the next
659 few days.  If any do, then it works.  If none do, then it doesn't
660 work.  I could write a function to make Gnus guess whether the server
661 supports @code{ask-server}, but it would just be a guess.  So I won't.
662 You could @code{telnet} to the server and say @code{HELP} and see
663 whether it lists @samp{NEWGROUPS} among the commands it understands.  If
664 it does, then it might work.  (But there are servers that lists
665 @samp{NEWGROUPS} without supporting the function properly.)
666
667 This variable can also be a list of select methods.  If so, Gnus will
668 issue an @code{ask-server} command to each of the select methods, and
669 subscribe them (or not) using the normal methods.  This might be handy
670 if you are monitoring a few servers for new groups.  A side effect is
671 that startup will take much longer, so you can meditate while waiting.
672 Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
673
674
675 @node Subscription Methods
676 @subsection Subscription Methods
677
678 @vindex gnus-subscribe-newsgroup-method
679 What Gnus does when it encounters a new group is determined by the
680 @code{gnus-subscribe-newsgroup-method} variable.
681
682 This variable should contain a function.  This function will be called
683 with the name of the new group as the only parameter.
684
685 Some handy pre-fab functions are:
686
687 @table @code
688
689 @item gnus-subscribe-zombies
690 @vindex gnus-subscribe-zombies
691 Make all new groups zombies.  This is the default.  You can browse the
692 zombies later (with @kbd{A z}) and either kill them all off properly
693 (with @kbd{S z}), or subscribe to them (with @kbd{u}).
694
695 @item gnus-subscribe-randomly
696 @vindex gnus-subscribe-randomly
697 Subscribe all new groups in arbitrary order.  This really means that all
698 new groups will be added at ``the top'' of the group buffer.
699
700 @item gnus-subscribe-alphabetically
701 @vindex gnus-subscribe-alphabetically
702 Subscribe all new groups in alphabetical order.
703
704 @item gnus-subscribe-hierarchically
705 @vindex gnus-subscribe-hierarchically
706 Subscribe all new groups hierarchically.  The difference between this
707 function and @code{gnus-subscribe-alphabetically} is slight.
708 @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
709 alphabetical fashion, while this function will enter groups into it's
710 hierarchy.  So if you want to have the @samp{rec} hierarchy before the
711 @samp{comp} hierarchy, this function will not mess that configuration
712 up.  Or something like that.
713
714 @item gnus-subscribe-interactively
715 @vindex gnus-subscribe-interactively
716 Subscribe new groups interactively.  This means that Gnus will ask
717 you about @strong{all} new groups.  The groups you choose to subscribe
718 to will be subscribed hierarchically.
719
720 @item gnus-subscribe-killed
721 @vindex gnus-subscribe-killed
722 Kill all new groups.
723
724 @end table
725
726 @vindex gnus-subscribe-hierarchical-interactive
727 A closely related variable is
728 @code{gnus-subscribe-hierarchical-interactive}.  (That's quite a
729 mouthful.)  If this variable is non-@code{nil}, Gnus will ask you in a
730 hierarchical fashion whether to subscribe to new groups or not.  Gnus
731 will ask you for each sub-hierarchy whether you want to descend the
732 hierarchy or not.
733
734 One common mistake is to set the variable a few paragraphs above
735 (@code{gnus-subscribe-newsgroup-method}) to
736 @code{gnus-subscribe-hierarchical-interactive}.  This is an error.  This
737 will not work.  This is ga-ga.  So don't do it.
738
739
740 @node Filtering New Groups
741 @subsection Filtering New Groups
742
743 A nice and portable way to control which new newsgroups should be
744 subscribed (or ignored) is to put an @dfn{options} line at the start of
745 the @file{.newsrc} file.  Here's an example:
746
747 @example
748 options -n !alt.all !rec.all sci.all
749 @end example
750
751 @vindex gnus-subscribe-options-newsgroup-method
752 This line obviously belongs to a serious-minded intellectual scientific
753 person (or she may just be plain old boring), because it says that all
754 groups that have names beginning with @samp{alt} and @samp{rec} should
755 be ignored, and all groups with names beginning with @samp{sci} should
756 be subscribed.  Gnus will not use the normal subscription method for
757 subscribing these groups.
758 @code{gnus-subscribe-options-newsgroup-method} is used instead.  This
759 variable defaults to @code{gnus-subscribe-alphabetically}.
760
761 @vindex gnus-options-not-subscribe
762 @vindex gnus-options-subscribe
763 If you don't want to mess with your @file{.newsrc} file, you can just
764 set the two variables @code{gnus-options-subscribe} and
765 @code{gnus-options-not-subscribe}.  These two variables do exactly the
766 same as the @file{.newsrc} @samp{options -n} trick.  Both are regexps,
767 and if the new group matches the former, it will be unconditionally
768 subscribed, and if it matches the latter, it will be ignored.
769
770 @vindex gnus-auto-subscribed-groups
771 Yet another variable that meddles here is
772 @code{gnus-auto-subscribed-groups}.  It works exactly like
773 @code{gnus-options-subscribe}, and is therefore really superfluous, but I
774 thought it would be nice to have two of these.  This variable is more
775 meant for setting some ground rules, while the other variable is used
776 more for user fiddling.  By default this variable makes all new groups
777 that come from mail backends (@code{nnml}, @code{nnbabyl},
778 @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed.  If you
779 don't like that, just set this variable to @code{nil}.
780
781 New groups that match this regexp are subscribed using
782 @code{gnus-subscribe-options-newsgroup-method}.
783
784
785 @node Changing Servers
786 @section Changing Servers
787 @cindex changing servers
788
789 Sometimes it is necessary to move from one @sc{nntp} server to another.
790 This happens very rarely, but perhaps you change jobs, or one server is
791 very flaky and you want to use another.
792
793 Changing the server is pretty easy, right?  You just change
794 @code{gnus-select-method} to point to the new server?
795
796 @emph{Wrong!}
797
798 Article numbers are not (in any way) kept synchronized between different
799 @sc{nntp} servers, and the only way Gnus keeps track of what articles
800 you have read is by keeping track of article numbers.  So when you
801 change @code{gnus-select-method}, your @file{.newsrc} file becomes
802 worthless.
803
804 Gnus provides a few functions to attempt to translate a @file{.newsrc}
805 file from one server to another.  They all have one thing in
806 common---they take a looong time to run.  You don't want to use these
807 functions more than absolutely necessary.
808
809 @kindex M-x gnus-change-server
810 @findex gnus-change-server
811 If you have access to both servers, Gnus can request the headers for all
812 the articles you have read and compare @code{Message-ID}s and map the
813 article numbers of the read articles and article marks.  The @kbd{M-x
814 gnus-change-server} command will do this for all your native groups.  It
815 will prompt for the method you want to move to.
816
817 @kindex M-x gnus-group-move-group-to-server
818 @findex gnus-group-move-group-to-server
819 You can also move individual groups with the @kbd{M-x
820 gnus-group-move-group-to-server} command.  This is useful if you want to
821 move a (foreign) group from one server to another.
822
823 @kindex M-x gnus-group-clear-data-on-native-groups
824 @findex gnus-group-clear-data-on-native-groups
825 If you don't have access to both the old and new server, all your marks
826 and read ranges have become worthless.  You can use the @kbd{M-x
827 gnus-group-clear-data-on-native-groups} command to clear out all data
828 that you have on your native groups.  Use with caution.
829
830 After changing servers, you @strong{must} move the cache hierarchy away,
831 since the cached articles will have wrong article numbers, which will
832 affect which articles Gnus thinks are read.
833
834
835 @node Startup Files
836 @section Startup Files
837 @cindex startup files
838 @cindex .newsrc
839 @cindex .newsrc.el
840 @cindex .newsrc.eld
841
842 Now, you all know about the @file{.newsrc} file.  All subscription
843 information is traditionally stored in this file.
844
845 Things got a bit more complicated with @sc{gnus}.  In addition to
846 keeping the @file{.newsrc} file updated, it also used a file called
847 @file{.newsrc.el} for storing all the information that didn't fit into
848 the @file{.newsrc} file.  (Actually, it also duplicated everything in
849 the @file{.newsrc} file.)  @sc{gnus} would read whichever one of these
850 files was the most recently saved, which enabled people to swap between
851 @sc{gnus} and other newsreaders.
852
853 That was kinda silly, so Gnus went one better: In addition to the
854 @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
855 @file{.newsrc.eld}.  It will read whichever of these files that are most
856 recent, but it will never write a @file{.newsrc.el} file.  You should
857 never delete the @file{.newsrc.eld} file---it contains much information
858 not stored in the @file{.newsrc} file.
859
860 @vindex gnus-save-newsrc-file
861 You can turn off writing the @file{.newsrc} file by setting
862 @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
863 the file and save some space, as well as exiting from Gnus faster.
864 However, this will make it impossible to use other newsreaders than
865 Gnus.  But hey, who would want to, right?
866
867 @vindex gnus-save-killed-list
868 If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
869 will not save the list of killed groups to the startup file.  This will
870 save both time (when starting and quitting) and space (on disk).  It
871 will also mean that Gnus has no record of what groups are new or old,
872 so the automatic new groups subscription methods become meaningless.
873 You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
874 @code{ask-server} if you set this variable to @code{nil} (@pxref{New
875 Groups}).  This variable can also be a regular expression.  If that's
876 the case, remove all groups that do not match this regexp before
877 saving.  This can be useful in certain obscure situations that involve
878 several servers where not all servers support @code{ask-server}.
879
880 @vindex gnus-startup-file
881 The @code{gnus-startup-file} variable says where the startup files are.
882 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
883 file being whatever that one is, with a @samp{.eld} appended.
884
885 @vindex gnus-save-newsrc-hook
886 @vindex gnus-save-quick-newsrc-hook
887 @vindex gnus-save-standard-newsrc-hook
888 @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
889 files, while @code{gnus-save-quick-newsrc-hook} is called just before
890 saving the @file{.newsrc.eld} file, and
891 @code{gnus-save-standard-newsrc-hook} is called just before saving the
892 @file{.newsrc} file.  The latter two are commonly used to turn version
893 control on or off.  Version control is on by default when saving the
894 startup files.  If you want to turn backup creation off, say something like:
895
896 @lisp
897 (defun turn-off-backup ()
898   (set (make-local-variable 'backup-inhibited) t))
899
900 (add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
901 (add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
902 @end lisp
903
904 @vindex gnus-init-file
905 When Gnus starts, it will read the @code{gnus-site-init-file}
906 (@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}
907 (@file{~/.gnus} by default) files.  These are normal Emacs Lisp files
908 and can be used to avoid cluttering your @file{~/.emacs} and
909 @file{site-init} files with Gnus stuff.  Gnus will also check for files
910 with the same names as these, but with @file{.elc} and @file{.el}
911 suffixes.  In other words, if you have set @code{gnus-init-file} to
912 @file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
913 and finally @file{~/.gnus} (in this order).
914
915
916
917 @node Auto Save
918 @section Auto Save
919 @cindex dribble file
920 @cindex auto-save
921
922 Whenever you do something that changes the Gnus data (reading articles,
923 catching up, killing/subscribing groups), the change is added to a
924 special @dfn{dribble buffer}.  This buffer is auto-saved the normal
925 Emacs way.  If your Emacs should crash before you have saved the
926 @file{.newsrc} files, all changes you have made can be recovered from
927 this file.
928
929 If Gnus detects this file at startup, it will ask the user whether to
930 read it.  The auto save file is deleted whenever the real startup file is
931 saved.
932
933 @vindex gnus-use-dribble-file
934 If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
935 maintain a dribble buffer.  The default is @code{t}.
936
937 @vindex gnus-dribble-directory
938 Gnus will put the dribble file(s) in @code{gnus-dribble-directory}.  If
939 this variable is @code{nil}, which it is by default, Gnus will dribble
940 into the directory where the @file{.newsrc} file is located.  (This is
941 normally the user's home directory.)  The dribble file will get the same
942 file permissions as the @code{.newsrc} file.
943
944 @vindex gnus-always-read-dribble-file
945 If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
946 read the dribble file on startup without querying the user.
947
948
949 @node The Active File
950 @section The Active File
951 @cindex active file
952 @cindex ignored groups
953
954 When Gnus starts, or indeed whenever it tries to determine whether new
955 articles have arrived, it reads the active file.  This is a very large
956 file that lists all the active groups and articles on the server.
957
958 @vindex gnus-ignored-newsgroups
959 Before examining the active file, Gnus deletes all lines that match the
960 regexp @code{gnus-ignored-newsgroups}.  This is done primarily to reject
961 any groups with bogus names, but you can use this variable to make Gnus
962 ignore hierarchies you aren't ever interested in.  However, this is not
963 recommended.  In fact, it's highly discouraged.  Instead, @pxref{New
964 Groups} for an overview of other variables that can be used instead.
965
966 @c This variable is
967 @c @code{nil} by default, and will slow down active file handling somewhat
968 @c if you set it to anything else.
969
970 @vindex gnus-read-active-file
971 @c @head
972 The active file can be rather Huge, so if you have a slow network, you
973 can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
974 reading the active file.  This variable is @code{some} by default.
975
976 Gnus will try to make do by getting information just on the groups that
977 you actually subscribe to.
978
979 Note that if you subscribe to lots and lots of groups, setting this
980 variable to @code{nil} will probably make Gnus slower, not faster.  At
981 present, having this variable @code{nil} will slow Gnus down
982 considerably, unless you read news over a 2400 baud modem.
983
984 This variable can also have the value @code{some}.  Gnus will then
985 attempt to read active info only on the subscribed groups.  On some
986 servers this is quite fast (on sparkling, brand new INN servers that
987 support the @code{LIST ACTIVE group} command), on others this isn't fast
988 at all.  In any case, @code{some} should be faster than @code{nil}, and
989 is certainly faster than @code{t} over slow lines.
990
991 If this variable is @code{nil}, Gnus will ask for group info in total
992 lock-step, which isn't very fast.  If it is @code{some} and you use an
993 @sc{nntp} server, Gnus will pump out commands as fast as it can, and
994 read all the replies in one swoop.  This will normally result in better
995 performance, but if the server does not support the aforementioned
996 @code{LIST ACTIVE group} command, this isn't very nice to the server.
997
998 In any case, if you use @code{some} or @code{nil}, you should definitely
999 kill all groups that you aren't interested in to speed things up.
1000
1001 Note that this variable also affects active file retrieval from
1002 secondary select methods.
1003
1004
1005 @node Startup Variables
1006 @section Startup Variables
1007
1008 @table @code
1009
1010 @item gnus-load-hook
1011 @vindex gnus-load-hook
1012 A hook run while Gnus is being loaded.  Note that this hook will
1013 normally be run just once in each Emacs session, no matter how many
1014 times you start Gnus.
1015
1016 @item gnus-before-startup-hook
1017 @vindex gnus-before-startup-hook
1018 A hook run after starting up Gnus successfully.
1019
1020 @item gnus-startup-hook
1021 @vindex gnus-startup-hook
1022 A hook run as the very last thing after starting up Gnus
1023
1024 @item gnus-started-hook
1025 @vindex gnus-started-hook
1026 A hook that is run as the very last thing after starting up Gnus
1027 successfully.
1028
1029 @item gnus-started-hook
1030 @vindex gnus-started-hook
1031 A hook that is run after reading the @file{.newsrc} file(s), but before
1032 generating the group buffer.
1033
1034 @item gnus-check-bogus-newsgroups
1035 @vindex gnus-check-bogus-newsgroups
1036 If non-@code{nil}, Gnus will check for and delete all bogus groups at
1037 startup.  A @dfn{bogus group} is a group that you have in your
1038 @file{.newsrc} file, but doesn't exist on the news server.  Checking for
1039 bogus groups can take quite a while, so to save time and resources it's
1040 best to leave this option off, and do the checking for bogus groups once
1041 in a while from the group buffer instead (@pxref{Group Maintenance}).
1042
1043 @item gnus-inhibit-startup-message
1044 @vindex gnus-inhibit-startup-message
1045 If non-@code{nil}, the startup message won't be displayed.  That way,
1046 your boss might not notice as easily that you are reading news instead
1047 of doing your job.  Note that this variable is used before
1048 @file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead.
1049
1050 @item gnus-no-groups-message
1051 @vindex gnus-no-groups-message
1052 Message displayed by Gnus when no groups are available.
1053
1054 @item gnus-play-startup-jingle
1055 @vindex gnus-play-startup-jingle
1056 If non-@code{nil}, play the Gnus jingle at startup.
1057
1058 @item gnus-startup-jingle
1059 @vindex gnus-startup-jingle
1060 Jingle to be played if the above variable is non-@code{nil}.  The
1061 default is @samp{Tuxedomoon.Jingle4.au}.
1062
1063 @end table
1064
1065
1066 @node The Group Buffer
1067 @chapter The Group Buffer
1068 @cindex group buffer
1069
1070 The @dfn{group buffer} lists all (or parts) of the available groups.  It
1071 is the first buffer shown when Gnus starts, and will never be killed as
1072 long as Gnus is active.
1073
1074 @iftex
1075 @iflatex
1076 \gnusfigure{The Group Buffer}{320}{
1077 \put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}}
1078 \put(120,37){\makebox(0,0)[t]{Buffer name}}
1079 \put(120,38){\vector(1,2){10}}
1080 \put(40,60){\makebox(0,0)[r]{Mode line}}
1081 \put(40,58){\vector(1,0){30}}
1082 \put(200,28){\makebox(0,0)[t]{Native select method}}
1083 \put(200,26){\vector(-1,2){15}}
1084 }
1085 @end iflatex
1086 @end iftex
1087
1088 @menu
1089 * Group Buffer Format::    Information listed and how you can change it.
1090 * Group Maneuvering::      Commands for moving in the group buffer.
1091 * Selecting a Group::      Actually reading news.
1092 * Group Data::             Changing the info for a group.
1093 * Subscription Commands::  Unsubscribing, killing, subscribing.
1094 * Group Levels::           Levels? What are those, then?
1095 * Group Score::            A mechanism for finding out what groups you like.
1096 * Marking Groups::         You can mark groups for later processing.
1097 * Foreign Groups::         Creating and editing groups.
1098 * Group Parameters::       Each group may have different parameters set.
1099 * Listing Groups::         Gnus can list various subsets of the groups.
1100 * Sorting Groups::         Re-arrange the group order.
1101 * Group Maintenance::      Maintaining a tidy @file{.newsrc} file.
1102 * Browse Foreign Server::  You can browse a server.  See what it has to offer.
1103 * Exiting Gnus::           Stop reading news and get some work done.
1104 * Group Topics::           A folding group mode divided into topics.
1105 * Misc Group Stuff::       Other stuff that you can to do.
1106 @end menu
1107
1108
1109 @node Group Buffer Format
1110 @section Group Buffer Format
1111
1112 @menu
1113 * Group Line Specification::       Deciding how the group buffer is to look.
1114 * Group Modeline Specification::   The group buffer modeline.
1115 * Group Highlighting::             Having nice colors in the group buffer.
1116 @end menu
1117
1118
1119 @node Group Line Specification
1120 @subsection Group Line Specification
1121 @cindex group buffer format
1122
1123 The default format of the group buffer is nice and dull, but you can
1124 make it as exciting and ugly as you feel like.
1125
1126 Here's a couple of example group lines:
1127
1128 @example
1129      25: news.announce.newusers
1130  *    0: alt.fan.andrea-dworkin
1131 @end example
1132
1133 Quite simple, huh?
1134
1135 You can see that there are 25 unread articles in
1136 @samp{news.announce.newusers}.  There are no unread articles, but some
1137 ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1138 asterisk at the beginning of the line?).
1139
1140 @vindex gnus-group-line-format
1141 You can change that format to whatever you want by fiddling with the
1142 @code{gnus-group-line-format} variable.  This variable works along the
1143 lines of a @code{format} specification, which is pretty much the same as
1144 a @code{printf} specifications, for those of you who use (feh!) C.
1145 @xref{Formatting Variables}.
1146
1147 @samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above.
1148
1149 There should always be a colon on the line; the cursor always moves to
1150 the colon after performing an operation.  Nothing else is required---not
1151 even the group name.  All displayed text is just window dressing, and is
1152 never examined by Gnus.  Gnus stores all real information it needs using
1153 text properties.
1154
1155 (Note that if you make a really strange, wonderful, spreadsheet-like
1156 layout, everybody will believe you are hard at work with the accounting
1157 instead of wasting time reading news.)
1158
1159 Here's a list of all available format characters:
1160
1161 @table @samp
1162
1163 @item M
1164 An asterisk if the group only has marked articles.
1165
1166 @item S
1167 Whether the group is subscribed.
1168
1169 @item L
1170 Level of subscribedness.
1171
1172 @item N
1173 Number of unread articles.
1174
1175 @item I
1176 Number of dormant articles.
1177
1178 @item T
1179 Number of ticked articles.
1180
1181 @item R
1182 Number of read articles.
1183
1184 @item t
1185 Estimated total number of articles.  (This is really @var{max-number}
1186 minus @var{min-number} plus 1.)
1187
1188 @item y
1189 Number of unread, unticked, non-dormant articles.
1190
1191 @item i
1192 Number of ticked and dormant articles.
1193
1194 @item g
1195 Full group name.
1196
1197 @item G
1198 Group name.
1199
1200 @item D
1201 Newsgroup description.
1202
1203 @item o
1204 @samp{m} if moderated.
1205
1206 @item O
1207 @samp{(m)} if moderated.
1208
1209 @item s
1210 Select method.
1211
1212 @item n
1213 Select from where.
1214
1215 @item z
1216 A string that looks like @samp{<%s:%n>} if a foreign select method is
1217 used.
1218
1219 @item P
1220 Indentation based on the level of the topic (@pxref{Group Topics}).
1221
1222 @item c
1223 @vindex gnus-group-uncollapsed-levels
1224 Short (collapsed) group name.  The @code{gnus-group-uncollapsed-levels}
1225 variable says how many levels to leave at the end of the group name.
1226 The default is 1---this will mean that group names like
1227 @samp{gnu.emacs.gnus} will be shortened to @samp{g.emacs.gnus}.
1228
1229 @item m
1230 @vindex gnus-new-mail-mark
1231 @cindex %
1232 @samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1233 the group lately.
1234
1235 @item d
1236 A string that says when you last read the group (@pxref{Group
1237 Timestamp}).
1238
1239 @item u
1240 User defined specifier.  The next character in the format string should
1241 be a letter.  Gnus will call the function
1242 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1243 following @samp{%u}.  The function will be passed a single dummy
1244 parameter as argument.  The function should return a string, which will
1245 be inserted into the buffer just like information from any other
1246 specifier.
1247 @end table
1248
1249 @cindex *
1250 All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1251 if no info is available---for instance, if it is a non-activated foreign
1252 group, or a bogus native group.
1253
1254
1255 @node Group Modeline Specification
1256 @subsection Group Modeline Specification
1257 @cindex group modeline
1258
1259 @vindex gnus-group-mode-line-format
1260 The mode line can be changed by setting
1261 @code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}).  It
1262 doesn't understand that many format specifiers:
1263
1264 @table @samp
1265 @item S
1266 The native news server.
1267 @item M
1268 The native select method.
1269 @end table
1270
1271
1272 @node Group Highlighting
1273 @subsection Group Highlighting
1274 @cindex highlighting
1275 @cindex group highlighting
1276
1277 @vindex gnus-group-highlight
1278 Highlighting in the group buffer is controlled by the
1279 @code{gnus-group-highlight} variable.  This is an alist with elements
1280 that look like @var{(form . face)}.  If @var{form} evaluates to
1281 something non-@code{nil}, the @var{face} will be used on the line.
1282
1283 Here's an example value for this variable that might look nice if the
1284 background is dark:
1285
1286 @lisp
1287 (face-spec-set 'my-group-face-1
1288                '((t (:foreground "Red" :bold t))))
1289 (face-spec-set 'my-group-face-2
1290                '((t (:foreground "SeaGreen" :bold t))))
1291 (face-spec-set 'my-group-face-3
1292                '((t (:foreground "SpringGreen" :bold t))))
1293 (face-spec-set 'my-group-face-4
1294                '((t (:foreground "SteelBlue" :bold t))))
1295 (face-spec-set 'my-group-face-5
1296                '((t (:foreground "SkyBlue" :bold t))))
1297
1298 (setq gnus-group-highlight
1299       '(((> unread 200) . my-group-face-1)
1300         ((and (< level 3) (zerop unread)) . my-group-face-2)
1301         ((< level 3) . my-group-face-3)
1302         ((zerop unread) . my-group-face-4)
1303         (t . my-group-face-5)))
1304 @end lisp
1305
1306 Also @pxref{Faces and Fonts}.
1307
1308 Variables that are dynamically bound when the forms are evaluated
1309 include:
1310
1311 @table @code
1312 @item group
1313 The group name.
1314 @item unread
1315 The number of unread articles in the group.
1316 @item method
1317 The select method.
1318 @item mailp
1319 Whether the group is a mail group.
1320 @item level
1321 The level of the group.
1322 @item score
1323 The score of the group.
1324 @item ticked
1325 The number of ticked articles in the group.
1326 @item total
1327 The total number of articles in the group.  Or rather, MAX-NUMBER minus
1328 MIN-NUMBER plus one.
1329 @item topic
1330 When using the topic minor mode, this variable is bound to the current
1331 topic being inserted.
1332 @end table
1333
1334 When the forms are @code{eval}ed, point is at the beginning of the line
1335 of the group in question, so you can use many of the normal Gnus
1336 functions for snarfing info on the group.
1337
1338 @vindex gnus-group-update-hook
1339 @findex gnus-group-highlight-line
1340 @code{gnus-group-update-hook} is called when a group line is changed.
1341 It will not be called when @code{gnus-visual} is @code{nil}.  This hook
1342 calls @code{gnus-group-highlight-line} by default.
1343
1344
1345 @node Group Maneuvering
1346 @section Group Maneuvering
1347 @cindex group movement
1348
1349 All movement commands understand the numeric prefix and will behave as
1350 expected, hopefully.
1351
1352 @table @kbd
1353
1354 @item n
1355 @kindex n (Group)
1356 @findex gnus-group-next-unread-group
1357 Go to the next group that has unread articles
1358 (@code{gnus-group-next-unread-group}).
1359
1360 @item p
1361 @itemx DEL
1362 @kindex DEL (Group)
1363 @kindex p (Group)
1364 @findex gnus-group-prev-unread-group
1365 Go to the previous group that has unread articles
1366 (@code{gnus-group-prev-unread-group}).
1367
1368 @item N
1369 @kindex N (Group)
1370 @findex gnus-group-next-group
1371 Go to the next group (@code{gnus-group-next-group}).
1372
1373 @item P
1374 @kindex P (Group)
1375 @findex gnus-group-prev-group
1376 Go to the previous group (@code{gnus-group-prev-group}).
1377
1378 @item M-n
1379 @kindex M-n (Group)
1380 @findex gnus-group-next-unread-group-same-level
1381 Go to the next unread group on the same (or lower) level
1382 (@code{gnus-group-next-unread-group-same-level}).
1383
1384 @item M-p
1385 @kindex M-p (Group)
1386 @findex gnus-group-prev-unread-group-same-level
1387 Go to the previous unread group on the same (or lower) level
1388 (@code{gnus-group-prev-unread-group-same-level}).
1389 @end table
1390
1391 Three commands for jumping to groups:
1392
1393 @table @kbd
1394
1395 @item j
1396 @kindex j (Group)
1397 @findex gnus-group-jump-to-group
1398 Jump to a group (and make it visible if it isn't already)
1399 (@code{gnus-group-jump-to-group}).  Killed groups can be jumped to, just
1400 like living groups.
1401
1402 @item ,
1403 @kindex , (Group)
1404 @findex gnus-group-best-unread-group
1405 Jump to the unread group with the lowest level
1406 (@code{gnus-group-best-unread-group}).
1407
1408 @item .
1409 @kindex . (Group)
1410 @findex gnus-group-first-unread-group
1411 Jump to the first group with unread articles
1412 (@code{gnus-group-first-unread-group}).
1413 @end table
1414
1415 @vindex gnus-group-goto-unread
1416 If @code{gnus-group-goto-unread} is @code{nil}, all the movement
1417 commands will move to the next group, not the next unread group.  Even
1418 the commands that say they move to the next unread group.  The default
1419 is @code{t}.
1420
1421
1422 @node Selecting a Group
1423 @section Selecting a Group
1424 @cindex group selection
1425
1426 @table @kbd
1427
1428 @item SPACE
1429 @kindex SPACE (Group)
1430 @findex gnus-group-read-group
1431 Select the current group, switch to the summary buffer and display the
1432 first unread article (@code{gnus-group-read-group}).  If there are no
1433 unread articles in the group, or if you give a non-numerical prefix to
1434 this command, Gnus will offer to fetch all the old articles in this
1435 group from the server.  If you give a numerical prefix @var{N}, @var{N}
1436 determines the number of articles Gnus will fetch.  If @var{N} is
1437 positive, Gnus fetches the @var{N} newest articles, if @var{N} is
1438 negative, Gnus fetches the @var{abs(N)} oldest articles.
1439
1440 @item RET
1441 @kindex RET (Group)
1442 @findex gnus-group-select-group
1443 Select the current group and switch to the summary buffer
1444 (@code{gnus-group-select-group}).  Takes the same arguments as
1445 @code{gnus-group-read-group}---the only difference is that this command
1446 does not display the first unread article automatically upon group
1447 entry.
1448
1449 @item M-RET
1450 @kindex M-RET (Group)
1451 @findex gnus-group-quick-select-group
1452 This does the same as the command above, but tries to do it with the
1453 minimum amount of fuzz (@code{gnus-group-quick-select-group}).  No
1454 scoring/killing will be performed, there will be no highlights and no
1455 expunging.  This might be useful if you're in a real hurry and have to
1456 enter some humongous group.  If you give a 0 prefix to this command
1457 (i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
1458 which is useful if you want to toggle threading before generating the
1459 summary buffer (@pxref{Summary Generation Commands}).
1460
1461 @item M-SPACE
1462 @kindex M-SPACE (Group)
1463 @findex gnus-group-visible-select-group
1464 This is yet one more command that does the same as the @kbd{RET}
1465 command, but this one does it without expunging and hiding dormants
1466 (@code{gnus-group-visible-select-group}).
1467
1468 @item M-C-RET
1469 @kindex M-C-RET (Group)
1470 @findex gnus-group-select-group-ephemerally
1471 Finally, this command selects the current group ephemerally without
1472 doing any processing of its contents
1473 (@code{gnus-group-select-group-ephemerally}).  Even threading has been
1474 turned off.  Everything you do in the group after selecting it in this
1475 manner will have no permanent effects.
1476
1477 @end table
1478
1479 @vindex gnus-large-newsgroup
1480 The @code{gnus-large-newsgroup} variable says what Gnus should consider
1481 to be a big group.  This is 200 by default.  If the group has more
1482 (unread and/or ticked) articles than this, Gnus will query the user
1483 before entering the group.  The user can then specify how many articles
1484 should be fetched from the server.  If the user specifies a negative
1485 number (@code{-n}), the @code{n} oldest articles will be fetched.  If it
1486 is positive, the @code{n} articles that have arrived most recently will
1487 be fetched.
1488
1489 @vindex gnus-select-group-hook
1490 @vindex gnus-auto-select-first
1491 @code{gnus-auto-select-first} control whether any articles are selected
1492 automatically when entering a group with the @kbd{SPACE} command.
1493
1494 @table @code
1495
1496 @item nil
1497 Don't select any articles when entering the group.  Just display the
1498 full summary buffer.
1499
1500 @item t
1501 Select the first unread article when entering the group.
1502
1503 @item best
1504 Select the highest scored article in the group when entering the
1505 group.
1506
1507 @end table
1508
1509 This variable can also be a function.  In that case, that function will
1510 be called to place point on a subject line, and/or select some article.
1511 Useful functions include:
1512
1513 @table @code
1514 @item gnus-summary-first-unread-subject
1515 Place point on the subject line of the first unread article, but
1516 don't select the article.
1517
1518 @item gnus-summary-first-unread-article
1519 Select the first unread article.
1520
1521 @item gnus-summary-best-unread-article
1522 Select the highest-scored unread article.
1523 @end table
1524
1525
1526 If you want to prevent automatic selection in some group (say, in a
1527 binary group with Huge articles) you can set this variable to @code{nil}
1528 in @code{gnus-select-group-hook}, which is called when a group is
1529 selected.
1530
1531
1532 @node Subscription Commands
1533 @section Subscription Commands
1534 @cindex subscription
1535
1536 @table @kbd
1537
1538 @item S t
1539 @itemx u
1540 @kindex S t (Group)
1541 @kindex u (Group)
1542 @findex gnus-group-unsubscribe-current-group
1543 @c @icon{gnus-group-unsubscribe}
1544 Toggle subscription to the current group
1545 (@code{gnus-group-unsubscribe-current-group}).
1546
1547 @item S s
1548 @itemx U
1549 @kindex S s (Group)
1550 @kindex U (Group)
1551 @findex gnus-group-unsubscribe-group
1552 Prompt for a group to subscribe, and then subscribe it.  If it was
1553 subscribed already, unsubscribe it instead
1554 (@code{gnus-group-unsubscribe-group}).
1555
1556 @item S k
1557 @itemx C-k
1558 @kindex S k (Group)
1559 @kindex C-k (Group)
1560 @findex gnus-group-kill-group
1561 @c @icon{gnus-group-kill-group}
1562 Kill the current group (@code{gnus-group-kill-group}).
1563
1564 @item S y
1565 @itemx C-y
1566 @kindex S y (Group)
1567 @kindex C-y (Group)
1568 @findex gnus-group-yank-group
1569 Yank the last killed group (@code{gnus-group-yank-group}).
1570
1571 @item C-x C-t
1572 @kindex C-x C-t (Group)
1573 @findex gnus-group-transpose-groups
1574 Transpose two groups (@code{gnus-group-transpose-groups}).  This isn't
1575 really a subscription command, but you can use it instead of a
1576 kill-and-yank sequence sometimes.
1577
1578 @item S w
1579 @itemx C-w
1580 @kindex S w (Group)
1581 @kindex C-w (Group)
1582 @findex gnus-group-kill-region
1583 Kill all groups in the region (@code{gnus-group-kill-region}).
1584
1585 @item S z
1586 @kindex S z (Group)
1587 @findex gnus-group-kill-all-zombies
1588 Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
1589
1590 @item S C-k
1591 @kindex S C-k (Group)
1592 @findex gnus-group-kill-level
1593 Kill all groups on a certain level (@code{gnus-group-kill-level}).
1594 These groups can't be yanked back after killing, so this command should
1595 be used with some caution.  The only time where this command comes in
1596 really handy is when you have a @file{.newsrc} with lots of unsubscribed
1597 groups that you want to get rid off.  @kbd{S C-k} on level 7 will
1598 kill off all unsubscribed groups that do not have message numbers in the
1599 @file{.newsrc} file.
1600
1601 @end table
1602
1603 Also @pxref{Group Levels}.
1604
1605
1606 @node Group Data
1607 @section Group Data
1608
1609 @table @kbd
1610
1611 @item c
1612 @kindex c (Group)
1613 @findex gnus-group-catchup-current
1614 @vindex gnus-group-catchup-group-hook
1615 @c @icon{gnus-group-catchup-current}
1616 Mark all unticked articles in this group as read
1617 (@code{gnus-group-catchup-current}).
1618 @code{gnus-group-catchup-group-hook} is called when catching up a group from
1619 the group buffer.
1620
1621 @item C
1622 @kindex C (Group)
1623 @findex gnus-group-catchup-current-all
1624 Mark all articles in this group, even the ticked ones, as read
1625 (@code{gnus-group-catchup-current-all}).
1626
1627 @item M-c
1628 @kindex M-c (Group)
1629 @findex gnus-group-clear-data
1630 Clear the data from the current group---nix out marks and the list of
1631 read articles (@code{gnus-group-clear-data}).
1632
1633 @item M-x gnus-group-clear-data-on-native-groups
1634 @kindex M-x gnus-group-clear-data-on-native-groups
1635 @findex gnus-group-clear-data-on-native-groups
1636 If you have switched from one @sc{nntp} server to another, all your marks
1637 and read ranges have become worthless.  You can use this command to
1638 clear out all data that you have on your native groups.  Use with
1639 caution.
1640
1641 @end table
1642
1643
1644 @node Group Levels
1645 @section Group Levels
1646 @cindex group level
1647 @cindex level
1648
1649 All groups have a level of @dfn{subscribedness}.  For instance, if a
1650 group is on level 2, it is more subscribed than a group on level 5.  You
1651 can ask Gnus to just list groups on a given level or lower
1652 (@pxref{Listing Groups}), or to just check for new articles in groups on
1653 a given level or lower (@pxref{Scanning New Messages}).
1654
1655 Remember:  The higher the level of the group, the less important it is.
1656
1657 @table @kbd
1658
1659 @item S l
1660 @kindex S l (Group)
1661 @findex gnus-group-set-current-level
1662 Set the level of the current group.  If a numeric prefix is given, the
1663 next @var{n} groups will have their levels set.  The user will be
1664 prompted for a level.
1665 @end table
1666
1667 @vindex gnus-level-killed
1668 @vindex gnus-level-zombie
1669 @vindex gnus-level-unsubscribed
1670 @vindex gnus-level-subscribed
1671 Gnus considers groups from levels 1 to
1672 @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
1673 @code{gnus-level-subscribed} (exclusive) and
1674 @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
1675 unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
1676 (default 8) and @code{gnus-level-killed} to be killed (completely dead)
1677 (default 9).  Gnus treats subscribed and unsubscribed groups exactly the
1678 same, but zombie and killed groups have no information on what articles
1679 you have read, etc, stored.  This distinction between dead and living
1680 groups isn't done because it is nice or clever, it is done purely for
1681 reasons of efficiency.
1682
1683 It is recommended that you keep all your mail groups (if any) on quite
1684 low levels (e.g. 1 or 2).
1685
1686 If you want to play with the level variables, you should show some care.
1687 Set them once, and don't touch them ever again.  Better yet, don't touch
1688 them at all unless you know exactly what you're doing.
1689
1690 @vindex gnus-level-default-unsubscribed
1691 @vindex gnus-level-default-subscribed
1692 Two closely related variables are @code{gnus-level-default-subscribed}
1693 (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
1694 which are the levels that new groups will be put on if they are
1695 (un)subscribed.  These two variables should, of course, be inside the
1696 relevant valid ranges.
1697
1698 @vindex gnus-keep-same-level
1699 If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
1700 will only move to groups of the same level (or lower).  In
1701 particular, going from the last article in one group to the next group
1702 will go to the next group of the same level (or lower).  This might be
1703 handy if you want to read the most important groups before you read the
1704 rest.
1705
1706 @vindex gnus-group-default-list-level
1707 All groups with a level less than or equal to
1708 @code{gnus-group-default-list-level} will be listed in the group buffer
1709 by default.
1710
1711 @vindex gnus-group-list-inactive-groups
1712 If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
1713 groups will be listed along with the unread groups.  This variable is
1714 @code{t} by default.  If it is @code{nil}, inactive groups won't be
1715 listed.
1716
1717 @vindex gnus-group-use-permanent-levels
1718 If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
1719 give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
1720 use this level as the ``work'' level.
1721
1722 @vindex gnus-activate-level
1723 Gnus will normally just activate (i. e., query the server about) groups
1724 on level @code{gnus-activate-level} or less.  If you don't want to
1725 activate unsubscribed groups, for instance, you might set this variable
1726 to 5.  The default is 6.
1727
1728
1729 @node Group Score
1730 @section Group Score
1731 @cindex group score
1732 @cindex group rank
1733 @cindex rank
1734
1735 You would normally keep important groups on high levels, but that scheme
1736 is somewhat restrictive.  Don't you wish you could have Gnus sort the
1737 group buffer according to how often you read groups, perhaps?  Within
1738 reason?
1739
1740 This is what @dfn{group score} is for.  You can assign a score to each
1741 group.  You can then sort the group buffer based on this score.
1742 Alternatively, you can sort on score and then level.  (Taken together,
1743 the level and the score is called the @dfn{rank} of the group.  A group
1744 that is on level 4 and has a score of 1 has a higher rank than a group
1745 on level 5 that has a score of 300.  (The level is the most significant
1746 part and the score is the least significant part.))
1747
1748 @findex gnus-summary-bubble-group
1749 If you want groups you read often to get higher scores than groups you
1750 read seldom you can add the @code{gnus-summary-bubble-group} function to
1751 the @code{gnus-summary-exit-hook} hook.  This will result (after
1752 sorting) in a bubbling sort of action.  If you want to see that in
1753 action after each summary exit, you can add
1754 @code{gnus-group-sort-groups-by-rank} or
1755 @code{gnus-group-sort-groups-by-score} to the same hook, but that will
1756 slow things down somewhat.
1757
1758
1759 @node Marking Groups
1760 @section Marking Groups
1761 @cindex marking groups
1762
1763 If you want to perform some command on several groups, and they appear
1764 subsequently in the group buffer, you would normally just give a
1765 numerical prefix to the command.  Most group commands will then do your
1766 bidding on those groups.
1767
1768 However, if the groups are not in sequential order, you can still
1769 perform a command on several groups.  You simply mark the groups first
1770 with the process mark and then execute the command.
1771
1772 @table @kbd
1773
1774 @item #
1775 @kindex # (Group)
1776 @itemx M m
1777 @kindex M m (Group)
1778 @findex gnus-group-mark-group
1779 Set the mark on the current group (@code{gnus-group-mark-group}).
1780
1781 @item M-#
1782 @kindex M-# (Group)
1783 @itemx M u
1784 @kindex M u (Group)
1785 @findex gnus-group-unmark-group
1786 Remove the mark from the current group
1787 (@code{gnus-group-unmark-group}).
1788
1789 @item M U
1790 @kindex M U (Group)
1791 @findex gnus-group-unmark-all-groups
1792 Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
1793
1794 @item M w
1795 @kindex M w (Group)
1796 @findex gnus-group-mark-region
1797 Mark all groups between point and mark (@code{gnus-group-mark-region}).
1798
1799 @item M b
1800 @kindex M b (Group)
1801 @findex gnus-group-mark-buffer
1802 Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
1803
1804 @item M r
1805 @kindex M r (Group)
1806 @findex gnus-group-mark-regexp
1807 Mark all groups that match some regular expression
1808 (@code{gnus-group-mark-regexp}).
1809 @end table
1810
1811 Also @pxref{Process/Prefix}.
1812
1813 @findex gnus-group-universal-argument
1814 If you want to execute some command on all groups that have been marked
1815 with the process mark, you can use the @kbd{M-&}
1816 (@code{gnus-group-universal-argument}) command.  It will prompt you for
1817 the command to be executed.
1818
1819
1820 @node Foreign Groups
1821 @section Foreign Groups
1822 @cindex foreign groups
1823
1824 Below are some group mode commands for making and editing general foreign
1825 groups, as well as commands to ease the creation of a few
1826 special-purpose groups.  All these commands insert the newly created
1827 groups under point---@code{gnus-subscribe-newsgroup-method} is not
1828 consulted.
1829
1830 @table @kbd
1831
1832 @item G m
1833 @kindex G m (Group)
1834 @findex gnus-group-make-group
1835 @cindex making groups
1836 Make a new group (@code{gnus-group-make-group}).  Gnus will prompt you
1837 for a name, a method and possibly an @dfn{address}.  For an easier way
1838 to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
1839
1840 @item G r
1841 @kindex G r (Group)
1842 @findex gnus-group-rename-group
1843 @cindex renaming groups
1844 Rename the current group to something else
1845 (@code{gnus-group-rename-group}).  This is valid only on some
1846 groups---mail groups mostly.  This command might very well be quite slow
1847 on some backends.
1848
1849 @item G c
1850 @kindex G c (Group)
1851 @cindex customizing
1852 @findex gnus-group-customize
1853 Customize the group parameters (@code{gnus-group-customize}).
1854
1855 @item G e
1856 @kindex G e (Group)
1857 @findex gnus-group-edit-group-method
1858 @cindex renaming groups
1859 Enter a buffer where you can edit the select method of the current
1860 group (@code{gnus-group-edit-group-method}).
1861
1862 @item G p
1863 @kindex G p (Group)
1864 @findex gnus-group-edit-group-parameters
1865 Enter a buffer where you can edit the group parameters
1866 (@code{gnus-group-edit-group-parameters}).
1867
1868 @item G E
1869 @kindex G E (Group)
1870 @findex gnus-group-edit-group
1871 Enter a buffer where you can edit the group info
1872 (@code{gnus-group-edit-group}).
1873
1874 @item G d
1875 @kindex G d (Group)
1876 @findex gnus-group-make-directory-group
1877 @cindex nndir
1878 Make a directory group (@pxref{Directory Groups}).  You will be prompted
1879 for a directory name (@code{gnus-group-make-directory-group}).
1880
1881 @item G h
1882 @kindex G h (Group)
1883 @cindex help group
1884 @findex gnus-group-make-help-group
1885 Make the Gnus help group (@code{gnus-group-make-help-group}).
1886
1887 @item G a
1888 @kindex G a (Group)
1889 @cindex (ding) archive
1890 @cindex archive group
1891 @findex gnus-group-make-archive-group
1892 @vindex gnus-group-archive-directory
1893 @vindex gnus-group-recent-archive-directory
1894 Make a Gnus archive group (@code{gnus-group-make-archive-group}).  By
1895 default a group pointing to the most recent articles will be created
1896 (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
1897 group will be created from @code{gnus-group-archive-directory}.
1898
1899 @item G k
1900 @kindex G k (Group)
1901 @findex gnus-group-make-kiboze-group
1902 @cindex nnkiboze
1903 Make a kiboze group.  You will be prompted for a name, for a regexp to
1904 match groups to be ``included'' in the kiboze group, and a series of
1905 strings to match on headers (@code{gnus-group-make-kiboze-group}).
1906 @xref{Kibozed Groups}.
1907
1908 @item G D
1909 @kindex G D (Group)
1910 @findex gnus-group-enter-directory
1911 @cindex nneething
1912 Read an arbitrary directory as if it were a newsgroup with the
1913 @code{nneething} backend (@code{gnus-group-enter-directory}).
1914 @xref{Anything Groups}.
1915
1916 @item G f
1917 @kindex G f (Group)
1918 @findex gnus-group-make-doc-group
1919 @cindex ClariNet Briefs
1920 @cindex nndoc
1921 Make a group based on some file or other
1922 (@code{gnus-group-make-doc-group}).  If you give a prefix to this
1923 command, you will be prompted for a file name and a file type.
1924 Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
1925 @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs},
1926 @code{rfc934}, @code{rfc822-forward}, and @code{forward}.  If you run
1927 this command without a prefix, Gnus will guess at the file type.
1928 @xref{Document Groups}.
1929
1930 @item G u
1931 @kindex G u (Group)
1932 @vindex gnus-useful-groups
1933 @findex gnus-group-make-useful-group
1934 Create one of the groups mentioned in @code{gnus-useful-groups}
1935 (@code{gnus-group-make-useful-group}).
1936
1937 @item G w
1938 @kindex G w (Group)
1939 @findex gnus-group-make-web-group
1940 @cindex DejaNews
1941 @cindex Alta Vista
1942 @cindex InReference
1943 @cindex nnweb
1944 Make an ephemeral group based on a web search
1945 (@code{gnus-group-make-web-group}).  If you give a prefix to this
1946 command, make a solid group instead.  You will be prompted for the
1947 search engine type and the search string.  Valid search engine types
1948 include @code{dejanews}, @code{altavista} and @code{reference}.
1949 @xref{Web Searches}.
1950
1951 If you use the @code{dejanews} search engine, you can limit the search
1952 to a particular group by using a match string like
1953 @samp{~g alt.sysadmin.recovery shaving}.
1954
1955 @item G DEL
1956 @kindex G DEL (Group)
1957 @findex gnus-group-delete-group
1958 This function will delete the current group
1959 (@code{gnus-group-delete-group}).  If given a prefix, this function will
1960 actually delete all the articles in the group, and forcibly remove the
1961 group itself from the face of the Earth.  Use a prefix only if you are
1962 absolutely sure of what you are doing.  This command can't be used on
1963 read-only groups (like @code{nntp} group), though.
1964
1965 @item G V
1966 @kindex G V (Group)
1967 @findex gnus-group-make-empty-virtual
1968 Make a new, fresh, empty @code{nnvirtual} group
1969 (@code{gnus-group-make-empty-virtual}).  @xref{Virtual Groups}.
1970
1971 @item G v
1972 @kindex G v (Group)
1973 @findex gnus-group-add-to-virtual
1974 Add the current group to an @code{nnvirtual} group
1975 (@code{gnus-group-add-to-virtual}).  Uses the process/prefix convention.
1976 @end table
1977
1978 @xref{Select Methods} for more information on the various select
1979 methods.
1980
1981 @vindex gnus-activate-foreign-newsgroups
1982 If @code{gnus-activate-foreign-newsgroups} is a positive number,
1983 Gnus will check all foreign groups with this level or lower at startup.
1984 This might take quite a while, especially if you subscribe to lots of
1985 groups from different @sc{nntp} servers.  Also @pxref{Group Levels};
1986 @code{gnus-activate-level} also affects activation of foreign
1987 newsgroups.
1988
1989
1990 @node Group Parameters
1991 @section Group Parameters
1992 @cindex group parameters
1993
1994 The group parameters store information local to a particular group.
1995 Here's an example group parameter list:
1996
1997 @example
1998 ((to-address . "ding@@gnus.org")
1999  (auto-expire . t))
2000 @end example
2001
2002 We see that each element consists of a "dotted pair"---the thing before
2003 the dot is the key, while the thing after the dot is the value.  All the
2004 parameters have this form @emph{except} local variable specs, which are
2005 not dotted pairs, but proper lists.
2006
2007 The following group parameters can be used:
2008
2009 @table @code
2010 @item to-address
2011 @cindex to-address
2012 Address used by when doing followups and new posts.
2013
2014 @example
2015 (to-address .  "some@@where.com")
2016 @end example
2017
2018 This is primarily useful in mail groups that represent closed mailing
2019 lists---mailing lists where it's expected that everybody that writes to
2020 the mailing list is subscribed to it.  Since using this parameter
2021 ensures that the mail only goes to the mailing list itself, it means
2022 that members won't receive two copies of your followups.
2023
2024 Using @code{to-address} will actually work whether the group is foreign
2025 or not.  Let's say there's a group on the server that is called
2026 @samp{fa.4ad-l}.  This is a real newsgroup, but the server has gotten
2027 the articles from a mail-to-news gateway.  Posting directly to this
2028 group is therefore impossible---you have to send mail to the mailing
2029 list address instead.
2030
2031 @item to-list
2032 @cindex to-list
2033 Address used when doing a @kbd{a} in that group.
2034
2035 @example
2036 (to-list . "some@@where.com")
2037 @end example
2038
2039 It is totally ignored
2040 when doing a followup---except that if it is present in a news group,
2041 you'll get mail group semantics when doing @kbd{f}.
2042
2043 If you do an @kbd{a} command in a mail group and you have neither a
2044 @code{to-list} group parameter nor a @code{to-address} group parameter,
2045 then a @code{to-list} group parameter will be added automatically upon
2046 sending the message if @code{gnus-add-to-list} is set to @code{t}.
2047 @vindex gnus-add-to-list
2048
2049 If you do an @kbd{a} command in a mail group and you don't have a
2050 @code{to-list} group parameter, one will be added automatically upon
2051 sending the message.
2052
2053 @item visible
2054 @cindex visible
2055 If the group parameter list has the element @code{(visible . t)},
2056 that group will always be visible in the Group buffer, regardless
2057 of whether it has any unread articles.
2058
2059 @item broken-reply-to
2060 @cindex broken-reply-to
2061 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
2062 headers in this group are to be ignored.  This can be useful if you're
2063 reading a mailing list group where the listserv has inserted
2064 @code{Reply-To} headers that point back to the listserv itself.  This is
2065 broken behavior.  So there!
2066
2067 @item to-group
2068 @cindex to-group
2069 Elements like @code{(to-group . "some.group.name")} means that all
2070 posts in that group will be sent to @code{some.group.name}.
2071
2072 @item newsgroup
2073 @cindex newsgroup
2074 If you have @code{(newsgroup . t)} in the group parameter list, Gnus
2075 will treat all responses as if they were responses to news articles.
2076 This can be useful if you have a mail group that's really a mirror of a
2077 news group.
2078
2079 @item gcc-self
2080 @cindex gcc-self
2081 If @code{(gcc-self . t)} is present in the group parameter list, newly
2082 composed messages will be @code{Gcc}'d to the current group. If
2083 @code{(gcc-self . none)} is present, no @code{Gcc:} header will be
2084 generated, if @code{(gcc-self . "string")} is present, this string will
2085 be inserted literally as a @code{gcc} header.  This parameter takes
2086 precedence over any default @code{Gcc} rules as described later
2087 (@pxref{Archived Messages}).
2088
2089 @item auto-expire
2090 @cindex auto-expire
2091 If the group parameter has an element that looks like @code{(auto-expire
2092 . t)}, all articles read will be marked as expirable.  For an
2093 alternative approach, @pxref{Expiring Mail}.
2094
2095 @item total-expire
2096 @cindex total-expire
2097 If the group parameter has an element that looks like
2098 @code{(total-expire . t)}, all read articles will be put through the
2099 expiry process, even if they are not marked as expirable.  Use with
2100 caution.  Unread, ticked and dormant articles are not eligible for
2101 expiry.
2102
2103 @item expiry-wait
2104 @cindex expiry-wait
2105 @vindex nnmail-expiry-wait-function
2106 If the group parameter has an element that looks like @code{(expiry-wait
2107 . 10)}, this value will override any @code{nnmail-expiry-wait} and
2108 @code{nnmail-expiry-wait-function} when expiring expirable messages.
2109 The value can either be a number of days (not necessarily an integer) or
2110 the symbols @code{never} or @code{immediate}.
2111
2112 @item score-file
2113 @cindex score file group parameter
2114 Elements that look like @code{(score-file . "file")} will make
2115 @file{file} into the current score file for the group in question.  All
2116 interactive score entries will be put into this file.
2117
2118 @item adapt-file
2119 @cindex adapt file group parameter
2120 Elements that look like @code{(adapt-file . "file")} will make
2121 @file{file} into the current adaptive file for the group in question.
2122 All adaptive score entries will be put into this file.
2123
2124 @item admin-address
2125 When unsubscribing from a mailing list you should never send the
2126 unsubscription notice to the mailing list itself.  Instead, you'd send
2127 messages to the administrative address.  This parameter allows you to
2128 put the admin address somewhere convenient.
2129
2130 @item display
2131 Elements that look like @code{(display . MODE)} say which articles to
2132 display on entering the group.  Valid values are:
2133
2134 @table @code
2135 @item all
2136 Display all articles, both read and unread.
2137
2138 @item default
2139 Display the default visible articles, which normally includes unread and
2140 ticked articles.
2141 @end table
2142
2143 @item comment
2144 Elements that look like @code{(comment . "This is a comment")}
2145 are arbitrary comments on the group.  They are currently ignored by
2146 Gnus, but provide a place for you to store information on particular
2147 groups.
2148
2149 @item charset
2150 Elements that look like @code{(charset . iso-8859-1)} will make
2151 @code{iso-8859-1} the default charset; that is, the charset that will be
2152 used for all articles that do not specify a charset.
2153
2154 @item @var{(variable form)}
2155 You can use the group parameters to set variables local to the group you
2156 are entering.  If you want to turn threading off in @samp{news.answers},
2157 you could put @code{(gnus-show-threads nil)} in the group parameters of
2158 that group.  @code{gnus-show-threads} will be made into a local variable
2159 in the summary buffer you enter, and the form @code{nil} will be
2160 @code{eval}ed there.
2161
2162 This can also be used as a group-specific hook function, if you'd like.
2163 If you want to hear a beep when you enter a group, you could put
2164 something like @code{(dummy-variable (ding))} in the parameters of that
2165 group.  @code{dummy-variable} will be set to the result of the
2166 @code{(ding)} form, but who cares?
2167
2168 @item posting-style
2169 You can store additional posting style information for this group only
2170 here (@pxref{Posting Styles}). The format is that of an entry in the
2171 @code{gnus-posting-styles} alist, except that there's no regexp matching
2172 the group name (of course). Style elements in this group parameter will
2173 take precedence over the ones found in @code{gnus-posting-styles}.
2174
2175 For instance, if you want a funky name and signature in this group only,
2176 instead of hacking @code{gnus-posting-styles}, you could put something
2177 like this in the group parameters:
2178
2179 @example
2180 (posting-style
2181   (name "Funky Name")
2182   (signature "Funky Signature"))
2183 @end example
2184
2185 @end table
2186
2187 Use the @kbd{G p} command to edit group parameters of a group.  You
2188 might also be interested in reading about topic parameters (@pxref{Topic
2189 Parameters}).
2190
2191
2192 @node Listing Groups
2193 @section Listing Groups
2194 @cindex group listing
2195
2196 These commands all list various slices of the groups available.
2197
2198 @table @kbd
2199
2200 @item l
2201 @itemx A s
2202 @kindex A s (Group)
2203 @kindex l (Group)
2204 @findex gnus-group-list-groups
2205 List all groups that have unread articles
2206 (@code{gnus-group-list-groups}).  If the numeric prefix is used, this
2207 command will list only groups of level ARG and lower.  By default, it
2208 only lists groups of level five (i. e.,
2209 @code{gnus-group-default-list-level}) or lower (i.e., just subscribed
2210 groups).
2211
2212 @item L
2213 @itemx A u
2214 @kindex A u (Group)
2215 @kindex L (Group)
2216 @findex gnus-group-list-all-groups
2217 List all groups, whether they have unread articles or not
2218 (@code{gnus-group-list-all-groups}).  If the numeric prefix is used,
2219 this command will list only groups of level ARG and lower.  By default,
2220 it lists groups of level seven or lower (i.e., just subscribed and
2221 unsubscribed groups).
2222
2223 @item A l
2224 @kindex A l (Group)
2225 @findex gnus-group-list-level
2226 List all unread groups on a specific level
2227 (@code{gnus-group-list-level}).  If given a prefix, also list the groups
2228 with no unread articles.
2229
2230 @item A k
2231 @kindex A k (Group)
2232 @findex gnus-group-list-killed
2233 List all killed groups (@code{gnus-group-list-killed}).  If given a
2234 prefix argument, really list all groups that are available, but aren't
2235 currently (un)subscribed.  This could entail reading the active file
2236 from the server.
2237
2238 @item A z
2239 @kindex A z (Group)
2240 @findex gnus-group-list-zombies
2241 List all zombie groups (@code{gnus-group-list-zombies}).
2242
2243 @item A m
2244 @kindex A m (Group)
2245 @findex gnus-group-list-matching
2246 List all unread, subscribed groups with names that match a regexp
2247 (@code{gnus-group-list-matching}).
2248
2249 @item A M
2250 @kindex A M (Group)
2251 @findex gnus-group-list-all-matching
2252 List groups that match a regexp (@code{gnus-group-list-all-matching}).
2253
2254 @item A A
2255 @kindex A A (Group)
2256 @findex gnus-group-list-active
2257 List absolutely all groups in the active file(s) of the
2258 server(s) you are connected to (@code{gnus-group-list-active}).  This
2259 might very well take quite a while.  It might actually be a better idea
2260 to do a @kbd{A M} to list all matching, and just give @samp{.} as the
2261 thing to match on.  Also note that this command may list groups that
2262 don't exist (yet)---these will be listed as if they were killed groups.
2263 Take the output with some grains of salt.
2264
2265 @item A a
2266 @kindex A a (Group)
2267 @findex gnus-group-apropos
2268 List all groups that have names that match a regexp
2269 (@code{gnus-group-apropos}).
2270
2271 @item A d
2272 @kindex A d (Group)
2273 @findex gnus-group-description-apropos
2274 List all groups that have names or descriptions that match a regexp
2275 (@code{gnus-group-description-apropos}).
2276
2277 @end table
2278
2279 @vindex gnus-permanently-visible-groups
2280 @cindex visible group parameter
2281 Groups that match the @code{gnus-permanently-visible-groups} regexp will
2282 always be shown, whether they have unread articles or not.  You can also
2283 add the @code{visible} element to the group parameters in question to
2284 get the same effect.
2285
2286 @vindex gnus-list-groups-with-ticked-articles
2287 Groups that have just ticked articles in it are normally listed in the
2288 group buffer.  If @code{gnus-list-groups-with-ticked-articles} is
2289 @code{nil}, these groups will be treated just like totally empty
2290 groups.  It is @code{t} by default.
2291
2292
2293 @node Sorting Groups
2294 @section Sorting Groups
2295 @cindex sorting groups
2296
2297 @kindex C-c C-s (Group)
2298 @findex gnus-group-sort-groups
2299 @vindex gnus-group-sort-function
2300 The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
2301 group buffer according to the function(s) given by the
2302 @code{gnus-group-sort-function} variable.  Available sorting functions
2303 include:
2304
2305 @table @code
2306
2307 @item gnus-group-sort-by-alphabet
2308 @findex gnus-group-sort-by-alphabet
2309 Sort the group names alphabetically.  This is the default.
2310
2311 @item gnus-group-sort-by-real-name
2312 @findex gnus-group-sort-by-real-name
2313 Sort the group alphabetically on the real (unprefixed) group names.
2314
2315 @item gnus-group-sort-by-level
2316 @findex gnus-group-sort-by-level
2317 Sort by group level.
2318
2319 @item gnus-group-sort-by-score
2320 @findex gnus-group-sort-by-score
2321 Sort by group score.  @xref{Group Score}.
2322
2323 @item gnus-group-sort-by-rank
2324 @findex gnus-group-sort-by-rank
2325 Sort by group score and then the group level.  The level and the score
2326 are, when taken together, the group's @dfn{rank}.  @xref{Group Score}.
2327
2328 @item gnus-group-sort-by-unread
2329 @findex gnus-group-sort-by-unread
2330 Sort by number of unread articles.
2331
2332 @item gnus-group-sort-by-method
2333 @findex gnus-group-sort-by-method
2334 Sort alphabetically on the select method.
2335
2336
2337 @end table
2338
2339 @code{gnus-group-sort-function} can also be a list of sorting
2340 functions.  In that case, the most significant sort key function must be
2341 the last one.
2342
2343
2344 There are also a number of commands for sorting directly according to
2345 some sorting criteria:
2346
2347 @table @kbd
2348 @item G S a
2349 @kindex G S a (Group)
2350 @findex gnus-group-sort-groups-by-alphabet
2351 Sort the group buffer alphabetically by group name
2352 (@code{gnus-group-sort-groups-by-alphabet}).
2353
2354 @item G S u
2355 @kindex G S u (Group)
2356 @findex gnus-group-sort-groups-by-unread
2357 Sort the group buffer by the number of unread articles
2358 (@code{gnus-group-sort-groups-by-unread}).
2359
2360 @item G S l
2361 @kindex G S l (Group)
2362 @findex gnus-group-sort-groups-by-level
2363 Sort the group buffer by group level
2364 (@code{gnus-group-sort-groups-by-level}).
2365
2366 @item G S v
2367 @kindex G S v (Group)
2368 @findex gnus-group-sort-groups-by-score
2369 Sort the group buffer by group score
2370 (@code{gnus-group-sort-groups-by-score}).  @xref{Group Score}.
2371
2372 @item G S r
2373 @kindex G S r (Group)
2374 @findex gnus-group-sort-groups-by-rank
2375 Sort the group buffer by group rank
2376 (@code{gnus-group-sort-groups-by-rank}).  @xref{Group Score}.
2377
2378 @item G S m
2379 @kindex G S m (Group)
2380 @findex gnus-group-sort-groups-by-method
2381 Sort the group buffer alphabetically by backend name
2382 (@code{gnus-group-sort-groups-by-method}).
2383
2384 @end table
2385
2386 All the commands below obeys the process/prefix convention
2387 (@pxref{Process/Prefix}).
2388
2389 When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
2390 commands will sort in reverse order.
2391
2392 You can also sort a subset of the groups:
2393
2394 @table @kbd
2395 @item G P a
2396 @kindex G P a (Group)
2397 @findex gnus-group-sort-selected-groups-by-alphabet
2398 Sort the groups alphabetically by group name
2399 (@code{gnus-group-sort-selected-groups-by-alphabet}).
2400
2401 @item G P u
2402 @kindex G P u (Group)
2403 @findex gnus-group-sort-selected-groups-by-unread
2404 Sort the groups by the number of unread articles
2405 (@code{gnus-group-sort-selected-groups-by-unread}).
2406
2407 @item G P l
2408 @kindex G P l (Group)
2409 @findex gnus-group-sort-selected-groups-by-level
2410 Sort the groups by group level
2411 (@code{gnus-group-sort-selected-groups-by-level}).
2412
2413 @item G P v
2414 @kindex G P v (Group)
2415 @findex gnus-group-sort-selected-groups-by-score
2416 Sort the groups by group score
2417 (@code{gnus-group-sort-selected-groups-by-score}).  @xref{Group Score}.
2418
2419 @item G P r
2420 @kindex G P r (Group)
2421 @findex gnus-group-sort-selected-groups-by-rank
2422 Sort the groups by group rank
2423 (@code{gnus-group-sort-selected-groups-by-rank}).  @xref{Group Score}.
2424
2425 @item G P m
2426 @kindex G P m (Group)
2427 @findex gnus-group-sort-selected-groups-by-method
2428 Sort the groups alphabetically by backend name
2429 (@code{gnus-group-sort-selected-groups-by-method}).
2430
2431 @end table
2432
2433
2434
2435 @node Group Maintenance
2436 @section Group Maintenance
2437 @cindex bogus groups
2438
2439 @table @kbd
2440 @item b
2441 @kindex b (Group)
2442 @findex gnus-group-check-bogus-groups
2443 Find bogus groups and delete them
2444 (@code{gnus-group-check-bogus-groups}).
2445
2446 @item F
2447 @kindex F (Group)
2448 @findex gnus-group-find-new-groups
2449 Find new groups and process them (@code{gnus-group-find-new-groups}).
2450 With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
2451 for new groups.  With 2 @kbd{C-u}'s, use most complete method possible
2452 to query the server for new groups, and subscribe the new groups as
2453 zombies.
2454
2455 @item C-c C-x
2456 @kindex C-c C-x (Group)
2457 @findex gnus-group-expire-articles
2458 Run all expirable articles in the current group through the expiry
2459 process (if any) (@code{gnus-group-expire-articles}).
2460
2461 @item C-c M-C-x
2462 @kindex C-c M-C-x (Group)
2463 @findex gnus-group-expire-all-groups
2464 Run all articles in all groups through the expiry process
2465 (@code{gnus-group-expire-all-groups}).
2466
2467 @end table
2468
2469
2470 @node Browse Foreign Server
2471 @section Browse Foreign Server
2472 @cindex foreign servers
2473 @cindex browsing servers
2474
2475 @table @kbd
2476 @item B
2477 @kindex B (Group)
2478 @findex gnus-group-browse-foreign-server
2479 You will be queried for a select method and a server name.  Gnus will
2480 then attempt to contact this server and let you browse the groups there
2481 (@code{gnus-group-browse-foreign-server}).
2482 @end table
2483
2484 @findex gnus-browse-mode
2485 A new buffer with a list of available groups will appear.  This buffer
2486 will use the @code{gnus-browse-mode}.  This buffer looks a bit (well,
2487 a lot) like a normal group buffer.
2488
2489 Here's a list of keystrokes available in the browse mode:
2490
2491 @table @kbd
2492 @item n
2493 @kindex n (Browse)
2494 @findex gnus-group-next-group
2495 Go to the next group (@code{gnus-group-next-group}).
2496
2497 @item p
2498 @kindex p (Browse)
2499 @findex gnus-group-prev-group
2500 Go to the previous group (@code{gnus-group-prev-group}).
2501
2502 @item SPACE
2503 @kindex SPACE (Browse)
2504 @findex gnus-browse-read-group
2505 Enter the current group and display the first article
2506 (@code{gnus-browse-read-group}).
2507
2508 @item RET
2509 @kindex RET (Browse)
2510 @findex gnus-browse-select-group
2511 Enter the current group (@code{gnus-browse-select-group}).
2512
2513 @item u
2514 @kindex u (Browse)
2515 @findex gnus-browse-unsubscribe-current-group
2516 Unsubscribe to the current group, or, as will be the case here,
2517 subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
2518
2519 @item l
2520 @itemx q
2521 @kindex q (Browse)
2522 @kindex l (Browse)
2523 @findex gnus-browse-exit
2524 Exit browse mode (@code{gnus-browse-exit}).
2525
2526 @item ?
2527 @kindex ? (Browse)
2528 @findex gnus-browse-describe-briefly
2529 Describe browse mode briefly (well, there's not much to describe, is
2530 there) (@code{gnus-browse-describe-briefly}).
2531 @end table
2532
2533
2534 @node Exiting Gnus
2535 @section Exiting Gnus
2536 @cindex exiting Gnus
2537
2538 Yes, Gnus is ex(c)iting.
2539
2540 @table @kbd
2541 @item z
2542 @kindex z (Group)
2543 @findex gnus-group-suspend
2544 Suspend Gnus (@code{gnus-group-suspend}).  This doesn't really exit Gnus,
2545 but it kills all buffers except the Group buffer.  I'm not sure why this
2546 is a gain, but then who am I to judge?
2547
2548 @item q
2549 @kindex q (Group)
2550 @findex gnus-group-exit
2551 @c @icon{gnus-group-exit}
2552 Quit Gnus (@code{gnus-group-exit}).
2553
2554 @item Q
2555 @kindex Q (Group)
2556 @findex gnus-group-quit
2557 Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
2558 The dribble file will be saved, though (@pxref{Auto Save}).
2559 @end table
2560
2561 @vindex gnus-exit-gnus-hook
2562 @vindex gnus-suspend-gnus-hook
2563 @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
2564 @code{gnus-exit-gnus-hook} is called when you quit Gnus, while
2565 @code{gnus-after-exiting-gnus-hook} is called as the final item when
2566 exiting Gnus.
2567
2568 @findex gnus-unload
2569 @cindex unloading
2570 If you wish to completely unload Gnus and all its adherents, you can use
2571 the @code{gnus-unload} command.  This command is also very handy when
2572 trying to customize meta-variables.
2573
2574 Note:
2575
2576 @quotation
2577 Miss Lisa Cannifax, while sitting in English class, felt her feet go
2578 numbly heavy and herself fall into a hazy trance as the boy sitting
2579 behind her drew repeated lines with his pencil across the back of her
2580 plastic chair.
2581 @end quotation
2582
2583
2584 @node Group Topics
2585 @section Group Topics
2586 @cindex topics
2587
2588 If you read lots and lots of groups, it might be convenient to group
2589 them hierarchically according to topics.  You put your Emacs groups over
2590 here, your sex groups over there, and the rest (what, two groups or so?)
2591 you put in some misc section that you never bother with anyway.  You can
2592 even group the Emacs sex groups as a sub-topic to either the Emacs
2593 groups or the sex groups---or both!  Go wild!
2594
2595 @iftex
2596 @iflatex
2597 \gnusfigure{Group Topics}{400}{
2598 \put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}}
2599 }
2600 @end iflatex
2601 @end iftex
2602
2603 Here's an example:
2604
2605 @example
2606 Gnus
2607   Emacs -- I wuw it!
2608      3: comp.emacs
2609      2: alt.religion.emacs
2610     Naughty Emacs
2611      452: alt.sex.emacs
2612        0: comp.talk.emacs.recovery
2613   Misc
2614      8: comp.binaries.fractals
2615     13: comp.sources.unix
2616 @end example
2617
2618 @findex gnus-topic-mode
2619 @kindex t (Group)
2620 To get this @emph{fab} functionality you simply turn on (ooh!) the
2621 @code{gnus-topic} minor mode---type @kbd{t} in the group buffer.  (This
2622 is a toggling command.)
2623
2624 Go ahead, just try it.  I'll still be here when you get back.  La de
2625 dum...  Nice tune, that...  la la la...  What, you're back? Yes, and now
2626 press @kbd{l}.  There.  All your groups are now listed under
2627 @samp{misc}.  Doesn't that make you feel all warm and fuzzy?  Hot and
2628 bothered?
2629
2630 If you want this permanently enabled, you should add that minor mode to
2631 the hook for the group mode:
2632
2633 @lisp
2634 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
2635 @end lisp
2636
2637 @menu
2638 * Topic Variables::    How to customize the topics the Lisp Way.
2639 * Topic Commands::     Interactive E-Z commands.
2640 * Topic Sorting::      Sorting each topic individually.
2641 * Topic Topology::     A map of the world.
2642 * Topic Parameters::   Parameters that apply to all groups in a topic.
2643 @end menu
2644
2645
2646 @node Topic Variables
2647 @subsection Topic Variables
2648 @cindex topic variables
2649
2650 Now, if you select a topic, it will fold/unfold that topic, which is
2651 really neat, I think.
2652
2653 @vindex gnus-topic-line-format
2654 The topic lines themselves are created according to the
2655 @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
2656 Valid elements are:
2657
2658 @table @samp
2659 @item i
2660 Indentation.
2661 @item n
2662 Topic name.
2663 @item v
2664 Visibility.
2665 @item l
2666 Level.
2667 @item g
2668 Number of groups in the topic.
2669 @item a
2670 Number of unread articles in the topic.
2671 @item A
2672 Number of unread articles in the topic and all its subtopics.
2673 @end table
2674
2675 @vindex gnus-topic-indent-level
2676 Each sub-topic (and the groups in the sub-topics) will be indented with
2677 @code{gnus-topic-indent-level} times the topic level number of spaces.
2678 The default is 2.
2679
2680 @vindex gnus-topic-mode-hook
2681 @code{gnus-topic-mode-hook} is called in topic minor mode buffers.
2682
2683 @vindex gnus-topic-display-empty-topics
2684 The @code{gnus-topic-display-empty-topics} says whether to display even
2685 topics that have no unread articles in them.  The default is @code{t}.
2686
2687
2688 @node Topic Commands
2689 @subsection Topic Commands
2690 @cindex topic commands
2691
2692 When the topic minor mode is turned on, a new @kbd{T} submap will be
2693 available.  In addition, a few of the standard keys change their
2694 definitions slightly.
2695
2696 @table @kbd
2697
2698 @item T n
2699 @kindex T n (Topic)
2700 @findex gnus-topic-create-topic
2701 Prompt for a new topic name and create it
2702 (@code{gnus-topic-create-topic}).
2703
2704 @item T m
2705 @kindex T m (Topic)
2706 @findex gnus-topic-move-group
2707 Move the current group to some other topic
2708 (@code{gnus-topic-move-group}).  This command uses the process/prefix
2709 convention (@pxref{Process/Prefix}).
2710
2711 @item T c
2712 @kindex T c (Topic)
2713 @findex gnus-topic-copy-group
2714 Copy the current group to some other topic
2715 (@code{gnus-topic-copy-group}).  This command uses the process/prefix
2716 convention (@pxref{Process/Prefix}).
2717
2718 @item T D
2719 @kindex T D (Topic)
2720 @findex gnus-topic-remove-group
2721 Remove a group from the current topic (@code{gnus-topic-remove-group}).
2722 This command is mainly useful if you have the same group in several
2723 topics and wish to remove it from one of the topics.  You may also
2724 remove a group from all topics, but in that case, Gnus will add it to
2725 the root topic the next time you start Gnus.  In fact, all new groups
2726 (which, naturally, don't belong to any topic) will show up in the root
2727 topic.
2728
2729 This command uses the process/prefix convention
2730 (@pxref{Process/Prefix}).
2731
2732 @item T M
2733 @kindex T M (Topic)
2734 @findex gnus-topic-move-matching
2735 Move all groups that match some regular expression to a topic
2736 (@code{gnus-topic-move-matching}).
2737
2738 @item T C
2739 @kindex T C (Topic)
2740 @findex gnus-topic-copy-matching
2741 Copy all groups that match some regular expression to a topic
2742 (@code{gnus-topic-copy-matching}).
2743
2744 @item T H
2745 @kindex T H (Topic)
2746 @findex gnus-topic-toggle-display-empty-topics
2747 Toggle hiding empty topics
2748 (@code{gnus-topic-toggle-display-empty-topics}).
2749
2750 @item T #
2751 @kindex T # (Topic)
2752 @findex gnus-topic-mark-topic
2753 Mark all groups in the current topic with the process mark
2754 (@code{gnus-topic-mark-topic}).
2755
2756 @item T M-#
2757 @kindex T M-# (Topic)
2758 @findex gnus-topic-unmark-topic
2759 Remove the process mark from all groups in the current topic
2760 (@code{gnus-topic-unmark-topic}).
2761
2762 @item T TAB
2763 @itemx TAB
2764 @kindex T TAB (Topic)
2765 @kindex TAB (Topic)
2766 @findex gnus-topic-indent
2767 ``Indent'' the current topic so that it becomes a sub-topic of the
2768 previous topic (@code{gnus-topic-indent}).  If given a prefix,
2769 ``un-indent'' the topic instead.
2770
2771 @item M-TAB
2772 @kindex M-TAB (Topic)
2773 @findex gnus-topic-unindent
2774 ``Un-indent'' the current topic so that it becomes a sub-topic of the
2775 parent of its current parent (@code{gnus-topic-unindent}).
2776
2777 @item RET
2778 @kindex RET (Topic)
2779 @findex gnus-topic-select-group
2780 @itemx SPACE
2781 Either select a group or fold a topic (@code{gnus-topic-select-group}).
2782 When you perform this command on a group, you'll enter the group, as
2783 usual.  When done on a topic line, the topic will be folded (if it was
2784 visible) or unfolded (if it was folded already).  So it's basically a
2785 toggling command on topics.  In addition, if you give a numerical
2786 prefix, group on that level (and lower) will be displayed.
2787
2788 @item C-c C-x
2789 @kindex C-c C-x (Topic)
2790 @findex gnus-topic-expire-articles
2791 Run all expirable articles in the current group or topic through the expiry
2792 process (if any) (@code{gnus-topic-expire-articles}).
2793
2794 @item C-k
2795 @kindex C-k (Topic)
2796 @findex gnus-topic-kill-group
2797 Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
2798 topic will be removed along with the topic.
2799
2800 @item C-y
2801 @kindex C-y (Topic)
2802 @findex gnus-topic-yank-group
2803 Yank the previously killed group or topic
2804 (@code{gnus-topic-yank-group}).  Note that all topics will be yanked
2805 before all groups.
2806
2807 @item T r
2808 @kindex T r (Topic)
2809 @findex gnus-topic-rename
2810 Rename a topic (@code{gnus-topic-rename}).
2811
2812 @item T DEL
2813 @kindex T DEL (Topic)
2814 @findex gnus-topic-delete
2815 Delete an empty topic (@code{gnus-topic-delete}).
2816
2817 @item A T
2818 @kindex A T (Topic)
2819 @findex gnus-topic-list-active
2820 List all groups that Gnus knows about in a topics-ified way
2821 (@code{gnus-topic-list-active}).
2822
2823 @item G p
2824 @kindex G p (Topic)
2825 @findex gnus-topic-edit-parameters
2826 @cindex group parameters
2827 @cindex topic parameters
2828 @cindex parameters
2829 Edit the topic parameters (@code{gnus-topic-edit-parameters}).
2830 @xref{Topic Parameters}.
2831
2832 @end table
2833
2834
2835 @node Topic Sorting
2836 @subsection Topic Sorting
2837 @cindex topic sorting
2838
2839 You can sort the groups in each topic individually with the following
2840 commands:
2841
2842
2843 @table @kbd
2844 @item T S a
2845 @kindex T S a (Topic)
2846 @findex gnus-topic-sort-groups-by-alphabet
2847 Sort the current topic alphabetically by group name
2848 (@code{gnus-topic-sort-groups-by-alphabet}).
2849
2850 @item T S u
2851 @kindex T S u (Topic)
2852 @findex gnus-topic-sort-groups-by-unread
2853 Sort the current topic by the number of unread articles
2854 (@code{gnus-topic-sort-groups-by-unread}).
2855
2856 @item T S l
2857 @kindex T S l (Topic)
2858 @findex gnus-topic-sort-groups-by-level
2859 Sort the current topic by group level
2860 (@code{gnus-topic-sort-groups-by-level}).
2861
2862 @item T S v
2863 @kindex T S v (Topic)
2864 @findex gnus-topic-sort-groups-by-score
2865 Sort the current topic by group score
2866 (@code{gnus-topic-sort-groups-by-score}).  @xref{Group Score}.
2867
2868 @item T S r
2869 @kindex T S r (Topic)
2870 @findex gnus-topic-sort-groups-by-rank
2871 Sort the current topic by group rank
2872 (@code{gnus-topic-sort-groups-by-rank}).  @xref{Group Score}.
2873
2874 @item T S m
2875 @kindex T S m (Topic)
2876 @findex gnus-topic-sort-groups-by-method
2877 Sort the current topic alphabetically by backend name
2878 (@code{gnus-topic-sort-groups-by-method}).
2879
2880 @end table
2881
2882 @xref{Sorting Groups} for more information about group sorting.
2883
2884
2885 @node Topic Topology
2886 @subsection Topic Topology
2887 @cindex topic topology
2888 @cindex topology
2889
2890 So, let's have a look at an example group buffer:
2891
2892 @example
2893 Gnus
2894   Emacs -- I wuw it!
2895      3: comp.emacs
2896      2: alt.religion.emacs
2897     Naughty Emacs
2898      452: alt.sex.emacs
2899        0: comp.talk.emacs.recovery
2900   Misc
2901      8: comp.binaries.fractals
2902     13: comp.sources.unix
2903 @end example
2904
2905 So, here we have one top-level topic (@samp{Gnus}), two topics under
2906 that, and one sub-topic under one of the sub-topics.  (There is always
2907 just one (1) top-level topic).  This topology can be expressed as
2908 follows:
2909
2910 @lisp
2911 (("Gnus" visible)
2912  (("Emacs -- I wuw it!" visible)
2913   (("Naughty Emacs" visible)))
2914  (("Misc" visible)))
2915 @end lisp
2916
2917 @vindex gnus-topic-topology
2918 This is in fact how the variable @code{gnus-topic-topology} would look
2919 for the display above.  That variable is saved in the @file{.newsrc.eld}
2920 file, and shouldn't be messed with manually---unless you really want
2921 to.  Since this variable is read from the @file{.newsrc.eld} file,
2922 setting it in any other startup files will have no effect.
2923
2924 This topology shows what topics are sub-topics of what topics (right),
2925 and which topics are visible.  Two settings are currently
2926 allowed---@code{visible} and @code{invisible}.
2927
2928
2929 @node Topic Parameters
2930 @subsection Topic Parameters
2931 @cindex topic parameters
2932
2933 All groups in a topic will inherit group parameters from the parent (and
2934 ancestor) topic parameters.  All valid group parameters are valid topic
2935 parameters (@pxref{Group Parameters}).
2936
2937 Group parameters (of course) override topic parameters, and topic
2938 parameters in sub-topics override topic parameters in super-topics.  You
2939 know.  Normal inheritance rules.  (@dfn{Rules} is here a noun, not a
2940 verb, although you may feel free to disagree with me here.)
2941
2942 @example
2943 Gnus
2944   Emacs
2945      3: comp.emacs
2946      2: alt.religion.emacs
2947    452: alt.sex.emacs
2948     Relief
2949      452: alt.sex.emacs
2950        0: comp.talk.emacs.recovery
2951   Misc
2952      8: comp.binaries.fractals
2953     13: comp.sources.unix
2954    452: alt.sex.emacs
2955 @end example
2956
2957 The @samp{Emacs} topic has the topic parameter @code{(score-file
2958 . "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
2959 @code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
2960 topic parameter @code{(score-file . "emacs.SCORE")}.  In addition,
2961 @* @samp{alt.religion.emacs} has the group parameter @code{(score-file
2962 . "religion.SCORE")}.
2963
2964 Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
2965 will get the @file{relief.SCORE} home score file.  If you enter the same
2966 group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
2967 score file.  If you enter the group @samp{alt.religion.emacs}, you'll
2968 get the @file{religion.SCORE} home score file.
2969
2970 This seems rather simple and self-evident, doesn't it?  Well, yes.  But
2971 there are some problems, especially with the @code{total-expiry}
2972 parameter.  Say you have a mail group in two topics; one with
2973 @code{total-expiry} and one without.  What happens when you do @kbd{M-x
2974 gnus-expire-all-expirable-groups}?  Gnus has no way of telling which one
2975 of these topics you mean to expire articles from, so anything may
2976 happen.  In fact, I hereby declare that it is @dfn{undefined} what
2977 happens.  You just have to be careful if you do stuff like that.
2978
2979
2980 @node Misc Group Stuff
2981 @section Misc Group Stuff
2982
2983 @menu
2984 * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
2985 * Group Information::     Information and help on groups and Gnus.
2986 * Group Timestamp::       Making Gnus keep track of when you last read a group.
2987 * File Commands::         Reading and writing the Gnus files.
2988 @end menu
2989
2990 @table @kbd
2991
2992 @item ^
2993 @kindex ^ (Group)
2994 @findex gnus-group-enter-server-mode
2995 Enter the server buffer (@code{gnus-group-enter-server-mode}).
2996 @xref{The Server Buffer}.
2997
2998 @item a
2999 @kindex a (Group)
3000 @findex gnus-group-post-news
3001 Post an article to a group (@code{gnus-group-post-news}).  If given a
3002 prefix, the current group name will be used as the default.
3003
3004 @item m
3005 @kindex m (Group)
3006 @findex gnus-group-mail
3007 Mail a message somewhere (@code{gnus-group-mail}).
3008
3009 @end table
3010
3011 Variables for the group buffer:
3012
3013 @table @code
3014
3015 @item gnus-group-mode-hook
3016 @vindex gnus-group-mode-hook
3017 is called after the group buffer has been
3018 created.
3019
3020 @item gnus-group-prepare-hook
3021 @vindex gnus-group-prepare-hook
3022 is called after the group buffer is
3023 generated.  It may be used to modify the buffer in some strange,
3024 unnatural way.
3025
3026 @item gnus-group-prepared-hook
3027 @vindex gnus-group-prepare-hook
3028 is called as the very last thing after the group buffer has been
3029 generated.  It may be used to move point around, for instance.
3030
3031 @item gnus-permanently-visible-groups
3032 @vindex gnus-permanently-visible-groups
3033 Groups matching this regexp will always be listed in the group buffer,
3034 whether they are empty or not.
3035
3036 @end table
3037
3038
3039 @node Scanning New Messages
3040 @subsection Scanning New Messages
3041 @cindex new messages
3042 @cindex scanning new news
3043
3044 @table @kbd
3045
3046 @item g
3047 @kindex g (Group)
3048 @findex gnus-group-get-new-news
3049 @c @icon{gnus-group-get-new-news}
3050 Check the server(s) for new articles.  If the numerical prefix is used,
3051 this command will check only groups of level @var{arg} and lower
3052 (@code{gnus-group-get-new-news}).  If given a non-numerical prefix, this
3053 command will force a total re-reading of the active file(s) from the
3054 backend(s).
3055
3056 @item M-g
3057 @kindex M-g (Group)
3058 @findex gnus-group-get-new-news-this-group
3059 @vindex gnus-goto-next-group-when-activating
3060 @c @icon{gnus-group-get-new-news-this-group}
3061 Check whether new articles have arrived in the current group
3062 (@code{gnus-group-get-new-news-this-group}).
3063 @code{gnus-goto-next-group-when-activating} says whether this command is
3064 to move point to the next group or not.  It is @code{t} by default.
3065
3066 @findex gnus-activate-all-groups
3067 @cindex activating groups
3068 @item C-c M-g
3069 @kindex C-c M-g (Group)
3070 Activate absolutely all groups (@code{gnus-activate-all-groups}).
3071
3072 @item R
3073 @kindex R (Group)
3074 @cindex restarting
3075 @findex gnus-group-restart
3076 Restart Gnus (@code{gnus-group-restart}).  This saves the @file{.newsrc}
3077 file(s), closes the connection to all servers, clears up all run-time
3078 Gnus variables, and then starts Gnus all over again.
3079
3080 @end table
3081
3082 @vindex gnus-get-new-news-hook
3083 @code{gnus-get-new-news-hook} is run just before checking for new news.
3084
3085 @vindex gnus-after-getting-new-news-hook
3086 @code{gnus-after-getting-new-news-hook} is run after checking for new
3087 news.
3088
3089
3090 @node Group Information
3091 @subsection Group Information
3092 @cindex group information
3093 @cindex information on groups
3094
3095 @table @kbd
3096
3097
3098 @item H f
3099 @kindex H f (Group)
3100 @findex gnus-group-fetch-faq
3101 @vindex gnus-group-faq-directory
3102 @cindex FAQ
3103 @cindex ange-ftp
3104 Try to fetch the FAQ for the current group
3105 (@code{gnus-group-fetch-faq}).  Gnus will try to get the FAQ from
3106 @code{gnus-group-faq-directory}, which is usually a directory on a
3107 remote machine.  This variable can also be a list of directories.  In
3108 that case, giving a prefix to this command will allow you to choose
3109 between the various sites.  @code{ange-ftp} (or @code{efs}) will be used
3110 for fetching the file.
3111
3112 If fetching from the first site is unsuccessful, Gnus will attempt to go
3113 through @code{gnus-group-faq-directory} and try to open them one by one.
3114
3115 @item H d
3116 @itemx C-c C-d
3117 @c @icon{gnus-group-describe-group}
3118 @kindex H d (Group)
3119 @kindex C-c C-d (Group)
3120 @cindex describing groups
3121 @cindex group description
3122 @findex gnus-group-describe-group
3123 Describe the current group (@code{gnus-group-describe-group}).  If given
3124 a prefix, force Gnus to re-read the description from the server.
3125
3126 @item M-d
3127 @kindex M-d (Group)
3128 @findex gnus-group-describe-all-groups
3129 Describe all groups (@code{gnus-group-describe-all-groups}).  If given a
3130 prefix, force Gnus to re-read the description file from the server.
3131
3132 @item H v
3133 @itemx V
3134 @kindex V (Group)
3135 @kindex H v (Group)
3136 @cindex version
3137 @findex gnus-version
3138 Display current Gnus version numbers (@code{gnus-version}).
3139
3140 @item ?
3141 @kindex ? (Group)
3142 @findex gnus-group-describe-briefly
3143 Give a very short help message (@code{gnus-group-describe-briefly}).
3144
3145 @item C-c C-i
3146 @kindex C-c C-i (Group)
3147 @cindex info
3148 @cindex manual
3149 @findex gnus-info-find-node
3150 Go to the Gnus info node (@code{gnus-info-find-node}).
3151 @end table
3152
3153
3154 @node Group Timestamp
3155 @subsection Group Timestamp
3156 @cindex timestamps
3157 @cindex group timestamps
3158
3159 It can be convenient to let Gnus keep track of when you last read a
3160 group.  To set the ball rolling, you should add
3161 @code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
3162
3163 @lisp
3164 (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
3165 @end lisp
3166
3167 After doing this, each time you enter a group, it'll be recorded.
3168
3169 This information can be displayed in various ways---the easiest is to
3170 use the @samp{%d} spec in the group line format:
3171
3172 @lisp
3173 (setq gnus-group-line-format
3174       "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
3175 @end lisp
3176
3177 This will result in lines looking like:
3178
3179 @example
3180 *        0: mail.ding                                19961002T012943
3181          0: custom                                   19961002T012713
3182 @end example
3183
3184 As you can see, the date is displayed in compact ISO 8601 format.  This
3185 may be a bit too much, so to just display the date, you could say
3186 something like:
3187
3188 @lisp
3189 (setq gnus-group-line-format
3190       "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
3191 @end lisp
3192
3193
3194 @node File Commands
3195 @subsection File Commands
3196 @cindex file commands
3197
3198 @table @kbd
3199
3200 @item r
3201 @kindex r (Group)
3202 @findex gnus-group-read-init-file
3203 @vindex gnus-init-file
3204 @cindex reading init file
3205 Re-read the init file (@code{gnus-init-file}, which defaults to
3206 @file{~/.gnus}) (@code{gnus-group-read-init-file}).
3207
3208 @item s
3209 @kindex s (Group)
3210 @findex gnus-group-save-newsrc
3211 @cindex saving .newsrc
3212 Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
3213 (@code{gnus-group-save-newsrc}).  If given a prefix, force saving the
3214 file(s) whether Gnus thinks it is necessary or not.
3215
3216 @c @item Z
3217 @c @kindex Z (Group)
3218 @c @findex gnus-group-clear-dribble
3219 @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
3220
3221 @end table
3222
3223
3224 @node The Summary Buffer
3225 @chapter The Summary Buffer
3226 @cindex summary buffer
3227
3228 A line for each article is displayed in the summary buffer.  You can
3229 move around, read articles, post articles and reply to articles.
3230
3231 The most common way to a summary buffer is to select a group from the
3232 group buffer (@pxref{Selecting a Group}).
3233
3234 You can have as many summary buffers open as you wish.
3235
3236 @menu
3237 * Summary Buffer Format::       Deciding how the summary buffer is to look.
3238 * Summary Maneuvering::         Moving around the summary buffer.
3239 * Choosing Articles::           Reading articles.
3240 * Paging the Article::          Scrolling the current article.
3241 * Reply Followup and Post::     Posting articles.
3242 * Canceling and Superseding::   ``Whoops, I shouldn't have called him that.''
3243 * Marking Articles::            Marking articles as read, expirable, etc.
3244 * Limiting::                    You can limit the summary buffer.
3245 * Threading::                   How threads are made.
3246 * Sorting::                     How articles and threads are sorted.
3247 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
3248 * Article Caching::             You may store articles in a cache.
3249 * Persistent Articles::         Making articles expiry-resistant.
3250 * Article Backlog::             Having already read articles hang around.
3251 * Saving Articles::             Ways of customizing article saving.
3252 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
3253 * Article Treatment::           The article buffer can be mangled at will.
3254 * MIME Commands::               Doing MIMEy things with the articles.
3255 * Charsets::                    Character set issues.
3256 * Article Commands::            Doing various things with the article buffer.
3257 * Summary Sorting::             Sorting the summary buffer in various ways.
3258 * Finding the Parent::          No child support? Get the parent.
3259 * Alternative Approaches::      Reading using non-default summaries.
3260 * Tree Display::                A more visual display of threads.
3261 * Mail Group Commands::         Some commands can only be used in mail groups.
3262 * Various Summary Stuff::       What didn't fit anywhere else.
3263 * Exiting the Summary Buffer::  Returning to the Group buffer.
3264 * Crosspost Handling::          How crossposted articles are dealt with.
3265 * Duplicate Suppression::       An alternative when crosspost handling fails.
3266 @end menu
3267
3268
3269 @node Summary Buffer Format
3270 @section Summary Buffer Format
3271 @cindex summary buffer format
3272
3273 @iftex
3274 @iflatex
3275 \gnusfigure{The Summary Buffer}{180}{
3276 \put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}}
3277 \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}}
3278 }
3279 @end iflatex
3280 @end iftex
3281
3282 @menu
3283 * Summary Buffer Lines::     You can specify how summary lines should look.
3284 * To From Newsgroups::       How to not display your own name.
3285 * Summary Buffer Mode Line:: You can say how the mode line should look.
3286 * Summary Highlighting::     Making the summary buffer all pretty and nice.
3287 @end menu
3288
3289 @findex mail-extract-address-components
3290 @findex gnus-extract-address-components
3291 @vindex gnus-extract-address-components
3292 Gnus will use the value of the @code{gnus-extract-address-components}
3293 variable as a function for getting the name and address parts of a
3294 @code{From} header.  Two pre-defined functions exist:
3295 @code{gnus-extract-address-components}, which is the default, quite
3296 fast, and too simplistic solution; and
3297 @code{mail-extract-address-components}, which works very nicely, but is
3298 slower.  The default function will return the wrong answer in 5% of the
3299 cases.  If this is unacceptable to you, use the other function instead:
3300
3301 @lisp
3302 (setq gnus-extract-address-components
3303       'mail-extract-address-components)
3304 @end lisp
3305
3306 @vindex gnus-summary-same-subject
3307 @code{gnus-summary-same-subject} is a string indicating that the current
3308 article has the same subject as the previous.  This string will be used
3309 with those specs that require it.  The default is @code{""}.
3310
3311
3312 @node Summary Buffer Lines
3313 @subsection Summary Buffer Lines
3314
3315 @vindex gnus-summary-line-format
3316 You can change the format of the lines in the summary buffer by changing
3317 the @code{gnus-summary-line-format} variable.  It works along the same
3318 lines as a normal @code{format} string, with some extensions
3319 (@pxref{Formatting Variables}).
3320
3321 The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
3322
3323 The following format specification characters are understood:
3324
3325 @table @samp
3326 @item N
3327 Article number.
3328 @item S
3329 Subject string.
3330 @item s
3331 Subject if the article is the root of the thread or the previous article
3332 had a different subject, @code{gnus-summary-same-subject} otherwise.
3333 (@code{gnus-summary-same-subject} defaults to @code{""}.)
3334 @item F
3335 Full @code{From} header.
3336 @item n
3337 The name (from the @code{From} header).
3338 @item f
3339 The name, code @code{To} header or the @code{Newsgroups} header
3340 (@pxref{To From Newsgroups}).
3341 @item a
3342 The name (from the @code{From} header).  This differs from the @code{n}
3343 spec in that it uses the function designated by the
3344 @code{gnus-extract-address-components} variable, which is slower, but
3345 may be more thorough.
3346 @item A
3347 The address (from the @code{From} header).  This works the same way as
3348 the @code{a} spec.
3349 @item L
3350 Number of lines in the article.
3351 @item c
3352 Number of characters in the article.
3353 @item I
3354 Indentation based on thread level (@pxref{Customizing Threading}).
3355 @item T
3356 Nothing if the article is a root and lots of spaces if it isn't (it
3357 pushes everything after it off the screen).
3358 @item [
3359 Opening bracket, which is normally @samp{[}, but can also be @samp{<}
3360 for adopted articles (@pxref{Customizing Threading}).
3361 @item ]
3362 Closing bracket, which is normally @samp{]}, but can also be @samp{>}
3363 for adopted articles.
3364 @item >
3365 One space for each thread level.
3366 @item <
3367 Twenty minus thread level spaces.
3368 @item U
3369 Unread.
3370
3371 @item R
3372 This misleadingly named specifier is the @dfn{secondary mark}.  This
3373 mark will say whether the article has been replied to, has been cached,
3374 or has been saved.
3375
3376 @item i
3377 Score as a number (@pxref{Scoring}).
3378 @item z
3379 @vindex gnus-summary-zcore-fuzz
3380 Zcore, @samp{+} if above the default level and @samp{-} if below the
3381 default level.  If the difference between
3382 @code{gnus-summary-default-score} and the score is less than
3383 @code{gnus-summary-zcore-fuzz}, this spec will not be used.
3384 @item V
3385 Total thread score.
3386 @item x
3387 @code{Xref}.
3388 @item D
3389 @code{Date}.
3390 @item d
3391 The @code{Date} in @code{DD-MMM} format.
3392 @item o
3393 The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
3394 @item M
3395 @code{Message-ID}.
3396 @item r
3397 @code{References}.
3398 @item t
3399 Number of articles in the current sub-thread.  Using this spec will slow
3400 down summary buffer generation somewhat.
3401 @item e
3402 An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
3403 article has any children.
3404 @item P
3405 The line number.
3406 @item O
3407 Download mark.
3408 @item u
3409 User defined specifier.  The next character in the format string should
3410 be a letter.  Gnus will call the function
3411 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
3412 following @samp{%u}.  The function will be passed the current header as
3413 argument.  The function should return a string, which will be inserted
3414 into the summary just like information from any other summary specifier.
3415 @end table
3416
3417 The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
3418 have to be handled with care.  For reasons of efficiency, Gnus will
3419 compute what column these characters will end up in, and ``hard-code''
3420 that.  This means that it is invalid to have these specs after a
3421 variable-length spec.  Well, you might not be arrested, but your summary
3422 buffer will look strange, which is bad enough.
3423
3424 The smart choice is to have these specs as far to the left as possible.
3425 (Isn't that the case with everything, though?  But I digress.)
3426
3427 This restriction may disappear in later versions of Gnus.
3428
3429
3430 @node To From Newsgroups
3431 @subsection To From Newsgroups
3432 @cindex To
3433 @cindex Newsgroups
3434
3435 In some groups (particularly in archive groups), the @code{From} header
3436 isn't very interesting, since all the articles there are written by
3437 you.  To display the information in the @code{To} or @code{Newsgroups}
3438 headers instead, you need to decide three things: What information to
3439 gather; where to display it; and when to display it.
3440
3441 @enumerate
3442 @item
3443 @vindex gnus-extra-headers
3444 The reading of extra header information is controlled by the
3445 @code{gnus-extra-headers}.  This is a list of header symbols.  For
3446 instance:
3447
3448 @lisp
3449 (setq gnus-extra-headers
3450       '(To Newsgroups X-Newsreader))
3451 @end lisp
3452
3453 This will result in Gnus trying to obtain these three headers, and
3454 storing it in header structures for later easy retrieval.
3455
3456 @item
3457 @findex gnus-extra-header
3458 The value of these extra headers can be accessed via the
3459 @code{gnus-extra-header} function.  Here's a format line spec that will
3460 access the @code{X-Newsreader} header:
3461
3462 @example
3463 "%~(form (gnus-extra-header 'X-Newsreader))@@"
3464 @end example
3465
3466 @item
3467 @vindex gnus-ignored-from-addresses
3468 The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
3469 summary line spec returns the @code{To}, @code{Newsreader} or
3470 @code{From} header.  If this regexp matches the contents of the
3471 @code{From} header, the value of the @code{To} or @code{Newsreader}
3472 headers are used instead.
3473
3474 @end enumerate
3475
3476 @vindex nnmail-extra-headers
3477 A related variable is @code{nnmail-extra-headers}, which controls when
3478 to include extra headers when generating overview (@sc{nov}) files.  If
3479 you have old overview files, you should regenerate them after changing
3480 this variable.
3481
3482 @vindex gnus-summary-line-format
3483 You also have to instruct Gnus to display the data by changing the
3484 @code{%n} spec to the @code{%f} spec in the
3485 @code{gnus-summary-line-format} variable.
3486
3487 In summary, you'd typically do something like the following:
3488
3489 @lisp
3490 (setq gnus-extra-headers
3491       '(To Newsgroups))
3492 (setq nnmail-extra-headers gnus-extra-headers)
3493 (setq gnus-summary-line-format
3494       "%U%R%z%I%(%[%4L: %-20,20f%]%) %s\n")
3495 (setq gnus-ignored-from-addresses
3496       "Your Name Here")
3497 @end lisp
3498
3499 Now, this is mostly useful for mail groups, where you have control over
3500 the @sc{nov} files that are created.  However, if you can persuade your
3501 nntp admin to add:
3502
3503 @example
3504 Newsgroups:full
3505 @end example
3506
3507 to the end of her @file{overview.fmt} file, then you can use that just
3508 as you would the extra headers from the mail groups.
3509
3510
3511 @node Summary Buffer Mode Line
3512 @subsection Summary Buffer Mode Line
3513
3514 @vindex gnus-summary-mode-line-format
3515 You can also change the format of the summary mode bar (@pxref{Mode Line
3516 Formatting}).  Set @code{gnus-summary-mode-line-format} to whatever you
3517 like.  The default is @samp{Gnus: %%b [%A] %Z}.
3518
3519 Here are the elements you can play with:
3520
3521 @table @samp
3522 @item G
3523 Group name.
3524 @item p
3525 Unprefixed group name.
3526 @item A
3527 Current article number.
3528 @item z
3529 Current article score.
3530 @item V
3531 Gnus version.
3532 @item U
3533 Number of unread articles in this group.
3534 @item e
3535 Number of unread articles in this group that aren't displayed in the
3536 summary buffer.
3537 @item Z
3538 A string with the number of unread and unselected articles represented
3539 either as @samp{<%U(+%e) more>} if there are both unread and unselected
3540 articles, and just as @samp{<%U more>} if there are just unread articles
3541 and no unselected ones.
3542 @item g
3543 Shortish group name.  For instance, @samp{rec.arts.anime} will be
3544 shortened to @samp{r.a.anime}.
3545 @item S
3546 Subject of the current article.
3547 @item u
3548 User-defined spec (@pxref{User-Defined Specs}).
3549 @item s
3550 Name of the current score file (@pxref{Scoring}).
3551 @item d
3552 Number of dormant articles (@pxref{Unread Articles}).
3553 @item t
3554 Number of ticked articles (@pxref{Unread Articles}).
3555 @item r
3556 Number of articles that have been marked as read in this session.
3557 @item E
3558 Number of articles expunged by the score files.
3559 @end table
3560
3561
3562 @node Summary Highlighting
3563 @subsection Summary Highlighting
3564
3565 @table @code
3566
3567 @item gnus-visual-mark-article-hook
3568 @vindex gnus-visual-mark-article-hook
3569 This hook is run after selecting an article.  It is meant to be used for
3570 highlighting the article in some way.  It is not run if
3571 @code{gnus-visual} is @code{nil}.
3572
3573 @item gnus-summary-update-hook
3574 @vindex gnus-summary-update-hook
3575 This hook is called when a summary line is changed.  It is not run if
3576 @code{gnus-visual} is @code{nil}.
3577
3578 @item gnus-summary-selected-face
3579 @vindex gnus-summary-selected-face
3580 This is the face (or @dfn{font} as some people call it) used to
3581 highlight the current article in the summary buffer.
3582
3583 @item gnus-summary-highlight
3584 @vindex gnus-summary-highlight
3585 Summary lines are highlighted according to this variable, which is a
3586 list where the elements are of the format @var{(FORM . FACE)}.  If you
3587 would, for instance, like ticked articles to be italic and high-scored
3588 articles to be bold, you could set this variable to something like
3589 @lisp
3590 (((eq mark gnus-ticked-mark) . italic)
3591  ((> score default) . bold))
3592 @end lisp
3593 As you may have guessed, if @var{FORM} returns a non-@code{nil} value,
3594 @var{FACE} will be applied to the line.
3595 @end table
3596
3597
3598 @node Summary Maneuvering
3599 @section Summary Maneuvering
3600 @cindex summary movement
3601
3602 All the straight movement commands understand the numeric prefix and
3603 behave pretty much as you'd expect.
3604
3605 None of these commands select articles.
3606
3607 @table @kbd
3608 @item G M-n
3609 @itemx M-n
3610 @kindex M-n (Summary)
3611 @kindex G M-n (Summary)
3612 @findex gnus-summary-next-unread-subject
3613 Go to the next summary line of an unread article
3614 (@code{gnus-summary-next-unread-subject}).
3615
3616 @item G M-p
3617 @itemx M-p
3618 @kindex M-p (Summary)
3619 @kindex G M-p (Summary)
3620 @findex gnus-summary-prev-unread-subject
3621 Go to the previous summary line of an unread article
3622 (@code{gnus-summary-prev-unread-subject}).
3623
3624 @item G j
3625 @itemx j
3626 @kindex j (Summary)
3627 @kindex G j (Summary)
3628 @findex gnus-summary-goto-article
3629 Ask for an article number or @code{Message-ID}, and then go to that
3630 article (@code{gnus-summary-goto-article}).
3631
3632 @item G g
3633 @kindex G g (Summary)
3634 @findex gnus-summary-goto-subject
3635 Ask for an article number and then go to the summary line of that article
3636 without displaying the article (@code{gnus-summary-goto-subject}).
3637 @end table
3638
3639 If Gnus asks you to press a key to confirm going to the next group, you
3640 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
3641 buffer, searching for the next group to read without actually returning
3642 to the group buffer.
3643
3644 Variables related to summary movement:
3645
3646 @table @code
3647
3648 @vindex gnus-auto-select-next
3649 @item gnus-auto-select-next
3650 If you issue one of the movement commands (like @kbd{n}) and there are
3651 no more unread articles after the current one, Gnus will offer to go to
3652 the next group.  If this variable is @code{t} and the next group is
3653 empty, Gnus will exit summary mode and return to the group buffer.  If
3654 this variable is neither @code{t} nor @code{nil}, Gnus will select the
3655 next group, no matter whether it has any unread articles or not.  As a
3656 special case, if this variable is @code{quietly}, Gnus will select the
3657 next group without asking for confirmation.  If this variable is
3658 @code{almost-quietly}, the same will happen only if you are located on
3659 the last article in the group.  Finally, if this variable is
3660 @code{slightly-quietly}, the @kbd{Z n} command will go to the next group
3661 without confirmation.  Also @pxref{Group Levels}.
3662
3663 @item gnus-auto-select-same
3664 @vindex gnus-auto-select-same
3665 If non-@code{nil}, all the movement commands will try to go to the next
3666 article with the same subject as the current.  (@dfn{Same} here might
3667 mean @dfn{roughly equal}.  See @code{gnus-summary-gather-subject-limit}
3668 for details (@pxref{Customizing Threading}).)  If there are no more
3669 articles with the same subject, go to the first unread article.
3670
3671 This variable is not particularly useful if you use a threaded display.
3672
3673 @item gnus-summary-check-current
3674 @vindex gnus-summary-check-current
3675 If non-@code{nil}, all the ``unread'' movement commands will not proceed
3676 to the next (or previous) article if the current article is unread.
3677 Instead, they will choose the current article.
3678
3679 @item gnus-auto-center-summary
3680 @vindex gnus-auto-center-summary
3681 If non-@code{nil}, Gnus will keep the point in the summary buffer
3682 centered at all times.  This makes things quite tidy, but if you have a
3683 slow network connection, or simply do not like this un-Emacsism, you can
3684 set this variable to @code{nil} to get the normal Emacs scrolling
3685 action.  This will also inhibit horizontal re-centering of the summary
3686 buffer, which might make it more inconvenient to read extremely long
3687 threads.
3688
3689 This variable can also be a number.  In that case, center the window at
3690 the given number of lines from the top.
3691
3692 @end table
3693
3694
3695 @node Choosing Articles
3696 @section Choosing Articles
3697 @cindex selecting articles
3698
3699 @menu
3700 * Choosing Commands::        Commands for choosing articles.
3701 * Choosing Variables::       Variables that influence these commands.
3702 @end menu
3703
3704
3705 @node Choosing Commands
3706 @subsection Choosing Commands
3707
3708 None of the following movement commands understand the numeric prefix,
3709 and they all select and display an article.
3710
3711 @table @kbd
3712 @item SPACE
3713 @kindex SPACE (Summary)
3714 @findex gnus-summary-next-page
3715 Select the current article, or, if that one's read already, the next
3716 unread article (@code{gnus-summary-next-page}).
3717
3718 @item G n
3719 @itemx n
3720 @kindex n (Summary)
3721 @kindex G n (Summary)
3722 @findex gnus-summary-next-unread-article
3723 @c @icon{gnus-summary-next-unread}
3724 Go to next unread article (@code{gnus-summary-next-unread-article}).
3725
3726 @item G p
3727 @itemx p
3728 @kindex p (Summary)
3729 @findex gnus-summary-prev-unread-article
3730 @c @icon{gnus-summary-prev-unread}
3731 Go to previous unread article (@code{gnus-summary-prev-unread-article}).
3732
3733 @item G N
3734 @itemx N
3735 @kindex N (Summary)
3736 @kindex G N (Summary)
3737 @findex gnus-summary-next-article
3738 Go to the next article (@code{gnus-summary-next-article}).
3739
3740 @item G P
3741 @itemx P
3742 @kindex P (Summary)
3743 @kindex G P (Summary)
3744 @findex gnus-summary-prev-article
3745 Go to the previous article (@code{gnus-summary-prev-article}).
3746
3747 @item G C-n
3748 @kindex G C-n (Summary)
3749 @findex gnus-summary-next-same-subject
3750 Go to the next article with the same subject
3751 (@code{gnus-summary-next-same-subject}).
3752
3753 @item G C-p
3754 @kindex G C-p (Summary)
3755 @findex gnus-summary-prev-same-subject
3756 Go to the previous article with the same subject
3757 (@code{gnus-summary-prev-same-subject}).
3758
3759 @item G f
3760 @itemx .
3761 @kindex G f  (Summary)
3762 @kindex .  (Summary)
3763 @findex gnus-summary-first-unread-article
3764 Go to the first unread article
3765 (@code{gnus-summary-first-unread-article}).
3766
3767 @item G b
3768 @itemx ,
3769 @kindex G b (Summary)
3770 @kindex , (Summary)
3771 @findex gnus-summary-best-unread-article
3772 Go to the article with the highest score
3773 (@code{gnus-summary-best-unread-article}).
3774
3775 @item G l
3776 @itemx l
3777 @kindex l (Summary)
3778 @kindex G l (Summary)
3779 @findex gnus-summary-goto-last-article
3780 Go to the previous article read (@code{gnus-summary-goto-last-article}).
3781
3782 @item G o
3783 @kindex G o (Summary)
3784 @findex gnus-summary-pop-article
3785 @cindex history
3786 @cindex article history
3787 Pop an article off the summary history and go to this article
3788 (@code{gnus-summary-pop-article}).  This command differs from the
3789 command above in that you can pop as many previous articles off the
3790 history as you like, while @kbd{l} toggles the two last read articles.
3791 For a somewhat related issue (if you use these commands a lot),
3792 @pxref{Article Backlog}.
3793 @end table
3794
3795
3796 @node Choosing Variables
3797 @subsection Choosing Variables
3798
3799 Some variables relevant for moving and selecting articles:
3800
3801 @table @code
3802 @item gnus-auto-extend-newsgroup
3803 @vindex gnus-auto-extend-newsgroup
3804 All the movement commands will try to go to the previous (or next)
3805 article, even if that article isn't displayed in the Summary buffer if
3806 this variable is non-@code{nil}.  Gnus will then fetch the article from
3807 the server and display it in the article buffer.
3808
3809 @item gnus-select-article-hook
3810 @vindex gnus-select-article-hook
3811 This hook is called whenever an article is selected.  By default it
3812 exposes any threads hidden under the selected article.
3813
3814 @item gnus-mark-article-hook
3815 @vindex gnus-mark-article-hook
3816 @findex gnus-summary-mark-unread-as-read
3817 @findex gnus-summary-mark-read-and-unread-as-read
3818 @findex gnus-unread-mark
3819 This hook is called whenever an article is selected.  It is intended to
3820 be used for marking articles as read.  The default value is
3821 @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
3822 mark of almost any article you read to @code{gnus-unread-mark}.  The
3823 only articles not affected by this function are ticked, dormant, and
3824 expirable articles.  If you'd instead like to just have unread articles
3825 marked as read, you can use @code{gnus-summary-mark-unread-as-read}
3826 instead.  It will leave marks like @code{gnus-low-score-mark},
3827 @code{gnus-del-mark} (and so on) alone.
3828
3829 @end table
3830
3831
3832 @node Paging the Article
3833 @section Scrolling the Article
3834 @cindex article scrolling
3835
3836 @table @kbd
3837
3838 @item SPACE
3839 @kindex SPACE (Summary)
3840 @findex gnus-summary-next-page
3841 Pressing @kbd{SPACE} will scroll the current article forward one page,
3842 or, if you have come to the end of the current article, will choose the
3843 next article (@code{gnus-summary-next-page}).
3844
3845 @item DEL
3846 @kindex DEL (Summary)
3847 @findex gnus-summary-prev-page
3848 Scroll the current article back one page (@code{gnus-summary-prev-page}).
3849
3850 @item RET
3851 @kindex RET (Summary)
3852 @findex gnus-summary-scroll-up
3853 Scroll the current article one line forward
3854 (@code{gnus-summary-scroll-up}).
3855
3856 @item M-RET
3857 @kindex M-RET (Summary)
3858 @findex gnus-summary-scroll-down
3859 Scroll the current article one line backward
3860 (@code{gnus-summary-scroll-down}).
3861
3862 @item A g
3863 @itemx g
3864 @kindex A g (Summary)
3865 @kindex g (Summary)
3866 @findex gnus-summary-show-article
3867 (Re)fetch the current article (@code{gnus-summary-show-article}).  If
3868 given a prefix, fetch the current article, but don't run any of the
3869 article treatment functions.  This will give you a ``raw'' article, just
3870 the way it came from the server.
3871
3872 @item A <
3873 @itemx <
3874 @kindex < (Summary)
3875 @kindex A < (Summary)
3876 @findex gnus-summary-beginning-of-article
3877 Scroll to the beginning of the article
3878 (@code{gnus-summary-beginning-of-article}).
3879
3880 @item A >
3881 @itemx >
3882 @kindex > (Summary)
3883 @kindex A > (Summary)
3884 @findex gnus-summary-end-of-article
3885 Scroll to the end of the article (@code{gnus-summary-end-of-article}).
3886
3887 @item A s
3888 @itemx s
3889 @kindex A s (Summary)
3890 @kindex s (Summary)
3891 @findex gnus-summary-isearch-article
3892 Perform an isearch in the article buffer
3893 (@code{gnus-summary-isearch-article}).
3894
3895 @item h
3896 @kindex h (Summary)
3897 @findex gnus-summary-select-article-buffer
3898 Select the article buffer (@code{gnus-summary-select-article-buffer}).
3899
3900 @end table
3901
3902
3903 @node Reply Followup and Post
3904 @section Reply, Followup and Post
3905
3906 @menu
3907 * Summary Mail Commands::            Sending mail.
3908 * Summary Post Commands::            Sending news.
3909 @end menu
3910
3911
3912 @node Summary Mail Commands
3913 @subsection Summary Mail Commands
3914 @cindex mail
3915 @cindex composing mail
3916
3917 Commands for composing a mail message:
3918
3919 @table @kbd
3920
3921 @item S r
3922 @itemx r
3923 @kindex S r (Summary)
3924 @kindex r (Summary)
3925 @findex gnus-summary-reply
3926 @c @icon{gnus-summary-mail-reply}
3927 @c @icon{gnus-summary-reply}
3928 Mail a reply to the author of the current article
3929 (@code{gnus-summary-reply}).
3930
3931 @item S R
3932 @itemx R
3933 @kindex R (Summary)
3934 @kindex S R (Summary)
3935 @findex gnus-summary-reply-with-original
3936 @c @icon{gnus-summary-reply-with-original}
3937 Mail a reply to the author of the current article and include the
3938 original message (@code{gnus-summary-reply-with-original}).  This
3939 command uses the process/prefix convention.
3940
3941 @item S w
3942 @kindex S w (Summary)
3943 @findex gnus-summary-wide-reply
3944 Mail a wide reply to the author of the current article
3945 (@code{gnus-summary-wide-reply}).  A @dfn{wide reply} is a reply that
3946 goes out to all people listed in the @code{To}, @code{From} (or
3947 @code{Reply-to}) and @code{Cc} headers.
3948
3949 @item S W
3950 @kindex S W (Summary)
3951 @findex gnus-summary-wide-reply-with-original
3952 Mail a wide reply to the current article and include the original
3953 message (@code{gnus-summary-wide-reply-with-original}).  This command uses
3954 the process/prefix convention.
3955
3956 @item S o m
3957 @kindex S o m (Summary)
3958 @findex gnus-summary-mail-forward
3959 @c @icon{gnus-summary-mail-forward}
3960 Forward the current article to some other person
3961 (@code{gnus-summary-mail-forward}).  If given a prefix, include the full
3962 headers of the forwarded article.
3963
3964 @item S m
3965 @itemx m
3966 @kindex m (Summary)
3967 @kindex S m (Summary)
3968 @findex gnus-summary-mail-other-window
3969 @c @icon{gnus-summary-mail-originate}
3970 Send a mail to some other person
3971 (@code{gnus-summary-mail-other-window}).
3972
3973 @item S D b
3974 @kindex S D b (Summary)
3975 @findex gnus-summary-resend-bounced-mail
3976 @cindex bouncing mail
3977 If you have sent a mail, but the mail was bounced back to you for some
3978 reason (wrong address, transient failure), you can use this command to
3979 resend that bounced mail (@code{gnus-summary-resend-bounced-mail}).  You
3980 will be popped into a mail buffer where you can edit the headers before
3981 sending the mail off again.  If you give a prefix to this command, and
3982 the bounced mail is a reply to some other mail, Gnus will try to fetch
3983 that mail and display it for easy perusal of its headers.  This might
3984 very well fail, though.
3985
3986 @item S D r
3987 @kindex S D r (Summary)
3988 @findex gnus-summary-resend-message
3989 Not to be confused with the previous command,
3990 @code{gnus-summary-resend-message} will prompt you for an address to
3991 send the current message off to, and then send it to that place.  The
3992 headers of the message won't be altered---but lots of headers that say
3993 @code{Resent-To}, @code{Resent-From} and so on will be added.  This
3994 means that you actually send a mail to someone that has a @code{To}
3995 header that (probably) points to yourself.  This will confuse people.
3996 So, natcherly you'll only do that if you're really eVIl.
3997
3998 This command is mainly used if you have several accounts and want to
3999 ship a mail to a different account of yours.  (If you're both
4000 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
4001 to the @code{root} account, you may want to resend it to
4002 @code{postmaster}.  Ordnung muß sein!
4003
4004 This command understands the process/prefix convention
4005 (@pxref{Process/Prefix}).
4006
4007 @item S O m
4008 @kindex S O m (Summary)
4009 @findex gnus-uu-digest-mail-forward
4010 Digest the current series (@pxref{Decoding Articles}) and forward the
4011 result using mail (@code{gnus-uu-digest-mail-forward}).  This command
4012 uses the process/prefix convention (@pxref{Process/Prefix}).
4013
4014 @item S M-c
4015 @kindex S M-c (Summary)
4016 @findex gnus-summary-mail-crosspost-complaint
4017 @cindex crossposting
4018 @cindex excessive crossposting
4019 Send a complaint about excessive crossposting to the author of the
4020 current article (@code{gnus-summary-mail-crosspost-complaint}).
4021
4022 @findex gnus-crosspost-complaint
4023 This command is provided as a way to fight back against the current
4024 crossposting pandemic that's sweeping Usenet.  It will compose a reply
4025 using the @code{gnus-crosspost-complaint} variable as a preamble.  This
4026 command understands the process/prefix convention
4027 (@pxref{Process/Prefix}) and will prompt you before sending each mail.
4028
4029 @end table
4030
4031 Also @pxref{(message)Header Commands} for more information.
4032
4033
4034 @node Summary Post Commands
4035 @subsection Summary Post Commands
4036 @cindex post
4037 @cindex composing news
4038
4039 Commands for posting a news article:
4040
4041 @table @kbd
4042 @item S p
4043 @itemx a
4044 @kindex a (Summary)
4045 @kindex S p (Summary)
4046 @findex gnus-summary-post-news
4047 @c @icon{gnus-summary-post-news}
4048 Post an article to the current group
4049 (@code{gnus-summary-post-news}).
4050
4051 @item S f
4052 @itemx f
4053 @kindex f (Summary)
4054 @kindex S f (Summary)
4055 @findex gnus-summary-followup
4056 @c @icon{gnus-summary-followup}
4057 Post a followup to the current article (@code{gnus-summary-followup}).
4058
4059 @item S F
4060 @itemx F
4061 @kindex S F (Summary)
4062 @kindex F (Summary)
4063 @c @icon{gnus-summary-followup-with-original}
4064 @findex gnus-summary-followup-with-original
4065 Post a followup to the current article and include the original message
4066 (@code{gnus-summary-followup-with-original}).   This command uses the
4067 process/prefix convention.
4068
4069 @item S n
4070 @kindex S n (Summary)
4071 @findex gnus-summary-followup-to-mail
4072 Post a followup to the current article via news, even if you got the
4073 message through mail (@code{gnus-summary-followup-to-mail}).
4074
4075 @item S N
4076 @kindex S N (Summary)
4077 @findex gnus-summary-followup-to-mail-with-original
4078 Post a followup to the current article via news, even if you got the
4079 message through mail and include the original message
4080 (@code{gnus-summary-followup-to-mail-with-original}).  This command uses
4081 the process/prefix convention.
4082
4083 @item S o p
4084 @kindex S o p (Summary)
4085 @findex gnus-summary-post-forward
4086 Forward the current article to a newsgroup
4087 (@code{gnus-summary-post-forward}).  If given a prefix, include the full
4088 headers of the forwarded article.
4089
4090 @item S O p
4091 @kindex S O p (Summary)
4092 @findex gnus-uu-digest-post-forward
4093 @cindex digests
4094 @cindex making digests
4095 Digest the current series and forward the result to a newsgroup
4096 (@code{gnus-uu-digest-mail-forward}).  This command uses the
4097 process/prefix convention.
4098
4099 @item S u
4100 @kindex S u (Summary)
4101 @findex gnus-uu-post-news
4102 @c @icon{gnus-uu-post-news}
4103 Uuencode a file, split it into parts, and post it as a series
4104 (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
4105 @end table
4106
4107 Also @pxref{(message)Header Commands} for more information.
4108
4109
4110 @node Canceling and Superseding
4111 @section Canceling Articles
4112 @cindex canceling articles
4113 @cindex superseding articles
4114
4115 Have you ever written something, and then decided that you really,
4116 really, really wish you hadn't posted that?
4117
4118 Well, you can't cancel mail, but you can cancel posts.
4119
4120 @findex gnus-summary-cancel-article
4121 @kindex C (Summary)
4122 @c @icon{gnus-summary-cancel-article}
4123 Find the article you wish to cancel (you can only cancel your own
4124 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
4125 c} (@code{gnus-summary-cancel-article}).  Your article will be
4126 canceled---machines all over the world will be deleting your article.
4127 This command uses the process/prefix convention (@pxref{Process/Prefix}).
4128
4129 Be aware, however, that not all sites honor cancels, so your article may
4130 live on here and there, while most sites will delete the article in
4131 question.
4132
4133 Gnus will use the ``current'' select method when canceling.  If you
4134 want to use the standard posting method, use the @samp{a} symbolic
4135 prefix (@pxref{Symbolic Prefixes}).
4136
4137 If you discover that you have made some mistakes and want to do some
4138 corrections, you can post a @dfn{superseding} article that will replace
4139 your original article.
4140
4141 @findex gnus-summary-supersede-article
4142 @kindex S (Summary)
4143 Go to the original article and press @kbd{S s}
4144 (@code{gnus-summary-supersede-article}).  You will be put in a buffer
4145 where you can edit the article all you want before sending it off the
4146 usual way.
4147
4148 The same goes for superseding as for canceling, only more so: Some
4149 sites do not honor superseding.  On those sites, it will appear that you
4150 have posted almost the same article twice.
4151
4152 If you have just posted the article, and change your mind right away,
4153 there is a trick you can use to cancel/supersede the article without
4154 waiting for the article to appear on your site first.  You simply return
4155 to the post buffer (which is called @code{*sent ...*}).  There you will
4156 find the article you just posted, with all the headers intact.  Change
4157 the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
4158 header by substituting one of those words for the word
4159 @code{Message-ID}.  Then just press @kbd{C-c C-c} to send the article as
4160 you would do normally.  The previous article will be
4161 canceled/superseded.
4162
4163 Just remember, kids: There is no 'c' in 'supersede'.
4164
4165
4166 @node Marking Articles
4167 @section Marking Articles
4168 @cindex article marking
4169 @cindex article ticking
4170 @cindex marks
4171
4172 There are several marks you can set on an article.
4173
4174 You have marks that decide the @dfn{readedness} (whoo, neato-keano
4175 neologism ohoy!) of the article.  Alphabetic marks generally mean
4176 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
4177
4178 In addition, you also have marks that do not affect readedness.
4179
4180 @menu
4181 * Unread Articles::      Marks for unread articles.
4182 * Read Articles::        Marks for read articles.
4183 * Other Marks::          Marks that do not affect readedness.
4184 @end menu
4185
4186 @ifinfo
4187 There's a plethora of commands for manipulating these marks:
4188 @end ifinfo
4189
4190 @menu
4191 * Setting Marks::           How to set and remove marks.
4192 * Setting Process Marks::   How to mark articles for later processing.
4193 @end menu
4194
4195
4196 @node Unread Articles
4197 @subsection Unread Articles
4198
4199 The following marks mark articles as (kinda) unread, in one form or
4200 other.
4201
4202 @table @samp
4203 @item !
4204 @vindex gnus-ticked-mark
4205 Marked as ticked (@code{gnus-ticked-mark}).
4206
4207 @dfn{Ticked articles} are articles that will remain visible always.  If
4208 you see an article that you find interesting, or you want to put off
4209 reading it, or replying to it, until sometime later, you'd typically
4210 tick it.  However, articles can be expired, so if you want to keep an
4211 article forever, you'll have to make it persistent (@pxref{Persistent
4212 Articles}).
4213
4214 @item ?
4215 @vindex gnus-dormant-mark
4216 Marked as dormant (@code{gnus-dormant-mark}).
4217
4218 @dfn{Dormant articles} will only appear in the summary buffer if there
4219 are followups to it.  If you want to see them even if they don't have
4220 followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
4221
4222 @item SPACE
4223 @vindex gnus-unread-mark
4224 Marked as unread (@code{gnus-unread-mark}).
4225
4226 @dfn{Unread articles} are articles that haven't been read at all yet.
4227 @end table
4228
4229
4230 @node Read Articles
4231 @subsection Read Articles
4232 @cindex expirable mark
4233
4234 All the following marks mark articles as read.
4235
4236 @table @samp
4237
4238 @item r
4239 @vindex gnus-del-mark
4240 These are articles that the user has marked as read with the @kbd{d}
4241 command manually, more or less (@code{gnus-del-mark}).
4242
4243 @item R
4244 @vindex gnus-read-mark
4245 Articles that have actually been read (@code{gnus-read-mark}).
4246
4247 @item O
4248 @vindex gnus-ancient-mark
4249 Articles that were marked as read in previous sessions and are now
4250 @dfn{old} (@code{gnus-ancient-mark}).
4251
4252 @item K
4253 @vindex gnus-killed-mark
4254 Marked as killed (@code{gnus-killed-mark}).
4255
4256 @item X
4257 @vindex gnus-kill-file-mark
4258 Marked as killed by kill files (@code{gnus-kill-file-mark}).
4259
4260 @item Y
4261 @vindex gnus-low-score-mark
4262 Marked as read by having too low a score (@code{gnus-low-score-mark}).
4263
4264 @item C
4265 @vindex gnus-catchup-mark
4266 Marked as read by a catchup (@code{gnus-catchup-mark}).
4267
4268 @item G
4269 @vindex gnus-canceled-mark
4270 Canceled article (@code{gnus-canceled-mark})
4271
4272 @item F
4273 @vindex gnus-souped-mark
4274 @sc{SOUP}ed article (@code{gnus-souped-mark}).  @xref{SOUP}.
4275
4276 @item Q
4277 @vindex gnus-sparse-mark
4278 Sparsely reffed article (@code{gnus-sparse-mark}).  @xref{Customizing
4279 Threading}.
4280
4281 @item M
4282 @vindex gnus-duplicate-mark
4283 Article marked as read by duplicate suppression
4284 (@code{gnus-duplicated-mark}).  @xref{Duplicate Suppression}.
4285
4286 @end table
4287
4288 All these marks just mean that the article is marked as read, really.
4289 They are interpreted differently when doing adaptive scoring, though.
4290
4291 One more special mark, though:
4292
4293 @table @samp
4294 @item E
4295 @vindex gnus-expirable-mark
4296 Marked as expirable (@code{gnus-expirable-mark}).
4297
4298 Marking articles as @dfn{expirable} (or have them marked as such
4299 automatically) doesn't make much sense in normal groups---a user doesn't
4300 control expiring of news articles, but in mail groups, for instance,
4301 articles marked as @dfn{expirable} can be deleted by Gnus at
4302 any time.
4303 @end table
4304
4305
4306 @node Other Marks
4307 @subsection Other Marks
4308 @cindex process mark
4309 @cindex bookmarks
4310
4311 There are some marks that have nothing to do with whether the article is
4312 read or not.
4313
4314 @itemize @bullet
4315
4316 @item
4317 You can set a bookmark in the current article.  Say you are reading a
4318 long thesis on cats' urinary tracts, and have to go home for dinner
4319 before you've finished reading the thesis.  You can then set a bookmark
4320 in the article, and Gnus will jump to this bookmark the next time it
4321 encounters the article.  @xref{Setting Marks}.
4322
4323 @item
4324 @vindex gnus-replied-mark
4325 All articles that you have replied to or made a followup to (i.e., have
4326 answered) will be marked with an @samp{A} in the second column
4327 (@code{gnus-replied-mark}).
4328
4329 @item
4330 @vindex gnus-cached-mark
4331 Articles stored in the article cache will be marked with an @samp{*} in
4332 the second column (@code{gnus-cached-mark}).  @xref{Article Caching}.
4333
4334 @item
4335 @vindex gnus-saved-mark
4336 Articles ``saved'' (in some manner or other; not necessarily
4337 religiously) are marked with an @samp{S} in the second column
4338 (@code{gnus-saved-mark}).
4339
4340 @item
4341 @vindex gnus-not-empty-thread-mark
4342 @vindex gnus-empty-thread-mark
4343 If the @samp{%e} spec is used, the presence of threads or not will be
4344 marked with @code{gnus-not-empty-thread-mark} and
4345 @code{gnus-empty-thread-mark} in the third column, respectively.
4346
4347 @item
4348 @vindex gnus-process-mark
4349 Finally we have the @dfn{process mark} (@code{gnus-process-mark}).  A
4350 variety of commands react to the presence of the process mark.  For
4351 instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
4352 all articles that have been marked with the process mark.  Articles
4353 marked with the process mark have a @samp{#} in the second column.
4354
4355 @end itemize
4356
4357 You might have noticed that most of these ``non-readedness'' marks
4358 appear in the second column by default.  So if you have a cached, saved,
4359 replied article that you have process-marked, what will that look like?
4360
4361 Nothing much.  The precedence rules go as follows: process -> cache ->
4362 replied -> saved.  So if the article is in the cache and is replied,
4363 you'll only see the cache mark and not the replied mark.
4364
4365
4366 @node Setting Marks
4367 @subsection Setting Marks
4368 @cindex setting marks
4369
4370 All the marking commands understand the numeric prefix.
4371
4372 @table @kbd
4373 @item M c
4374 @itemx M-u
4375 @kindex M c (Summary)
4376 @kindex M-u (Summary)
4377 @findex gnus-summary-clear-mark-forward
4378 @cindex mark as unread
4379 Clear all readedness-marks from the current article
4380 (@code{gnus-summary-clear-mark-forward}).  In other words, mark the
4381 article as unread.
4382
4383 @item M t
4384 @itemx !
4385 @kindex ! (Summary)
4386 @kindex M t (Summary)
4387 @findex gnus-summary-tick-article-forward
4388 Tick the current article (@code{gnus-summary-tick-article-forward}).
4389 @xref{Article Caching}.
4390
4391 @item M ?
4392 @itemx ?
4393 @kindex ? (Summary)
4394 @kindex M ? (Summary)
4395 @findex gnus-summary-mark-as-dormant
4396 Mark the current article as dormant
4397 (@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}.
4398
4399 @item M d
4400 @itemx d
4401 @kindex M d (Summary)
4402 @kindex d (Summary)
4403 @findex gnus-summary-mark-as-read-forward
4404 Mark the current article as read
4405 (@code{gnus-summary-mark-as-read-forward}).
4406
4407 @item D
4408 @kindex D (Summary)
4409 @findex gnus-summary-mark-as-read-backward
4410 Mark the current article as read and move point to the previous line
4411 (@code{gnus-summary-mark-as-read-backward}).
4412
4413 @item M k
4414 @itemx k
4415 @kindex k (Summary)
4416 @kindex M k (Summary)
4417 @findex gnus-summary-kill-same-subject-and-select
4418 Mark all articles that have the same subject as the current one as read,
4419 and then select the next unread article
4420 (@code{gnus-summary-kill-same-subject-and-select}).
4421
4422 @item M K
4423 @itemx C-k
4424 @kindex M K (Summary)
4425 @kindex C-k (Summary)
4426 @findex gnus-summary-kill-same-subject
4427 Mark all articles that have the same subject as the current one as read
4428 (@code{gnus-summary-kill-same-subject}).
4429
4430 @item M C
4431 @kindex M C (Summary)
4432 @findex gnus-summary-catchup
4433 @c @icon{gnus-summary-catchup}
4434 Mark all unread articles as read (@code{gnus-summary-catchup}).
4435
4436 @item M C-c
4437 @kindex M C-c (Summary)
4438 @findex gnus-summary-catchup-all
4439 Mark all articles in the group as read---even the ticked and dormant
4440 articles (@code{gnus-summary-catchup-all}).
4441
4442 @item M H
4443 @kindex M H (Summary)
4444 @findex gnus-summary-catchup-to-here
4445 Catchup the current group to point
4446 (@code{gnus-summary-catchup-to-here}).
4447
4448 @item C-w
4449 @kindex C-w (Summary)
4450 @findex gnus-summary-mark-region-as-read
4451 Mark all articles between point and mark as read
4452 (@code{gnus-summary-mark-region-as-read}).
4453
4454 @item M V k
4455 @kindex M V k (Summary)
4456 @findex gnus-summary-kill-below
4457 Kill all articles with scores below the default score (or below the
4458 numeric prefix) (@code{gnus-summary-kill-below}).
4459
4460 @item M e
4461 @itemx E
4462 @kindex M e (Summary)
4463 @kindex E (Summary)
4464 @findex gnus-summary-mark-as-expirable
4465 Mark the current article as expirable
4466 (@code{gnus-summary-mark-as-expirable}).
4467
4468 @item M b
4469 @kindex M b (Summary)
4470 @findex gnus-summary-set-bookmark
4471 Set a bookmark in the current article
4472 (@code{gnus-summary-set-bookmark}).
4473
4474 @item M B
4475 @kindex M B (Summary)
4476 @findex gnus-summary-remove-bookmark
4477 Remove the bookmark from the current article
4478 (@code{gnus-summary-remove-bookmark}).
4479
4480 @item M V c
4481 @kindex M V c (Summary)
4482 @findex gnus-summary-clear-above
4483 Clear all marks from articles with scores over the default score (or
4484 over the numeric prefix) (@code{gnus-summary-clear-above}).
4485
4486 @item M V u
4487 @kindex M V u (Summary)
4488 @findex gnus-summary-tick-above
4489 Tick all articles with scores over the default score (or over the
4490 numeric prefix) (@code{gnus-summary-tick-above}).
4491
4492 @item M V m
4493 @kindex M V m (Summary)
4494 @findex gnus-summary-mark-above
4495 Prompt for a mark, and mark all articles with scores over the default
4496 score (or over the numeric prefix) with this mark
4497 (@code{gnus-summary-clear-above}).
4498 @end table
4499
4500 @vindex gnus-summary-goto-unread
4501 The @code{gnus-summary-goto-unread} variable controls what action should
4502 be taken after setting a mark.  If non-@code{nil}, point will move to
4503 the next/previous unread article.  If @code{nil}, point will just move
4504 one line up or down.  As a special case, if this variable is
4505 @code{never}, all the marking commands as well as other commands (like
4506 @kbd{SPACE}) will move to the next article, whether it is unread or not.
4507 The default is @code{t}.
4508
4509
4510 @node Setting Process Marks
4511 @subsection Setting Process Marks
4512 @cindex setting process marks
4513
4514 @table @kbd
4515
4516 @item M P p
4517 @itemx #
4518 @kindex # (Summary)
4519 @kindex M P p (Summary)
4520 @findex gnus-summary-mark-as-processable
4521 Mark the current article with the process mark
4522 (@code{gnus-summary-mark-as-processable}).
4523 @findex gnus-summary-unmark-as-processable
4524
4525 @item M P u
4526 @itemx M-#
4527 @kindex M P u (Summary)
4528 @kindex M-# (Summary)
4529 Remove the process mark, if any, from the current article
4530 (@code{gnus-summary-unmark-as-processable}).
4531
4532 @item M P U
4533 @kindex M P U (Summary)
4534 @findex gnus-summary-unmark-all-processable
4535 Remove the process mark from all articles
4536 (@code{gnus-summary-unmark-all-processable}).
4537
4538 @item M P i
4539 @kindex M P i (Summary)
4540 @findex gnus-uu-invert-processable
4541 Invert the list of process marked articles
4542 (@code{gnus-uu-invert-processable}).
4543
4544 @item M P R
4545 @kindex M P R (Summary)
4546 @findex gnus-uu-mark-by-regexp
4547 Mark articles that have a @code{Subject} header that matches a regular
4548 expression (@code{gnus-uu-mark-by-regexp}).
4549
4550 @item M P r
4551 @kindex M P r (Summary)
4552 @findex gnus-uu-mark-region
4553 Mark articles in region (@code{gnus-uu-mark-region}).
4554
4555 @item M P t
4556 @kindex M P t (Summary)
4557 @findex gnus-uu-mark-thread
4558 Mark all articles in the current (sub)thread
4559 (@code{gnus-uu-mark-thread}).
4560
4561 @item M P T
4562 @kindex M P T (Summary)
4563 @findex gnus-uu-unmark-thread
4564 Unmark all articles in the current (sub)thread
4565 (@code{gnus-uu-unmark-thread}).
4566
4567 @item M P v
4568 @kindex M P v (Summary)
4569 @findex gnus-uu-mark-over
4570 Mark all articles that have a score above the prefix argument
4571 (@code{gnus-uu-mark-over}).
4572
4573 @item M P s
4574 @kindex M P s (Summary)
4575 @findex gnus-uu-mark-series
4576 Mark all articles in the current series (@code{gnus-uu-mark-series}).
4577
4578 @item M P S
4579 @kindex M P S (Summary)
4580 @findex gnus-uu-mark-sparse
4581 Mark all series that have already had some articles marked
4582 (@code{gnus-uu-mark-sparse}).
4583
4584 @item M P a
4585 @kindex M P a (Summary)
4586 @findex gnus-uu-mark-all
4587 Mark all articles in series order (@code{gnus-uu-mark-series}).
4588
4589 @item M P b
4590 @kindex M P b (Summary)
4591 @findex gnus-uu-mark-buffer
4592 Mark all articles in the buffer in the order they appear
4593 (@code{gnus-uu-mark-buffer}).
4594
4595 @item M P k
4596 @kindex M P k (Summary)
4597 @findex gnus-summary-kill-process-mark
4598 Push the current process mark set onto the stack and unmark all articles
4599 (@code{gnus-summary-kill-process-mark}).
4600
4601 @item M P y
4602 @kindex M P y (Summary)
4603 @findex gnus-summary-yank-process-mark
4604 Pop the previous process mark set from the stack and restore it
4605 (@code{gnus-summary-yank-process-mark}).
4606
4607 @item M P w
4608 @kindex M P w (Summary)
4609 @findex gnus-summary-save-process-mark
4610 Push the current process mark set onto the stack
4611 (@code{gnus-summary-save-process-mark}).
4612
4613 @end table
4614
4615
4616 @node Limiting
4617 @section Limiting
4618 @cindex limiting
4619
4620 It can be convenient to limit the summary buffer to just show some
4621 subset of the articles currently in the group.  The effect most limit
4622 commands have is to remove a few (or many) articles from the summary
4623 buffer.
4624
4625 All limiting commands work on subsets of the articles already fetched
4626 from the servers.  None of these commands query the server for
4627 additional articles.
4628
4629 @table @kbd
4630
4631 @item / /
4632 @itemx / s
4633 @kindex / / (Summary)
4634 @findex gnus-summary-limit-to-subject
4635 Limit the summary buffer to articles that match some subject
4636 (@code{gnus-summary-limit-to-subject}).
4637
4638 @item / a
4639 @kindex / a (Summary)
4640 @findex gnus-summary-limit-to-author
4641 Limit the summary buffer to articles that match some author
4642 (@code{gnus-summary-limit-to-author}).
4643
4644 @item / u
4645 @itemx x
4646 @kindex / u (Summary)
4647 @kindex x (Summary)
4648 @findex gnus-summary-limit-to-unread
4649 Limit the summary buffer to articles not marked as read
4650 (@code{gnus-summary-limit-to-unread}).  If given a prefix, limit the
4651 buffer to articles strictly unread.  This means that ticked and
4652 dormant articles will also be excluded.
4653
4654 @item / m
4655 @kindex / m (Summary)
4656 @findex gnus-summary-limit-to-marks
4657 Ask for a mark and then limit to all articles that have been marked
4658 with that mark (@code{gnus-summary-limit-to-marks}).
4659
4660 @item / t
4661 @kindex / t (Summary)
4662 @findex gnus-summary-limit-to-age
4663 Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
4664 (@code{gnus-summary-limit-to-marks}).  If given a prefix, limit to
4665 articles younger than that number of days.
4666
4667 @item / n
4668 @kindex / n (Summary)
4669 @findex gnus-summary-limit-to-articles
4670 Limit the summary buffer to the current article
4671 (@code{gnus-summary-limit-to-articles}).  Uses the process/prefix
4672 convention (@pxref{Process/Prefix}).
4673
4674 @item / w
4675 @kindex / w (Summary)
4676 @findex gnus-summary-pop-limit
4677 Pop the previous limit off the stack and restore it
4678 (@code{gnus-summary-pop-limit}).  If given a prefix, pop all limits off
4679 the stack.
4680
4681 @item / v
4682 @kindex / v (Summary)
4683 @findex gnus-summary-limit-to-score
4684 Limit the summary buffer to articles that have a score at or above some
4685 score (@code{gnus-summary-limit-to-score}).
4686
4687 @item / E
4688 @itemx M S
4689 @kindex M S (Summary)
4690 @kindex / E (Summary)
4691 @findex gnus-summary-limit-include-expunged
4692 Include all expunged articles in the limit
4693 (@code{gnus-summary-limit-include-expunged}).
4694
4695 @item / D
4696 @kindex / D (Summary)
4697 @findex gnus-summary-limit-include-dormant
4698 Include all dormant articles in the limit
4699 (@code{gnus-summary-limit-include-dormant}).
4700
4701 @item / *
4702 @kindex / * (Summary)
4703 @findex gnus-summary-limit-include-cached
4704 Include all cached articles in the limit
4705 (@code{gnus-summary-limit-include-cached}).
4706
4707 @item / d
4708 @kindex / d (Summary)
4709 @findex gnus-summary-limit-exclude-dormant
4710 Exclude all dormant articles from the limit
4711 (@code{gnus-summary-limit-exclude-dormant}).
4712
4713 @item / M
4714 @kindex / M (Summary)
4715 @findex gnus-summary-limit-exclude-marks
4716 Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}). 
4717
4718 @item / T
4719 @kindex / T (Summary)
4720 @findex gnus-summary-limit-include-thread
4721 Include all the articles in the current thread in the limit.
4722
4723 @item / c
4724 @kindex / c (Summary)
4725 @findex gnus-summary-limit-exclude-childless-dormant
4726 Exclude all dormant articles that have no children from the limit
4727 (@code{gnus-summary-limit-exclude-childless-dormant}).
4728
4729 @item / C
4730 @kindex / C (Summary)
4731 @findex gnus-summary-limit-mark-excluded-as-read
4732 Mark all excluded unread articles as read
4733 (@code{gnus-summary-limit-mark-excluded-as-read}).   If given a prefix,
4734 also mark excluded ticked and dormant articles as read.
4735
4736 @end table
4737
4738
4739 @node Threading
4740 @section Threading
4741 @cindex threading
4742 @cindex article threading
4743
4744 Gnus threads articles by default.  @dfn{To thread} is to put responses
4745 to articles directly after the articles they respond to---in a
4746 hierarchical fashion.
4747
4748 Threading is done by looking at the @code{References} headers of the
4749 articles.  In a perfect world, this would be enough to build pretty
4750 trees, but unfortunately, the @code{References} header is often broken
4751 or simply missing.  Weird news propagation excarcerbates the problem,
4752 so one has to employ other heuristics to get pleasing results.  A
4753 plethora of approaches exists, as detailed in horrible detail in
4754 @pxref{Customizing Threading}.
4755
4756 First, a quick overview of the concepts:
4757
4758 @table @dfn
4759 @item root
4760 The top-most article in a thread; the first article in the thread.
4761
4762 @item thread
4763 A tree-like article structure.
4764
4765 @item sub-thread
4766 A small(er) section of this tree-like structure.
4767
4768 @item loose threads
4769 Threads often lose their roots due to article expiry, or due to the root
4770 already having been read in a previous session, and not displayed in the
4771 summary buffer.  We then typically have many sub-threads that really
4772 belong to one thread, but are without connecting roots.  These are
4773 called loose threads.
4774
4775 @item thread gathering
4776 An attempt to gather loose threads into bigger threads.
4777
4778 @item sparse threads
4779 A thread where the missing articles have been ``guessed'' at, and are
4780 displayed as empty lines in the summary buffer.
4781
4782 @end table
4783
4784
4785 @menu
4786 * Customizing Threading::     Variables you can change to affect the threading.
4787 * Thread Commands::           Thread based commands in the summary buffer.
4788 @end menu
4789
4790
4791 @node Customizing Threading
4792 @subsection Customizing Threading
4793 @cindex customizing threading
4794
4795 @menu
4796 * Loose Threads::        How Gnus gathers loose threads into bigger threads.
4797 * Filling In Threads::   Making the threads displayed look fuller.
4798 * More Threading::       Even more variables for fiddling with threads.
4799 * Low-Level Threading::  You thought it was over... but you were wrong!
4800 @end menu
4801
4802
4803 @node Loose Threads
4804 @subsubsection Loose Threads
4805 @cindex <
4806 @cindex >
4807 @cindex loose threads
4808
4809 @table @code
4810 @item gnus-summary-make-false-root
4811 @vindex gnus-summary-make-false-root
4812 If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
4813 and create a dummy root at the top.  (Wait a minute.  Root at the top?
4814 Yup.)  Loose subtrees occur when the real root has expired, or you've
4815 read or killed the root in a previous session.
4816
4817 When there is no real root of a thread, Gnus will have to fudge
4818 something.  This variable says what fudging method Gnus should use.
4819 There are four possible values:
4820
4821 @iftex
4822 @iflatex
4823 \gnusfigure{The Summary Buffer}{390}{
4824 \put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}
4825 \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}
4826 \put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}
4827 \put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}
4828 }
4829 @end iflatex
4830 @end iftex
4831
4832 @cindex adopting articles
4833
4834 @table @code
4835
4836 @item adopt
4837 Gnus will make the first of the orphaned articles the parent.  This
4838 parent will adopt all the other articles.  The adopted articles will be
4839 marked as such by pointy brackets (@samp{<>}) instead of the standard
4840 square brackets (@samp{[]}).  This is the default method.
4841
4842 @item dummy
4843 @vindex gnus-summary-dummy-line-format
4844 Gnus will create a dummy summary line that will pretend to be the
4845 parent.  This dummy line does not correspond to any real article, so
4846 selecting it will just select the first real article after the dummy
4847 article.  @code{gnus-summary-dummy-line-format} is used to specify the
4848 format of the dummy roots.  It accepts only one format spec:  @samp{S},
4849 which is the subject of the article.  @xref{Formatting Variables}.
4850
4851 @item empty
4852 Gnus won't actually make any article the parent, but simply leave the
4853 subject field of all orphans except the first empty.  (Actually, it will
4854 use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
4855 Buffer Format}).)
4856
4857 @item none
4858 Don't make any article parent at all.  Just gather the threads and
4859 display them after one another.
4860
4861 @item nil
4862 Don't gather loose threads.
4863 @end table
4864
4865 @item gnus-summary-gather-subject-limit
4866 @vindex gnus-summary-gather-subject-limit
4867 Loose threads are gathered by comparing subjects of articles.  If this
4868 variable is @code{nil}, Gnus requires an exact match between the
4869 subjects of the loose threads before gathering them into one big
4870 super-thread.  This might be too strict a requirement, what with the
4871 presence of stupid newsreaders that chop off long subject lines.  If
4872 you think so, set this variable to, say, 20 to require that only the
4873 first 20 characters of the subjects have to match.  If you set this
4874 variable to a really low number, you'll find that Gnus will gather
4875 everything in sight into one thread, which isn't very helpful.
4876
4877 @cindex fuzzy article gathering
4878 If you set this variable to the special value @code{fuzzy}, Gnus will
4879 use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
4880 Matching}).
4881
4882 @item gnus-simplify-subject-fuzzy-regexp
4883 @vindex gnus-simplify-subject-fuzzy-regexp
4884 This can either be a regular expression or list of regular expressions
4885 that match strings that will be removed from subjects if fuzzy subject
4886 simplification is used.
4887
4888 @item gnus-simplify-ignored-prefixes
4889 @vindex gnus-simplify-ignored-prefixes
4890 If you set @code{gnus-summary-gather-subject-limit} to something as low
4891 as 10, you might consider setting this variable to something sensible:
4892
4893 @c Written by Michael Ernst <mernst@cs.rice.edu>
4894 @lisp
4895 (setq gnus-simplify-ignored-prefixes
4896       (concat
4897        "\\`\\[?\\("
4898        (mapconcat
4899         'identity
4900         '("looking"
4901           "wanted" "followup" "summary\\( of\\)?"
4902           "help" "query" "problem" "question"
4903           "answer" "reference" "announce"
4904           "How can I" "How to" "Comparison of"
4905           ;; ...
4906           )
4907         "\\|")
4908        "\\)\\s *\\("
4909        (mapconcat 'identity
4910                   '("for" "for reference" "with" "about")
4911                   "\\|")
4912        "\\)?\\]?:?[ \t]*"))
4913 @end lisp
4914
4915 All words that match this regexp will be removed before comparing two
4916 subjects.
4917
4918 @item gnus-simplify-subject-functions
4919 @vindex gnus-simplify-subject-functions
4920 If non-@code{nil}, this variable overrides
4921 @code{gnus-summary-gather-subject-limit}.  This variable should be a
4922 list of functions to apply to the @code{Subject} string iteratively to
4923 arrive at the simplified version of the string.
4924
4925 Useful functions to put in this list include:
4926
4927 @table @code
4928 @item gnus-simplify-subject-re
4929 @findex gnus-simplify-subject-re
4930 Strip the leading @samp{Re:}.
4931
4932 @item gnus-simplify-subject-fuzzy
4933 @findex gnus-simplify-subject-fuzzy
4934 Simplify fuzzily.
4935
4936 @item gnus-simplify-whitespace
4937 @findex gnus-simplify-whitespace
4938 Remove excessive whitespace.
4939 @end table
4940
4941 You may also write your own functions, of course.
4942
4943
4944 @item gnus-summary-gather-exclude-subject
4945 @vindex gnus-summary-gather-exclude-subject
4946 Since loose thread gathering is done on subjects only, that might lead
4947 to many false hits, especially with certain common subjects like
4948 @samp{} and @samp{(none)}.  To make the situation slightly better,
4949 you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
4950 what subjects should be excluded from the gathering process.@*
4951 The default is @samp{^ *$\\|^(none)$}.
4952
4953 @item gnus-summary-thread-gathering-function
4954 @vindex gnus-summary-thread-gathering-function
4955 Gnus gathers threads by looking at @code{Subject} headers.  This means
4956 that totally unrelated articles may end up in the same ``thread'', which
4957 is confusing.  An alternate approach is to look at all the
4958 @code{Message-ID}s in all the @code{References} headers to find matches.
4959 This will ensure that no gathered threads ever include unrelated
4960 articles, but it also means that people who have posted with broken
4961 newsreaders won't be gathered properly.  The choice is yours---plague or
4962 cholera:
4963
4964 @table @code
4965 @item gnus-gather-threads-by-subject
4966 @findex gnus-gather-threads-by-subject
4967 This function is the default gathering function and looks at
4968 @code{Subject}s exclusively.
4969
4970 @item gnus-gather-threads-by-references
4971 @findex gnus-gather-threads-by-references
4972 This function looks at @code{References} headers exclusively.
4973 @end table
4974
4975 If you want to test gathering by @code{References}, you could say
4976 something like:
4977
4978 @lisp
4979 (setq gnus-summary-thread-gathering-function
4980       'gnus-gather-threads-by-references)
4981 @end lisp
4982
4983 @end table
4984
4985
4986 @node Filling In Threads
4987 @subsubsection Filling In Threads
4988
4989 @table @code
4990 @item gnus-fetch-old-headers
4991 @vindex gnus-fetch-old-headers
4992 If non-@code{nil}, Gnus will attempt to build old threads by fetching
4993 more old headers---headers to articles marked as read.  If you
4994 would like to display as few summary lines as possible, but still
4995 connect as many loose threads as possible, you should set this variable
4996 to @code{some} or a number.  If you set it to a number, no more than
4997 that number of extra old headers will be fetched.  In either case,
4998 fetching old headers only works if the backend you are using carries
4999 overview files---this would normally be @code{nntp}, @code{nnspool} and
5000 @code{nnml}.  Also remember that if the root of the thread has been
5001 expired by the server, there's not much Gnus can do about that.
5002
5003 This variable can also be set to @code{invisible}.  This won't have any
5004 visible effects, but is useful if you use the @kbd{A T} command a lot
5005 (@pxref{Finding the Parent}).
5006
5007 @item gnus-build-sparse-threads
5008 @vindex gnus-build-sparse-threads
5009 Fetching old headers can be slow.  A low-rent similar effect can be
5010 gotten by setting this variable to @code{some}.  Gnus will then look at
5011 the complete @code{References} headers of all articles and try to string
5012 together articles that belong in the same thread.  This will leave
5013 @dfn{gaps} in the threading display where Gnus guesses that an article
5014 is missing from the thread.  (These gaps appear like normal summary
5015 lines.  If you select a gap, Gnus will try to fetch the article in
5016 question.)  If this variable is @code{t}, Gnus will display all these
5017 ``gaps'' without regard for whether they are useful for completing the
5018 thread or not.  Finally, if this variable is @code{more}, Gnus won't cut
5019 off sparse leaf nodes that don't lead anywhere.  This variable is
5020 @code{nil} by default.
5021
5022 @end table
5023
5024
5025 @node More Threading
5026 @subsubsection More Threading
5027
5028 @table @code
5029 @item gnus-show-threads
5030 @vindex gnus-show-threads
5031 If this variable is @code{nil}, no threading will be done, and all of
5032 the rest of the variables here will have no effect.  Turning threading
5033 off will speed group selection up a bit, but it is sure to make reading
5034 slower and more awkward.
5035
5036 @item gnus-thread-hide-subtree
5037 @vindex gnus-thread-hide-subtree
5038 If non-@code{nil}, all threads will be hidden when the summary buffer is
5039 generated.
5040
5041 @item gnus-thread-expunge-below
5042 @vindex gnus-thread-expunge-below
5043 All threads that have a total score (as defined by
5044 @code{gnus-thread-score-function}) less than this number will be
5045 expunged.  This variable is @code{nil} by default, which means that no
5046 threads are expunged.
5047
5048 @item gnus-thread-hide-killed
5049 @vindex gnus-thread-hide-killed
5050 if you kill a thread and this variable is non-@code{nil}, the subtree
5051 will be hidden.
5052
5053 @item gnus-thread-ignore-subject
5054 @vindex gnus-thread-ignore-subject
5055 Sometimes somebody changes the subject in the middle of a thread.  If
5056 this variable is non-@code{nil}, the subject change is ignored.  If it
5057 is @code{nil}, which is the default, a change in the subject will result
5058 in a new thread.
5059
5060 @item gnus-thread-indent-level
5061 @vindex gnus-thread-indent-level
5062 This is a number that says how much each sub-thread should be indented.
5063 The default is 4.
5064
5065 @end table
5066
5067
5068 @node Low-Level Threading
5069 @subsubsection Low-Level Threading
5070
5071 @table @code
5072
5073 @item gnus-parse-headers-hook
5074 @vindex gnus-parse-headers-hook
5075 Hook run before parsing any headers.
5076
5077 @item gnus-alter-header-function
5078 @vindex gnus-alter-header-function
5079 If non-@code{nil}, this function will be called to allow alteration of
5080 article header structures.  The function is called with one parameter,
5081 the article header vector, which it may alter in any way.  For instance,
5082 if you have a mail-to-news gateway which alters the @code{Message-ID}s
5083 in systematic ways (by adding prefixes and such), you can use this
5084 variable to un-scramble the @code{Message-ID}s so that they are more
5085 meaningful.  Here's one example:
5086
5087 @lisp
5088 (setq gnus-alter-header-function 'my-alter-message-id)
5089
5090 (defun my-alter-message-id (header)
5091   (let ((id (mail-header-id header)))
5092     (when (string-match
5093            "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
5094       (mail-header-set-id
5095        (concat (match-string 1 id) "@@" (match-string 2 id))
5096        header))))
5097 @end lisp
5098
5099 @end table
5100
5101
5102 @node Thread Commands
5103 @subsection Thread Commands
5104 @cindex thread commands
5105
5106 @table @kbd
5107
5108 @item T k
5109 @itemx M-C-k
5110 @kindex T k (Summary)
5111 @kindex M-C-k (Summary)
5112 @findex gnus-summary-kill-thread
5113 Mark all articles in the current (sub-)thread as read
5114 (@code{gnus-summary-kill-thread}).  If the prefix argument is positive,
5115 remove all marks instead.  If the prefix argument is negative, tick
5116 articles instead.
5117
5118 @item T l
5119 @itemx M-C-l
5120 @kindex T l (Summary)
5121 @kindex M-C-l (Summary)
5122 @findex gnus-summary-lower-thread
5123 Lower the score of the current (sub-)thread
5124 (@code{gnus-summary-lower-thread}).
5125
5126 @item T i
5127 @kindex T i (Summary)
5128 @findex gnus-summary-raise-thread
5129 Increase the score of the current (sub-)thread
5130 (@code{gnus-summary-raise-thread}).
5131
5132 @item T #
5133 @kindex T # (Summary)
5134 @findex gnus-uu-mark-thread
5135 Set the process mark on the current (sub-)thread
5136 (@code{gnus-uu-mark-thread}).
5137
5138 @item T M-#
5139 @kindex T M-# (Summary)
5140 @findex gnus-uu-unmark-thread
5141 Remove the process mark from the current (sub-)thread
5142 (@code{gnus-uu-unmark-thread}).
5143
5144 @item T T
5145 @kindex T T (Summary)
5146 @findex gnus-summary-toggle-threads
5147 Toggle threading (@code{gnus-summary-toggle-threads}).
5148
5149 @item T s
5150 @kindex T s (Summary)
5151 @findex gnus-summary-show-thread
5152 Expose the (sub-)thread hidden under the current article, if any
5153 (@code{gnus-summary-show-thread}).
5154
5155 @item T h
5156 @kindex T h (Summary)
5157 @findex gnus-summary-hide-thread
5158 Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
5159
5160 @item T S
5161 @kindex T S (Summary)
5162 @findex gnus-summary-show-all-threads
5163 Expose all hidden threads (@code{gnus-summary-show-all-threads}).
5164
5165 @item T H
5166 @kindex T H (Summary)
5167 @findex gnus-summary-hide-all-threads
5168 Hide all threads (@code{gnus-summary-hide-all-threads}).
5169
5170 @item T t
5171 @kindex T t (Summary)
5172 @findex gnus-summary-rethread-current
5173 Re-thread the current article's thread
5174 (@code{gnus-summary-rethread-current}).  This works even when the
5175 summary buffer is otherwise unthreaded.
5176
5177 @item T ^
5178 @kindex T ^ (Summary)
5179 @findex gnus-summary-reparent-thread
5180 Make the current article the child of the marked (or previous) article
5181 (@code{gnus-summary-reparent-thread}).
5182
5183 @end table
5184
5185 The following commands are thread movement commands.  They all
5186 understand the numeric prefix.
5187
5188 @table @kbd
5189
5190 @item T n
5191 @kindex T n (Summary)
5192 @findex gnus-summary-next-thread
5193 Go to the next thread (@code{gnus-summary-next-thread}).
5194
5195 @item T p
5196 @kindex T p (Summary)
5197 @findex gnus-summary-prev-thread
5198 Go to the previous thread (@code{gnus-summary-prev-thread}).
5199
5200 @item T d
5201 @kindex T d (Summary)
5202 @findex gnus-summary-down-thread
5203 Descend the thread (@code{gnus-summary-down-thread}).
5204
5205 @item T u
5206 @kindex T u (Summary)
5207 @findex gnus-summary-up-thread
5208 Ascend the thread (@code{gnus-summary-up-thread}).
5209
5210 @item T o
5211 @kindex T o (Summary)
5212 @findex gnus-summary-top-thread
5213 Go to the top of the thread (@code{gnus-summary-top-thread}).
5214 @end table
5215
5216 @vindex gnus-thread-operation-ignore-subject
5217 If you ignore subject while threading, you'll naturally end up with
5218 threads that have several different subjects in them.  If you then issue
5219 a command like `T k' (@code{gnus-summary-kill-thread}) you might not
5220 wish to kill the entire thread, but just those parts of the thread that
5221 have the same subject as the current article.  If you like this idea,
5222 you can fiddle with @code{gnus-thread-operation-ignore-subject}.  If it
5223 is non-@code{nil} (which it is by default), subjects will be ignored
5224 when doing thread commands.  If this variable is @code{nil}, articles in
5225 the same thread with different subjects will not be included in the
5226 operation in question.  If this variable is @code{fuzzy}, only articles
5227 that have subjects fuzzily equal will be included (@pxref{Fuzzy
5228 Matching}).
5229
5230
5231 @node Sorting
5232 @section Sorting
5233
5234 @findex gnus-thread-sort-by-total-score
5235 @findex gnus-thread-sort-by-date
5236 @findex gnus-thread-sort-by-score
5237 @findex gnus-thread-sort-by-subject
5238 @findex gnus-thread-sort-by-author
5239 @findex gnus-thread-sort-by-number
5240 @vindex gnus-thread-sort-functions
5241 If you are using a threaded summary display, you can sort the threads by
5242 setting @code{gnus-thread-sort-functions}, which can be either a single
5243 function, a list of functions, or a list containing functions and
5244 @code{(not some-function)} elements.
5245
5246 By default, sorting is done on article numbers.  Ready-made sorting
5247 predicate functions include @code{gnus-thread-sort-by-number},
5248 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
5249 @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and
5250 @code{gnus-thread-sort-by-total-score}.
5251
5252 Each function takes two threads and returns non-@code{nil} if the first
5253 thread should be sorted before the other.  Note that sorting really is
5254 normally done by looking only at the roots of each thread.
5255
5256 If you use more than one function, the primary sort key should be the
5257 last function in the list.  You should probably always include
5258 @code{gnus-thread-sort-by-number} in the list of sorting
5259 functions---preferably first.  This will ensure that threads that are
5260 equal with respect to the other sort criteria will be displayed in
5261 ascending article order.
5262
5263 If you would like to sort by reverse score, then by subject, and finally
5264 by number, you could do something like:
5265
5266 @lisp
5267 (setq gnus-thread-sort-functions
5268       '(gnus-thread-sort-by-number
5269         gnus-thread-sort-by-subject
5270         (reverse gnus-thread-sort-by-total-score)))
5271 @end lisp
5272
5273 The threads that have highest score will be displayed first in the
5274 summary buffer.  When threads have the same score, they will be sorted
5275 alphabetically.  The threads that have the same score and the same
5276 subject will be sorted by number, which is (normally) the sequence in
5277 which the articles arrived.
5278
5279 If you want to sort by score and then reverse arrival order, you could
5280 say something like:
5281
5282 @lisp
5283 (setq gnus-thread-sort-functions
5284       '((lambda (t1 t2)
5285           (not (gnus-thread-sort-by-number t1 t2)))
5286         gnus-thread-sort-by-score))
5287 @end lisp
5288
5289 @vindex gnus-thread-score-function
5290 The function in the @code{gnus-thread-score-function} variable (default
5291 @code{+}) is used for calculating the total score of a thread.  Useful
5292 functions might be @code{max}, @code{min}, or squared means, or whatever
5293 tickles your fancy.
5294
5295 @findex gnus-article-sort-functions
5296 @findex gnus-article-sort-by-date
5297 @findex gnus-article-sort-by-score
5298 @findex gnus-article-sort-by-subject
5299 @findex gnus-article-sort-by-author
5300 @findex gnus-article-sort-by-number
5301 If you are using an unthreaded display for some strange reason or other,
5302 you have to fiddle with the @code{gnus-article-sort-functions} variable.
5303 It is very similar to the @code{gnus-thread-sort-functions}, except that
5304 it uses slightly different functions for article comparison.  Available
5305 sorting predicate functions are @code{gnus-article-sort-by-number},
5306 @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
5307 @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
5308
5309 If you want to sort an unthreaded summary display by subject, you could
5310 say something like:
5311
5312 @lisp
5313 (setq gnus-article-sort-functions
5314       '(gnus-article-sort-by-number
5315         gnus-article-sort-by-subject))
5316 @end lisp
5317
5318
5319
5320 @node Asynchronous Fetching
5321 @section Asynchronous Article Fetching
5322 @cindex asynchronous article fetching
5323 @cindex article pre-fetch
5324 @cindex pre-fetch
5325
5326 If you read your news from an @sc{nntp} server that's far away, the
5327 network latencies may make reading articles a chore.  You have to wait
5328 for a while after pressing @kbd{n} to go to the next article before the
5329 article appears.  Why can't Gnus just go ahead and fetch the article
5330 while you are reading the previous one?  Why not, indeed.
5331
5332 First, some caveats.  There are some pitfalls to using asynchronous
5333 article fetching, especially the way Gnus does it.
5334
5335 Let's say you are reading article 1, which is short, and article 2 is
5336 quite long, and you are not interested in reading that.  Gnus does not
5337 know this, so it goes ahead and fetches article 2.  You decide to read
5338 article 3, but since Gnus is in the process of fetching article 2, the
5339 connection is blocked.
5340
5341 To avoid these situations, Gnus will open two (count 'em two)
5342 connections to the server.  Some people may think this isn't a very nice
5343 thing to do, but I don't see any real alternatives.  Setting up that
5344 extra connection takes some time, so Gnus startup will be slower.
5345
5346 Gnus will fetch more articles than you will read.  This will mean that
5347 the link between your machine and the @sc{nntp} server will become more
5348 loaded than if you didn't use article pre-fetch.  The server itself will
5349 also become more loaded---both with the extra article requests, and the
5350 extra connection.
5351
5352 Ok, so now you know that you shouldn't really use this thing...  unless
5353 you really want to.
5354
5355 @vindex gnus-asynchronous
5356 Here's how:  Set @code{gnus-asynchronous} to @code{t}.  The rest should
5357 happen automatically.
5358
5359 @vindex gnus-use-article-prefetch
5360 You can control how many articles are to be pre-fetched by setting
5361 @code{gnus-use-article-prefetch}.  This is 30 by default, which means
5362 that when you read an article in the group, the backend will pre-fetch
5363 the next 30 articles.  If this variable is @code{t}, the backend will
5364 pre-fetch all the articles it can without bound.  If it is
5365 @code{nil}, no pre-fetching will be done.
5366
5367 @vindex gnus-async-prefetch-article-p
5368 @findex gnus-async-read-p
5369 There are probably some articles that you don't want to pre-fetch---read
5370 articles, for instance.  The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched.  This function should
5371 return non-@code{nil} when the article in question is to be
5372 pre-fetched.  The default is @code{gnus-async-read-p}, which returns
5373 @code{nil} on read articles.  The function is called with an article
5374 data structure as the only parameter.
5375
5376 If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like:
5377
5378 @lisp
5379 (defun my-async-short-unread-p (data)
5380   "Return non-nil for short, unread articles."
5381   (and (gnus-data-unread-p data)
5382        (< (mail-header-lines (gnus-data-header data))
5383           100)))
5384
5385 (setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
5386 @end lisp
5387
5388 These functions will be called many, many times, so they should
5389 preferably be short and sweet to avoid slowing down Gnus too much.
5390 It's probably a good idea to byte-compile things like this.
5391
5392 @vindex gnus-prefetched-article-deletion-strategy
5393 Articles have to be removed from the asynch buffer sooner or later.  The
5394 @code{gnus-prefetched-article-deletion-strategy} says when to remove
5395 articles.  This is a list that may contain the following elements:
5396
5397 @table @code
5398 @item read
5399 Remove articles when they are read.
5400
5401 @item exit
5402 Remove articles when exiting the group.
5403 @end table
5404
5405 The default value is @code{(read exit)}.
5406
5407 @c @vindex gnus-use-header-prefetch
5408 @c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
5409 @c from the next group.
5410
5411
5412 @node Article Caching
5413 @section Article Caching
5414 @cindex article caching
5415 @cindex caching
5416
5417 If you have an @emph{extremely} slow @sc{nntp} connection, you may
5418 consider turning article caching on.  Each article will then be stored
5419 locally under your home directory.  As you may surmise, this could
5420 potentially use @emph{huge} amounts of disk space, as well as eat up all
5421 your inodes so fast it will make your head swim.  In vodka.
5422
5423 Used carefully, though, it could be just an easier way to save articles.
5424
5425 @vindex gnus-use-long-file-name
5426 @vindex gnus-cache-directory
5427 @vindex gnus-use-cache
5428 To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
5429 all articles ticked or marked as dormant will then be copied
5430 over to your local cache (@code{gnus-cache-directory}).  Whether this
5431 cache is flat or hierarchal is controlled by the
5432 @code{gnus-use-long-file-name} variable, as usual.
5433
5434 When re-selecting a ticked or dormant article, it will be fetched from the
5435 cache instead of from the server.  As articles in your cache will never
5436 expire, this might serve as a method of saving articles while still
5437 keeping them where they belong.  Just mark all articles you want to save
5438 as dormant, and don't worry.
5439
5440 When an article is marked as read, is it removed from the cache.
5441
5442 @vindex gnus-cache-remove-articles
5443 @vindex gnus-cache-enter-articles
5444 The entering/removal of articles from the cache is controlled by the
5445 @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
5446 variables.  Both are lists of symbols.  The first is @code{(ticked
5447 dormant)} by default, meaning that ticked and dormant articles will be
5448 put in the cache.  The latter is @code{(read)} by default, meaning that
5449 articles marked as read are removed from the cache.  Possibly
5450 symbols in these two lists are @code{ticked}, @code{dormant},
5451 @code{unread} and @code{read}.
5452
5453 @findex gnus-jog-cache
5454 So where does the massive article-fetching and storing come into the
5455 picture?  The @code{gnus-jog-cache} command will go through all
5456 subscribed newsgroups, request all unread articles, score them, and
5457 store them in the cache.  You should only ever, ever ever ever, use this
5458 command if 1) your connection to the @sc{nntp} server is really, really,
5459 really slow and 2) you have a really, really, really huge disk.
5460 Seriously.  One way to cut down on the number of articles downloaded is
5461 to score unwanted articles down and have them marked as read.  They will
5462 not then be downloaded by this command.
5463
5464 @vindex gnus-uncacheable-groups
5465 @vindex gnus-cacheable-groups
5466 It is likely that you do not want caching on all groups.  For instance,
5467 if your @code{nnml} mail is located under your home directory, it makes no
5468 sense to cache it somewhere else under your home directory.  Unless you
5469 feel that it's neat to use twice as much space.
5470
5471 To limit the caching, you could set @code{gnus-cacheable-groups} to a
5472 regexp of groups to cache, @samp{^nntp} for instance, or set the
5473 @code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
5474 Both variables are @code{nil} by default. If a group matches both
5475 variables, the group is not cached.
5476
5477 @findex gnus-cache-generate-nov-databases
5478 @findex gnus-cache-generate-active
5479 @vindex gnus-cache-active-file
5480 The cache stores information on what articles it contains in its active
5481 file (@code{gnus-cache-active-file}).  If this file (or any other parts
5482 of the cache) becomes all messed up for some reason or other, Gnus
5483 offers two functions that will try to set things right.  @kbd{M-x
5484 gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
5485 files, and @kbd{gnus-cache-generate-active} will (re)generate the active
5486 file.
5487
5488
5489 @node Persistent Articles
5490 @section Persistent Articles
5491 @cindex persistent articles
5492
5493 Closely related to article caching, we have @dfn{persistent articles}.
5494 In fact, it's just a different way of looking at caching, and much more
5495 useful in my opinion.
5496
5497 Say you're reading a newsgroup, and you happen on to some valuable gem
5498 that you want to keep and treasure forever.  You'd normally just save it
5499 (using one of the many saving commands) in some file.  The problem with
5500 that is that it's just, well, yucky.  Ideally you'd prefer just having
5501 the article remain in the group where you found it forever; untouched by
5502 the expiry going on at the news server.
5503
5504 This is what a @dfn{persistent article} is---an article that just won't
5505 be deleted.  It's implemented using the normal cache functions, but
5506 you use two explicit commands for managing persistent articles:
5507
5508 @table @kbd
5509
5510 @item *
5511 @kindex * (Summary)
5512 @findex gnus-cache-enter-article
5513 Make the current article persistent (@code{gnus-cache-enter-article}).
5514
5515 @item M-*
5516 @kindex M-* (Summary)
5517 @findex gnus-cache-remove-article
5518 Remove the current article from the persistent articles
5519 (@code{gnus-cache-remove-article}).  This will normally delete the
5520 article.
5521 @end table
5522
5523 Both these commands understand the process/prefix convention.
5524
5525 To avoid having all ticked articles (and stuff) entered into the cache,
5526 you should set @code{gnus-use-cache} to @code{passive} if you're just
5527 interested in persistent articles:
5528
5529 @lisp
5530 (setq gnus-use-cache 'passive)
5531 @end lisp
5532
5533
5534 @node Article Backlog
5535 @section Article Backlog
5536 @cindex backlog
5537 @cindex article backlog
5538
5539 If you have a slow connection, but the idea of using caching seems
5540 unappealing to you (and it is, really), you can help the situation some
5541 by switching on the @dfn{backlog}.  This is where Gnus will buffer
5542 already read articles so that it doesn't have to re-fetch articles
5543 you've already read.  This only helps if you are in the habit of
5544 re-selecting articles you've recently read, of course.  If you never do
5545 that, turning the backlog on will slow Gnus down a little bit, and
5546 increase memory usage some.
5547
5548 @vindex gnus-keep-backlog
5549 If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
5550 at most @var{n} old articles in a buffer for later re-fetching.  If this
5551 variable is non-@code{nil} and is not a number, Gnus will store
5552 @emph{all} read articles, which means that your Emacs will grow without
5553 bound before exploding and taking your machine down with you.  I put
5554 that in there just to keep y'all on your toes.
5555
5556 This variable is @code{nil} by default.
5557
5558
5559 @node Saving Articles
5560 @section Saving Articles
5561 @cindex saving articles
5562
5563 Gnus can save articles in a number of ways.  Below is the documentation
5564 for saving articles in a fairly straight-forward fashion (i.e., little
5565 processing of the article is done before it is saved).  For a different
5566 approach (uudecoding, unsharing) you should use @code{gnus-uu}
5567 (@pxref{Decoding Articles}).
5568
5569 @vindex gnus-save-all-headers
5570 If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
5571 unwanted headers before saving the article.
5572
5573 @vindex gnus-saved-headers
5574 If the preceding variable is @code{nil}, all headers that match the
5575 @code{gnus-saved-headers} regexp will be kept, while the rest will be
5576 deleted before saving.
5577
5578 @table @kbd
5579
5580 @item O o
5581 @itemx o
5582 @kindex O o (Summary)
5583 @kindex o (Summary)
5584 @findex gnus-summary-save-article
5585 @c @icon{gnus-summary-save-article}
5586 Save the current article using the default article saver
5587 (@code{gnus-summary-save-article}).
5588
5589 @item O m
5590 @kindex O m (Summary)
5591 @findex gnus-summary-save-article-mail
5592 Save the current article in mail format
5593 (@code{gnus-summary-save-article-mail}).
5594
5595 @item O r
5596 @kindex O r (Summary)
5597 @findex gnus-summary-save-article-rmail
5598 Save the current article in rmail format
5599 (@code{gnus-summary-save-article-rmail}).
5600
5601 @item O f
5602 @kindex O f (Summary)
5603 @findex gnus-summary-save-article-file
5604 @c @icon{gnus-summary-save-article-file}
5605 Save the current article in plain file format
5606 (@code{gnus-summary-save-article-file}).
5607
5608 @item O F
5609 @kindex O F (Summary)
5610 @findex gnus-summary-write-article-file
5611 Write the current article in plain file format, overwriting any previous
5612 file contents (@code{gnus-summary-write-article-file}).
5613
5614 @item O b
5615 @kindex O b (Summary)
5616 @findex gnus-summary-save-article-body-file
5617 Save the current article body in plain file format
5618 (@code{gnus-summary-save-article-body-file}).
5619
5620 @item O h
5621 @kindex O h (Summary)
5622 @findex gnus-summary-save-article-folder
5623 Save the current article in mh folder format
5624 (@code{gnus-summary-save-article-folder}).
5625
5626 @item O v
5627 @kindex O v (Summary)
5628 @findex gnus-summary-save-article-vm
5629 Save the current article in a VM folder
5630 (@code{gnus-summary-save-article-vm}).
5631
5632 @item O p
5633 @kindex O p (Summary)
5634 @findex gnus-summary-pipe-output
5635 Save the current article in a pipe.  Uhm, like, what I mean is---Pipe
5636 the current article to a process (@code{gnus-summary-pipe-output}).
5637 @end table
5638
5639 @vindex gnus-prompt-before-saving
5640 All these commands use the process/prefix convention
5641 (@pxref{Process/Prefix}).  If you save bunches of articles using these
5642 functions, you might get tired of being prompted for files to save each
5643 and every article in.  The prompting action is controlled by
5644 the @code{gnus-prompt-before-saving} variable, which is @code{always} by
5645 default, giving you that excessive prompting action you know and
5646 loathe.  If you set this variable to @code{t} instead, you'll be prompted
5647 just once for each series of articles you save.  If you like to really
5648 have Gnus do all your thinking for you, you can even set this variable
5649 to @code{nil}, which means that you will never be prompted for files to
5650 save articles in.  Gnus will simply save all the articles in the default
5651 files.
5652
5653
5654 @vindex gnus-default-article-saver
5655 You can customize the @code{gnus-default-article-saver} variable to make
5656 Gnus do what you want it to.  You can use any of the six ready-made
5657 functions below, or you can create your own.
5658
5659 @table @code
5660
5661 @item gnus-summary-save-in-rmail
5662 @findex gnus-summary-save-in-rmail
5663 @vindex gnus-rmail-save-name
5664 @findex gnus-plain-save-name
5665 This is the default format, @dfn{babyl}.  Uses the function in the
5666 @code{gnus-rmail-save-name} variable to get a file name to save the
5667 article in.  The default is @code{gnus-plain-save-name}.
5668
5669 @item gnus-summary-save-in-mail
5670 @findex gnus-summary-save-in-mail
5671 @vindex gnus-mail-save-name
5672 Save in a Unix mail (mbox) file.  Uses the function in the
5673 @code{gnus-mail-save-name} variable to get a file name to save the
5674 article in.  The default is @code{gnus-plain-save-name}.
5675
5676 @item gnus-summary-save-in-file
5677 @findex gnus-summary-save-in-file
5678 @vindex gnus-file-save-name
5679 @findex gnus-numeric-save-name
5680 Append the article straight to an ordinary file.  Uses the function in
5681 the @code{gnus-file-save-name} variable to get a file name to save the
5682 article in.  The default is @code{gnus-numeric-save-name}.
5683
5684 @item gnus-summary-save-body-in-file
5685 @findex gnus-summary-save-body-in-file
5686 Append the article body to an ordinary file.  Uses the function in the
5687 @code{gnus-file-save-name} variable to get a file name to save the
5688 article in.  The default is @code{gnus-numeric-save-name}.
5689
5690 @item gnus-summary-save-in-folder
5691 @findex gnus-summary-save-in-folder
5692 @findex gnus-folder-save-name
5693 @findex gnus-Folder-save-name
5694 @vindex gnus-folder-save-name
5695 @cindex rcvstore
5696 @cindex MH folders
5697 Save the article to an MH folder using @code{rcvstore} from the MH
5698 library.  Uses the function in the @code{gnus-folder-save-name} variable
5699 to get a file name to save the article in.  The default is
5700 @code{gnus-folder-save-name}, but you can also use
5701 @code{gnus-Folder-save-name}, which creates capitalized names.
5702
5703 @item gnus-summary-save-in-vm
5704 @findex gnus-summary-save-in-vm
5705 Save the article in a VM folder.  You have to have the VM mail
5706 reader to use this setting.
5707 @end table
5708
5709 @vindex gnus-article-save-directory
5710 All of these functions, except for the last one, will save the article
5711 in the @code{gnus-article-save-directory}, which is initialized from the
5712 @code{SAVEDIR} environment variable.  This is @file{~/News/} by
5713 default.
5714
5715 As you can see above, the functions use different functions to find a
5716 suitable name of a file to save the article in.  Below is a list of
5717 available functions that generate names:
5718
5719 @table @code
5720
5721 @item gnus-Numeric-save-name
5722 @findex gnus-Numeric-save-name
5723 File names like @file{~/News/Alt.andrea-dworkin/45}.
5724
5725 @item gnus-numeric-save-name
5726 @findex gnus-numeric-save-name
5727 File names like @file{~/News/alt.andrea-dworkin/45}.
5728
5729 @item gnus-Plain-save-name
5730 @findex gnus-Plain-save-name
5731 File names like @file{~/News/Alt.andrea-dworkin}.
5732
5733 @item gnus-plain-save-name
5734 @findex gnus-plain-save-name
5735 File names like @file{~/News/alt.andrea-dworkin}.
5736 @end table
5737
5738 @vindex gnus-split-methods
5739 You can have Gnus suggest where to save articles by plonking a regexp into
5740 the @code{gnus-split-methods} alist.  For instance, if you would like to
5741 save articles related to Gnus in the file @file{gnus-stuff}, and articles
5742 related to VM in @code{vm-stuff}, you could set this variable to something
5743 like:
5744
5745 @lisp
5746 (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
5747  ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
5748  (my-choosing-function "../other-dir/my-stuff")
5749  ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
5750 @end lisp
5751
5752 We see that this is a list where each element is a list that has two
5753 elements---the @dfn{match} and the @dfn{file}.  The match can either be
5754 a string (in which case it is used as a regexp to match on the article
5755 head); it can be a symbol (which will be called as a function with the
5756 group name as a parameter); or it can be a list (which will be
5757 @code{eval}ed).  If any of these actions have a non-@code{nil} result,
5758 the @dfn{file} will be used as a default prompt.  In addition, the
5759 result of the operation itself will be used if the function or form
5760 called returns a string or a list of strings.
5761
5762 You basically end up with a list of file names that might be used when
5763 saving the current article.  (All ``matches'' will be used.)  You will
5764 then be prompted for what you really want to use as a name, with file
5765 name completion over the results from applying this variable.
5766
5767 This variable is @code{((gnus-article-archive-name))} by default, which
5768 means that Gnus will look at the articles it saves for an
5769 @code{Archive-name} line and use that as a suggestion for the file
5770 name.
5771
5772 Here's an example function to clean up file names somewhat.  If you have
5773 lots of mail groups called things like
5774 @samp{nnml:mail.whatever}, you may want to chop off the beginning of
5775 these group names before creating the file name to save to.  The
5776 following will do just that:
5777
5778 @lisp
5779 (defun my-save-name (group)
5780   (when (string-match "^nnml:mail." group)
5781     (substring group (match-end 0))))
5782
5783 (setq gnus-split-methods
5784       '((gnus-article-archive-name)
5785         (my-save-name)))
5786 @end lisp
5787
5788
5789 @vindex gnus-use-long-file-name
5790 Finally, you have the @code{gnus-use-long-file-name} variable.  If it is
5791 @code{nil}, all the preceding functions will replace all periods
5792 (@samp{.}) in the group names with slashes (@samp{/})---which means that
5793 the functions will generate hierarchies of directories instead of having
5794 all the files in the top level directory
5795 (@file{~/News/alt/andrea-dworkin} instead of
5796 @file{~/News/alt.andrea-dworkin}.)  This variable is @code{t} by default
5797 on most systems.  However, for historical reasons, this is @code{nil} on
5798 Xenix and usg-unix-v machines by default.
5799
5800 This function also affects kill and score file names.  If this variable
5801 is a list, and the list contains the element @code{not-score}, long file
5802 names will not be used for score files, if it contains the element
5803 @code{not-save}, long file names will not be used for saving, and if it
5804 contains the element @code{not-kill}, long file names will not be used
5805 for kill files.
5806
5807 If you'd like to save articles in a hierarchy that looks something like
5808 a spool, you could
5809
5810 @lisp
5811 (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
5812 (setq gnus-default-article-saver 'gnus-summary-save-in-file) ; no encoding
5813 @end lisp
5814
5815 Then just save with @kbd{o}.  You'd then read this hierarchy with
5816 ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
5817 the top level directory as the argument (@file{~/News/}).  Then just walk
5818 around to the groups/directories with @code{nneething}.
5819
5820
5821 @node Decoding Articles
5822 @section Decoding Articles
5823 @cindex decoding articles
5824
5825 Sometime users post articles (or series of articles) that have been
5826 encoded in some way or other.  Gnus can decode them for you.
5827
5828 @menu
5829 * Uuencoded Articles::    Uudecode articles.
5830 * Shell Archives::        Unshar articles.
5831 * PostScript Files::      Split PostScript.
5832 * Other Files::           Plain save and binhex.
5833 * Decoding Variables::    Variables for a happy decoding.
5834 * Viewing Files::         You want to look at the result of the decoding?
5835 @end menu
5836
5837 @cindex series
5838 @cindex article series
5839 All these functions use the process/prefix convention
5840 (@pxref{Process/Prefix}) for finding out what articles to work on, with
5841 the extension that a ``single article'' means ``a single series''.  Gnus
5842 can find out by itself what articles belong to a series, decode all the
5843 articles and unpack/view/save the resulting file(s).
5844
5845 Gnus guesses what articles are in the series according to the following
5846 simplish rule: The subjects must be (nearly) identical, except for the
5847 last two numbers of the line.  (Spaces are largely ignored, however.)
5848
5849 For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
5850 will find all the articles that match the regexp @samp{^cat.gif
5851 ([0-9]+/[0-9]+).*$}.
5852
5853 Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
5854 series}, will not be properly recognized by any of the automatic viewing
5855 commands, and you have to mark the articles manually with @kbd{#}.
5856
5857
5858 @node Uuencoded Articles
5859 @subsection Uuencoded Articles
5860 @cindex uudecode
5861 @cindex uuencoded articles
5862
5863 @table @kbd
5864
5865 @item X u
5866 @kindex X u (Summary)
5867 @findex gnus-uu-decode-uu
5868 @c @icon{gnus-uu-decode-uu}
5869 Uudecodes the current series (@code{gnus-uu-decode-uu}).
5870
5871 @item X U
5872 @kindex X U (Summary)
5873 @findex gnus-uu-decode-uu-and-save
5874 Uudecodes and saves the current series
5875 (@code{gnus-uu-decode-uu-and-save}).
5876
5877 @item X v u
5878 @kindex X v u (Summary)
5879 @findex gnus-uu-decode-uu-view
5880 Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
5881
5882 @item X v U
5883 @kindex X v U (Summary)
5884 @findex gnus-uu-decode-uu-and-save-view
5885 Uudecodes, views and saves the current series
5886 (@code{gnus-uu-decode-uu-and-save-view}).
5887
5888 @end table
5889
5890 Remember that these all react to the presence of articles marked with
5891 the process mark.  If, for instance, you'd like to decode and save an
5892 entire newsgroup, you'd typically do @kbd{M P a}
5893 (@code{gnus-uu-mark-all}) and then @kbd{X U}
5894 (@code{gnus-uu-decode-uu-and-save}).
5895
5896 All this is very much different from how @code{gnus-uu} worked with
5897 @sc{gnus 4.1}, where you had explicit keystrokes for everything under
5898 the sun.  This version of @code{gnus-uu} generally assumes that you mark
5899 articles in some way (@pxref{Setting Process Marks}) and then press
5900 @kbd{X u}.
5901
5902 @vindex gnus-uu-notify-files
5903 Note: When trying to decode articles that have names matching
5904 @code{gnus-uu-notify-files}, which is hard-coded to
5905 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
5906 automatically post an article on @samp{comp.unix.wizards} saying that
5907 you have just viewed the file in question.  This feature can't be turned
5908 off.
5909
5910
5911 @node Shell Archives
5912 @subsection Shell Archives
5913 @cindex unshar
5914 @cindex shell archives
5915 @cindex shared articles
5916
5917 Shell archives (``shar files'') used to be a popular way to distribute
5918 sources, but it isn't used all that much today.  In any case, we have
5919 some commands to deal with these:
5920
5921 @table @kbd
5922
5923 @item X s
5924 @kindex X s (Summary)
5925 @findex gnus-uu-decode-unshar
5926 Unshars the current series (@code{gnus-uu-decode-unshar}).
5927
5928 @item X S
5929 @kindex X S (Summary)
5930 @findex gnus-uu-decode-unshar-and-save
5931 Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
5932
5933 @item X v s
5934 @kindex X v s (Summary)
5935 @findex gnus-uu-decode-unshar-view
5936 Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
5937
5938 @item X v S
5939 @kindex X v S (Summary)
5940 @findex gnus-uu-decode-unshar-and-save-view
5941 Unshars, views and saves the current series
5942 (@code{gnus-uu-decode-unshar-and-save-view}).
5943 @end table
5944
5945
5946 @node PostScript Files
5947 @subsection PostScript Files
5948 @cindex PostScript
5949
5950 @table @kbd
5951
5952 @item X p
5953 @kindex X p (Summary)
5954 @findex gnus-uu-decode-postscript
5955 Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
5956
5957 @item X P
5958 @kindex X P (Summary)
5959 @findex gnus-uu-decode-postscript-and-save
5960 Unpack and save the current PostScript series
5961 (@code{gnus-uu-decode-postscript-and-save}).
5962
5963 @item X v p
5964 @kindex X v p (Summary)
5965 @findex gnus-uu-decode-postscript-view
5966 View the current PostScript series
5967 (@code{gnus-uu-decode-postscript-view}).
5968
5969 @item X v P
5970 @kindex X v P (Summary)
5971 @findex gnus-uu-decode-postscript-and-save-view
5972 View and save the current PostScript series
5973 (@code{gnus-uu-decode-postscript-and-save-view}).
5974 @end table
5975
5976
5977 @node Other Files
5978 @subsection Other Files
5979
5980 @table @kbd
5981 @item X o
5982 @kindex X o (Summary)
5983 @findex gnus-uu-decode-save
5984 Save the current series
5985 (@code{gnus-uu-decode-save}).
5986
5987 @item X b
5988 @kindex X b (Summary)
5989 @findex gnus-uu-decode-binhex
5990 Unbinhex the current series (@code{gnus-uu-decode-binhex}).  This
5991 doesn't really work yet.
5992 @end table
5993
5994
5995 @node Decoding Variables
5996 @subsection Decoding Variables
5997
5998 Adjective, not verb.
5999
6000 @menu
6001 * Rule Variables::          Variables that say how a file is to be viewed.
6002 * Other Decode Variables::  Other decode variables.
6003 * Uuencoding and Posting::  Variables for customizing uuencoding.
6004 @end menu
6005
6006
6007 @node Rule Variables
6008 @subsubsection Rule Variables
6009 @cindex rule variables
6010
6011 Gnus uses @dfn{rule variables} to decide how to view a file.  All these
6012 variables are of the form
6013
6014 @lisp
6015       (list '(regexp1 command2)
6016             '(regexp2 command2)
6017             ...)
6018 @end lisp
6019
6020 @table @code
6021
6022 @item gnus-uu-user-view-rules
6023 @vindex gnus-uu-user-view-rules
6024 @cindex sox
6025 This variable is consulted first when viewing files.  If you wish to use,
6026 for instance, @code{sox} to convert an @samp{.au} sound file, you could
6027 say something like:
6028 @lisp
6029 (setq gnus-uu-user-view-rules
6030       (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
6031 @end lisp
6032
6033 @item gnus-uu-user-view-rules-end
6034 @vindex gnus-uu-user-view-rules-end
6035 This variable is consulted if Gnus couldn't make any matches from the
6036 user and default view rules.
6037
6038 @item gnus-uu-user-archive-rules
6039 @vindex gnus-uu-user-archive-rules
6040 This variable can be used to say what commands should be used to unpack
6041 archives.
6042 @end table
6043
6044
6045 @node Other Decode Variables
6046 @subsubsection Other Decode Variables
6047
6048 @table @code
6049 @vindex gnus-uu-grabbed-file-functions
6050
6051 @item gnus-uu-grabbed-file-functions
6052 All functions in this list will be called right after each file has been
6053 successfully decoded---so that you can move or view files right away,
6054 and don't have to wait for all files to be decoded before you can do
6055 anything.  Ready-made functions you can put in this list are:
6056
6057 @table @code
6058
6059 @item gnus-uu-grab-view
6060 @findex gnus-uu-grab-view
6061 View the file.
6062
6063 @item gnus-uu-grab-move
6064 @findex gnus-uu-grab-move
6065 Move the file (if you're using a saving function.)
6066 @end table
6067
6068 @item gnus-uu-be-dangerous
6069 @vindex gnus-uu-be-dangerous
6070 Specifies what to do if unusual situations arise during decoding.  If
6071 @code{nil}, be as conservative as possible.  If @code{t}, ignore things
6072 that didn't work, and overwrite existing files.  Otherwise, ask each
6073 time.
6074
6075 @item gnus-uu-ignore-files-by-name
6076 @vindex gnus-uu-ignore-files-by-name
6077 Files with name matching this regular expression won't be viewed.
6078
6079 @item gnus-uu-ignore-files-by-type
6080 @vindex gnus-uu-ignore-files-by-type
6081 Files with a @sc{mime} type matching this variable won't be viewed.
6082 Note that Gnus tries to guess what type the file is based on the name.
6083 @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
6084 kludgey.
6085
6086 @item gnus-uu-tmp-dir
6087 @vindex gnus-uu-tmp-dir
6088 Where @code{gnus-uu} does its work.
6089
6090 @item gnus-uu-do-not-unpack-archives
6091 @vindex gnus-uu-do-not-unpack-archives
6092 Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
6093 looking for files to display.
6094
6095 @item gnus-uu-view-and-save
6096 @vindex gnus-uu-view-and-save
6097 Non-@code{nil} means that the user will always be asked to save a file
6098 after viewing it.
6099
6100 @item gnus-uu-ignore-default-view-rules
6101 @vindex gnus-uu-ignore-default-view-rules
6102 Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
6103 rules.
6104
6105 @item gnus-uu-ignore-default-archive-rules
6106 @vindex gnus-uu-ignore-default-archive-rules
6107 Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
6108 unpacking commands.
6109
6110 @item gnus-uu-kill-carriage-return
6111 @vindex gnus-uu-kill-carriage-return
6112 Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
6113 from articles.
6114
6115 @item gnus-uu-unmark-articles-not-decoded
6116 @vindex gnus-uu-unmark-articles-not-decoded
6117 Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
6118 decoded articles as unread.
6119
6120 @item gnus-uu-correct-stripped-uucode
6121 @vindex gnus-uu-correct-stripped-uucode
6122 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
6123 uuencoded files that have had trailing spaces deleted.
6124
6125 @item gnus-uu-pre-uudecode-hook
6126 @vindex gnus-uu-pre-uudecode-hook
6127 Hook run before sending a message to @code{uudecode}.
6128
6129 @item gnus-uu-view-with-metamail
6130 @vindex gnus-uu-view-with-metamail
6131 @cindex metamail
6132 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
6133 commands defined by the rule variables and just fudge a @sc{mime}
6134 content type based on the file name.  The result will be fed to
6135 @code{metamail} for viewing.
6136
6137 @item gnus-uu-save-in-digest
6138 @vindex gnus-uu-save-in-digest
6139 Non-@code{nil} means that @code{gnus-uu}, when asked to save without
6140 decoding, will save in digests.  If this variable is @code{nil},
6141 @code{gnus-uu} will just save everything in a file without any
6142 embellishments.  The digesting almost conforms to RFC1153---no easy way
6143 to specify any meaningful volume and issue numbers were found, so I
6144 simply dropped them.
6145
6146 @end table
6147
6148
6149 @node Uuencoding and Posting
6150 @subsubsection Uuencoding and Posting
6151
6152 @table @code
6153
6154 @item gnus-uu-post-include-before-composing
6155 @vindex gnus-uu-post-include-before-composing
6156 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
6157 before you compose the article.  If this variable is @code{t}, you can
6158 either include an encoded file with @kbd{C-c C-i} or have one included
6159 for you when you post the article.
6160
6161 @item gnus-uu-post-length
6162 @vindex gnus-uu-post-length
6163 Maximum length of an article.  The encoded file will be split into how
6164 many articles it takes to post the entire file.
6165
6166 @item gnus-uu-post-threaded
6167 @vindex gnus-uu-post-threaded
6168 Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
6169 thread.  This may not be smart, as no other decoder I have seen is able
6170 to follow threads when collecting uuencoded articles.  (Well, I have
6171 seen one package that does that---@code{gnus-uu}, but somehow, I don't
6172 think that counts...) Default is @code{nil}.
6173
6174 @item gnus-uu-post-separate-description
6175 @vindex gnus-uu-post-separate-description
6176 Non-@code{nil} means that the description will be posted in a separate
6177 article.  The first article will typically be numbered (0/x).  If this
6178 variable is @code{nil}, the description the user enters will be included
6179 at the beginning of the first article, which will be numbered (1/x).
6180 Default is @code{t}.
6181
6182 @end table
6183
6184
6185 @node Viewing Files
6186 @subsection Viewing Files
6187 @cindex viewing files
6188 @cindex pseudo-articles
6189
6190 After decoding, if the file is some sort of archive, Gnus will attempt
6191 to unpack the archive and see if any of the files in the archive can be
6192 viewed.  For instance, if you have a gzipped tar file @file{pics.tar.gz}
6193 containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
6194 uncompress and de-tar the main file, and then view the two pictures.
6195 This unpacking process is recursive, so if the archive contains archives
6196 of archives, it'll all be unpacked.
6197
6198 Finally, Gnus will normally insert a @dfn{pseudo-article} for each
6199 extracted file into the summary buffer.  If you go to these
6200 ``articles'', you will be prompted for a command to run (usually Gnus
6201 will make a suggestion), and then the command will be run.
6202
6203 @vindex gnus-view-pseudo-asynchronously
6204 If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
6205 until the viewing is done before proceeding.
6206
6207 @vindex gnus-view-pseudos
6208 If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
6209 the pseudo-articles into the summary buffer, but view them
6210 immediately.  If this variable is @code{not-confirm}, the user won't even
6211 be asked for a confirmation before viewing is done.
6212
6213 @vindex gnus-view-pseudos-separately
6214 If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
6215 pseudo-article will be created for each file to be viewed.  If
6216 @code{nil}, all files that use the same viewing command will be given as
6217 a list of parameters to that command.
6218
6219 @vindex gnus-insert-pseudo-articles
6220 If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
6221 pseudo-articles when decoding.  It is @code{t} by default.
6222
6223 So; there you are, reading your @emph{pseudo-articles} in your
6224 @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
6225 Why isn't anything real anymore? How did we get here?
6226
6227
6228 @node Article Treatment
6229 @section Article Treatment
6230
6231 Reading through this huge manual, you may have quite forgotten that the
6232 object of newsreaders is to actually, like, read what people have
6233 written.  Reading articles.  Unfortunately, people are quite bad at
6234 writing, so there are tons of functions and variables to make reading
6235 these articles easier.
6236
6237 @menu
6238 * Article Highlighting::    You want to make the article look like fruit salad.
6239 * Article Fontisizing::     Making emphasized text look nice.
6240 * Article Hiding::          You also want to make certain info go away.
6241 * Article Washing::         Lots of way-neat functions to make life better.
6242 * Article Buttons::         Click on URLs, Message-IDs, addresses and the like.
6243 * Article Date::            Grumble, UT!
6244 * Article Signature::       What is a signature?
6245 @end menu
6246
6247
6248 @node Article Highlighting
6249 @subsection Article Highlighting
6250 @cindex highlighting
6251
6252 Not only do you want your article buffer to look like fruit salad, but
6253 you want it to look like technicolor fruit salad.
6254
6255 @table @kbd
6256
6257 @item W H a
6258 @kindex W H a (Summary)
6259 @findex gnus-article-highlight
6260 @findex gnus-article-maybe-highlight
6261 Do much highlighting of the current article
6262 (@code{gnus-article-highlight}).  This function highlights header, cited
6263 text, the signature, and adds buttons to the body and the head.
6264
6265 @item W H h
6266 @kindex W H h (Summary)
6267 @findex gnus-article-highlight-headers
6268 @vindex gnus-header-face-alist
6269 Highlight the headers (@code{gnus-article-highlight-headers}).  The
6270 highlighting will be done according to the @code{gnus-header-face-alist}
6271 variable, which is a list where each element has the form @var{(regexp
6272 name content)}.  @var{regexp} is a regular expression for matching the
6273 header, @var{name} is the face used for highlighting the header name
6274 (@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
6275 the header value.  The first match made will be used.  Note that
6276 @var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
6277
6278 @item W H c
6279 @kindex W H c (Summary)
6280 @findex gnus-article-highlight-citation
6281 Highlight cited text (@code{gnus-article-highlight-citation}).
6282
6283 Some variables to customize the citation highlights:
6284
6285 @table @code
6286 @vindex gnus-cite-parse-max-size
6287
6288 @item gnus-cite-parse-max-size
6289 If the article size if bigger than this variable (which is 25000 by
6290 default), no citation highlighting will be performed.
6291
6292 @item gnus-cite-prefix-regexp
6293 @vindex gnus-cite-prefix-regexp
6294 Regexp matching the longest possible citation prefix on a line.
6295
6296 @item gnus-cite-max-prefix
6297 @vindex gnus-cite-max-prefix
6298 Maximum possible length for a citation prefix (default 20).
6299
6300 @item gnus-cite-face-list
6301 @vindex gnus-cite-face-list
6302 List of faces used for highlighting citations (@pxref{Faces and Fonts}).
6303 When there are citations from multiple articles in the same message,
6304 Gnus will try to give each citation from each article its own face.
6305 This should make it easier to see who wrote what.
6306
6307 @item gnus-supercite-regexp
6308 @vindex gnus-supercite-regexp
6309 Regexp matching normal Supercite attribution lines.
6310
6311 @item gnus-supercite-secondary-regexp
6312 @vindex gnus-supercite-secondary-regexp
6313 Regexp matching mangled Supercite attribution lines.
6314
6315 @item gnus-cite-minimum-match-count
6316 @vindex gnus-cite-minimum-match-count
6317 Minimum number of identical prefixes we have to see before we believe
6318 that it's a citation.
6319
6320 @item gnus-cite-attribution-prefix
6321 @vindex gnus-cite-attribution-prefix
6322 Regexp matching the beginning of an attribution line.
6323
6324 @item gnus-cite-attribution-suffix
6325 @vindex gnus-cite-attribution-suffix
6326 Regexp matching the end of an attribution line.
6327
6328 @item gnus-cite-attribution-face
6329 @vindex gnus-cite-attribution-face
6330 Face used for attribution lines.  It is merged with the face for the
6331 cited text belonging to the attribution.
6332
6333 @end table
6334
6335
6336 @item W H s
6337 @kindex W H s (Summary)
6338 @vindex gnus-signature-separator
6339 @vindex gnus-signature-face
6340 @findex gnus-article-highlight-signature
6341 Highlight the signature (@code{gnus-article-highlight-signature}).
6342 Everything after @code{gnus-signature-separator} (@pxref{Article
6343 Signature}) in an article will be considered a signature and will be
6344 highlighted with @code{gnus-signature-face}, which is @code{italic} by
6345 default.
6346
6347 @end table
6348
6349 @xref{Customizing Articles} for how to highlight articles automatically.
6350
6351
6352 @node Article Fontisizing
6353 @subsection Article Fontisizing
6354 @cindex emphasis
6355 @cindex article emphasis
6356
6357 @findex gnus-article-emphasize
6358 @kindex W e (Summary)
6359 People commonly add emphasis to words in news articles by writing things
6360 like @samp{_this_} or @samp{*this*}.  Gnus can make this look nicer by
6361 running the article through the @kbd{W e}
6362 (@code{gnus-article-emphasize}) command.
6363
6364 @vindex gnus-emphasis-alist
6365 How the emphasis is computed is controlled by the
6366 @code{gnus-emphasis-alist} variable.  This is an alist where the first
6367 element is a regular expression to be matched.  The second is a number
6368 that says what regular expression grouping is used to find the entire
6369 emphasized word.  The third is a number that says what regexp grouping
6370 should be displayed and highlighted.  (The text between these two
6371 groupings will be hidden.)  The fourth is the face used for
6372 highlighting.
6373
6374 @lisp
6375 (setq gnus-article-emphasis
6376       '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
6377         ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
6378 @end lisp
6379
6380 @vindex gnus-emphasis-underline
6381 @vindex gnus-emphasis-bold
6382 @vindex gnus-emphasis-italic
6383 @vindex gnus-emphasis-underline-bold
6384 @vindex gnus-emphasis-underline-italic
6385 @vindex gnus-emphasis-bold-italic
6386 @vindex gnus-emphasis-underline-bold-italic
6387 By default, there are seven rules, and they use the following faces:
6388 @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
6389 @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
6390 @code{gnus-emphasis-underline-italic},
6391 @code{gnus-emphasis-underline-bold}, and
6392 @code{gnus-emphasis-underline-bold-italic}.
6393
6394 If you want to change these faces, you can either use @kbd{M-x
6395 customize}, or you can use @code{copy-face}.  For instance, if you want
6396 to make @code{gnus-emphasis-italic} use a red face instead, you could
6397 say something like:
6398
6399 @lisp
6400 (copy-face 'red 'gnus-emphasis-italic)
6401 @end lisp
6402
6403 @xref{Customizing Articles} for how to fontize articles automatically.
6404
6405
6406 @node Article Hiding
6407 @subsection Article Hiding
6408 @cindex article hiding
6409
6410 Or rather, hiding certain things in each article.  There usually is much
6411 too much cruft in most articles.
6412
6413 @table @kbd
6414
6415 @item W W a
6416 @kindex W W a (Summary)
6417 @findex gnus-article-hide
6418 Do quite a lot of hiding on the article buffer
6419 (@kbd{gnus-article-hide}).  In particular, this function will hide
6420 headers, PGP, cited text and the signature.
6421
6422 @item W W h
6423 @kindex W W h (Summary)
6424 @findex gnus-article-hide-headers
6425 Hide headers (@code{gnus-article-hide-headers}).  @xref{Hiding
6426 Headers}.
6427
6428 @item W W b
6429 @kindex W W b (Summary)
6430 @findex gnus-article-hide-boring-headers
6431 Hide headers that aren't particularly interesting
6432 (@code{gnus-article-hide-boring-headers}).  @xref{Hiding Headers}.
6433
6434 @item W W s
6435 @kindex W W s (Summary)
6436 @findex gnus-article-hide-signature
6437 Hide signature (@code{gnus-article-hide-signature}).  @xref{Article
6438 Signature}.
6439
6440 @item W W p
6441 @kindex W W p (Summary)
6442 @findex gnus-article-hide-pgp
6443 @vindex gnus-article-hide-pgp-hook
6444 Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}).  The
6445 @code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp}
6446 signature has been hidden.  For example, to automatically verify
6447 articles that have signatures in them do:
6448 @lisp
6449 ;;; Hide pgp cruft if any.
6450
6451 (setq gnus-treat-strip-pgp t)
6452
6453 ;;; After hiding pgp, verify the message;
6454 ;;; only happens if pgp signature is found.
6455
6456 (add-hook 'gnus-article-hide-pgp-hook
6457           (lambda ()
6458             (save-excursion
6459               (set-buffer gnus-original-article-buffer)
6460               (mc-verify))))
6461 @end lisp
6462
6463 @item W W P
6464 @kindex W W P (Summary)
6465 @findex gnus-article-hide-pem
6466 Hide @sc{pem} (privacy enhanced messages) cruft
6467 (@code{gnus-article-hide-pem}).
6468
6469 @item W W B
6470 @kindex W W B (Summary)
6471 @findex gnus-article-strip-banner
6472 Strip the banner specified by the @code{banner} group parameter
6473 (@code{gnus-article-strip-banner}).  This is mainly used to hide those
6474 annoying banners and/or signatures that some mailing lists and moderated
6475 groups adds to all the messages.  The way to use this function is to add
6476 the @code{banner} group parameter (@pxref{Group Parameters}) to the
6477 group you want banners stripped from.  The parameter either be a string,
6478 which will be interpreted as a regulax expression matching text to be
6479 removed, or the symbol @code{signature}, meaning that the (last)
6480 signature should be removed.
6481
6482 @item W W c
6483 @kindex W W c (Summary)
6484 @findex gnus-article-hide-citation
6485 Hide citation (@code{gnus-article-hide-citation}).  Some variables for
6486 customizing the hiding:
6487
6488 @table @code
6489
6490 @item gnus-cited-opened-text-button-line-format
6491 @itemx gnus-cited-closed-text-button-line-format
6492 @vindex gnus-cited-closed-text-button-line-format
6493 @vindex gnus-cited-opened-text-button-line-format
6494 Gnus adds buttons to show where the cited text has been hidden, and to
6495 allow toggle hiding the text.  The format of the variable is specified
6496 by these format-like variable (@pxref{Formatting Variables}).  These
6497 specs are valid:
6498
6499 @table @samp
6500 @item b
6501 Starting point of the hidden text.
6502 @item e
6503 Ending point of the hidden text.
6504 @item l
6505 Number of characters in the hidden region.
6506 @item n
6507 Number of lines of hidden text.
6508 @end table
6509
6510 @item gnus-cited-lines-visible
6511 @vindex gnus-cited-lines-visible
6512 The number of lines at the beginning of the cited text to leave shown.
6513
6514 @end table
6515
6516 @item W W C-c
6517 @kindex W W C-c (Summary)
6518 @findex gnus-article-hide-citation-maybe
6519
6520 Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
6521 following two variables:
6522
6523 @table @code
6524 @item gnus-cite-hide-percentage
6525 @vindex gnus-cite-hide-percentage
6526 If the cited text is of a bigger percentage than this variable (default
6527 50), hide the cited text.
6528
6529 @item gnus-cite-hide-absolute
6530 @vindex gnus-cite-hide-absolute
6531 The cited text must have at least this length (default 10) before it
6532 is hidden.
6533 @end table
6534
6535 @item W W C
6536 @kindex W W C (Summary)
6537 @findex gnus-article-hide-citation-in-followups
6538 Hide cited text in articles that aren't roots
6539 (@code{gnus-article-hide-citation-in-followups}).  This isn't very
6540 useful as an interactive command, but might be a handy function to stick
6541 have happen automatically (@pxref{Customizing Articles}).
6542
6543 @end table
6544
6545 All these ``hiding'' commands are toggles, but if you give a negative
6546 prefix to these commands, they will show what they have previously
6547 hidden.  If you give a positive prefix, they will always hide.
6548
6549 Also @pxref{Article Highlighting} for further variables for
6550 citation customization.
6551
6552 @xref{Customizing Articles} for how to hide article elements
6553 automatically.
6554
6555
6556 @node Article Washing
6557 @subsection Article Washing
6558 @cindex washing
6559 @cindex article washing
6560
6561 We call this ``article washing'' for a really good reason.  Namely, the
6562 @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
6563
6564 @dfn{Washing} is defined by us as ``changing something from something to
6565 something else'', but normally results in something looking better.
6566 Cleaner, perhaps.
6567
6568 @table @kbd
6569
6570 @item W l
6571 @kindex W l (Summary)
6572 @findex gnus-summary-stop-page-breaking
6573 Remove page breaks from the current article
6574 (@code{gnus-summary-stop-page-breaking}).  @xref{Misc Article} for page
6575 delimiters.
6576
6577 @item W r
6578 @kindex W r (Summary)
6579 @findex gnus-summary-caesar-message
6580 @c @icon{gnus-summary-caesar-message}
6581 Do a Caesar rotate (rot13) on the article buffer
6582 (@code{gnus-summary-caesar-message}).
6583 Unreadable articles that tell you to read them with Caesar rotate or rot13.
6584 (Typically offensive jokes and such.)
6585
6586 It's commonly called ``rot13'' because each letter is rotated 13
6587 positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
6588 #15).  It is sometimes referred to as ``Caesar rotate'' because Caesar
6589 is rumored to have employed this form of, uh, somewhat weak encryption.
6590
6591 @item W t
6592 @kindex W t (Summary)
6593 @findex gnus-summary-toggle-header
6594 Toggle whether to display all headers in the article buffer
6595 (@code{gnus-summary-toggle-header}).
6596
6597 @item W v
6598 @kindex W v (Summary)
6599 @findex gnus-summary-verbose-header
6600 Toggle whether to display all headers in the article buffer permanently
6601 (@code{gnus-summary-verbose-header}).
6602
6603 @item W o
6604 @kindex W o (Summary)
6605 @findex gnus-article-treat-overstrike
6606 Treat overstrike (@code{gnus-article-treat-overstrike}).
6607
6608 @item W d
6609 @kindex W d (Summary)
6610 @findex gnus-article-treat-dumbquotes
6611 @vindex gnus-article-dumbquotes-map
6612 @cindex Smartquotes
6613 @cindex M******** sm*rtq**t*s
6614 @cindex Latin 1
6615 Treat M******** sm*rtq**t*s according to
6616 @code{gnus-article-dumbquotes-map}
6617 (@code{gnus-article-treat-dumbquotes}).  Note that this function guesses
6618 whether a character is a sm*rtq**t* or not, so it should only be used
6619 interactively.
6620
6621 @item W w
6622 @kindex W w (Summary)
6623 @findex gnus-article-fill-cited-article
6624 Do word wrap (@code{gnus-article-fill-cited-article}).
6625
6626 You can give the command a numerical prefix to specify the width to use
6627 when filling.
6628
6629 @item W q
6630 @kindex W q (Summary)
6631 @findex gnus-article-fill-long-lines
6632 Fill long lines (@code{gnus-article-fill-long-lines}).
6633
6634 @item W C
6635 @kindex W C (Summary)
6636 @findex gnus-article-capitalize-sentencse
6637 Capitalize the first word in each sentence
6638 (@code{gnus-article-capitalize-sentences}).
6639
6640 @item W c
6641 @kindex W c (Summary)
6642 @findex gnus-article-remove-cr
6643 Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
6644 (this takes care of DOS line endings), and then translate any remaining
6645 CRs into LF (this takes care of Mac line endings)
6646 (@code{gnus-article-remove-cr}).
6647
6648 @item W q
6649 @kindex W q (Summary)
6650 @findex gnus-article-de-quoted-unreadable
6651 Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
6652 Quoted-Printable is one common @sc{mime} encoding employed when sending
6653 non-ASCII (i. e., 8-bit) articles.  It typically makes strings like
6654 @samp{déjà vu} look like @samp{d=E9j=E0 vu}, which doesn't look very
6655 readable to me.  Note that the this is usually done automatically by
6656 Gnus if the message in question has a @code{Content-Transfer-Encoding}
6657 header that says that this encoding has been done.
6658
6659 @item W f
6660 @kindex W f (Summary)
6661 @cindex x-face
6662 @findex gnus-article-display-x-face
6663 @findex gnus-article-x-face-command
6664 @vindex gnus-article-x-face-command
6665 @vindex gnus-article-x-face-too-ugly
6666 @iftex
6667 @iflatex
6668 \include{xface}
6669 @end iflatex
6670 @end iftex
6671 Look for and display any X-Face headers
6672 (@code{gnus-article-display-x-face}).  The command executed by this
6673 function is given by the @code{gnus-article-x-face-command} variable.
6674 If this variable is a string, this string will be executed in a
6675 sub-shell.  If it is a function, this function will be called with the
6676 face as the argument.  If the @code{gnus-article-x-face-too-ugly} (which
6677 is a regexp) matches the @code{From} header, the face will not be shown.
6678 The default action under Emacs is to fork off an @code{xv} to view the
6679 face; under XEmacs the default action is to display the face before the
6680 @code{From} header.  (It's nicer if XEmacs has been compiled with X-Face
6681 support---that will make display somewhat faster.  If there's no native
6682 X-Face support, Gnus will try to convert the @code{X-Face} header using
6683 external programs from the @code{pbmplus} package and friends.)  If you
6684 want to have this function in the display hook, it should probably come
6685 last.
6686
6687 @item W b
6688 @kindex W b (Summary)
6689 @findex gnus-article-add-buttons
6690 Add clickable buttons to the article (@code{gnus-article-add-buttons}).
6691 @xref{Article Buttons}.
6692
6693 @item W B
6694 @kindex W B (Summary)
6695 @findex gnus-article-add-buttons-to-head
6696 Add clickable buttons to the article headers
6697 (@code{gnus-article-add-buttons-to-head}).
6698
6699 @item W E l
6700 @kindex W E l (Summary)
6701 @findex gnus-article-strip-leading-blank-lines
6702 Remove all blank lines from the beginning of the article
6703 (@code{gnus-article-strip-leading-blank-lines}).
6704
6705 @item W E m
6706 @kindex W E m (Summary)
6707 @findex gnus-article-strip-multiple-blank-lines
6708 Replace all blank lines with empty lines and then all multiple empty
6709 lines with a single empty line.
6710 (@code{gnus-article-strip-multiple-blank-lines}).
6711
6712 @item W E t
6713 @kindex W E t (Summary)
6714 @findex gnus-article-remove-trailing-blank-lines
6715 Remove all blank lines at the end of the article
6716 (@code{gnus-article-remove-trailing-blank-lines}).
6717
6718 @item W E a
6719 @kindex W E a (Summary)
6720 @findex gnus-article-strip-blank-lines
6721 Do all the three commands above
6722 (@code{gnus-article-strip-blank-lines}).
6723
6724 @item W E A
6725 @kindex W E A (Summary)
6726 @findex gnus-article-strip-all-blank-lines
6727 Remove all blank lines
6728 (@code{gnus-article-strip-all-blank-lines}).
6729
6730 @item W E s
6731 @kindex W E s (Summary)
6732 @findex gnus-article-strip-leading-space
6733 Remove all white space from the beginning of all lines of the article
6734 body (@code{gnus-article-strip-leading-space}).
6735
6736 @item W E e
6737 @kindex W E e (Summary)
6738 @findex gnus-article-strip-trailing-space
6739 Remove all white space from the end of all lines of the article
6740 body (@code{gnus-article-strip-trailing-space}).
6741
6742 @end table
6743
6744 @xref{Customizing Articles} for how to wash articles automatically.
6745
6746
6747 @node Article Buttons
6748 @subsection Article Buttons
6749 @cindex buttons
6750
6751 People often include references to other stuff in articles, and it would
6752 be nice if Gnus could just fetch whatever it is that people talk about
6753 with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
6754 button on these references.
6755
6756 Gnus adds @dfn{buttons} to certain standard references by default:
6757 Well-formed URLs, mail addresses and Message-IDs.  This is controlled by
6758 two variables, one that handles article bodies and one that handles
6759 article heads:
6760
6761 @table @code
6762
6763 @item gnus-button-alist
6764 @vindex gnus-button-alist
6765 This is an alist where each entry has this form:
6766
6767 @lisp
6768 (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
6769 @end lisp
6770
6771 @table @var
6772
6773 @item regexp
6774 All text that match this regular expression will be considered an
6775 external reference.  Here's a typical regexp that matches embedded URLs:
6776 @samp{<URL:\\([^\n\r>]*\\)>}.
6777
6778 @item button-par
6779 Gnus has to know which parts of the matches is to be highlighted.  This
6780 is a number that says what sub-expression of the regexp is to be
6781 highlighted.  If you want it all highlighted, you use 0 here.
6782
6783 @item use-p
6784 This form will be @code{eval}ed, and if the result is non-@code{nil},
6785 this is considered a match.  This is useful if you want extra sifting to
6786 avoid false matches.
6787
6788 @item function
6789 This function will be called when you click on this button.
6790
6791 @item data-par
6792 As with @var{button-par}, this is a sub-expression number, but this one
6793 says which part of the match is to be sent as data to @var{function}.
6794
6795 @end table
6796
6797 So the full entry for buttonizing URLs is then
6798
6799 @lisp
6800 ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
6801 @end lisp
6802
6803 @item gnus-header-button-alist
6804 @vindex gnus-header-button-alist
6805 This is just like the other alist, except that it is applied to the
6806 article head only, and that each entry has an additional element that is
6807 used to say what headers to apply the buttonize coding to:
6808
6809 @lisp
6810 (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
6811 @end lisp
6812
6813 @var{HEADER} is a regular expression.
6814
6815 @item gnus-button-url-regexp
6816 @vindex gnus-button-url-regexp
6817 A regular expression that matches embedded URLs.  It is used in the
6818 default values of the variables above.
6819
6820 @item gnus-article-button-face
6821 @vindex gnus-article-button-face
6822 Face used on buttons.
6823
6824 @item gnus-article-mouse-face
6825 @vindex gnus-article-mouse-face
6826 Face used when the mouse cursor is over a button.
6827
6828 @end table
6829
6830 @xref{Customizing Articles} for how to buttonize articles automatically.
6831
6832
6833 @node Article Date
6834 @subsection Article Date
6835
6836 The date is most likely generated in some obscure timezone you've never
6837 heard of, so it's quite nice to be able to find out what the time was
6838 when the article was sent.
6839
6840 @table @kbd
6841
6842 @item W T u
6843 @kindex W T u (Summary)
6844 @findex gnus-article-date-ut
6845 Display the date in UT (aka. GMT, aka ZULU)
6846 (@code{gnus-article-date-ut}).
6847
6848 @item W T i
6849 @kindex W T i (Summary)
6850 @findex gnus-article-date-iso8601
6851 @cindex ISO 8601
6852 Display the date in international format, aka. ISO 8601
6853 (@code{gnus-article-date-iso8601}).
6854
6855 @item W T l
6856 @kindex W T l (Summary)
6857 @findex gnus-article-date-local
6858 Display the date in the local timezone (@code{gnus-article-date-local}).
6859
6860 @item W T s
6861 @kindex W T s (Summary)
6862 @vindex gnus-article-time-format
6863 @findex gnus-article-date-user
6864 @findex format-time-string
6865 Display the date using a user-defined format
6866 (@code{gnus-article-date-user}).  The format is specified by the
6867 @code{gnus-article-time-format} variable, and is a string that's passed
6868 to @code{format-time-string}.  See the documentation of that variable
6869 for a list of possible format specs.
6870
6871 @item W T e
6872 @kindex W T e (Summary)
6873 @findex gnus-article-date-lapsed
6874 @findex gnus-start-date-timer
6875 @findex gnus-stop-date-timer
6876 Say how much time has elapsed between the article was posted and now
6877 (@code{gnus-article-date-lapsed}).  If you want to have this line
6878 updated continually, you can put
6879
6880 @lisp
6881 (gnus-start-date-timer)
6882 @end lisp
6883
6884 in your @file{.gnus.el} file, or you can run it off of some hook.  If
6885 you want to stop the timer, you can use the @code{gnus-stop-date-timer}
6886 command.
6887
6888 @item W T o
6889 @kindex W T o (Summary)
6890 @findex gnus-article-date-original
6891 Display the original date (@code{gnus-article-date-original}).  This can
6892 be useful if you normally use some other conversion function and are
6893 worried that it might be doing something totally wrong.  Say, claiming
6894 that the article was posted in 1854.  Although something like that is
6895 @emph{totally} impossible.  Don't you trust me? *titter*
6896
6897 @end table
6898
6899 @xref{Customizing Articles} for how to display the date in your
6900 preferred format automatically.
6901
6902
6903 @node Article Signature
6904 @subsection Article Signature
6905 @cindex signatures
6906 @cindex article signature
6907
6908 @vindex gnus-signature-separator
6909 Each article is divided into two parts---the head and the body.  The
6910 body can be divided into a signature part and a text part.  The variable
6911 that says what is to be considered a signature is
6912 @code{gnus-signature-separator}.  This is normally the standard
6913 @samp{^-- $} as mandated by son-of-RFC 1036.  However, many people use
6914 non-standard signature separators, so this variable can also be a list
6915 of regular expressions to be tested, one by one.  (Searches are done
6916 from the end of the body towards the beginning.)  One likely value is:
6917
6918 @lisp
6919 (setq gnus-signature-separator
6920       '("^-- $"         ; The standard
6921         "^-- *$"        ; A common mangling
6922         "^-------*$"    ; Many people just use a looong
6923                         ; line of dashes.  Shame!
6924         "^ *--------*$" ; Double-shame!
6925         "^________*$"   ; Underscores are also popular
6926         "^========*$")) ; Pervert!
6927 @end lisp
6928
6929 The more permissive you are, the more likely it is that you'll get false
6930 positives.
6931
6932 @vindex gnus-signature-limit
6933 @code{gnus-signature-limit} provides a limit to what is considered a
6934 signature.
6935
6936 @enumerate
6937 @item
6938 If it is an integer, no signature may be longer (in characters) than
6939 that integer.
6940 @item
6941 If it is a floating point number, no signature may be longer (in lines)
6942 than that number.
6943 @item
6944 If it is a function, the function will be called without any parameters,
6945 and if it returns @code{nil}, there is no signature in the buffer.
6946 @item
6947 If it is a string, it will be used as a regexp.  If it matches, the text
6948 in question is not a signature.
6949 @end enumerate
6950
6951 This variable can also be a list where the elements may be of the types
6952 listed above.  Here's an example:
6953
6954 @lisp
6955 (setq gnus-signature-limit
6956       '(200.0 "^---*Forwarded article"))
6957 @end lisp
6958
6959 This means that if there are more than 200 lines after the signature
6960 separator, or the text after the signature separator is matched by
6961 the regular expression @samp{^---*Forwarded article}, then it isn't a
6962 signature after all.
6963
6964
6965 @node MIME Commands
6966 @section MIME Commands
6967 @cindex MIME decoding
6968
6969 @table @kbd
6970 @item M-t
6971 @kindex M-t (Summary)
6972 @findex gnus-summary-display-buttonized
6973 Toggle the buttonized display of the article buffer
6974 (@code{gnus-summary-toggle-display-buttonized}).
6975
6976 @item W M w
6977 @kindex W M w (Summary)
6978 Decode RFC2047-encoded words in the article headers
6979 (@code{gnus-article-decode-mime-words}).
6980
6981 @item W M c
6982 @kindex W M c (Summary)
6983 Decode encoded article bodies as well as charsets
6984 (@code{gnus-article-decode-charset}).
6985
6986 This command looks in the @code{Content-Type} header to determine the
6987 charset.  If there is no such header in the article, you can give it a
6988 prefix, which will prompt for the charset to decode as.  In regional
6989 groups where people post using some common encoding (but do not include
6990 MIME headers), you can set the @code{charset} group/topic parameter to
6991 the required charset (@pxref{Group Parameters}).
6992
6993 @item W M v
6994 @kindex W M v (Summary)
6995 View all the @sc{mime} parts in the current article
6996 (@code{gnus-mime-view-all-parts}).
6997
6998 @end table
6999
7000 Relevant variables:
7001
7002 @table @code
7003 @item gnus-ignored-mime-types
7004 @vindex gnus-ignored-mime-types
7005 This is a list of regexps.  @sc{mime} types that match a regexp from
7006 this list will be completely ignored by Gnus.  The default value is
7007 @code{nil}.
7008
7009 To have all Vcards be ignored, you'd say something like this:
7010
7011 @lisp
7012 (setq gnus-ignored-mime-types
7013       '("text/x-vcard"))
7014 @end lisp
7015
7016 @item gnus-unbuttonized-mime-types
7017 @vindex gnus-unbuttonized-mime-types
7018 This is a list of regexps.  @sc{mime} types that match a regexp from
7019 this list won't have @sc{mime} buttons inserted unless they aren't
7020 displayed.  The default value is @code{(".*/.*")}.
7021
7022 @item gnus-article-mime-part-function
7023 @vindex gnus-article-mime-part-function
7024 For each @sc{mime} part, this function will be called with the @sc{mime}
7025 handle as the parameter.  The function is meant to be used to allow
7026 users to gather information from the article (e. g., add Vcard info to
7027 the bbdb database) or to do actions based on parts (e. g., automatically
7028 save all jpegs into some directory).
7029
7030 Here's an example function the does the latter:
7031
7032 @lisp
7033 (defun my-save-all-jpeg-parts (handle)
7034   (when (equal (car (mm-handle-type handle)) "image/jpeg")
7035     (with-temp-buffer
7036       (insert (mm-get-part handle))
7037       (write-region (point-min) (point-max)
7038                     (read-file-name "Save jpeg to: ")))))
7039 (setq gnus-article-mime-part-function
7040       'my-save-all-jpeg-parts)
7041 @end lisp
7042
7043 @end table
7044
7045
7046 @node Charsets
7047 @section Charsets
7048 @cindex charsets
7049
7050 People use different charsets, and we have @sc{mime} to let us know what
7051 charsets they use.  Or rather, we wish we had.  Many people use
7052 newsreaders and mailers that do not understand or use @sc{mime}, and
7053 just send out messages without saying what character sets they use.  To
7054 help a bit with this, some local news hierarchies have policies that say
7055 what character set is the default.  For instance, the @samp{fj}
7056 hierarchy uses @code{iso-2022-jp-2}.
7057
7058 @vindex gnus-group-charset-alist
7059 This knowledge is encoded in the @code{gnus-group-charset-alist}
7060 variable, which is an alist of regexps (to match group names) and
7061 default charsets to be used when reading these groups.
7062
7063 In addition, some people do use soi-disant @sc{mime}-aware agents that
7064 aren't.  These blitely mark messages as being in @code{iso-8859-1} even
7065 if they really are in @code{koi-8}.  To help here, the
7066 @code{gnus-newsgroup-ignored-charsets} variable can be used.  The
7067 charsets that are listed here will be ignored.  The variable can be set
7068 on a group-by-group basis using the group parameters (@pxref{Group
7069 Parameters}).  The default value is @code{(unknown-8bit)}, which is
7070 something some agents insist on having in there.
7071
7072
7073 @node Article Commands
7074 @section Article Commands
7075
7076 @table @kbd
7077
7078 @item A P
7079 @cindex PostScript
7080 @cindex printing
7081 @kindex A P (Summary)
7082 @vindex gnus-ps-print-hook
7083 @findex gnus-summary-print-article
7084 Generate and print a PostScript image of the article buffer
7085 (@code{gnus-summary-print-article}).  @code{gnus-ps-print-hook} will be
7086 run just before printing the buffer.
7087
7088 @end table
7089
7090
7091 @node Summary Sorting
7092 @section Summary Sorting
7093 @cindex summary sorting
7094
7095 You can have the summary buffer sorted in various ways, even though I
7096 can't really see why you'd want that.
7097
7098 @table @kbd
7099
7100 @item C-c C-s C-n
7101 @kindex C-c C-s C-n (Summary)
7102 @findex gnus-summary-sort-by-number
7103 Sort by article number (@code{gnus-summary-sort-by-number}).
7104
7105 @item C-c C-s C-a
7106 @kindex C-c C-s C-a (Summary)
7107 @findex gnus-summary-sort-by-author
7108 Sort by author (@code{gnus-summary-sort-by-author}).
7109
7110 @item C-c C-s C-s
7111 @kindex C-c C-s C-s (Summary)
7112 @findex gnus-summary-sort-by-subject
7113 Sort by subject (@code{gnus-summary-sort-by-subject}).
7114
7115 @item C-c C-s C-d
7116 @kindex C-c C-s C-d (Summary)
7117 @findex gnus-summary-sort-by-date
7118 Sort by date (@code{gnus-summary-sort-by-date}).
7119
7120 @item C-c C-s C-l
7121 @kindex C-c C-s C-l (Summary)
7122 @findex gnus-summary-sort-by-lines
7123 Sort by lines (@code{gnus-summary-sort-by-lines}).
7124
7125 @item C-c C-s C-c
7126 @kindex C-c C-s C-c (Summary)
7127 @findex gnus-summary-sort-by-chars
7128 Sort by article length (@code{gnus-summary-sort-by-chars}).
7129
7130 @item C-c C-s C-i
7131 @kindex C-c C-s C-i (Summary)
7132 @findex gnus-summary-sort-by-score
7133 Sort by score (@code{gnus-summary-sort-by-score}).
7134 @end table
7135
7136 These functions will work both when you use threading and when you don't
7137 use threading.  In the latter case, all summary lines will be sorted,
7138 line by line.  In the former case, sorting will be done on a
7139 root-by-root basis, which might not be what you were looking for.  To
7140 toggle whether to use threading, type @kbd{T T} (@pxref{Thread
7141 Commands}).
7142
7143
7144 @node Finding the Parent
7145 @section Finding the Parent
7146 @cindex parent articles
7147 @cindex referring articles
7148
7149 @table @kbd
7150 @item ^
7151 @kindex ^ (Summary)
7152 @findex gnus-summary-refer-parent-article
7153 If you'd like to read the parent of the current article, and it is not
7154 displayed in the summary buffer, you might still be able to.  That is,
7155 if the current group is fetched by @sc{nntp}, the parent hasn't expired
7156 and the @code{References} in the current article are not mangled, you
7157 can just press @kbd{^} or @kbd{A r}
7158 (@code{gnus-summary-refer-parent-article}).  If everything goes well,
7159 you'll get the parent.  If the parent is already displayed in the
7160 summary buffer, point will just move to this article.
7161
7162 If given a positive numerical prefix, fetch that many articles back into
7163 the ancestry.  If given a negative numerical prefix, fetch just that
7164 ancestor.  So if you say @kbd{3 ^}, Gnus will fetch the parent, the
7165 grandparent and the grandgrandparent of the current article.  If you say
7166 @kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
7167 article.
7168
7169 @item A R (Summary)
7170 @findex gnus-summary-refer-references
7171 @kindex A R (Summary)
7172 Fetch all articles mentioned in the @code{References} header of the
7173 article (@code{gnus-summary-refer-references}).
7174
7175 @item A T (Summary)
7176 @findex gnus-summary-refer-thread
7177 @kindex A T (Summary)
7178 Display the full thread where the current article appears
7179 (@code{gnus-summary-refer-thread}).  This command has to fetch all the
7180 headers in the current group to work, so it usually takes a while.  If
7181 you do it often, you may consider setting @code{gnus-fetch-old-headers}
7182 to @code{invisible} (@pxref{Filling In Threads}).  This won't have any
7183 visible effects normally, but it'll make this command work a whole lot
7184 faster.  Of course, it'll make group entry somewhat slow.
7185
7186 @vindex gnus-refer-thread-limit
7187 The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
7188 articles before the first displayed in the current group) headers to
7189 fetch when doing this command.  The default is 200.  If @code{t}, all
7190 the available headers will be fetched.  This variable can be overridden
7191 by giving the @kbd{A T} command a numerical prefix.
7192
7193 @item M-^ (Summary)
7194 @findex gnus-summary-refer-article
7195 @kindex M-^ (Summary)
7196 @cindex Message-ID
7197 @cindex fetching by Message-ID
7198 You can also ask the @sc{nntp} server for an arbitrary article, no
7199 matter what group it belongs to.  @kbd{M-^}
7200 (@code{gnus-summary-refer-article}) will ask you for a
7201 @code{Message-ID}, which is one of those long, hard-to-read thingies
7202 that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You
7203 have to get it all exactly right.  No fuzzy searches, I'm afraid.
7204 @end table
7205
7206 The current select method will be used when fetching by
7207 @code{Message-ID} from non-news select method, but you can override this
7208 by giving this command a prefix.
7209
7210 @vindex gnus-refer-article-method
7211 If the group you are reading is located on a backend that does not
7212 support fetching by @code{Message-ID} very well (like @code{nnspool}),
7213 you can set @code{gnus-refer-article-method} to an @sc{nntp} method.  It
7214 would, perhaps, be best if the @sc{nntp} server you consult is the one
7215 updating the spool you are reading from, but that's not really
7216 necessary.
7217
7218 Most of the mail backends support fetching by @code{Message-ID}, but do
7219 not do a particularly excellent job at it.  That is, @code{nnmbox} and
7220 @code{nnbabyl} are able to locate articles from any groups, while
7221 @code{nnml} and @code{nnfolder} are only able to locate articles that
7222 have been posted to the current group.  (Anything else would be too time
7223 consuming.)  @code{nnmh} does not support this at all.
7224
7225
7226 @node Alternative Approaches
7227 @section Alternative Approaches
7228
7229 Different people like to read news using different methods.  This being
7230 Gnus, we offer a small selection of minor modes for the summary buffers.
7231
7232 @menu
7233 * Pick and Read::               First mark articles and then read them.
7234 * Binary Groups::               Auto-decode all articles.
7235 @end menu
7236
7237
7238 @node Pick and Read
7239 @subsection Pick and Read
7240 @cindex pick and read
7241
7242 Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
7243 a two-phased reading interface.  The user first marks in a summary
7244 buffer the articles she wants to read.  Then she starts reading the
7245 articles with just an article buffer displayed.
7246
7247 @findex gnus-pick-mode
7248 @kindex M-x gnus-pick-mode
7249 Gnus provides a summary buffer minor mode that allows
7250 this---@code{gnus-pick-mode}.  This basically means that a few process
7251 mark commands become one-keystroke commands to allow easy marking, and
7252 it provides one additional command for switching to the summary buffer.
7253
7254 Here are the available keystrokes when using pick mode:
7255
7256 @table @kbd
7257 @item .
7258 @kindex . (Pick)
7259 @findex gnus-pick-article-or-thread
7260 Pick the article or thread on the current line
7261 (@code{gnus-pick-article-or-thread}).  If the variable
7262 @code{gnus-thread-hide-subtree} is true, then this key selects the
7263 entire thread when used at the first article of the thread.  Otherwise,
7264 it selects just the article. If given a numerical prefix, go to that
7265 thread or article and pick it.  (The line number is normally displayed
7266 at the beginning of the summary pick lines.)
7267
7268 @item SPACE
7269 @kindex SPACE (Pick)
7270 @findex gnus-pick-next-page
7271 Scroll the summary buffer up one page (@code{gnus-pick-next-page}).  If
7272 at the end of the buffer, start reading the picked articles.
7273
7274 @item u
7275 @kindex u (Pick)
7276 @findex gnus-pick-unmark-article-or-thread.
7277 Unpick the thread or article
7278 (@code{gnus-pick-unmark-article-or-thread}).  If the variable
7279 @code{gnus-thread-hide-subtree} is true, then this key unpicks the
7280 thread if used at the first article of the thread.  Otherwise it unpicks
7281 just the article.  You can give this key a numerical prefix to unpick
7282 the thread or article at that line.
7283
7284 @item RET
7285 @kindex RET (Pick)
7286 @findex gnus-pick-start-reading
7287 @vindex gnus-pick-display-summary
7288 Start reading the picked articles (@code{gnus-pick-start-reading}).  If
7289 given a prefix, mark all unpicked articles as read first.  If
7290 @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
7291 will still be visible when you are reading.
7292
7293 @end table
7294
7295 All the normal summary mode commands are still available in the
7296 pick-mode, with the exception of @kbd{u}.  However @kbd{!} is available
7297 which is mapped to the same function
7298 @code{gnus-summary-tick-article-forward}.
7299
7300 If this sounds like a good idea to you, you could say:
7301
7302 @lisp
7303 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
7304 @end lisp
7305
7306 @vindex gnus-pick-mode-hook
7307 @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
7308
7309 @vindex gnus-mark-unpicked-articles-as-read
7310 If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
7311 all unpicked articles as read.  The default is @code{nil}.
7312
7313 @vindex gnus-summary-pick-line-format
7314 The summary line format in pick mode is slightly different from the
7315 standard format.  At the beginning of each line the line number is
7316 displayed.  The pick mode line format is controlled by the
7317 @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
7318 Variables}).  It accepts the same format specs that
7319 @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
7320
7321
7322 @node Binary Groups
7323 @subsection Binary Groups
7324 @cindex binary groups
7325
7326 @findex gnus-binary-mode
7327 @kindex M-x gnus-binary-mode
7328 If you spend much time in binary groups, you may grow tired of hitting
7329 @kbd{X u}, @kbd{n}, @kbd{RET} all the time.  @kbd{M-x gnus-binary-mode}
7330 is a minor mode for summary buffers that makes all ordinary Gnus article
7331 selection functions uudecode series of articles and display the result
7332 instead of just displaying the articles the normal way.
7333
7334 @kindex g (Binary)
7335 @findex gnus-binary-show-article
7336 The only way, in fact, to see the actual articles is the @kbd{g}
7337 command, when you have turned on this mode
7338 (@code{gnus-binary-show-article}).
7339
7340 @vindex gnus-binary-mode-hook
7341 @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
7342
7343
7344 @node Tree Display
7345 @section Tree Display
7346 @cindex trees
7347
7348 @vindex gnus-use-trees
7349 If you don't like the normal Gnus summary display, you might try setting
7350 @code{gnus-use-trees} to @code{t}.  This will create (by default) an
7351 additional @dfn{tree buffer}.  You can execute all summary mode commands
7352 in the tree buffer.
7353
7354 There are a few variables to customize the tree display, of course:
7355
7356 @table @code
7357 @item gnus-tree-mode-hook
7358 @vindex gnus-tree-mode-hook
7359 A hook called in all tree mode buffers.
7360
7361 @item gnus-tree-mode-line-format
7362 @vindex gnus-tree-mode-line-format
7363 A format string for the mode bar in the tree mode buffers (@pxref{Mode
7364 Line Formatting}).  The default is @samp{Gnus: %%b %S %Z}.  For a list
7365 of valid specs, @pxref{Summary Buffer Mode Line}.
7366
7367 @item gnus-selected-tree-face
7368 @vindex gnus-selected-tree-face
7369 Face used for highlighting the selected article in the tree buffer.  The
7370 default is @code{modeline}.
7371
7372 @item gnus-tree-line-format
7373 @vindex gnus-tree-line-format
7374 A format string for the tree nodes.  The name is a bit of a misnomer,
7375 though---it doesn't define a line, but just the node.  The default value
7376 is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
7377 the name of the poster.  It is vital that all nodes are of the same
7378 length, so you @emph{must} use @samp{%4,4n}-like specifiers.
7379
7380 Valid specs are:
7381
7382 @table @samp
7383 @item n
7384 The name of the poster.
7385 @item f
7386 The @code{From} header.
7387 @item N
7388 The number of the article.
7389 @item [
7390 The opening bracket.
7391 @item ]
7392 The closing bracket.
7393 @item s
7394 The subject.
7395 @end table
7396
7397 @xref{Formatting Variables}.
7398
7399 Variables related to the display are:
7400
7401 @table @code
7402 @item gnus-tree-brackets
7403 @vindex gnus-tree-brackets
7404 This is used for differentiating between ``real'' articles and
7405 ``sparse'' articles.  The format is @var{((real-open . real-close)
7406 (sparse-open . sparse-close) (dummy-open . dummy-close))}, and the
7407 default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
7408
7409 @item gnus-tree-parent-child-edges
7410 @vindex gnus-tree-parent-child-edges
7411 This is a list that contains the characters used for connecting parent
7412 nodes to their children.  The default is @code{(?- ?\\ ?|)}.
7413
7414 @end table
7415
7416 @item gnus-tree-minimize-window
7417 @vindex gnus-tree-minimize-window
7418 If this variable is non-@code{nil}, Gnus will try to keep the tree
7419 buffer as small as possible to allow more room for the other Gnus
7420 windows.  If this variable is a number, the tree buffer will never be
7421 higher than that number.  The default is @code{t}.  Note that if you
7422 have several windows displayed side-by-side in a frame and the tree
7423 buffer is one of these, minimizing the tree window will also resize all
7424 other windows displayed next to it.
7425
7426 @item gnus-generate-tree-function
7427 @vindex gnus-generate-tree-function
7428 @findex gnus-generate-horizontal-tree
7429 @findex gnus-generate-vertical-tree
7430 The function that actually generates the thread tree.  Two predefined
7431 functions are available: @code{gnus-generate-horizontal-tree} and
7432 @code{gnus-generate-vertical-tree} (which is the default).
7433
7434 @end table
7435
7436 Here's an example from a horizontal tree buffer:
7437
7438 @example
7439 @{***@}-(***)-[odd]-[Gun]
7440      |      \[Jan]
7441      |      \[odd]-[Eri]
7442      |      \(***)-[Eri]
7443      |            \[odd]-[Paa]
7444      \[Bjo]
7445      \[Gun]
7446      \[Gun]-[Jor]
7447 @end example
7448
7449 Here's the same thread displayed in a vertical tree buffer:
7450
7451 @example
7452 @{***@}
7453   |--------------------------\-----\-----\
7454 (***)                         [Bjo] [Gun] [Gun]
7455   |--\-----\-----\                          |
7456 [odd] [Jan] [odd] (***)                   [Jor]
7457   |           |     |--\
7458 [Gun]       [Eri] [Eri] [odd]
7459                           |
7460                         [Paa]
7461 @end example
7462
7463 If you're using horizontal trees, it might be nice to display the trees
7464 side-by-side with the summary buffer.  You could add something like the
7465 following to your @file{.gnus.el} file:
7466
7467 @lisp
7468 (setq gnus-use-trees t
7469       gnus-generate-tree-function 'gnus-generate-horizontal-tree
7470       gnus-tree-minimize-window nil)
7471 (gnus-add-configuration
7472  '(article
7473    (vertical 1.0
7474              (horizontal 0.25
7475                          (summary 0.75 point)
7476                          (tree 1.0))
7477              (article 1.0))))
7478 @end lisp
7479
7480 @xref{Windows Configuration}.
7481
7482
7483 @node Mail Group Commands
7484 @section Mail Group Commands
7485 @cindex mail group commands
7486
7487 Some commands only make sense in mail groups.  If these commands are
7488 invalid in the current group, they will raise a hell and let you know.
7489
7490 All these commands (except the expiry and edit commands) use the
7491 process/prefix convention (@pxref{Process/Prefix}).
7492
7493 @table @kbd
7494
7495 @item B e
7496 @kindex B e (Summary)
7497 @findex gnus-summary-expire-articles
7498 Expire all expirable articles in the group
7499 (@code{gnus-summary-expire-articles}).
7500
7501 @item B M-C-e
7502 @kindex B M-C-e (Summary)
7503 @findex gnus-summary-expire-articles-now
7504 Delete all the expirable articles in the group
7505 (@code{gnus-summary-expire-articles-now}).  This means that @strong{all}
7506 articles eligible for expiry in the current group will
7507 disappear forever into that big @file{/dev/null} in the sky.
7508
7509 @item B DEL
7510 @kindex B DEL (Summary)
7511 @findex gnus-summary-delete-article
7512 @c @icon{gnus-summary-mail-delete}
7513 Delete the mail article.  This is ``delete'' as in ``delete it from your
7514 disk forever and ever, never to return again.'' Use with caution.
7515 (@code{gnus-summary-delete-article}).
7516
7517 @item B m
7518 @kindex B m (Summary)
7519 @cindex move mail
7520 @findex gnus-summary-move-article
7521 Move the article from one mail group to another
7522 (@code{gnus-summary-move-article}).
7523
7524 @item B c
7525 @kindex B c (Summary)
7526 @cindex copy mail
7527 @findex gnus-summary-copy-article
7528 @c @icon{gnus-summary-mail-copy}
7529 Copy the article from one group (mail group or not) to a mail group
7530 (@code{gnus-summary-copy-article}).
7531
7532 @item B B
7533 @kindex B B (Summary)
7534 @cindex crosspost mail
7535 @findex gnus-summary-crosspost-article
7536 Crosspost the current article to some other group
7537 (@code{gnus-summary-crosspost-article}).  This will create a new copy of
7538 the article in the other group, and the Xref headers of the article will
7539 be properly updated.
7540
7541 @item B i
7542 @kindex B i (Summary)
7543 @findex gnus-summary-import-article
7544 Import an arbitrary file into the current mail newsgroup
7545 (@code{gnus-summary-import-article}).  You will be prompted for a file
7546 name, a @code{From} header and a @code{Subject} header.
7547
7548 @item B r
7549 @kindex B r (Summary)
7550 @findex gnus-summary-respool-article
7551 Respool the mail article (@code{gnus-summary-respool-article}).
7552 @code{gnus-summary-respool-default-method} will be used as the default
7553 select method when respooling.  This variable is @code{nil} by default,
7554 which means that the current group select method will be used instead.
7555
7556 @item B w
7557 @itemx e
7558 @kindex B w (Summary)
7559 @kindex e (Summary)
7560 @findex gnus-summary-edit-article
7561 @kindex C-c C-c (Article)
7562 Edit the current article (@code{gnus-summary-edit-article}).  To finish
7563 editing and make the changes permanent, type @kbd{C-c C-c}
7564 (@kbd{gnus-summary-edit-article-done}).  If you give a prefix to the
7565 @kbd{C-c C-c} command, Gnus won't re-highlight the article.
7566
7567 @item B q
7568 @kindex B q (Summary)
7569 @findex gnus-summary-respool-query
7570 If you want to re-spool an article, you might be curious as to what group
7571 the article will end up in before you do the re-spooling.  This command
7572 will tell you (@code{gnus-summary-respool-query}).
7573
7574 @item B t
7575 @kindex B t (Summary)
7576 @findex gnus-summary-respool-trace
7577 Similarly, this command will display all fancy splitting patterns used
7578 when repooling, if any (@code{gnus-summary-respool-trace}).
7579
7580 @item B p
7581 @kindex B p (Summary)
7582 @findex gnus-summary-article-posted-p
7583 Some people have a tendency to send you "courtesy" copies when they
7584 follow up to articles you have posted.  These usually have a
7585 @code{Newsgroups} header in them, but not always.  This command
7586 (@code{gnus-summary-article-posted-p}) will try to fetch the current
7587 article from your news server (or rather, from
7588 @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
7589 report back whether it found the article or not.  Even if it says that
7590 it didn't find the article, it may have been posted anyway---mail
7591 propagation is much faster than news propagation, and the news copy may
7592 just not have arrived yet.
7593
7594 @end table
7595
7596 @vindex gnus-move-split-methods
7597 @cindex moving articles
7598 If you move (or copy) articles regularly, you might wish to have Gnus
7599 suggest where to put the articles.  @code{gnus-move-split-methods} is a
7600 variable that uses the same syntax as @code{gnus-split-methods}
7601 (@pxref{Saving Articles}).  You may customize that variable to create
7602 suggestions you find reasonable.
7603
7604 @lisp
7605 (setq gnus-move-split-methods
7606       '(("^From:.*Lars Magne" "nnml:junk")
7607         ("^Subject:.*gnus" "nnfolder:important")
7608         (".*" "nnml:misc")))
7609 @end lisp
7610
7611
7612 @node Various Summary Stuff
7613 @section Various Summary Stuff
7614
7615 @menu
7616 * Summary Group Information::         Information oriented commands.
7617 * Searching for Articles::            Multiple article commands.
7618 * Summary Generation Commands::       (Re)generating the summary buffer.
7619 * Really Various Summary Commands::   Those pesky non-conformant commands.
7620 @end menu
7621
7622 @table @code
7623 @vindex gnus-summary-mode-hook
7624 @item gnus-summary-mode-hook
7625 This hook is called when creating a summary mode buffer.
7626
7627 @vindex gnus-summary-generate-hook
7628 @item gnus-summary-generate-hook
7629 This is called as the last thing before doing the threading and the
7630 generation of the summary buffer.  It's quite convenient for customizing
7631 the threading variables based on what data the newsgroup has.  This hook
7632 is called from the summary buffer after most summary buffer variables
7633 have been set.
7634
7635 @vindex gnus-summary-prepare-hook
7636 @item gnus-summary-prepare-hook
7637 It is called after the summary buffer has been generated.  You might use
7638 it to, for instance, highlight lines or modify the look of the buffer in
7639 some other ungodly manner.  I don't care.
7640
7641 @vindex gnus-summary-prepared-hook
7642 @item gnus-summary-prepared-hook
7643 A hook called as the very last thing after the summary buffer has been
7644 generated.
7645
7646 @vindex gnus-summary-ignore-duplicates
7647 @item gnus-summary-ignore-duplicates
7648 When Gnus discovers two articles that have the same @code{Message-ID},
7649 it has to do something drastic.  No articles are allowed to have the
7650 same @code{Message-ID}, but this may happen when reading mail from some
7651 sources.  Gnus allows you to customize what happens with this variable.
7652 If it is @code{nil} (which is the default), Gnus will rename the
7653 @code{Message-ID} (for display purposes only) and display the article as
7654 any other article.  If this variable is @code{t}, it won't display the
7655 article---it'll be as if it never existed.
7656
7657 @end table
7658
7659
7660 @node Summary Group Information
7661 @subsection Summary Group Information
7662
7663 @table @kbd
7664
7665 @item H f
7666 @kindex H f (Summary)
7667 @findex gnus-summary-fetch-faq
7668 @vindex gnus-group-faq-directory
7669 Try to fetch the FAQ (list of frequently asked questions) for the
7670 current group (@code{gnus-summary-fetch-faq}).  Gnus will try to get the
7671 FAQ from @code{gnus-group-faq-directory}, which is usually a directory
7672 on a remote machine.  This variable can also be a list of directories.
7673 In that case, giving a prefix to this command will allow you to choose
7674 between the various sites.  @code{ange-ftp} or @code{efs} will probably
7675 be used for fetching the file.
7676
7677 @item H d
7678 @kindex H d (Summary)
7679 @findex gnus-summary-describe-group
7680 Give a brief description of the current group
7681 (@code{gnus-summary-describe-group}).  If given a prefix, force
7682 rereading the description from the server.
7683
7684 @item H h
7685 @kindex H h (Summary)
7686 @findex gnus-summary-describe-briefly
7687 Give an extremely brief description of the most important summary
7688 keystrokes (@code{gnus-summary-describe-briefly}).
7689
7690 @item H i
7691 @kindex H i (Summary)
7692 @findex gnus-info-find-node
7693 Go to the Gnus info node (@code{gnus-info-find-node}).
7694 @end table
7695
7696
7697 @node Searching for Articles
7698 @subsection Searching for Articles
7699
7700 @table @kbd
7701
7702 @item M-s
7703 @kindex M-s (Summary)
7704 @findex gnus-summary-search-article-forward
7705 Search through all subsequent articles for a regexp
7706 (@code{gnus-summary-search-article-forward}).
7707
7708 @item M-r
7709 @kindex M-r (Summary)
7710 @findex gnus-summary-search-article-backward
7711 Search through all previous articles for a regexp
7712 (@code{gnus-summary-search-article-backward}).
7713
7714 @item &
7715 @kindex & (Summary)
7716 @findex gnus-summary-execute-command
7717 This command will prompt you for a header field, a regular expression to
7718 match on this field, and a command to be executed if the match is made
7719 (@code{gnus-summary-execute-command}).  If given a prefix, search
7720 backward instead.
7721
7722 @item M-&
7723 @kindex M-& (Summary)
7724 @findex gnus-summary-universal-argument
7725 Perform any operation on all articles that have been marked with
7726 the process mark (@code{gnus-summary-universal-argument}).
7727 @end table
7728
7729 @node Summary Generation Commands
7730 @subsection Summary Generation Commands
7731
7732 @table @kbd
7733
7734 @item Y g
7735 @kindex Y g (Summary)
7736 @findex gnus-summary-prepare
7737 Regenerate the current summary buffer (@code{gnus-summary-prepare}).
7738
7739 @item Y c
7740 @kindex Y c (Summary)
7741 @findex gnus-summary-insert-cached-articles
7742 Pull all cached articles (for the current group) into the summary buffer
7743 (@code{gnus-summary-insert-cached-articles}).
7744
7745 @end table
7746
7747
7748 @node Really Various Summary Commands
7749 @subsection Really Various Summary Commands
7750
7751 @table @kbd
7752
7753 @item C-d
7754 @kindex C-d (Summary)
7755 @findex gnus-summary-enter-digest-group
7756 If the current article is a collection of other articles (for instance,
7757 a digest), you might use this command to enter a group based on the that
7758 article (@code{gnus-summary-enter-digest-group}).  Gnus will try to
7759 guess what article type is currently displayed unless you give a prefix
7760 to this command, which forces a ``digest'' interpretation.  Basically,
7761 whenever you see a message that is a collection of other messages of
7762 some format, you @kbd{C-d} and read these messages in a more convenient
7763 fashion.
7764
7765 @item M-C-d
7766 @kindex M-C-d (Summary)
7767 @findex gnus-summary-read-document
7768 This command is very similar to the one above, but lets you gather
7769 several documents into one biiig group
7770 (@code{gnus-summary-read-document}).  It does this by opening several
7771 @code{nndoc} groups for each document, and then opening an
7772 @code{nnvirtual} group on top of these @code{nndoc} groups.  This
7773 command understands the process/prefix convention
7774 (@pxref{Process/Prefix}).
7775
7776 @item C-t
7777 @kindex C-t (Summary)
7778 @findex gnus-summary-toggle-truncation
7779 Toggle truncation of summary lines
7780 (@code{gnus-summary-toggle-truncation}).  This will probably confuse the
7781 line centering function in the summary buffer, so it's not a good idea
7782 to have truncation switched off while reading articles.
7783
7784 @item =
7785 @kindex = (Summary)
7786 @findex gnus-summary-expand-window
7787 Expand the summary buffer window (@code{gnus-summary-expand-window}).
7788 If given a prefix, force an @code{article} window configuration.
7789
7790 @item M-C-e
7791 @kindex M-C-e (Summary)
7792 @findex gnus-summary-edit-parameters
7793 Edit the group parameters (@pxref{Group Parameters}) of the current
7794 group (@code{gnus-summary-edit-parameters}).
7795
7796 @item M-C-g
7797 @kindex M-C-g (Summary)
7798 @findex gnus-summary-customize-parameters
7799 Customize the group parameters (@pxref{Group Parameters}) of the current
7800 group (@code{gnus-summary-customize-parameters}).
7801
7802 @end table
7803
7804
7805 @node Exiting the Summary Buffer
7806 @section Exiting the Summary Buffer
7807 @cindex summary exit
7808 @cindex exiting groups
7809
7810 Exiting from the summary buffer will normally update all info on the
7811 group and return you to the group buffer.
7812
7813 @table @kbd
7814
7815 @item Z Z
7816 @itemx q
7817 @kindex Z Z (Summary)
7818 @kindex q (Summary)
7819 @findex gnus-summary-exit
7820 @vindex gnus-summary-exit-hook
7821 @vindex gnus-summary-prepare-exit-hook
7822 @c @icon{gnus-summary-exit}
7823 Exit the current group and update all information on the group
7824 (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
7825 called before doing much of the exiting, which calls
7826 @code{gnus-summary-expire-articles} by default.
7827 @code{gnus-summary-exit-hook} is called after finishing the exit
7828 process.  @code{gnus-group-no-more-groups-hook} is run when returning to
7829 group mode having no more (unread) groups.
7830
7831 @item Z E
7832 @itemx Q
7833 @kindex Z E (Summary)
7834 @kindex Q (Summary)
7835 @findex gnus-summary-exit-no-update
7836 Exit the current group without updating any information on the group
7837 (@code{gnus-summary-exit-no-update}).
7838
7839 @item Z c
7840 @itemx c
7841 @kindex Z c (Summary)
7842 @kindex c (Summary)
7843 @findex gnus-summary-catchup-and-exit
7844 @c @icon{gnus-summary-catchup-and-exit}
7845 Mark all unticked articles in the group as read and then exit
7846 (@code{gnus-summary-catchup-and-exit}).
7847
7848 @item Z C
7849 @kindex Z C (Summary)
7850 @findex gnus-summary-catchup-all-and-exit
7851 Mark all articles, even the ticked ones, as read and then exit
7852 (@code{gnus-summary-catchup-all-and-exit}).
7853
7854 @item Z n
7855 @kindex Z n (Summary)
7856 @findex gnus-summary-catchup-and-goto-next-group
7857 Mark all articles as read and go to the next group
7858 (@code{gnus-summary-catchup-and-goto-next-group}).
7859
7860 @item Z R
7861 @kindex Z R (Summary)
7862 @findex gnus-summary-reselect-current-group
7863 Exit this group, and then enter it again
7864 (@code{gnus-summary-reselect-current-group}).  If given a prefix, select
7865 all articles, both read and unread.
7866
7867 @item Z G
7868 @itemx M-g
7869 @kindex Z G (Summary)
7870 @kindex M-g (Summary)
7871 @findex gnus-summary-rescan-group
7872 @c @icon{gnus-summary-mail-get}
7873 Exit the group, check for new articles in the group, and select the
7874 group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
7875 articles, both read and unread.
7876
7877 @item Z N
7878 @kindex Z N (Summary)
7879 @findex gnus-summary-next-group
7880 Exit the group and go to the next group
7881 (@code{gnus-summary-next-group}).
7882
7883 @item Z P
7884 @kindex Z P (Summary)
7885 @findex gnus-summary-prev-group
7886 Exit the group and go to the previous group
7887 (@code{gnus-summary-prev-group}).
7888
7889 @item Z s
7890 @kindex Z s (Summary)
7891 @findex gnus-summary-save-newsrc
7892 Save the current number of read/marked articles in the dribble buffer
7893 and then save the dribble buffer (@code{gnus-summary-save-newsrc}).  If
7894 given a prefix, also save the @file{.newsrc} file(s).  Using this
7895 command will make exit without updating (the @kbd{Q} command) worthless.
7896 @end table
7897
7898 @vindex gnus-exit-group-hook
7899 @code{gnus-exit-group-hook} is called when you exit the current
7900 group.
7901
7902 @findex gnus-summary-wake-up-the-dead
7903 @findex gnus-dead-summary-mode
7904 @vindex gnus-kill-summary-on-exit
7905 If you're in the habit of exiting groups, and then changing your mind
7906 about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
7907 If you do that, Gnus won't kill the summary buffer when you exit it.
7908 (Quelle surprise!)  Instead it will change the name of the buffer to
7909 something like @samp{*Dead Summary ... *} and install a minor mode
7910 called @code{gnus-dead-summary-mode}.  Now, if you switch back to this
7911 buffer, you'll find that all keys are mapped to a function called
7912 @code{gnus-summary-wake-up-the-dead}.  So tapping any keys in a dead
7913 summary buffer will result in a live, normal summary buffer.
7914
7915 There will never be more than one dead summary buffer at any one time.
7916
7917 @vindex gnus-use-cross-reference
7918 The data on the current group will be updated (which articles you have
7919 read, which articles you have replied to, etc.) when you exit the
7920 summary buffer.  If the @code{gnus-use-cross-reference} variable is
7921 @code{t} (which is the default), articles that are cross-referenced to
7922 this group and are marked as read, will also be marked as read in the
7923 other subscribed groups they were cross-posted to.  If this variable is
7924 neither @code{nil} nor @code{t}, the article will be marked as read in
7925 both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
7926
7927
7928 @node Crosspost Handling
7929 @section Crosspost Handling
7930
7931 @cindex velveeta
7932 @cindex spamming
7933 Marking cross-posted articles as read ensures that you'll never have to
7934 read the same article more than once.  Unless, of course, somebody has
7935 posted it to several groups separately.  Posting the same article to
7936 several groups (not cross-posting) is called @dfn{spamming}, and you are
7937 by law required to send nasty-grams to anyone who perpetrates such a
7938 heinous crime.  You may want to try NoCeM handling to filter out spam
7939 (@pxref{NoCeM}).
7940
7941 Remember: Cross-posting is kinda ok, but posting the same article
7942 separately to several groups is not.  Massive cross-posting (aka.
7943 @dfn{velveeta}) is to be avoided at all costs, and you can even use the
7944 @code{gnus-summary-mail-crosspost-complaint} command to complain about
7945 excessive crossposting (@pxref{Summary Mail Commands}).
7946
7947 @cindex cross-posting
7948 @cindex Xref
7949 @cindex @sc{nov}
7950 One thing that may cause Gnus to not do the cross-posting thing
7951 correctly is if you use an @sc{nntp} server that supports @sc{xover}
7952 (which is very nice, because it speeds things up considerably) which
7953 does not include the @code{Xref} header in its @sc{nov} lines.  This is
7954 Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
7955 even with @sc{xover} by registering the @code{Xref} lines of all
7956 articles you actually read, but if you kill the articles, or just mark
7957 them as read without reading them, Gnus will not get a chance to snoop
7958 the @code{Xref} lines out of these articles, and will be unable to use
7959 the cross reference mechanism.
7960
7961 @cindex LIST overview.fmt
7962 @cindex overview.fmt
7963 To check whether your @sc{nntp} server includes the @code{Xref} header
7964 in its overview files, try @samp{telnet your.nntp.server nntp},
7965 @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
7966 overview.fmt}.  This may not work, but if it does, and the last line you
7967 get does not read @samp{Xref:full}, then you should shout and whine at
7968 your news admin until she includes the @code{Xref} header in the
7969 overview files.
7970
7971 @vindex gnus-nov-is-evil
7972 If you want Gnus to get the @code{Xref}s right all the time, you have to
7973 set @code{gnus-nov-is-evil} to @code{t}, which slows things down
7974 considerably.
7975
7976 C'est la vie.
7977
7978 For an alternative approach, @pxref{Duplicate Suppression}.
7979
7980
7981 @node Duplicate Suppression
7982 @section Duplicate Suppression
7983
7984 By default, Gnus tries to make sure that you don't have to read the same
7985 article more than once by utilizing the crossposting mechanism
7986 (@pxref{Crosspost Handling}).  However, that simple and efficient
7987 approach may not work satisfactory for some users for various
7988 reasons.
7989
7990 @enumerate
7991 @item
7992 The @sc{nntp} server may fail to generate the @code{Xref} header.  This
7993 is evil and not very common.
7994
7995 @item
7996 The @sc{nntp} server may fail to include the @code{Xref} header in the
7997 @file{.overview} data bases.  This is evil and all too common, alas.
7998
7999 @item
8000 You may be reading the same group (or several related groups) from
8001 different @sc{nntp} servers.
8002
8003 @item
8004 You may be getting mail that duplicates articles posted to groups.
8005 @end enumerate
8006
8007 I'm sure there are other situations where @code{Xref} handling fails as
8008 well, but these four are the most common situations.
8009
8010 If, and only if, @code{Xref} handling fails for you, then you may
8011 consider switching on @dfn{duplicate suppression}.  If you do so, Gnus
8012 will remember the @code{Message-ID}s of all articles you have read or
8013 otherwise marked as read, and then, as if by magic, mark them as read
8014 all subsequent times you see them---in @emph{all} groups.  Using this
8015 mechanism is quite likely to be somewhat inefficient, but not overly
8016 so.  It's certainly preferable to reading the same articles more than
8017 once.
8018
8019 Duplicate suppression is not a very subtle instrument.  It's more like a
8020 sledge hammer than anything else.  It works in a very simple
8021 fashion---if you have marked an article as read, it adds this Message-ID
8022 to a cache.  The next time it sees this Message-ID, it will mark the
8023 article as read with the @samp{M} mark.  It doesn't care what group it
8024 saw the article in.
8025
8026 @table @code
8027 @item gnus-suppress-duplicates
8028 @vindex gnus-suppress-duplicates
8029 If non-@code{nil}, suppress duplicates.
8030
8031 @item gnus-save-duplicate-list
8032 @vindex gnus-save-duplicate-list
8033 If non-@code{nil}, save the list of duplicates to a file.  This will
8034 make startup and shutdown take longer, so the default is @code{nil}.
8035 However, this means that only duplicate articles read in a single Gnus
8036 session are suppressed.
8037
8038 @item gnus-duplicate-list-length
8039 @vindex gnus-duplicate-list-length
8040 This variable says how many @code{Message-ID}s to keep in the duplicate
8041 suppression list.  The default is 10000.
8042
8043 @item gnus-duplicate-file
8044 @vindex gnus-duplicate-file
8045 The name of the file to store the duplicate suppression list in.  The
8046 default is @file{~/News/suppression}.
8047 @end table
8048
8049 If you have a tendency to stop and start Gnus often, setting
8050 @code{gnus-save-duplicate-list} to @code{t} is probably a good idea.  If
8051 you leave Gnus running for weeks on end, you may have it @code{nil}.  On
8052 the other hand, saving the list makes startup and shutdown much slower,
8053 so that means that if you stop and start Gnus often, you should set
8054 @code{gnus-save-duplicate-list} to @code{nil}.  Uhm.  I'll leave this up
8055 to you to figure out, I think.
8056
8057
8058 @node The Article Buffer
8059 @chapter The Article Buffer
8060 @cindex article buffer
8061
8062 The articles are displayed in the article buffer, of which there is only
8063 one.  All the summary buffers share the same article buffer unless you
8064 tell Gnus otherwise.
8065
8066 @menu
8067 * Hiding Headers::        Deciding what headers should be displayed.
8068 * Using MIME::            Pushing articles through @sc{mime} before reading them.
8069 * Customizing Articles::  Tailoring the look of the articles.
8070 * Article Keymap::        Keystrokes available in the article buffer.
8071 * Misc Article::          Other stuff.
8072 @end menu
8073
8074
8075 @node Hiding Headers
8076 @section Hiding Headers
8077 @cindex hiding headers
8078 @cindex deleting headers
8079
8080 The top section of each article is the @dfn{head}.  (The rest is the
8081 @dfn{body}, but you may have guessed that already.)
8082
8083 @vindex gnus-show-all-headers
8084 There is a lot of useful information in the head: the name of the person
8085 who wrote the article, the date it was written and the subject of the
8086 article.  That's well and nice, but there's also lots of information
8087 most people do not want to see---what systems the article has passed
8088 through before reaching you, the @code{Message-ID}, the
8089 @code{References}, etc. ad nauseum---and you'll probably want to get rid
8090 of some of those lines.  If you want to keep all those lines in the
8091 article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
8092
8093 Gnus provides you with two variables for sifting headers:
8094
8095 @table @code
8096
8097 @item gnus-visible-headers
8098 @vindex gnus-visible-headers
8099 If this variable is non-@code{nil}, it should be a regular expression
8100 that says what headers you wish to keep in the article buffer.  All
8101 headers that do not match this variable will be hidden.
8102
8103 For instance, if you only want to see the name of the person who wrote
8104 the article and the subject, you'd say:
8105
8106 @lisp
8107 (setq gnus-visible-headers "^From:\\|^Subject:")
8108 @end lisp
8109
8110 This variable can also be a list of regexps to match headers to
8111 remain visible.
8112
8113 @item gnus-ignored-headers
8114 @vindex gnus-ignored-headers
8115 This variable is the reverse of @code{gnus-visible-headers}.  If this
8116 variable is set (and @code{gnus-visible-headers} is @code{nil}), it
8117 should be a regular expression that matches all lines that you want to
8118 hide.  All lines that do not match this variable will remain visible.
8119
8120 For instance, if you just want to get rid of the @code{References} line
8121 and the @code{Xref} line, you might say:
8122
8123 @lisp
8124 (setq gnus-ignored-headers "^References:\\|^Xref:")
8125 @end lisp
8126
8127 This variable can also be a list of regexps to match headers to
8128 be removed.
8129
8130 Note that if @code{gnus-visible-headers} is non-@code{nil}, this
8131 variable will have no effect.
8132
8133 @end table
8134
8135 @vindex gnus-sorted-header-list
8136 Gnus can also sort the headers for you.  (It does this by default.)  You
8137 can control the sorting by setting the @code{gnus-sorted-header-list}
8138 variable.  It is a list of regular expressions that says in what order
8139 the headers are to be displayed.
8140
8141 For instance, if you want the name of the author of the article first,
8142 and then the subject, you might say something like:
8143
8144 @lisp
8145 (setq gnus-sorted-header-list '("^From:" "^Subject:"))
8146 @end lisp
8147
8148 Any headers that are to remain visible, but are not listed in this
8149 variable, will be displayed in random order after all the headers listed in this variable.
8150
8151 @findex gnus-article-hide-boring-headers
8152 @vindex gnus-boring-article-headers
8153 You can hide further boring headers by setting
8154 @code{gnus-treat-hide-boring-header} to @code{head}.  What this function
8155 does depends on the @code{gnus-boring-article-headers} variable.  It's a
8156 list, but this list doesn't actually contain header names.  Instead is
8157 lists various @dfn{boring conditions} that Gnus can check and remove
8158 from sight.
8159
8160 These conditions are:
8161 @table @code
8162 @item empty
8163 Remove all empty headers.
8164 @item followup-to
8165 Remove the @code{Followup-To} header if it is identical to the
8166 @code{Newsgroups} header.
8167 @item reply-to
8168 Remove the @code{Reply-To} header if it lists the same address as the
8169 @code{From} header.
8170 @item newsgroups
8171 Remove the @code{Newsgroups} header if it only contains the current group
8172 name.
8173 @item date
8174 Remove the @code{Date} header if the article is less than three days
8175 old.
8176 @item long-to
8177 Remove the @code{To} header if it is very long.
8178 @item many-to
8179 Remove all @code{To} headers if there are more than one.
8180 @end table
8181
8182 To include the four three elements, you could say something like;
8183
8184 @lisp
8185 (setq gnus-boring-article-headers
8186       '(empty followup-to reply-to))
8187 @end lisp
8188
8189 This is also the default value for this variable.
8190
8191
8192 @node Using MIME
8193 @section Using @sc{mime}
8194 @cindex @sc{mime}
8195
8196 Mime is a standard for waving your hands through the air, aimlessly,
8197 while people stand around yawning.
8198
8199 @sc{mime}, however, is a standard for encoding your articles, aimlessly,
8200 while all newsreaders die of fear.
8201
8202 @sc{mime} may specify what character set the article uses, the encoding
8203 of the characters, and it also makes it possible to embed pictures and
8204 other naughty stuff in innocent-looking articles.
8205
8206 @vindex gnus-display-mime-function
8207 @findex gnus-display-mime
8208 Gnus pushes @sc{mime} articles through @code{gnus-display-mime-function}
8209 to display the @sc{mime} parts.  This is @code{gnus-display-mime} by
8210 default, which creates a bundle of clickable buttons that can be used to
8211 display, save and manipulate the @sc{mime} objects.
8212
8213 The following commands are available when you have placed point over a
8214 @sc{mime} button:
8215
8216 @table @kbd
8217 @findex gnus-article-press-button
8218 @item RET (Article)
8219 @itemx BUTTON-2 (Article)
8220 Toggle displaying of the @sc{mime} object
8221 (@code{gnus-article-press-button}).
8222
8223 @findex gnus-mime-view-part
8224 @item M-RET (Article)
8225 @itemx v (Article)
8226 Prompt for a method, and then view the @sc{mime} object using this
8227 method (@code{gnus-mime-view-part}).
8228
8229 @findex gnus-mime-save-part
8230 @item o (Article)
8231 Prompt for a file name, and then save the @sc{mime} object
8232 (@code{gnus-mime-save-part}).
8233
8234 @findex gnus-mime-copy-part
8235 @item c (Article)
8236 Copy the @sc{mime} object to a fresh buffer and display this buffer
8237 (@code{gnus-mime-copy-part}).
8238
8239 @findex gnus-mime-pipe-part
8240 @item | (Article)
8241 Output the @sc{mime} object to a process (@code{gnus-mime-pipe-part}).
8242 @end table
8243
8244 Gnus will display some @sc{mime} objects automatically.  The way Gnus
8245 determines which parts to do this with is described in the Emacs MIME
8246 manual.
8247
8248 It might be best to just use the toggling functions from the article
8249 buffer to avoid getting nasty surprises.  (For instance, you enter the
8250 group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
8251 decoded the sound file in the article and some horrible sing-a-long song
8252 comes screaming out your speakers, and you can't find the volume button,
8253 because there isn't one, and people are starting to look at you, and you
8254 try to stop the program, but you can't, and you can't find the program
8255 to control the volume, and everybody else in the room suddenly decides
8256 to look at you disdainfully, and you'll feel rather stupid.)
8257
8258 Any similarity to real events and people is purely coincidental.  Ahem.
8259
8260
8261 @node Customizing Articles
8262 @section Customizing Articles
8263 @cindex article customization
8264
8265 A slew of functions for customizing how the articles are to look like
8266 exist.  You can call these functions interactively, or you can have them
8267 called automatically when you select the articles.
8268
8269 To have them called automatically, you should set the corresponding
8270 ``treatment'' variable.  For instance, to have headers hidden, you'd set
8271 @code{gnus-treat-hide-headers}.  Below is a list of variables that can
8272 be set, but first we discuss the values these variables can have.
8273
8274 @enumerate
8275 @item
8276 @code{nil}: Don't do this treatment.
8277
8278 @item
8279 @code{t}: Do this treatment on all body parts.
8280
8281 @item
8282 @code{head}: Do the treatment on the headers.
8283
8284 @item
8285 @code{last}: Do this treatment on the last part.
8286
8287 @item
8288 An integer: Do this treatment on all body parts that have a length less
8289 than this number.
8290
8291 @item
8292 A list:
8293
8294 The list is evaluated recursively.  The first element of the list is a
8295 predicate.  The following predicates are recognized: @code{or},
8296 @code{and}, @code{not} and @code{typep}.  Here's an example:
8297
8298 @lisp
8299 (or last
8300     (typep "text/x-vcard"))
8301 @end lisp
8302
8303 @end enumerate
8304
8305 You may have noticed that the word @dfn{part} is used here.  This refers
8306 to the fact that some messages are @sc{mime} multipart articles that may
8307 be divided into several parts.  Articles that are not multiparts are
8308 considered to contain just a single part.
8309
8310 @vindex gnus-article-treat-types
8311 Are the treatments applied to all sorts of multipart parts?  Yes, if you
8312 want to, but by default, only @samp{text/plain} parts are given the
8313 treatment.  This is controlled by the @code{gnus-article-treat-types}
8314 variable, which is a list of regular expressions that are matched to the
8315 type of the part.  This variable is ignored if the value of the
8316 controlling variable is a predicate list, as described above.
8317
8318 The following treatment options are available.  The easiest way to
8319 customize this is to examine the @code{gnus-article-treat} customization
8320 group.
8321
8322 @table @code
8323 @item gnus-treat-highlight-signature
8324 @item gnus-treat-buttonize
8325 @item gnus-treat-buttonize-head
8326 @item gnus-treat-emphasize
8327 @item gnus-treat-fill-article
8328 @item gnus-treat-strip-cr
8329 @item gnus-treat-hide-headers
8330 @item gnus-treat-hide-boring-headers
8331 @item gnus-treat-hide-signature
8332 @item gnus-treat-hide-citation
8333 @item gnus-treat-strip-pgp
8334 @item gnus-treat-strip-pem
8335 @item gnus-treat-highlight-headers
8336 @item gnus-treat-highlight-citation
8337 @item gnus-treat-highlight-signature
8338 @item gnus-treat-date-ut
8339 @item gnus-treat-date-local
8340 @item gnus-treat-date-lapsed
8341 @item gnus-treat-date-original
8342 @item gnus-treat-strip-trailing-blank-lines
8343 @item gnus-treat-strip-leading-blank-lines
8344 @item gnus-treat-strip-multiple-blank-lines
8345 @item gnus-treat-strip-blank-lines
8346 @item gnus-treat-overstrike
8347 @item gnus-treat-display-xface
8348 @item gnus-treat-display-smileys
8349 @item gnus-treat-display-picons
8350 @end table
8351
8352 @vindex gnus-part-display-hook
8353 You can, of course, write your own functions to be called from
8354 @code{gnus-part-display-hook}.  The functions are called narrowed to the
8355 part, and you can do anything you like, pretty much.  There is no
8356 information that you have to keep in the buffer---you can change
8357 everything.  However, you shouldn't delete any headers.  Instead make
8358 them invisible if you want to make them go away.
8359
8360
8361 @node Article Keymap
8362 @section Article Keymap
8363
8364 Most of the keystrokes in the summary buffer can also be used in the
8365 article buffer.  They should behave as if you typed them in the summary
8366 buffer, which means that you don't actually have to have a summary
8367 buffer displayed while reading.  You can do it all from the article
8368 buffer.
8369
8370 A few additional keystrokes are available:
8371
8372 @table @kbd
8373
8374 @item SPACE
8375 @kindex SPACE (Article)
8376 @findex gnus-article-next-page
8377 Scroll forwards one page (@code{gnus-article-next-page}).
8378
8379 @item DEL
8380 @kindex DEL (Article)
8381 @findex gnus-article-prev-page
8382 Scroll backwards one page (@code{gnus-article-prev-page}).
8383
8384 @item C-c ^
8385 @kindex C-c ^ (Article)
8386 @findex gnus-article-refer-article
8387 If point is in the neighborhood of a @code{Message-ID} and you press
8388 @kbd{C-c ^}, Gnus will try to get that article from the server
8389 (@code{gnus-article-refer-article}).
8390
8391 @item C-c C-m
8392 @kindex C-c C-m (Article)
8393 @findex gnus-article-mail
8394 Send a reply to the address near point (@code{gnus-article-mail}).  If
8395 given a prefix, include the mail.
8396
8397 @item s
8398 @kindex s (Article)
8399 @findex gnus-article-show-summary
8400 Reconfigure the buffers so that the summary buffer becomes visible
8401 (@code{gnus-article-show-summary}).
8402
8403 @item ?
8404 @kindex ? (Article)
8405 @findex gnus-article-describe-briefly
8406 Give a very brief description of the available keystrokes
8407 (@code{gnus-article-describe-briefly}).
8408
8409 @item TAB
8410 @kindex TAB (Article)
8411 @findex gnus-article-next-button
8412 Go to the next button, if any (@code{gnus-article-next-button}).  This
8413 only makes sense if you have buttonizing turned on.
8414
8415 @item M-TAB
8416 @kindex M-TAB (Article)
8417 @findex gnus-article-prev-button
8418 Go to the previous button, if any (@code{gnus-article-prev-button}).
8419
8420 @end table
8421
8422
8423 @node Misc Article
8424 @section Misc Article
8425
8426 @table @code
8427
8428 @item gnus-single-article-buffer
8429 @vindex gnus-single-article-buffer
8430 If non-@code{nil}, use the same article buffer for all the groups.
8431 (This is the default.)  If @code{nil}, each group will have its own
8432 article buffer.
8433
8434 @vindex gnus-article-decode-hook
8435 @item gnus-article-decode-hook
8436 @cindex MIME
8437 Hook used to decode @sc{mime} articles.  The default value is
8438 @code{(article-decode-charset article-decode-encoded-words)}
8439
8440 @vindex gnus-article-prepare-hook
8441 @item gnus-article-prepare-hook
8442 This hook is called right after the article has been inserted into the
8443 article buffer.  It is mainly intended for functions that do something
8444 depending on the contents; it should probably not be used for changing
8445 the contents of the article buffer.
8446
8447 @item gnus-article-mode-hook
8448 @vindex gnus-article-mode-hook
8449 Hook called in article mode buffers.
8450
8451 @item gnus-article-mode-syntax-table
8452 @vindex gnus-article-mode-syntax-table
8453 Syntax table used in article buffers.  It is initialized from
8454 @code{text-mode-syntax-table}.
8455
8456 @vindex gnus-article-mode-line-format
8457 @item gnus-article-mode-line-format
8458 This variable is a format string along the same lines as
8459 @code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}).  It
8460 accepts the same format specifications as that variable, with one
8461 extension:
8462
8463 @table @samp
8464 @item w
8465 The @dfn{wash status} of the article.  This is a short string with one
8466 character for each possible article wash operation that may have been
8467 performed.
8468 @item m
8469 The number of @sc{mime} parts in the article.
8470 @end table
8471
8472 @vindex gnus-break-pages
8473
8474 @item gnus-break-pages
8475 Controls whether @dfn{page breaking} is to take place.  If this variable
8476 is non-@code{nil}, the articles will be divided into pages whenever a
8477 page delimiter appears in the article.  If this variable is @code{nil},
8478 paging will not be done.
8479
8480 @item gnus-page-delimiter
8481 @vindex gnus-page-delimiter
8482 This is the delimiter mentioned above.  By default, it is @samp{^L}
8483 (formfeed).
8484 @end table
8485
8486
8487 @node Composing Messages
8488 @chapter Composing Messages
8489 @cindex composing messages
8490 @cindex messages
8491 @cindex mail
8492 @cindex sending mail
8493 @cindex reply
8494 @cindex followup
8495 @cindex post
8496
8497 @kindex C-c C-c (Post)
8498 All commands for posting and mailing will put you in a message buffer
8499 where you can edit the article all you like, before you send the article
8500 by pressing @kbd{C-c C-c}.  @xref{Top, , Top, message, The Message
8501 Manual}.  If you are in a foreign news group, and you wish to post the
8502 article using the foreign server, you can give a prefix to @kbd{C-c C-c}
8503 to make Gnus try to post using the foreign server.
8504
8505 @menu
8506 * Mail::                 Mailing and replying.
8507 * Post::                 Posting and following up.
8508 * Posting Server::       What server should you post via?
8509 * Mail and Post::        Mailing and posting at the same time.
8510 * Archived Messages::    Where Gnus stores the messages you've sent.
8511 * Posting Styles::       An easier way to specify who you are.
8512 * Drafts::               Postponing messages and rejected messages.
8513 * Rejected Articles::    What happens if the server doesn't like your article?
8514 @end menu
8515
8516 Also see @pxref{Canceling and Superseding} for information on how to
8517 remove articles you shouldn't have posted.
8518
8519
8520 @node Mail
8521 @section Mail
8522
8523 Variables for customizing outgoing mail:
8524
8525 @table @code
8526 @item gnus-uu-digest-headers
8527 @vindex gnus-uu-digest-headers
8528 List of regexps to match headers included in digested messages.  The
8529 headers will be included in the sequence they are matched.
8530
8531 @item gnus-add-to-list
8532 @vindex gnus-add-to-list
8533 If non-@code{nil}, add a @code{to-list} group parameter to mail groups
8534 that have none when you do a @kbd{a}.
8535
8536 @end table
8537
8538
8539 @node Post
8540 @section Post
8541
8542 Variables for composing news articles:
8543
8544 @table @code
8545 @item gnus-sent-message-ids-file
8546 @vindex gnus-sent-message-ids-file
8547 Gnus will keep a @code{Message-ID} history file of all the mails it has
8548 sent.  If it discovers that it has already sent a mail, it will ask the
8549 user whether to re-send the mail.  (This is primarily useful when
8550 dealing with @sc{soup} packets and the like where one is apt to send the
8551 same packet multiple times.)  This variable says what the name of this
8552 history file is.  It is @file{~/News/Sent-Message-IDs} by default.  Set
8553 this variable to @code{nil} if you don't want Gnus to keep a history
8554 file.
8555
8556 @item gnus-sent-message-ids-length
8557 @vindex gnus-sent-message-ids-length
8558 This variable says how many @code{Message-ID}s to keep in the history
8559 file.  It is 1000 by default.
8560
8561 @end table
8562
8563
8564 @node Posting Server
8565 @section Posting Server
8566
8567 When you press those magical @kbd{C-c C-c} keys to ship off your latest
8568 (extremely intelligent, of course) article, where does it go?
8569
8570 Thank you for asking.  I hate you.
8571
8572 @vindex gnus-post-method
8573
8574 It can be quite complicated.  Normally, Gnus will use the same native
8575 server.  However.  If your native server doesn't allow posting, just
8576 reading, you probably want to use some other server to post your
8577 (extremely intelligent and fabulously interesting) articles.  You can
8578 then set the @code{gnus-post-method} to some other method:
8579
8580 @lisp
8581 (setq gnus-post-method '(nnspool ""))
8582 @end lisp
8583
8584 Now, if you've done this, and then this server rejects your article, or
8585 this server is down, what do you do then?  To override this variable you
8586 can use a non-zero prefix to the @kbd{C-c C-c} command to force using
8587 the ``current'' server for posting.
8588
8589 If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
8590 Gnus will prompt you for what method to use for posting.
8591
8592 You can also set @code{gnus-post-method} to a list of select methods.
8593 If that's the case, Gnus will always prompt you for what method to use
8594 for posting.
8595
8596 Finally, if you want to always post using the same select method as
8597 you're reading from (which might be convenient if you're reading lots of
8598 groups from different private servers), you can set this variable to
8599 @code{current}.
8600
8601
8602 @node Mail and Post
8603 @section Mail and Post
8604
8605 Here's a list of variables relevant to both mailing and
8606 posting:
8607
8608 @table @code
8609 @item gnus-mailing-list-groups
8610 @findex gnus-mailing-list-groups
8611 @cindex mailing lists
8612
8613 If your news server offers groups that are really mailing lists
8614 gatewayed to the @sc{nntp} server, you can read those groups without
8615 problems, but you can't post/followup to them without some difficulty.
8616 One solution is to add a @code{to-address} to the group parameters
8617 (@pxref{Group Parameters}).  An easier thing to do is set the
8618 @code{gnus-mailing-list-groups} to a regexp that matches the groups that
8619 really are mailing lists.  Then, at least, followups to the mailing
8620 lists will work most of the time.  Posting to these groups (@kbd{a}) is
8621 still a pain, though.
8622
8623 @end table
8624
8625 You may want to do spell-checking on messages that you send out.  Or, if
8626 you don't want to spell-check by hand, you could add automatic
8627 spell-checking via the @code{ispell} package:
8628
8629 @cindex ispell
8630 @findex ispell-message
8631 @lisp
8632 (add-hook 'message-send-hook 'ispell-message)
8633 @end lisp
8634
8635
8636 @node Archived Messages
8637 @section Archived Messages
8638 @cindex archived messages
8639 @cindex sent messages
8640
8641 Gnus provides a few different methods for storing the mail and news you
8642 send.  The default method is to use the @dfn{archive virtual server} to
8643 store the messages.  If you want to disable this completely, the
8644 @code{gnus-message-archive-group} variable should be @code{nil}, which
8645 is the default.
8646
8647 @vindex gnus-message-archive-method
8648 @code{gnus-message-archive-method} says what virtual server Gnus is to
8649 use to store sent messages.  The default is:
8650
8651 @lisp
8652 (nnfolder "archive"
8653           (nnfolder-directory   "~/Mail/archive")
8654           (nnfolder-active-file "~/Mail/archive/active")
8655           (nnfolder-get-new-mail nil)
8656           (nnfolder-inhibit-expiry t))
8657 @end lisp
8658
8659 You can, however, use any mail select method (@code{nnml},
8660 @code{nnmbox}, etc.).  @code{nnfolder} is a quite likeable select method
8661 for doing this sort of thing, though.  If you don't like the default
8662 directory chosen, you could say something like:
8663
8664 @lisp
8665 (setq gnus-message-archive-method
8666       '(nnfolder "archive"
8667                  (nnfolder-inhibit-expiry t)
8668                  (nnfolder-active-file "~/News/sent-mail/active")
8669                  (nnfolder-directory "~/News/sent-mail/")))
8670 @end lisp
8671
8672 @vindex gnus-message-archive-group
8673 @cindex Gcc
8674 Gnus will insert @code{Gcc} headers in all outgoing messages that point
8675 to one or more group(s) on that server.  Which group to use is
8676 determined by the @code{gnus-message-archive-group} variable.
8677
8678 This variable can be used to do the following:
8679
8680 @itemize @bullet
8681 @item a string
8682 Messages will be saved in that group.
8683 @item a list of strings
8684 Messages will be saved in all those groups.
8685 @item an alist of regexps, functions and forms
8686 When a key ``matches'', the result is used.
8687 @item @code{nil}
8688 No message archiving will take place.  This is the default.
8689 @end itemize
8690
8691 Let's illustrate:
8692
8693 Just saving to a single group called @samp{MisK}:
8694 @lisp
8695 (setq gnus-message-archive-group "MisK")
8696 @end lisp
8697
8698 Saving to two groups, @samp{MisK} and @samp{safe}:
8699 @lisp
8700 (setq gnus-message-archive-group '("MisK" "safe"))
8701 @end lisp
8702
8703 Save to different groups based on what group you are in:
8704 @lisp
8705 (setq gnus-message-archive-group
8706       '(("^alt" "sent-to-alt")
8707         ("mail" "sent-to-mail")
8708         (".*" "sent-to-misc")))
8709 @end lisp
8710
8711 More complex stuff:
8712 @lisp
8713 (setq gnus-message-archive-group
8714       '((if (message-news-p)
8715             "misc-news"
8716           "misc-mail")))
8717 @end lisp
8718
8719 How about storing all news messages in one file, but storing all mail
8720 messages in one file per month:
8721
8722 @lisp
8723 (setq gnus-message-archive-group
8724       '((if (message-news-p)
8725             "misc-news"
8726           (concat "mail." (format-time-string
8727                            "%Y-%m" (current-time))))))
8728 @end lisp
8729
8730 (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
8731 use a different value for @code{gnus-message-archive-group} there.)
8732
8733 Now, when you send a message off, it will be stored in the appropriate
8734 group.  (If you want to disable storing for just one particular message,
8735 you can just remove the @code{Gcc} header that has been inserted.)  The
8736 archive group will appear in the group buffer the next time you start
8737 Gnus, or the next time you press @kbd{F} in the group buffer.  You can
8738 enter it and read the articles in it just like you'd read any other
8739 group.  If the group gets really big and annoying, you can simply rename
8740 if (using @kbd{G r} in the group buffer) to something
8741 nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
8742 continue to be stored in the old (now empty) group.
8743
8744 That's the default method of archiving sent messages.  Gnus offers a
8745 different way for the people who don't like the default method.  In that
8746 case you should set @code{gnus-message-archive-group} to @code{nil};
8747 this will disable archiving.
8748
8749 @table @code
8750 @item gnus-outgoing-message-group
8751 @vindex gnus-outgoing-message-group
8752 All outgoing messages will be put in this group.  If you want to store
8753 all your outgoing mail and articles in the group @samp{nnml:archive},
8754 you set this variable to that value.  This variable can also be a list of
8755 group names.
8756
8757 If you want to have greater control over what group to put each
8758 message in, you can set this variable to a function that checks the
8759 current newsgroup name and then returns a suitable group name (or list
8760 of names).
8761
8762 This variable can be used instead of @code{gnus-message-archive-group},
8763 but the latter is the preferred method.
8764 @end table
8765
8766
8767 @node Posting Styles
8768 @section Posting Styles
8769 @cindex posting styles
8770 @cindex styles
8771
8772 All them variables, they make my head swim.
8773
8774 So what if you want a different @code{Organization} and signature based
8775 on what groups you post to?  And you post both from your home machine
8776 and your work machine, and you want different @code{From} lines, and so
8777 on?
8778
8779 @vindex gnus-posting-styles
8780 One way to do stuff like that is to write clever hooks that change the
8781 variables you need to have changed.  That's a bit boring, so somebody
8782 came up with the bright idea of letting the user specify these things in
8783 a handy alist.  Here's an example of a @code{gnus-posting-styles}
8784 variable:
8785
8786 @lisp
8787 ((".*"
8788   (signature "Peace and happiness")
8789   (organization "What me?"))
8790  ("^comp"
8791   (signature "Death to everybody"))
8792  ("comp.emacs.i-love-it"
8793   (organization "Emacs is it")))
8794 @end lisp
8795
8796 As you might surmise from this example, this alist consists of several
8797 @dfn{styles}.  Each style will be applicable if the first element
8798 ``matches'', in some form or other.  The entire alist will be iterated
8799 over, from the beginning towards the end, and each match will be
8800 applied, which means that attributes in later styles that match override
8801 the same attributes in earlier matching styles.  So
8802 @samp{comp.programming.literate} will have the @samp{Death to everybody}
8803 signature and the @samp{What me?} @code{Organization} header.
8804
8805 The first element in each style is called the @code{match}.  If it's a
8806 string, then Gnus will try to regexp match it against the group name.
8807 If it's a function symbol, that function will be called with no
8808 arguments.  If it's a variable symbol, then the variable will be
8809 referenced.  If it's a list, then that list will be @code{eval}ed.  In
8810 any case, if this returns a non-@code{nil} value, then the style is said
8811 to @dfn{match}.
8812
8813 Each style may contain a arbitrary amount of @dfn{attributes}.  Each
8814 attribute consists of a @var{(name . value)} pair.  The attribute name
8815 can be one of @code{signature}, @code{signature-file},
8816 @code{organization}, @code{address}, @code{name} or @code{body}.  The
8817 attribute name can also be a string.  In that case, this will be used as
8818 a header name, and the value will be inserted in the headers of the
8819 article.
8820
8821 The attribute value can be a string (used verbatim), a function (the
8822 return value will be used), a variable (its value will be used) or a
8823 list (it will be @code{eval}ed and the return value will be used).
8824
8825 If you wish to check whether the message you are about to compose is
8826 meant to be a news article or a mail message, you can check the values
8827 of the two dynamically bound variables @code{message-this-is-news} and
8828 @code{message-this-is-mail}.
8829
8830 @vindex message-this-is-mail
8831 @vindex message-this-is-news
8832
8833 So here's a new example:
8834
8835 @lisp
8836 (setq gnus-posting-styles
8837       '((".*"
8838          (signature-file "~/.signature")
8839          (name "User Name")
8840          ("X-Home-Page" (getenv "WWW_HOME"))
8841          (organization "People's Front Against MWM"))
8842         ("^rec.humor"
8843          (signature my-funny-signature-randomizer))
8844         ((equal (system-name) "gnarly")
8845          (signature my-quote-randomizer))
8846         (message-this-is-news
8847          (signature my-news-signature))
8848         (posting-from-work-p
8849          (signature-file "~/.work-signature")
8850          (address "user@@bar.foo")
8851          (body "You are fired.\n\nSincerely, your boss.")
8852          (organization "Important Work, Inc"))
8853         ("^nn.+:"
8854          (signature-file "~/.mail-signature"))))
8855 @end lisp
8856
8857
8858 @node Drafts
8859 @section Drafts
8860 @cindex drafts
8861
8862 If you are writing a message (mail or news) and suddenly remember that
8863 you have a steak in the oven (or some pesto in the food processor, you
8864 craaazy vegetarians), you'll probably wish there was a method to save
8865 the message you are writing so that you can continue editing it some
8866 other day, and send it when you feel its finished.
8867
8868 Well, don't worry about it.  Whenever you start composing a message of
8869 some sort using the Gnus mail and post commands, the buffer you get will
8870 automatically associate to an article in a special @dfn{draft} group.
8871 If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
8872 article will be saved there.  (Auto-save files also go to the draft
8873 group.)
8874
8875 @cindex nndraft
8876 @vindex nndraft-directory
8877 The draft group is a special group (which is implemented as an
8878 @code{nndraft} group, if you absolutely have to know) called
8879 @samp{nndraft:drafts}.  The variable @code{nndraft-directory} says where
8880 @code{nndraft} is to store its files.  What makes this group special is
8881 that you can't tick any articles in it or mark any articles as
8882 read---all articles in the group are permanently unread.
8883
8884 If the group doesn't exist, it will be created and you'll be subscribed
8885 to it.  The only way to make it disappear from the Group buffer is to
8886 unsubscribe it.
8887
8888 @c @findex gnus-dissociate-buffer-from-draft
8889 @c @kindex C-c M-d (Mail)
8890 @c @kindex C-c M-d (Post)
8891 @c @findex gnus-associate-buffer-with-draft
8892 @c @kindex C-c C-d (Mail)
8893 @c @kindex C-c C-d (Post)
8894 @c If you're writing some super-secret message that you later want to
8895 @c encode with PGP before sending, you may wish to turn the auto-saving
8896 @c (and association with the draft group) off.  You never know who might be
8897 @c interested in reading all your extremely valuable and terribly horrible
8898 @c and interesting secrets.  The @kbd{C-c M-d}
8899 @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
8900 @c If you change your mind and want to turn the auto-saving back on again,
8901 @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
8902 @c
8903 @c @vindex gnus-use-draft
8904 @c To leave association with the draft group off by default, set
8905 @c @code{gnus-use-draft} to @code{nil}.  It is @code{t} by default.
8906
8907 @findex gnus-draft-edit-message
8908 @kindex D e (Draft)
8909 When you want to continue editing the article, you simply enter the
8910 draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
8911 that.  You will be placed in a buffer where you left off.
8912
8913 Rejected articles will also be put in this draft group (@pxref{Rejected
8914 Articles}).
8915
8916 @findex gnus-draft-send-all-messages
8917 @findex gnus-draft-send-message
8918 If you have lots of rejected messages you want to post (or mail) without
8919 doing further editing, you can use the @kbd{D s} command
8920 (@code{gnus-draft-send-message}).  This command understands the
8921 process/prefix convention (@pxref{Process/Prefix}).  The @kbd{D S}
8922 command (@code{gnus-draft-send-all-messages}) will ship off all messages
8923 in the buffer.
8924
8925 If you have some messages that you wish not to send, you can use the
8926 @kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
8927 as unsendable.  This is a toggling command.
8928
8929
8930 @node Rejected Articles
8931 @section Rejected Articles
8932 @cindex rejected articles
8933
8934 Sometimes a news server will reject an article.  Perhaps the server
8935 doesn't like your face.  Perhaps it just feels miserable.  Perhaps
8936 @emph{there be demons}.  Perhaps you have included too much cited text.
8937 Perhaps the disk is full.  Perhaps the server is down.
8938
8939 These situations are, of course, totally beyond the control of Gnus.
8940 (Gnus, of course, loves the way you look, always feels great, has angels
8941 fluttering around inside of it, doesn't care about how much cited text
8942 you include, never runs full and never goes down.)  So Gnus saves these
8943 articles until some later time when the server feels better.
8944
8945 The rejected articles will automatically be put in a special draft group
8946 (@pxref{Drafts}).  When the server comes back up again, you'd then
8947 typically enter that group and send all the articles off.
8948
8949
8950 @node Select Methods
8951 @chapter Select Methods
8952 @cindex foreign groups
8953 @cindex select methods
8954
8955 A @dfn{foreign group} is a group not read by the usual (or
8956 default) means.  It could be, for instance, a group from a different
8957 @sc{nntp} server, it could be a virtual group, or it could be your own
8958 personal mail group.
8959
8960 A foreign group (or any group, really) is specified by a @dfn{name} and
8961 a @dfn{select method}.  To take the latter first, a select method is a
8962 list where the first element says what backend to use (e.g. @code{nntp},
8963 @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
8964 name}.  There may be additional elements in the select method, where the
8965 value may have special meaning for the backend in question.
8966
8967 One could say that a select method defines a @dfn{virtual server}---so
8968 we do just that (@pxref{The Server Buffer}).
8969
8970 The @dfn{name} of the group is the name the backend will recognize the
8971 group as.
8972
8973 For instance, the group @samp{soc.motss} on the @sc{nntp} server
8974 @samp{some.where.edu} will have the name @samp{soc.motss} and select
8975 method @code{(nntp "some.where.edu")}.  Gnus will call this group
8976 @samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
8977 backend just knows this group as @samp{soc.motss}.
8978
8979 The different methods all have their peculiarities, of course.
8980
8981 @menu
8982 * The Server Buffer::     Making and editing virtual servers.
8983 * Getting News::          Reading USENET news with Gnus.
8984 * Getting Mail::          Reading your personal mail with Gnus.
8985 * Other Sources::         Reading directories, files, SOUP packets.
8986 * Combined Groups::       Combining groups into one group.
8987 * Gnus Unplugged::        Reading news and mail offline.
8988 @end menu
8989
8990
8991 @node The Server Buffer
8992 @section The Server Buffer
8993
8994 Traditionally, a @dfn{server} is a machine or a piece of software that
8995 one connects to, and then requests information from.  Gnus does not
8996 connect directly to any real servers, but does all transactions through
8997 one backend or other.  But that's just putting one layer more between
8998 the actual media and Gnus, so we might just as well say that each
8999 backend represents a virtual server.
9000
9001 For instance, the @code{nntp} backend may be used to connect to several
9002 different actual @sc{nntp} servers, or, perhaps, to many different ports
9003 on the same actual @sc{nntp} server.  You tell Gnus which backend to
9004 use, and what parameters to set by specifying a @dfn{select method}.
9005
9006 These select method specifications can sometimes become quite
9007 complicated---say, for instance, that you want to read from the
9008 @sc{nntp} server @samp{news.funet.fi} on port number 13, which
9009 hangs if queried for @sc{nov} headers and has a buggy select.  Ahem.
9010 Anyways, if you had to specify that for each group that used this
9011 server, that would be too much work, so Gnus offers a way of naming
9012 select methods, which is what you do in the server buffer.
9013
9014 To enter the server buffer, use the @kbd{^}
9015 (@code{gnus-group-enter-server-mode}) command in the group buffer.
9016
9017 @menu
9018 * Server Buffer Format::      You can customize the look of this buffer.
9019 * Server Commands::           Commands to manipulate servers.
9020 * Example Methods::           Examples server specifications.
9021 * Creating a Virtual Server:: An example session.
9022 * Server Variables::          Which variables to set.
9023 * Servers and Methods::       You can use server names as select methods.
9024 * Unavailable Servers::       Some servers you try to contact may be down.
9025 @end menu
9026
9027 @vindex gnus-server-mode-hook
9028 @code{gnus-server-mode-hook} is run when creating the server buffer.
9029
9030
9031 @node Server Buffer Format
9032 @subsection Server Buffer Format
9033 @cindex server buffer format
9034
9035 @vindex gnus-server-line-format
9036 You can change the look of the server buffer lines by changing the
9037 @code{gnus-server-line-format} variable.  This is a @code{format}-like
9038 variable, with some simple extensions:
9039
9040 @table @samp
9041
9042 @item h
9043 How the news is fetched---the backend name.
9044
9045 @item n
9046 The name of this server.
9047
9048 @item w
9049 Where the news is to be fetched from---the address.
9050
9051 @item s
9052 The opened/closed/denied status of the server.
9053 @end table
9054
9055 @vindex gnus-server-mode-line-format
9056 The mode line can also be customized by using the
9057 @code{gnus-server-mode-line-format} variable (@pxref{Mode Line
9058 Formatting}).  The following specs are understood:
9059
9060 @table @samp
9061 @item S
9062 Server name.
9063
9064 @item M
9065 Server method.
9066 @end table
9067
9068 Also @pxref{Formatting Variables}.
9069
9070
9071 @node Server Commands
9072 @subsection Server Commands
9073 @cindex server commands
9074
9075 @table @kbd
9076
9077 @item a
9078 @kindex a (Server)
9079 @findex gnus-server-add-server
9080 Add a new server (@code{gnus-server-add-server}).
9081
9082 @item e
9083 @kindex e (Server)
9084 @findex gnus-server-edit-server
9085 Edit a server (@code{gnus-server-edit-server}).
9086
9087 @item SPACE
9088 @kindex SPACE (Server)
9089 @findex gnus-server-read-server
9090 Browse the current server (@code{gnus-server-read-server}).
9091
9092 @item q
9093 @kindex q (Server)
9094 @findex gnus-server-exit
9095 Return to the group buffer (@code{gnus-server-exit}).
9096
9097 @item k
9098 @kindex k (Server)
9099 @findex gnus-server-kill-server
9100 Kill the current server (@code{gnus-server-kill-server}).
9101
9102 @item y
9103 @kindex y (Server)
9104 @findex gnus-server-yank-server
9105 Yank the previously killed server (@code{gnus-server-yank-server}).
9106
9107 @item c
9108 @kindex c (Server)
9109 @findex gnus-server-copy-server
9110 Copy the current server (@code{gnus-server-copy-server}).
9111
9112 @item l
9113 @kindex l (Server)
9114 @findex gnus-server-list-servers
9115 List all servers (@code{gnus-server-list-servers}).
9116
9117 @item s
9118 @kindex s (Server)
9119 @findex gnus-server-scan-server
9120 Request that the server scan its sources for new articles
9121 (@code{gnus-server-scan-server}).  This is mainly sensible with mail
9122 servers.
9123
9124 @item g
9125 @kindex g (Server)
9126 @findex gnus-server-regenerate-server
9127 Request that the server regenerate all its data structures
9128 (@code{gnus-server-regenerate-server}).  This can be useful if you have
9129 a mail backend that has gotten out of synch.
9130
9131 @end table
9132
9133
9134 @node Example Methods
9135 @subsection Example Methods
9136
9137 Most select methods are pretty simple and self-explanatory:
9138
9139 @lisp
9140 (nntp "news.funet.fi")
9141 @end lisp
9142
9143 Reading directly from the spool is even simpler:
9144
9145 @lisp
9146 (nnspool "")
9147 @end lisp
9148
9149 As you can see, the first element in a select method is the name of the
9150 backend, and the second is the @dfn{address}, or @dfn{name}, if you
9151 will.
9152
9153 After these two elements, there may be an arbitrary number of
9154 @var{(variable form)} pairs.
9155
9156 To go back to the first example---imagine that you want to read from
9157 port 15 on that machine.  This is what the select method should
9158 look like then:
9159
9160 @lisp
9161 (nntp "news.funet.fi" (nntp-port-number 15))
9162 @end lisp
9163
9164 You should read the documentation to each backend to find out what
9165 variables are relevant, but here's an @code{nnmh} example:
9166
9167 @code{nnmh} is a mail backend that reads a spool-like structure.  Say
9168 you have two structures that you wish to access: One is your private
9169 mail spool, and the other is a public one.  Here's the possible spec for
9170 your private mail:
9171
9172 @lisp
9173 (nnmh "private" (nnmh-directory "~/private/mail/"))
9174 @end lisp
9175
9176 (This server is then called @samp{private}, but you may have guessed
9177 that.)
9178
9179 Here's the method for a public spool:
9180
9181 @lisp
9182 (nnmh "public"
9183       (nnmh-directory "/usr/information/spool/")
9184       (nnmh-get-new-mail nil))
9185 @end lisp
9186
9187 If you are behind a firewall and only have access to the @sc{nntp}
9188 server from the firewall machine, you can instruct Gnus to @code{rlogin}
9189 on the firewall machine and telnet from there to the @sc{nntp} server.
9190 Doing this can be rather fiddly, but your virtual server definition
9191 should probably look something like this:
9192
9193 @lisp
9194 (nntp "firewall"
9195       (nntp-address "the.firewall.machine")
9196       (nntp-open-connection-function nntp-open-rlogin)
9197       (nntp-end-of-line "\n")
9198       (nntp-rlogin-parameters
9199        ("telnet" "the.real.nntp.host" "nntp")))
9200 @end lisp
9201
9202 If you want to use the wonderful @code{ssh} program to provide a
9203 compressed connection over the modem line, you could create a virtual
9204 server that would look something like this:
9205
9206 @lisp
9207 (nntp "news"
9208        (nntp-address "copper.uio.no")
9209        (nntp-rlogin-program "ssh")
9210        (nntp-open-connection-function nntp-open-rlogin)
9211        (nntp-end-of-line "\n")
9212        (nntp-rlogin-parameters
9213         ("telnet" "news.uio.no" "nntp")))
9214 @end lisp
9215
9216 This means that you have to have set up @code{ssh-agent} correctly to
9217 provide automatic authorization, of course.  And to get a compressed
9218 connection, you have to have the @samp{Compression} option in the
9219 @code{ssh} @file{config} file.
9220
9221
9222 @node Creating a Virtual Server
9223 @subsection Creating a Virtual Server
9224
9225 If you're saving lots of articles in the cache by using persistent
9226 articles, you may want to create a virtual server to read the cache.
9227
9228 First you need to add a new server.  The @kbd{a} command does that.  It
9229 would probably be best to use @code{nnspool} to read the cache.  You
9230 could also use @code{nnml} or @code{nnmh}, though.
9231
9232 Type @kbd{a nnspool RET cache RET}.
9233
9234 You should now have a brand new @code{nnspool} virtual server called
9235 @samp{cache}.  You now need to edit it to have the right definitions.
9236 Type @kbd{e} to edit the server.  You'll be entered into a buffer that
9237 will contain the following:
9238
9239 @lisp
9240 (nnspool "cache")
9241 @end lisp
9242
9243 Change that to:
9244
9245 @lisp
9246 (nnspool "cache"
9247          (nnspool-spool-directory "~/News/cache/")
9248          (nnspool-nov-directory "~/News/cache/")
9249          (nnspool-active-file "~/News/cache/active"))
9250 @end lisp
9251
9252 Type @kbd{C-c C-c} to return to the server buffer.  If you now press
9253 @kbd{RET} over this virtual server, you should be entered into a browse
9254 buffer, and you should be able to enter any of the groups displayed.
9255
9256
9257 @node Server Variables
9258 @subsection Server Variables
9259
9260 One sticky point when defining variables (both on backends and in Emacs
9261 in general) is that some variables are typically initialized from other
9262 variables when the definition of the variables is being loaded.  If you
9263 change the "base" variable after the variables have been loaded, you
9264 won't change the "derived" variables.
9265
9266 This typically affects directory and file variables.  For instance,
9267 @code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
9268 directory variables are initialized from that variable, so
9269 @code{nnml-active-file} will be @file{~/Mail/active}.  If you define a
9270 new virtual @code{nnml} server, it will @emph{not} suffice to set just
9271 @code{nnml-directory}---you have to explicitly set all the file
9272 variables to be what you want them to be.  For a complete list of
9273 variables for each backend, see each backend's section later in this
9274 manual, but here's an example @code{nnml} definition:
9275
9276 @lisp
9277 (nnml "public"
9278       (nnml-directory "~/my-mail/")
9279       (nnml-active-file "~/my-mail/active")
9280       (nnml-newsgroups-file "~/my-mail/newsgroups"))
9281 @end lisp
9282
9283
9284 @node Servers and Methods
9285 @subsection Servers and Methods
9286
9287 Wherever you would normally use a select method
9288 (e.g. @code{gnus-secondary-select-method}, in the group select method,
9289 when browsing a foreign server) you can use a virtual server name
9290 instead.  This could potentially save lots of typing.  And it's nice all
9291 over.
9292
9293
9294 @node Unavailable Servers
9295 @subsection Unavailable Servers
9296
9297 If a server seems to be unreachable, Gnus will mark that server as
9298 @code{denied}.  That means that any subsequent attempt to make contact
9299 with that server will just be ignored.  ``It can't be opened,'' Gnus
9300 will tell you, without making the least effort to see whether that is
9301 actually the case or not.
9302
9303 That might seem quite naughty, but it does make sense most of the time.
9304 Let's say you have 10 groups subscribed to on server
9305 @samp{nephelococcygia.com}.  This server is located somewhere quite far
9306 away from you and the machine is quite slow, so it takes 1 minute just
9307 to find out that it refuses connection to you today.  If Gnus were to
9308 attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
9309 attempt to do that.  Once it has gotten a single ``connection refused'',
9310 it will regard that server as ``down''.
9311
9312 So, what happens if the machine was only feeling unwell temporarily?
9313 How do you test to see whether the machine has come up again?
9314
9315 You jump to the server buffer (@pxref{The Server Buffer}) and poke it
9316 with the following commands:
9317
9318 @table @kbd
9319
9320 @item O
9321 @kindex O (Server)
9322 @findex gnus-server-open-server
9323 Try to establish connection to the server on the current line
9324 (@code{gnus-server-open-server}).
9325
9326 @item C
9327 @kindex C (Server)
9328 @findex gnus-server-close-server
9329 Close the connection (if any) to the server
9330 (@code{gnus-server-close-server}).
9331
9332 @item D
9333 @kindex D (Server)
9334 @findex gnus-server-deny-server
9335 Mark the current server as unreachable
9336 (@code{gnus-server-deny-server}).
9337
9338 @item M-o
9339 @kindex M-o (Server)
9340 @findex gnus-server-open-all-servers
9341 Open the connections to all servers in the buffer
9342 (@code{gnus-server-open-all-servers}).
9343
9344 @item M-c
9345 @kindex M-c (Server)
9346 @findex gnus-server-close-all-servers
9347 Close the connections to all servers in the buffer
9348 (@code{gnus-server-close-all-servers}).
9349
9350 @item R
9351 @kindex R (Server)
9352 @findex gnus-server-remove-denials
9353 Remove all marks to whether Gnus was denied connection from any servers
9354 (@code{gnus-server-remove-denials}).
9355
9356 @end table
9357
9358
9359 @node Getting News
9360 @section Getting News
9361 @cindex reading news
9362 @cindex news backends
9363
9364 A newsreader is normally used for reading news.  Gnus currently provides
9365 only two methods of getting news---it can read from an @sc{nntp} server,
9366 or it can read from a local spool.
9367
9368 @menu
9369 * NNTP::               Reading news from an @sc{nntp} server.
9370 * News Spool::         Reading news from the local spool.
9371 @end menu
9372
9373
9374 @node NNTP
9375 @subsection @sc{nntp}
9376 @cindex nntp
9377
9378 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
9379 You just specify @code{nntp} as method and the address of the @sc{nntp}
9380 server as the, uhm, address.
9381
9382 If the @sc{nntp} server is located at a non-standard port, setting the
9383 third element of the select method to this port number should allow you
9384 to connect to the right port.  You'll have to edit the group info for
9385 that (@pxref{Foreign Groups}).
9386
9387 The name of the foreign group can be the same as a native group.  In
9388 fact, you can subscribe to the same group from as many different servers
9389 you feel like.  There will be no name collisions.
9390
9391 The following variables can be used to create a virtual @code{nntp}
9392 server:
9393
9394 @table @code
9395
9396 @item nntp-server-opened-hook
9397 @vindex nntp-server-opened-hook
9398 @cindex @sc{mode reader}
9399 @cindex authinfo
9400 @cindex authentification
9401 @cindex nntp authentification
9402 @findex nntp-send-authinfo
9403 @findex nntp-send-mode-reader
9404 is run after a connection has been made.  It can be used to send
9405 commands to the @sc{nntp} server after it has been contacted.  By
9406 default it sends the command @code{MODE READER} to the server with the
9407 @code{nntp-send-mode-reader} function.  This function should always be
9408 present in this hook.
9409
9410 @item nntp-authinfo-function
9411 @vindex nntp-authinfo-function
9412 @findex nntp-send-authinfo
9413 @vindex nntp-authinfo-file
9414 This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
9415 server.  The default function is @code{nntp-send-authinfo}, which looks
9416 through your @file{~/.authinfo} (or whatever you've set the
9417 @code{nntp-authinfo-file} variable to) for applicable entries.  If none
9418 are found, it will prompt you for a login name and a password.  The
9419 format of the @file{~/.authinfo} file is (almost) the same as the
9420 @code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
9421 manual page, but here are the salient facts:
9422
9423 @enumerate
9424 @item
9425 The file contains one or more line, each of which define one server.
9426
9427 @item
9428 Each line may contain an arbitrary number of token/value pairs.  The
9429 valid tokens include @samp{machine}, @samp{login}, @samp{password},
9430 @samp{default} and @samp{force}.  (The latter is not a valid
9431 @file{.netrc}/@code{ftp} token, which is the only way the
9432 @file{.authinfo} file format deviates from the @file{.netrc} file
9433 format.)
9434
9435 @end enumerate
9436
9437 Here's an example file:
9438
9439 @example
9440 machine news.uio.no login larsi password geheimnis
9441 machine nntp.ifi.uio.no login larsi force yes
9442 @end example
9443
9444 The token/value pairs may appear in any order; @samp{machine} doesn't
9445 have to be first, for instance.
9446
9447 In this example, both login name and password have been supplied for the
9448 former server, while the latter has only the login name listed, and the
9449 user will be prompted for the password.  The latter also has the
9450 @samp{force} tag, which means that the authinfo will be sent to the
9451 @var{nntp} server upon connection; the default (i.e., when there is not
9452 @samp{force} tag) is to not send authinfo to the @var{nntp} server
9453 until the @var{nntp} server asks for it.
9454
9455 You can also add @samp{default} lines that will apply to all servers
9456 that don't have matching @samp{machine} lines.
9457
9458 @example
9459 default force yes
9460 @end example
9461
9462 This will force sending @samp{AUTHINFO} commands to all servers not
9463 previously mentioned.
9464
9465 Remember to not leave the @file{~/.authinfo} file world-readable.
9466
9467 @item nntp-server-action-alist
9468 @vindex nntp-server-action-alist
9469 This is a list of regexps to match on server types and actions to be
9470 taken when matches are made.  For instance, if you want Gnus to beep
9471 every time you connect to innd, you could say something like:
9472
9473 @lisp
9474 (setq nntp-server-action-alist
9475       '(("innd" (ding))))
9476 @end lisp
9477
9478 You probably don't want to do that, though.
9479
9480 The default value is
9481
9482 @lisp
9483 '(("nntpd 1\\.5\\.11t"
9484    (remove-hook 'nntp-server-opened-hook 'nntp-send-mode-reader)))
9485 @end lisp
9486
9487 This ensures that Gnus doesn't send the @code{MODE READER} command to
9488 nntpd 1.5.11t, since that command chokes that server, I've been told.
9489
9490 @item nntp-maximum-request
9491 @vindex nntp-maximum-request
9492 If the @sc{nntp} server doesn't support @sc{nov} headers, this backend
9493 will collect headers by sending a series of @code{head} commands.  To
9494 speed things up, the backend sends lots of these commands without
9495 waiting for reply, and then reads all the replies.  This is controlled
9496 by the @code{nntp-maximum-request} variable, and is 400 by default.  If
9497 your network is buggy, you should set this to 1.
9498
9499 @item nntp-connection-timeout
9500 @vindex nntp-connection-timeout
9501 If you have lots of foreign @code{nntp} groups that you connect to
9502 regularly, you're sure to have problems with @sc{nntp} servers not
9503 responding properly, or being too loaded to reply within reasonable
9504 time.  This is can lead to awkward problems, which can be helped
9505 somewhat by setting @code{nntp-connection-timeout}.  This is an integer
9506 that says how many seconds the @code{nntp} backend should wait for a
9507 connection before giving up.  If it is @code{nil}, which is the default,
9508 no timeouts are done.
9509
9510 @c @item nntp-command-timeout
9511 @c @vindex nntp-command-timeout
9512 @c @cindex PPP connections
9513 @c @cindex dynamic IP addresses
9514 @c If you're running Gnus on a machine that has a dynamically assigned
9515 @c address, Gnus may become confused.  If the address of your machine
9516 @c changes after connecting to the @sc{nntp} server, Gnus will simply sit
9517 @c waiting forever for replies from the server.  To help with this
9518 @c unfortunate problem, you can set this command to a number.  Gnus will
9519 @c then, if it sits waiting for a reply from the server longer than that
9520 @c number of seconds, shut down the connection, start a new one, and resend
9521 @c the command.  This should hopefully be transparent to the user.  A
9522 @c likely number is 30 seconds.
9523 @c
9524 @c @item nntp-retry-on-break
9525 @c @vindex nntp-retry-on-break
9526 @c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
9527 @c hangs.  This will have much the same effect as the command timeout
9528 @c described above.
9529
9530 @item nntp-server-hook
9531 @vindex nntp-server-hook
9532 This hook is run as the last step when connecting to an @sc{nntp}
9533 server.
9534
9535 @findex nntp-open-rlogin
9536 @findex nntp-open-telnet
9537 @findex nntp-open-network-stream
9538 @item nntp-open-connection-function
9539 @vindex nntp-open-connection-function
9540 This function is used to connect to the remote system.  Four pre-made
9541 functions are supplied:
9542
9543 @table @code
9544 @item nntp-open-network-stream
9545 This is the default, and simply connects to some port or other on the
9546 remote system.
9547
9548 @item nntp-open-rlogin
9549 Does an @samp{rlogin} on the
9550 remote system, and then does a @samp{telnet} to the @sc{nntp} server
9551 available there.
9552
9553 @code{nntp-open-rlogin}-related variables:
9554
9555 @table @code
9556
9557 @item nntp-rlogin-program
9558 @vindex nntp-rlogin-program
9559 Program used to log in on remote machines.  The default is @samp{rsh},
9560 but @samp{ssh} is a popular alternative.
9561
9562 @item nntp-rlogin-parameters
9563 @vindex nntp-rlogin-parameters
9564 This list will be used as the parameter list given to @code{rsh}.
9565
9566 @item nntp-rlogin-user-name
9567 @vindex nntp-rlogin-user-name
9568 User name on the remote system.
9569
9570 @end table
9571
9572 @item nntp-open-telnet
9573 Does a @samp{telnet} to the remote system and then another @samp{telnet}
9574 to get to the @sc{nntp} server.
9575
9576 @code{nntp-open-telnet}-related variables:
9577
9578 @table @code
9579 @item nntp-telnet-command
9580 @vindex nntp-telnet-command
9581 Command used to start @code{telnet}.
9582
9583 @item nntp-telnet-switches
9584 @vindex nntp-telnet-switches
9585 List of strings to be used as the switches to the @code{telnet} command.
9586
9587 @item nntp-telnet-user-name
9588 @vindex nntp-telnet-user-name
9589 User name for log in on the remote system.
9590
9591 @item nntp-telnet-passwd
9592 @vindex nntp-telnet-passwd
9593 Password to use when logging in.
9594
9595 @item nntp-telnet-parameters
9596 @vindex nntp-telnet-parameters
9597 A list of strings executed as a command after logging in
9598 via @code{telnet}.
9599
9600 @item nntp-telnet-shell-prompt
9601 @vindex nntp-telnet-shell-prompt
9602 Regexp matching the shell prompt on the remote machine.  The default is
9603 @samp{bash\\|\$ *\r?$\\|> *\r?}.
9604
9605 @item nntp-open-telnet-envuser
9606 @vindex nntp-open-telnet-envuser
9607 If non-@code{nil}, the @code{telnet} session (client and server both)
9608 will support the @code{ENVIRON} option and not prompt for login name.
9609 This works for Solaris @code{telnet}, for instance.
9610
9611 @end table
9612
9613 @findex nntp-open-ssl-stream
9614 @item nntp-open-ssl-stream
9615 Opens a connection to a server over a @dfn{secure} channel.  To use this
9616 you must have SSLay installed
9617 (@file{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need
9618 @file{ssl.el} (from the W3 distributeion, for instance).  You then
9619 define a server as follows:
9620
9621 @lisp
9622 ;; Type `C-c C-c' after you've finished editing.
9623 ;;
9624 ;; "snews" is port 563 and is predefined in our /etc/services
9625 ;;
9626 (nntp "snews.bar.com"
9627       (nntp-open-connection-function nntp-open-ssl-stream)
9628       (nntp-port-number "snews")
9629       (nntp-address "snews.bar.com"))
9630 @end lisp
9631
9632 @end table
9633
9634 @item nntp-end-of-line
9635 @vindex nntp-end-of-line
9636 String to use as end-of-line marker when talking to the @sc{nntp}
9637 server.  This is @samp{\r\n} by default, but should be @samp{\n} when
9638 using @code{rlogin} to talk to the server.
9639
9640 @item nntp-rlogin-user-name
9641 @vindex nntp-rlogin-user-name
9642 User name on the remote system when using the @code{rlogin} connect
9643 function.
9644
9645 @item nntp-address
9646 @vindex nntp-address
9647 The address of the remote system running the @sc{nntp} server.
9648
9649 @item nntp-port-number
9650 @vindex nntp-port-number
9651 Port number to connect to when using the @code{nntp-open-network-stream}
9652 connect function.
9653
9654 @item nntp-buggy-select
9655 @vindex nntp-buggy-select
9656 Set this to non-@code{nil} if your select routine is buggy.
9657
9658 @item nntp-nov-is-evil
9659 @vindex nntp-nov-is-evil
9660 If the @sc{nntp} server does not support @sc{nov}, you could set this
9661 variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov}
9662 can be used.
9663
9664 @item nntp-xover-commands
9665 @vindex nntp-xover-commands
9666 @cindex nov
9667 @cindex XOVER
9668 List of strings used as commands to fetch @sc{nov} lines from a
9669 server.  The default value of this variable is @code{("XOVER"
9670 "XOVERVIEW")}.
9671
9672 @item nntp-nov-gap
9673 @vindex nntp-nov-gap
9674 @code{nntp} normally sends just one big request for @sc{nov} lines to
9675 the server.  The server responds with one huge list of lines.  However,
9676 if you have read articles 2-5000 in the group, and only want to read
9677 article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
9678 lines that you will not need.  This variable says how
9679 big a gap between two consecutive articles is allowed to be before the
9680 @code{XOVER} request is split into several request.  Note that if your
9681 network is fast, setting this variable to a really small number means
9682 that fetching will probably be slower.  If this variable is @code{nil},
9683 @code{nntp} will never split requests.  The default is 5.
9684
9685 @item nntp-prepare-server-hook
9686 @vindex nntp-prepare-server-hook
9687 A hook run before attempting to connect to an @sc{nntp} server.
9688
9689 @item nntp-warn-about-losing-connection
9690 @vindex nntp-warn-about-losing-connection
9691 If this variable is non-@code{nil}, some noise will be made when a
9692 server closes connection.
9693
9694 @item nntp-record-commands
9695 @vindex nntp-record-commands
9696 If non-@code{nil}, @code{nntp} will log all commands it sends to the
9697 @sc{nntp} server (along with a timestep) in the @samp{*nntp-log*}
9698 buffer.  This is useful if you are debugging a Gnus/@sc{nntp} connection
9699 that doesn't seem to work.
9700
9701 @end table
9702
9703
9704 @node News Spool
9705 @subsection News Spool
9706 @cindex nnspool
9707 @cindex news spool
9708
9709 Subscribing to a foreign group from the local spool is extremely easy,
9710 and might be useful, for instance, to speed up reading groups that
9711 contain very big articles---@samp{alt.binaries.pictures.furniture}, for
9712 instance.
9713
9714 Anyways, you just specify @code{nnspool} as the method and @code{""} (or
9715 anything else) as the address.
9716
9717 If you have access to a local spool, you should probably use that as the
9718 native select method (@pxref{Finding the News}).  It is normally faster
9719 than using an @code{nntp} select method, but might not be.  It depends.
9720 You just have to try to find out what's best at your site.
9721
9722 @table @code
9723
9724 @item nnspool-inews-program
9725 @vindex nnspool-inews-program
9726 Program used to post an article.
9727
9728 @item nnspool-inews-switches
9729 @vindex nnspool-inews-switches
9730 Parameters given to the inews program when posting an article.
9731
9732 @item nnspool-spool-directory
9733 @vindex nnspool-spool-directory
9734 Where @code{nnspool} looks for the articles.  This is normally
9735 @file{/usr/spool/news/}.
9736
9737 @item nnspool-nov-directory
9738 @vindex nnspool-nov-directory
9739 Where @code{nnspool} will look for @sc{nov} files.  This is normally
9740 @file{/usr/spool/news/over.view/}.
9741
9742 @item nnspool-lib-dir
9743 @vindex nnspool-lib-dir
9744 Where the news lib dir is (@file{/usr/lib/news/} by default).
9745
9746 @item nnspool-active-file
9747 @vindex nnspool-active-file
9748 The path to the active file.
9749
9750 @item nnspool-newsgroups-file
9751 @vindex nnspool-newsgroups-file
9752 The path to the group descriptions file.
9753
9754 @item nnspool-history-file
9755 @vindex nnspool-history-file
9756 The path to the news history file.
9757
9758 @item nnspool-active-times-file
9759 @vindex nnspool-active-times-file
9760 The path to the active date file.
9761
9762 @item nnspool-nov-is-evil
9763 @vindex nnspool-nov-is-evil
9764 If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
9765 that it finds.
9766
9767 @item nnspool-sift-nov-with-sed
9768 @vindex nnspool-sift-nov-with-sed
9769 @cindex sed
9770 If non-@code{nil}, which is the default, use @code{sed} to get the
9771 relevant portion from the overview file.  If nil, @code{nnspool} will
9772 load the entire file into a buffer and process it there.
9773
9774 @end table
9775
9776
9777 @node Getting Mail
9778 @section Getting Mail
9779 @cindex reading mail
9780 @cindex mail
9781
9782 Reading mail with a newsreader---isn't that just plain WeIrD? But of
9783 course.
9784
9785 @menu
9786 * Getting Started Reading Mail:: A simple cookbook example.
9787 * Splitting Mail::               How to create mail groups.
9788 * Mail Sources::                 How to tell Gnus where to get mail from.
9789 * Mail Backend Variables::       Variables for customizing mail handling.
9790 * Fancy Mail Splitting::         Gnus can do hairy splitting of incoming mail.
9791 * Incorporating Old Mail::       What about the old mail you have?
9792 * Expiring Mail::                Getting rid of unwanted mail.
9793 * Washing Mail::                 Removing gruft from the mail you get.
9794 * Duplicates::                   Dealing with duplicated mail.
9795 * Not Reading Mail::             Using mail backends for reading other files.
9796 * Choosing a Mail Backend::      Gnus can read a variety of mail formats.
9797 @end menu
9798
9799
9800 @node Getting Started Reading Mail
9801 @subsection Getting Started Reading Mail
9802
9803 It's quite easy to use Gnus to read your new mail.  You just plonk the
9804 mail backend of your choice into @code{gnus-secondary-select-methods},
9805 and things will happen automatically.
9806
9807 For instance, if you want to use @code{nnml} (which is a "one file per
9808 mail" backend), you could put the following in your @file{.gnus} file:
9809
9810 @lisp
9811 (setq gnus-secondary-select-methods
9812       '((nnml "private")))
9813 @end lisp
9814
9815 Now, the next time you start Gnus, this backend will be queried for new
9816 articles, and it will move all the messages in your spool file to its
9817 directory, which is @code{~/Mail/} by default.  The new group that will
9818 be created (@samp{mail.misc}) will be subscribed, and you can read it
9819 like any other group.
9820
9821 You will probably want to split the mail into several groups, though:
9822
9823 @lisp
9824 (setq nnmail-split-methods
9825       '(("junk" "^From:.*Lars Ingebrigtsen")
9826         ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
9827         ("other" "")))
9828 @end lisp
9829
9830 This will result in three new @code{nnml} mail groups being created:
9831 @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}.  All the
9832 mail that doesn't fit into the first two groups will be placed in the
9833 last group.
9834
9835 This should be sufficient for reading mail with Gnus.  You might want to
9836 give the other sections in this part of the manual a perusal, though.
9837 Especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}.
9838
9839
9840 @node Splitting Mail
9841 @subsection Splitting Mail
9842 @cindex splitting mail
9843 @cindex mail splitting
9844
9845 @vindex nnmail-split-methods
9846 The @code{nnmail-split-methods} variable says how the incoming mail is
9847 to be split into groups.
9848
9849 @lisp
9850 (setq nnmail-split-methods
9851   '(("mail.junk" "^From:.*Lars Ingebrigtsen")
9852     ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
9853     ("mail.other" "")))
9854 @end lisp
9855
9856 This variable is a list of lists, where the first element of each of
9857 these lists is the name of the mail group (they do not have to be called
9858 something beginning with @samp{mail}, by the way), and the second
9859 element is a regular expression used on the header of each mail to
9860 determine if it belongs in this mail group.  The first string may
9861 contain @samp{\\1} forms, like the ones used by @code{replace-match} to
9862 insert sub-expressions from the matched text.  For instance:
9863
9864 @lisp
9865 ("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
9866 @end lisp
9867
9868 The second element can also be a function.  In that case, it will be
9869 called narrowed to the headers with the first element of the rule as the
9870 argument.  It should return a non-@code{nil} value if it thinks that the
9871 mail belongs in that group.
9872
9873 The last of these groups should always be a general one, and the regular
9874 expression should @emph{always} be @samp{} so that it matches any mails
9875 that haven't been matched by any of the other regexps.  (These rules are
9876 processed from the beginning of the alist toward the end.  The first
9877 rule to make a match will "win", unless you have crossposting enabled.
9878 In that case, all matching rules will "win".)
9879
9880 If you like to tinker with this yourself, you can set this variable to a
9881 function of your choice.  This function will be called without any
9882 arguments in a buffer narrowed to the headers of an incoming mail
9883 message.  The function should return a list of group names that it
9884 thinks should carry this mail message.
9885
9886 Note that the mail backends are free to maul the poor, innocent,
9887 incoming headers all they want to.  They all add @code{Lines} headers;
9888 some add @code{X-Gnus-Group} headers; most rename the Unix mbox
9889 @code{From<SPACE>} line to something else.
9890
9891 @vindex nnmail-crosspost
9892 The mail backends all support cross-posting.  If several regexps match,
9893 the mail will be ``cross-posted'' to all those groups.
9894 @code{nnmail-crosspost} says whether to use this mechanism or not.  Note
9895 that no articles are crossposted to the general (@samp{}) group.
9896
9897 @vindex nnmail-crosspost-link-function
9898 @cindex crosspost
9899 @cindex links
9900 @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
9901 the crossposted articles.  However, not all file systems support hard
9902 links.  If that's the case for you, set
9903 @code{nnmail-crosspost-link-function} to @code{copy-file}.  (This
9904 variable is @code{add-name-to-file} by default.)
9905
9906 @findex nnmail-split-header-length-limit
9907 Header lines may be arbitrarily long.  However, the longer a line is,
9908 the longer it takes to match them.  Very long lines may lead to Gnus
9909 taking forever to split the mail, so Gnus excludes lines that are longer
9910 than @code{nnmail-split-header-length-limit} (which defaults to 1024).
9911
9912 @kindex M-x nnmail-split-history
9913 @kindex nnmail-split-history
9914 If you wish to see where the previous mail split put the messages, you
9915 can use the @kbd{M-x nnmail-split-history} command.
9916
9917 Gnus gives you all the opportunity you could possibly want for shooting
9918 yourself in the foot.  Let's say you create a group that will contain
9919 all the mail you get from your boss.  And then you accidentally
9920 unsubscribe from the group.  Gnus will still put all the mail from your
9921 boss in the unsubscribed group, and so, when your boss mails you ``Have
9922 that report ready by Monday or you're fired!'', you'll never see it and,
9923 come Tuesday, you'll still believe that you're gainfully employed while
9924 you really should be out collecting empty bottles to save up for next
9925 month's rent money.
9926
9927
9928 @node Mail Sources
9929 @subsection Mail Sources
9930
9931 Mail can be gotten from many different sources---the mail spool, from a
9932 POP mail server, or from a procmail directory, for instance.
9933
9934 @menu
9935 * Mail Source Specifiers::       How to specify what a mail source is.
9936 * Mail Source Customization::    Some variables that influence things.
9937 * Fetching Mail::                Using the mail source specifiers.
9938 @end menu
9939
9940
9941 @node Mail Source Specifiers
9942 @subsubsection Mail Source Specifiers
9943 @cindex POP
9944 @cindex mail server
9945 @cindex procmail
9946 @cindex mail spool
9947 @cindex mail source
9948
9949 You tell Gnus how to fetch mail by creating a @dfn{mail source
9950 specifier}.
9951
9952 Here's an example:
9953
9954 @lisp
9955 (pop :server "pop3.mailserver.com" :user "myname")
9956 @end lisp
9957
9958 As can be observed, a mail source specifier is a list where the first
9959 element is a @dfn{mail source type}, followed by an arbitrary number of
9960 @dfn{keywords}.  Keywords that are not explicitly specified are given
9961 default values.
9962
9963 The following mail source types are available:
9964
9965 @table @code
9966 @item file
9967 Get mail from a single file; typically from the mail spool.
9968
9969 Keywords:
9970
9971 @table @code
9972 @item :path
9973 The path of the file.  Defaults to the value of the @code{MAIL}
9974 environment variable or @file{/usr/mail/spool/user-name}.
9975 @end table
9976
9977 An example file mail source:
9978
9979 @lisp
9980 (file :path "/usr/spool/mail/user-name")
9981 @end lisp
9982
9983 Or using the default path:
9984
9985 @lisp
9986 (file)
9987 @end lisp
9988
9989 @item directory
9990 Get mail from several files in a directory.  This is typically used when
9991 you have procmail split the incoming mail into several files.
9992
9993 Keywords:
9994
9995 @table @code
9996 @item :path
9997 The path of the directory where the files are.  There is no default
9998 value.
9999
10000 @item :suffix
10001 Only files ending with this suffix are used.  The default is
10002 @samp{.spool}.
10003
10004 @item :predicate
10005 Only files that have this predicate return non-@code{nil} are returned.
10006 The default is @code{identity}.  This is used as an additional
10007 filter---only files that have the right suffix @emph{and} satisfy this
10008 predicate are considered.
10009
10010 @end table
10011
10012 An example directory mail source:
10013
10014 @lisp
10015 (directory :path "/home/user-name/procmail-dir/"
10016            :suffix ".prcml")
10017 @end lisp
10018
10019 @item pop
10020 Get mail from a POP server.
10021
10022 Keywords:
10023
10024 @table @code
10025 @item :server
10026 The name of the POP server.  The default is taken from the
10027 @code{MAILHOST} environment variable.
10028
10029 @item :port
10030 The port number of the POP server.  The default is @samp{pop3}.
10031
10032 @item :user
10033 The user name to give to the POP server.  The default is the login
10034 name.
10035
10036 @item :password
10037 The password to give to the POP server.  If not specified, the user is
10038 prompted.
10039
10040 @item :program
10041 The program to use to fetch mail from the POP server.  This is should be
10042 a @code{format}-like string.  Here's an example:
10043
10044 @example
10045 fetchmail %u@@%s -P %p %t
10046 @end example
10047
10048 The valid format specifier characters are:
10049
10050 @table @samp
10051 @item t
10052 The name of the file the mail is to be moved to.  This must always be
10053 included in this string.
10054
10055 @item s
10056 The name of the server.
10057
10058 @item P
10059 The port number of the server.
10060
10061 @item u
10062 The user name to use.
10063
10064 @item p
10065 The password to use.
10066 @end table
10067
10068 The values used for these specs are taken from the values you give the
10069 corresponding keywords.
10070
10071 @item :prescript
10072 A script to be run before fetching the mail.  The syntax is the same as
10073 the @code{:program} keyword.  This can also be a function to be run.
10074
10075 @item :postscript
10076 A script to be run after fetching the mail.  The syntax is the same as
10077 the @code{:program} keyword.  This can also be a function to be run.
10078
10079 @item :function
10080 The function to use to fetch mail from the POP server.  The function is
10081 called with one parameter---the name of the file where the mail should
10082 be moved to.
10083
10084 @item :authentication
10085 This can be either the symbol @code{password} or the symbol @code{apop}
10086 and says what authentication scheme to use.  The default is
10087 @code{password}.
10088
10089 @end table
10090
10091 If the @code{:program} and @code{:function} keywords aren't specified,
10092 @code{pop3-movemail} will be used.
10093
10094 Here are some examples.  Fetch from the default POP server, using the
10095 default user name, and default fetcher:
10096
10097 @lisp
10098 (pop)
10099 @end lisp
10100
10101 Fetch from a named server with a named user and password:
10102
10103 @lisp
10104 (pop :server "my.pop.server"
10105      :user "user-name" :password "secret")
10106 @end lisp
10107
10108 Use @samp{movemail} to move the mail:
10109
10110 @lisp
10111 (pop :program "movemail po:%u %t %p")
10112 @end lisp
10113
10114 @item maildir
10115 Get mail from a maildir. This is a type of mailbox currently only
10116 supported by qmail, where each file in a special directory contains
10117 exactly one mail.
10118
10119 Keywords:
10120
10121 @table @code
10122 @item :path
10123 The path of the directory where the mails are stored.  The default is 
10124 @samp{~/Maildir/new}.
10125
10126 If you sometimes look at your mail through a pop3 daemon before fetching
10127 them with Gnus, you may also have to fetch your mails from the
10128 @code{cur} directory inside the maildir, like in the following example.
10129
10130 @end table
10131
10132 An example maildir mail source:
10133
10134 @lisp
10135 (maildir :path "/home/user-name/Maildir/cur")
10136 @end lisp
10137
10138 @end table
10139
10140
10141 @node Mail Source Customization
10142 @subsubsection Mail Source Customization
10143
10144 The following is a list of variables that influence how the mail is
10145 fetched.  You would normally not need to set or change any of these
10146 variables.
10147
10148 @table @code
10149 @item mail-source-movemail-program
10150 @vindex mail-source-movemail-program
10151 A command to be executed to move mail from the inbox.  The default is
10152 @samp{movemail}.
10153
10154 This can also be a function.  In that case, the function will be
10155 called with two parameters -- the name of the INBOX file, and the file
10156 to be moved to.
10157
10158 @item mail-source-movemail-args
10159 @vindex mail-source-movemail-args
10160 Extra arguments to give to the command described above.
10161
10162 @item mail-source-crash-box
10163 @vindex mail-source-crash-box
10164 File where mail will be stored while processing it.  The default is
10165 @file{~/.emacs-mail-crash-box}.
10166
10167 @item mail-source-delete-incoming
10168 @vindex mail-source-delete-incoming
10169 If non-@code{nil}, delete incoming files after handling them.
10170
10171 @item mail-source-directory
10172 @vindex mail-source-directory
10173 Directory where files (if any) will be stored.  The default is
10174 @file{~/Mail/}.  At present, the only thing this is used for is to say
10175 where the incoming files will be stored if the previous variable is
10176 @code{nil}.
10177
10178 @item mail-source-default-file-modes
10179 @vindex mail-source-default-file-modes
10180 All new mail files will get this file mode.  The default is 384.
10181
10182 @end table
10183
10184
10185 @node Fetching Mail
10186 @subsubsection Fetching Mail
10187
10188 The way to actually tell Gnus where to get new mail from is to set
10189 @code{nnmail-spool-file} to a list of mail source specifiers
10190 (@pxref{Mail Source Specifiers}).
10191
10192 If this variable is @code{nil}, the mail backends will never attempt to
10193 fetch mail by themselves.
10194
10195 If you want to fetch mail both from your local spool as well as a POP
10196 mail server, you'd say something like:
10197
10198 @lisp
10199 (setq nnmail-spool-file
10200       '((file)
10201         (pop :server "pop3.mail.server"
10202              :password "secret")))
10203 @end lisp
10204
10205 Or, if you don't want to use any of the keyword defaults:
10206
10207 @lisp
10208 (setq nnmail-spool-file
10209       '((file :path "/var/spool/mail/user-name")
10210         (pop :server "pop3.mail.server"
10211              :user "user-name"
10212              :port "pop3"
10213              :password "secret")))
10214 @end lisp
10215
10216
10217 When you use a mail backend, Gnus will slurp all your mail from your
10218 inbox and plonk it down in your home directory.  Gnus doesn't move any
10219 mail if you're not using a mail backend---you have to do a lot of magic
10220 invocations first.  At the time when you have finished drawing the
10221 pentagram, lightened the candles, and sacrificed the goat, you really
10222 shouldn't be too surprised when Gnus moves your mail.
10223
10224
10225
10226 @node Mail Backend Variables
10227 @subsection Mail Backend Variables
10228
10229 These variables are (for the most part) pertinent to all the various
10230 mail backends.
10231
10232 @table @code
10233 @vindex nnmail-read-incoming-hook
10234 @item nnmail-read-incoming-hook
10235 The mail backends all call this hook after reading new mail.  You can
10236 use this hook to notify any mail watch programs, if you want to.
10237
10238 @vindex nnmail-split-hook
10239 @item nnmail-split-hook
10240 @findex article-decode-encoded-words
10241 @findex RFC1522 decoding
10242 @findex RFC2047 decoding
10243 Hook run in the buffer where the mail headers of each message is kept
10244 just before the splitting based on these headers is done.  The hook is
10245 free to modify the buffer contents in any way it sees fit---the buffer
10246 is discarded after the splitting has been done, and no changes performed
10247 in the buffer will show up in any files.
10248 @code{gnus-article-decode-encoded-words} is one likely function to add
10249 to this hook.
10250
10251 @vindex nnmail-pre-get-new-mail-hook
10252 @vindex nnmail-post-get-new-mail-hook
10253 @item nnmail-pre-get-new-mail-hook
10254 @itemx nnmail-post-get-new-mail-hook
10255 These are two useful hooks executed when treating new incoming
10256 mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
10257 starting to handle the new mail) and
10258 @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
10259 is done).  Here's and example of using these two hooks to change the
10260 default file modes the new mail files get:
10261
10262 @lisp
10263 (add-hook 'gnus-pre-get-new-mail-hook
10264           (lambda () (set-default-file-modes 511)))
10265
10266 (add-hook 'gnus-post-get-new-mail-hook
10267           (lambda () (set-default-file-modes 551)))
10268 @end lisp
10269
10270 @item nnmail-use-long-file-names
10271 @vindex nnmail-use-long-file-names
10272 If non-@code{nil}, the mail backends will use long file and directory
10273 names.  Groups like @samp{mail.misc} will end up in directories
10274 (assuming use of @code{nnml} backend) or files (assuming use of
10275 @code{nnfolder} backend) like @file{mail.misc}.  If it is @code{nil},
10276 the same group will end up in @file{mail/misc}.
10277
10278 @item nnmail-delete-file-function
10279 @vindex nnmail-delete-file-function
10280 @findex delete-file
10281 Function called to delete files.  It is @code{delete-file} by default.
10282
10283 @item nnmail-cache-accepted-message-ids
10284 @vindex nnmail-cache-accepted-message-ids
10285 If non-@code{nil}, put the @code{Message-ID}s of articles imported into
10286 the backend (via @code{Gcc}, for instance) into the mail duplication
10287 discovery cache.  The default is @code{nil}.
10288
10289 @end table
10290
10291
10292 @node Fancy Mail Splitting
10293 @subsection Fancy Mail Splitting
10294 @cindex mail splitting
10295 @cindex fancy mail splitting
10296
10297 @vindex nnmail-split-fancy
10298 @findex nnmail-split-fancy
10299 If the rather simple, standard method for specifying how to split mail
10300 doesn't allow you to do what you want, you can set
10301 @code{nnmail-split-methods} to @code{nnmail-split-fancy}.  Then you can
10302 play with the @code{nnmail-split-fancy} variable.
10303
10304 Let's look at an example value of this variable first:
10305
10306 @lisp
10307 ;; Messages from the mailer daemon are not crossposted to any of
10308 ;; the ordinary groups.  Warnings are put in a separate group
10309 ;; from real errors.
10310 (| ("from" mail (| ("subject" "warn.*" "mail.warning")
10311                    "mail.misc"))
10312    ;; Non-error messages are crossposted to all relevant
10313    ;; groups, but we don't crosspost between the group for the
10314    ;; (ding) list and the group for other (ding) related mail.
10315    (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
10316          ("subject" "ding" "ding.misc"))
10317       ;; Other mailing lists...
10318       (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
10319       (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
10320       ;; People...
10321       (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
10322    ;; Unmatched mail goes to the catch all group.
10323    "misc.misc")
10324 @end lisp
10325
10326 This variable has the format of a @dfn{split}.  A split is a (possibly)
10327 recursive structure where each split may contain other splits.  Here are
10328 the five possible split syntaxes:
10329
10330 @enumerate
10331
10332 @item
10333 @samp{group}: If the split is a string, that will be taken as a group
10334 name.  Normal regexp match expansion will be done.  See below for
10335 examples.
10336
10337 @item
10338 @var{(FIELD VALUE SPLIT)}: If the split is a list, the first element of
10339 which is a string, then store the message as specified by SPLIT, if
10340 header FIELD (a regexp) contains VALUE (also a regexp).
10341
10342 @item
10343 @var{(| SPLIT...)}: If the split is a list, and the first element is
10344 @code{|} (vertical bar), then process each SPLIT until one of them
10345 matches.  A SPLIT is said to match if it will cause the mail message to
10346 be stored in one or more groups.
10347
10348 @item
10349 @var{(& SPLIT...)}: If the split is a list, and the first element is
10350 @code{&}, then process all SPLITs in the list.
10351
10352 @item
10353 @code{junk}: If the split is the symbol @code{junk}, then don't save
10354 this message. Use with extreme caution.
10355
10356 @item
10357 @var{(: function arg1 arg2 ...)}:  If the split is a list, and the first
10358 element is @code{:}, then the second element will be called as a
10359 function with @var{args} given as arguments.  The function should return
10360 a SPLIT.
10361
10362 @item
10363 @var{(! FUNC SPLIT)}: If the split is a list, and the first element
10364 is @code{!}, then SPLIT will be processed, and FUNC will be called as a
10365 function with the result of SPLIT as argument. FUNC should return a split.
10366
10367 @item
10368 @code{nil}: If the split is @code{nil}, it is ignored.
10369
10370 @end enumerate
10371
10372 In these splits, @var{FIELD} must match a complete field name.
10373 @var{VALUE} must match a complete word according to the fundamental mode
10374 syntax table.  You can use @code{.*} in the regexps to match partial
10375 field names or words.  In other words, all @var{VALUE}'s are wrapped in
10376 @samp{\<} and @samp{\>} pairs.
10377
10378 @vindex nnmail-split-abbrev-alist
10379 @var{FIELD} and @var{VALUE} can also be lisp symbols, in that case they
10380 are expanded as specified by the variable
10381 @code{nnmail-split-abbrev-alist}.  This is an alist of cons cells, where
10382 the @code{car} of a cell contains the key, and the @code{cdr} contains the associated
10383 value.
10384
10385 @vindex nnmail-split-fancy-syntax-table
10386 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
10387 when all this splitting is performed.
10388
10389 If you want to have Gnus create groups dynamically based on some
10390 information in the headers (i.e., do @code{replace-match}-like
10391 substitutions in the group names), you can say things like:
10392
10393 @example
10394 (any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
10395 @end example
10396
10397 If the string contains the element @samp{\&}, then the previously
10398 matched string will be substituted.  Similarly, the elements @samp{\\1}
10399 up to @samp{\\9} will be substituted with the text matched by the
10400 groupings 1 through 9.
10401
10402
10403 @node Incorporating Old Mail
10404 @subsection Incorporating Old Mail
10405
10406 Most people have lots of old mail stored in various file formats.  If
10407 you have set up Gnus to read mail using one of the spiffy Gnus mail
10408 backends, you'll probably wish to have that old mail incorporated into
10409 your mail groups.
10410
10411 Doing so can be quite easy.
10412
10413 To take an example: You're reading mail using @code{nnml}
10414 (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
10415 satisfactory value (@pxref{Splitting Mail}).  You have an old Unix mbox
10416 file filled with important, but old, mail.  You want to move it into
10417 your @code{nnml} groups.
10418
10419 Here's how:
10420
10421 @enumerate
10422 @item
10423 Go to the group buffer.
10424
10425 @item
10426 Type `G f' and give the path to the mbox file when prompted to create an
10427 @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
10428
10429 @item
10430 Type `SPACE' to enter the newly created group.
10431
10432 @item
10433 Type `M P b' to process-mark all articles in this group's buffer
10434 (@pxref{Setting Process Marks}).
10435
10436 @item
10437 Type `B r' to respool all the process-marked articles, and answer
10438 @samp{nnml} when prompted (@pxref{Mail Group Commands}).
10439 @end enumerate
10440
10441 All the mail messages in the mbox file will now also be spread out over
10442 all your @code{nnml} groups.  Try entering them and check whether things
10443 have gone without a glitch.  If things look ok, you may consider
10444 deleting the mbox file, but I wouldn't do that unless I was absolutely
10445 sure that all the mail has ended up where it should be.
10446
10447 Respooling is also a handy thing to do if you're switching from one mail
10448 backend to another.  Just respool all the mail in the old mail groups
10449 using the new mail backend.
10450
10451
10452 @node Expiring Mail
10453 @subsection Expiring Mail
10454 @cindex article expiry
10455
10456 Traditional mail readers have a tendency to remove mail articles when
10457 you mark them as read, in some way.  Gnus takes a fundamentally
10458 different approach to mail reading.
10459
10460 Gnus basically considers mail just to be news that has been received in
10461 a rather peculiar manner.  It does not think that it has the power to
10462 actually change the mail, or delete any mail messages.  If you enter a
10463 mail group, and mark articles as ``read'', or kill them in some other
10464 fashion, the mail articles will still exist on the system.  I repeat:
10465 Gnus will not delete your old, read mail.  Unless you ask it to, of
10466 course.
10467
10468 To make Gnus get rid of your unwanted mail, you have to mark the
10469 articles as @dfn{expirable}.  This does not mean that the articles will
10470 disappear right away, however.  In general, a mail article will be
10471 deleted from your system if, 1) it is marked as expirable, AND 2) it is
10472 more than one week old.  If you do not mark an article as expirable, it
10473 will remain on your system until hell freezes over.  This bears
10474 repeating one more time, with some spurious capitalizations: IF you do
10475 NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
10476
10477 @vindex gnus-auto-expirable-newsgroups
10478 You do not have to mark articles as expirable by hand.  Groups that
10479 match the regular expression @code{gnus-auto-expirable-newsgroups} will
10480 have all articles that you read marked as expirable automatically.  All
10481 articles marked as expirable have an @samp{E} in the first
10482 column in the summary buffer.
10483
10484 By default, if you have auto expiry switched on, Gnus will mark all the
10485 articles you read as expirable, no matter if they were read or unread
10486 before.  To avoid having articles marked as read marked as expirable
10487 automatically, you can put something like the following in your
10488 @file{.gnus} file:
10489
10490 @vindex gnus-mark-article-hook
10491 @lisp
10492 (remove-hook 'gnus-mark-article-hook
10493              'gnus-summary-mark-read-and-unread-as-read)
10494 (add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
10495 @end lisp
10496
10497 Note that making a group auto-expirable doesn't mean that all read
10498 articles are expired---only the articles marked as expirable
10499 will be expired.  Also note that using the @kbd{d} command won't make
10500 groups expirable---only semi-automatic marking of articles as read will
10501 mark the articles as expirable in auto-expirable groups.
10502
10503 Let's say you subscribe to a couple of mailing lists, and you want the
10504 articles you have read to disappear after a while:
10505
10506 @lisp
10507 (setq gnus-auto-expirable-newsgroups
10508       "mail.nonsense-list\\|mail.nice-list")
10509 @end lisp
10510
10511 Another way to have auto-expiry happen is to have the element
10512 @code{auto-expire} in the group parameters of the group.
10513
10514 If you use adaptive scoring (@pxref{Adaptive Scoring}) and
10515 auto-expiring, you'll have problems.  Auto-expiring and adaptive scoring
10516 don't really mix very well.
10517
10518 @vindex nnmail-expiry-wait
10519 The @code{nnmail-expiry-wait} variable supplies the default time an
10520 expirable article has to live.  Gnus starts counting days from when the
10521 message @emph{arrived}, not from when it was sent.  The default is seven
10522 days.
10523
10524 Gnus also supplies a function that lets you fine-tune how long articles
10525 are to live, based on what group they are in.  Let's say you want to
10526 have one month expiry period in the @samp{mail.private} group, a one day
10527 expiry period in the @samp{mail.junk} group, and a six day expiry period
10528 everywhere else:
10529
10530 @vindex nnmail-expiry-wait-function
10531 @lisp
10532 (setq nnmail-expiry-wait-function
10533       (lambda (group)
10534        (cond ((string= group "mail.private")
10535                31)
10536              ((string= group "mail.junk")
10537                1)
10538              ((string= group "important")
10539                'never)
10540              (t
10541                6))))
10542 @end lisp
10543
10544 The group names this function is fed are ``unadorned'' group
10545 names---no @samp{nnml:} prefixes and the like.
10546
10547 The @code{nnmail-expiry-wait} variable and
10548 @code{nnmail-expiry-wait-function} function can either be a number (not
10549 necessarily an integer) or one of the symbols @code{immediate} or
10550 @code{never}.
10551
10552 You can also use the @code{expiry-wait} group parameter to selectively
10553 change the expiry period (@pxref{Group Parameters}).
10554
10555 @vindex nnmail-keep-last-article
10556 If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
10557 expire the final article in a mail newsgroup.  This is to make life
10558 easier for procmail users.
10559
10560 @vindex gnus-total-expirable-newsgroups
10561 By the way: That line up there, about Gnus never expiring non-expirable
10562 articles, is a lie.  If you put @code{total-expire} in the group
10563 parameters, articles will not be marked as expirable, but all read
10564 articles will be put through the expiry process.  Use with extreme
10565 caution.  Even more dangerous is the
10566 @code{gnus-total-expirable-newsgroups} variable.  All groups that match
10567 this regexp will have all read articles put through the expiry process,
10568 which means that @emph{all} old mail articles in the groups in question
10569 will be deleted after a while.  Use with extreme caution, and don't come
10570 crying to me when you discover that the regexp you used matched the
10571 wrong group and all your important mail has disappeared.  Be a
10572 @emph{man}!  Or a @emph{woman}!  Whatever you feel more comfortable
10573 with!  So there!
10574
10575 Most people make most of their mail groups total-expirable, though.
10576
10577 @vindex gnus-inhibit-user-auto-expire
10578 If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
10579 commands will not mark an article as expirable, even if the group has
10580 auto-expire turned on.
10581
10582
10583 @node Washing Mail
10584 @subsection Washing Mail
10585 @cindex mail washing
10586 @cindex list server brain damage
10587 @cindex incoming mail treatment
10588
10589 Mailers and list servers are notorious for doing all sorts of really,
10590 really stupid things with mail.  ``Hey, RFC822 doesn't explicitly
10591 prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
10592 end of all lines passing through our server, so let's do that!!!!1!''
10593 Yes, but RFC822 wasn't designed to be read by morons.  Things that were
10594 considered to be self-evident were not discussed.  So.  Here we are.
10595
10596 Case in point:  The German version of Microsoft Exchange adds @samp{AW:
10597 } to the subjects of replies instead of @samp{Re: }.  I could pretend to
10598 be shocked and dismayed by this, but I haven't got the energy.  It is to
10599 laugh.
10600
10601 Gnus provides a plethora of functions for washing articles while
10602 displaying them, but it might be nicer to do the filtering before
10603 storing the mail to disc.  For that purpose, we have three hooks and
10604 various functions that can be put in these hooks.
10605
10606 @table @code
10607 @item nnmail-prepare-incoming-hook
10608 @vindex nnmail-prepare-incoming-hook
10609 This hook is called before doing anything with the mail and is meant for
10610 grand, sweeping gestures.  It is called in a buffer that contains all
10611 the new, incoming mail.  Functions to be used include:
10612
10613 @table @code
10614 @item nnheader-ms-strip-cr
10615 @findex nnheader-ms-strip-cr
10616 Remove trailing carriage returns from each line.  This is default on
10617 Emacs running on MS machines.
10618
10619 @end table
10620
10621 @item nnmail-prepare-incoming-header-hook
10622 @vindex nnmail-prepare-incoming-header-hook
10623 This hook is called narrowed to each header.  It can be used when
10624 cleaning up the headers.  Functions that can be used include:
10625
10626 @table @code
10627 @item nnmail-remove-leading-whitespace
10628 @findex nnmail-remove-leading-whitespace
10629 Clear leading white space that ``helpful'' listservs have added to the
10630 headers to make them look nice.  Aaah.
10631
10632 @item nnmail-remove-list-identifiers
10633 @findex nnmail-remove-list-identifiers
10634 Some list servers add an identifier---for example, @samp{(idm)}---to the
10635 beginning of all @code{Subject} headers.  I'm sure that's nice for
10636 people who use stone age mail readers.  This function will remove
10637 strings that match the @code{nnmail-list-identifiers} regexp, which can
10638 also be a list of regexp.
10639
10640 For instance, if you want to remove the @samp{(idm)} and the
10641 @samp{nagnagnag} identifiers:
10642
10643 @lisp
10644 (setq nnmail-list-identifiers
10645       '("(idm)" "nagnagnag"))
10646 @end lisp
10647
10648 @item nnmail-remove-tabs
10649 @findex nnmail-remove-tabs
10650 Translate all @samp{TAB} characters into @samp{SPACE} characters.
10651
10652 @item nnmail-fix-eudora-headers
10653 @findex nnmail-fix-eudora-headers
10654 @cindex Eudora
10655 Eudora produces broken @code{References} headers, but OK
10656 @code{In-Reply-To} headers.  This function will get rid of the
10657 @code{References} headers.
10658
10659 @end table
10660
10661 @item nnmail-prepare-incoming-message-hook
10662 @vindex nnmail-prepare-incoming-message-hook
10663 This hook is called narrowed to each message.  Functions to be used
10664 include:
10665
10666 @table @code
10667 @item article-de-quoted-unreadable
10668 @findex article-de-quoted-unreadable
10669 Decode Quoted Readable encoding.
10670
10671 @end table
10672 @end table
10673
10674
10675 @node Duplicates
10676 @subsection Duplicates
10677
10678 @vindex nnmail-treat-duplicates
10679 @vindex nnmail-message-id-cache-length
10680 @vindex nnmail-message-id-cache-file
10681 @cindex duplicate mails
10682 If you are a member of a couple of mailing lists, you will sometimes
10683 receive two copies of the same mail.  This can be quite annoying, so
10684 @code{nnmail} checks for and treats any duplicates it might find.  To do
10685 this, it keeps a cache of old @code{Message-ID}s---
10686 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
10687 default.  The approximate maximum number of @code{Message-ID}s stored
10688 there is controlled by the @code{nnmail-message-id-cache-length}
10689 variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
10690 stored.) If all this sounds scary to you, you can set
10691 @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
10692 default), and @code{nnmail} won't delete duplicate mails.  Instead it
10693 will insert a warning into the head of the mail saying that it thinks
10694 that this is a duplicate of a different message.
10695
10696 This variable can also be a function.  If that's the case, the function
10697 will be called from a buffer narrowed to the message in question with
10698 the @code{Message-ID} as a parameter.  The function must return either
10699 @code{nil}, @code{warn}, or @code{delete}.
10700
10701 You can turn this feature off completely by setting the variable to
10702 @code{nil}.
10703
10704 If you want all the duplicate mails to be put into a special
10705 @dfn{duplicates} group, you could do that using the normal mail split
10706 methods:
10707
10708 @lisp
10709 (setq nnmail-split-fancy
10710       '(| ;; Messages duplicates go to a separate group.
10711           ("gnus-warning" "duplication of message" "duplicate")
10712           ;; Message from daemons, postmaster, and the like to another.
10713           (any mail "mail.misc")
10714           ;; Other rules.
10715           [ ... ] ))
10716 @end lisp
10717
10718 Or something like:
10719 @lisp
10720 (setq nnmail-split-methods
10721       '(("duplicates" "^Gnus-Warning:")
10722         ;; Other rules.
10723         [...]))
10724 @end lisp
10725
10726 Here's a neat feature: If you know that the recipient reads her mail
10727 with Gnus, and that she has @code{nnmail-treat-duplicates} set to
10728 @code{delete}, you can send her as many insults as you like, just by
10729 using a @code{Message-ID} of a mail that you know that she's already
10730 received.  Think of all the fun!  She'll never see any of it!  Whee!
10731
10732
10733 @node Not Reading Mail
10734 @subsection Not Reading Mail
10735
10736 If you start using any of the mail backends, they have the annoying
10737 habit of assuming that you want to read mail with them.  This might not
10738 be unreasonable, but it might not be what you want.
10739
10740 If you set @code{nnmail-spool-file} to @code{nil}, none of the backends
10741 will ever attempt to read incoming mail, which should help.
10742
10743 @vindex nnbabyl-get-new-mail
10744 @vindex nnmbox-get-new-mail
10745 @vindex nnml-get-new-mail
10746 @vindex nnmh-get-new-mail
10747 @vindex nnfolder-get-new-mail
10748 This might be too much, if, for instance, you are reading mail quite
10749 happily with @code{nnml} and just want to peek at some old @sc{rmail}
10750 file you have stashed away with @code{nnbabyl}.  All backends have
10751 variables called backend-@code{get-new-mail}.  If you want to disable
10752 the @code{nnbabyl} mail reading, you edit the virtual server for the
10753 group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
10754
10755 All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook}
10756 narrowed to the article to be saved before saving it when reading
10757 incoming mail.
10758
10759
10760 @node Choosing a Mail Backend
10761 @subsection Choosing a Mail Backend
10762
10763 Gnus will read the mail spool when you activate a mail group.  The mail
10764 file is first copied to your home directory.  What happens after that
10765 depends on what format you want to store your mail in.
10766
10767 @menu
10768 * Unix Mail Box::               Using the (quite) standard Un*x mbox.
10769 * Rmail Babyl::                 Emacs programs use the rmail babyl format.
10770 * Mail Spool::                  Store your mail in a private spool?
10771 * MH Spool::                    An mhspool-like backend.
10772 * Mail Folders::                Having one file for each group.
10773 @end menu
10774
10775
10776 @node Unix Mail Box
10777 @subsubsection Unix Mail Box
10778 @cindex nnmbox
10779 @cindex unix mail box
10780
10781 @vindex nnmbox-active-file
10782 @vindex nnmbox-mbox-file
10783 The @dfn{nnmbox} backend will use the standard Un*x mbox file to store
10784 mail.  @code{nnmbox} will add extra headers to each mail article to say
10785 which group it belongs in.
10786
10787 Virtual server settings:
10788
10789 @table @code
10790 @item nnmbox-mbox-file
10791 @vindex nnmbox-mbox-file
10792 The name of the mail box in the user's home directory.
10793
10794 @item nnmbox-active-file
10795 @vindex nnmbox-active-file
10796 The name of the active file for the mail box.
10797
10798 @item nnmbox-get-new-mail
10799 @vindex nnmbox-get-new-mail
10800 If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
10801 into groups.
10802 @end table
10803
10804
10805 @node Rmail Babyl
10806 @subsubsection Rmail Babyl
10807 @cindex nnbabyl
10808 @cindex rmail mbox
10809
10810 @vindex nnbabyl-active-file
10811 @vindex nnbabyl-mbox-file
10812 The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail
10813 mbox}) to store mail. @code{nnbabyl} will add extra headers to each mail
10814 article to say which group it belongs in.
10815
10816 Virtual server settings:
10817
10818 @table @code
10819 @item nnbabyl-mbox-file
10820 @vindex nnbabyl-mbox-file
10821 The name of the rmail mbox file.
10822
10823 @item nnbabyl-active-file
10824 @vindex nnbabyl-active-file
10825 The name of the active file for the rmail box.
10826
10827 @item nnbabyl-get-new-mail
10828 @vindex nnbabyl-get-new-mail
10829 If non-@code{nil}, @code{nnbabyl} will read incoming mail.
10830 @end table
10831
10832
10833 @node Mail Spool
10834 @subsubsection Mail Spool
10835 @cindex nnml
10836 @cindex mail @sc{nov} spool
10837
10838 The @dfn{nnml} spool mail format isn't compatible with any other known
10839 format.  It should be used with some caution.
10840
10841 @vindex nnml-directory
10842 If you use this backend, Gnus will split all incoming mail into files,
10843 one file for each mail, and put the articles into the corresponding
10844 directories under the directory specified by the @code{nnml-directory}
10845 variable.  The default value is @file{~/Mail/}.
10846
10847 You do not have to create any directories beforehand; Gnus will take
10848 care of all that.
10849
10850 If you have a strict limit as to how many files you are allowed to store
10851 in your account, you should not use this backend.  As each mail gets its
10852 own file, you might very well occupy thousands of inodes within a few
10853 weeks.  If this is no problem for you, and it isn't a problem for you
10854 having your friendly systems administrator walking around, madly,
10855 shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
10856 know that this is probably the fastest format to use.  You do not have
10857 to trudge through a big mbox file just to read your new mail.
10858
10859 @code{nnml} is probably the slowest backend when it comes to article
10860 splitting.  It has to create lots of files, and it also generates
10861 @sc{nov} databases for the incoming mails.  This makes it the fastest
10862 backend when it comes to reading mail.
10863
10864 Virtual server settings:
10865
10866 @table @code
10867 @item nnml-directory
10868 @vindex nnml-directory
10869 All @code{nnml} directories will be placed under this directory.
10870
10871 @item nnml-active-file
10872 @vindex nnml-active-file
10873 The active file for the @code{nnml} server.
10874
10875 @item nnml-newsgroups-file
10876 @vindex nnml-newsgroups-file
10877 The @code{nnml} group descriptions file.  @xref{Newsgroups File
10878 Format}.
10879
10880 @item nnml-get-new-mail
10881 @vindex nnml-get-new-mail
10882 If non-@code{nil}, @code{nnml} will read incoming mail.
10883
10884 @item nnml-nov-is-evil
10885 @vindex nnml-nov-is-evil
10886 If non-@code{nil}, this backend will ignore any @sc{nov} files.
10887
10888 @item nnml-nov-file-name
10889 @vindex nnml-nov-file-name
10890 The name of the @sc{nov} files.  The default is @file{.overview}.
10891
10892 @item nnml-prepare-save-mail-hook
10893 @vindex nnml-prepare-save-mail-hook
10894 Hook run narrowed to an article before saving.
10895
10896 @end table
10897
10898 @findex nnml-generate-nov-databases
10899 If your @code{nnml} groups and @sc{nov} files get totally out of whack,
10900 you can do a complete update by typing @kbd{M-x
10901 nnml-generate-nov-databases}.  This command will trawl through the
10902 entire @code{nnml} hierarchy, looking at each and every article, so it
10903 might take a while to complete.  A better interface to this
10904 functionality can be found in the server buffer (@pxref{Server
10905 Commands}).
10906
10907
10908 @node MH Spool
10909 @subsubsection MH Spool
10910 @cindex nnmh
10911 @cindex mh-e mail spool
10912
10913 @code{nnmh} is just like @code{nnml}, except that is doesn't generate
10914 @sc{nov} databases and it doesn't keep an active file.  This makes
10915 @code{nnmh} a @emph{much} slower backend than @code{nnml}, but it also
10916 makes it easier to write procmail scripts for.
10917
10918 Virtual server settings:
10919
10920 @table @code
10921 @item nnmh-directory
10922 @vindex nnmh-directory
10923 All @code{nnmh} directories will be located under this directory.
10924
10925 @item nnmh-get-new-mail
10926 @vindex nnmh-get-new-mail
10927 If non-@code{nil}, @code{nnmh} will read incoming mail.
10928
10929 @item nnmh-be-safe
10930 @vindex nnmh-be-safe
10931 If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
10932 sure that the articles in the folder are actually what Gnus thinks they
10933 are.  It will check date stamps and stat everything in sight, so
10934 setting this to @code{t} will mean a serious slow-down.  If you never
10935 use anything but Gnus to read the @code{nnmh} articles, you do not have
10936 to set this variable to @code{t}.
10937 @end table
10938
10939
10940 @node Mail Folders
10941 @subsubsection Mail Folders
10942 @cindex nnfolder
10943 @cindex mbox folders
10944 @cindex mail folders
10945
10946 @code{nnfolder} is a backend for storing each mail group in a separate
10947 file.  Each file is in the standard Un*x mbox format.  @code{nnfolder}
10948 will add extra headers to keep track of article numbers and arrival
10949 dates.
10950
10951 Virtual server settings:
10952
10953 @table @code
10954 @item nnfolder-directory
10955 @vindex nnfolder-directory
10956 All the @code{nnfolder} mail boxes will be stored under this directory.
10957
10958 @item nnfolder-active-file
10959 @vindex nnfolder-active-file
10960 The name of the active file.
10961
10962 @item nnfolder-newsgroups-file
10963 @vindex nnfolder-newsgroups-file
10964 The name of the group descriptions file.  @xref{Newsgroups File Format}.
10965
10966 @item nnfolder-get-new-mail
10967 @vindex nnfolder-get-new-mail
10968 If non-@code{nil}, @code{nnfolder} will read incoming mail.
10969
10970 @item nnfolder-save-buffer-hook
10971 @vindex nnfolder-save-buffer-hook
10972 @cindex backup files
10973 Hook run before saving the folders.  Note that Emacs does the normal
10974 backup renaming of files even with the @code{nnfolder} buffers.  If you
10975 wish to switch this off, you could say something like the following in
10976 your @file{.emacs} file:
10977
10978 @lisp
10979 (defun turn-off-backup ()
10980   (set (make-local-variable 'backup-inhibited) t))
10981
10982 (add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
10983 @end lisp
10984
10985 @item nnfolder-delete-mail-hook
10986 @vindex nnfolder-delete-mail-hook
10987 Hook run in a buffer narrowed to the message that is to be deleted.
10988 This function can be used to copy the message to somewhere else, or to
10989 extract some information from it before removing it.
10990
10991 @end table
10992
10993
10994 @findex nnfolder-generate-active-file
10995 @kindex M-x nnfolder-generate-active-file
10996 If you have lots of @code{nnfolder}-like files you'd like to read with
10997 @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
10998 command to make @code{nnfolder} aware of all likely files in
10999 @code{nnfolder-directory}.  This only works if you use long file names,
11000 though.
11001
11002
11003 @node Other Sources
11004 @section Other Sources
11005
11006 Gnus can do more than just read news or mail.  The methods described
11007 below allow Gnus to view directories and files as if they were
11008 newsgroups.
11009
11010 @menu
11011 * Directory Groups::      You can read a directory as if it was a newsgroup.
11012 * Anything Groups::       Dired?  Who needs dired?
11013 * Document Groups::       Single files can be the basis of a group.
11014 * SOUP::                  Reading @sc{SOUP} packets ``offline''.
11015 * Web Searches::          Creating groups from articles that match a string.
11016 * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
11017 @end menu
11018
11019
11020 @node Directory Groups
11021 @subsection Directory Groups
11022 @cindex nndir
11023 @cindex directory groups
11024
11025 If you have a directory that has lots of articles in separate files in
11026 it, you might treat it as a newsgroup.  The files have to have numerical
11027 names, of course.
11028
11029 This might be an opportune moment to mention @code{ange-ftp} (and its
11030 successor @code{efs}), that most wonderful of all wonderful Emacs
11031 packages.  When I wrote @code{nndir}, I didn't think much about it---a
11032 backend to read directories.  Big deal.
11033
11034 @code{ange-ftp} changes that picture dramatically.  For instance, if you
11035 enter the @code{ange-ftp} file name
11036 @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
11037 @code{ange-ftp} or @code{efs} will actually allow you to read this
11038 directory over at @samp{sina} as a newsgroup.  Distributed news ahoy!
11039
11040 @code{nndir} will use @sc{nov} files if they are present.
11041
11042 @code{nndir} is a ``read-only'' backend---you can't delete or expire
11043 articles with this method.  You can use @code{nnmh} or @code{nnml} for
11044 whatever you use @code{nndir} for, so you could switch to any of those
11045 methods if you feel the need to have a non-read-only @code{nndir}.
11046
11047
11048 @node Anything Groups
11049 @subsection Anything Groups
11050 @cindex nneething
11051
11052 From the @code{nndir} backend (which reads a single spool-like
11053 directory), it's just a hop and a skip to @code{nneething}, which
11054 pretends that any arbitrary directory is a newsgroup.  Strange, but
11055 true.
11056
11057 When @code{nneething} is presented with a directory, it will scan this
11058 directory and assign article numbers to each file.  When you enter such
11059 a group, @code{nneething} must create ``headers'' that Gnus can use.
11060 After all, Gnus is a newsreader, in case you're
11061 forgetting. @code{nneething} does this in a two-step process.  First, it
11062 snoops each file in question.  If the file looks like an article (i.e.,
11063 the first few lines look like headers), it will use this as the head.
11064 If this is just some arbitrary file without a head (e.g. a C source
11065 file), @code{nneething} will cobble up a header out of thin air.  It
11066 will use file ownership, name and date and do whatever it can with these
11067 elements.
11068
11069 All this should happen automatically for you, and you will be presented
11070 with something that looks very much like a newsgroup.  Totally like a
11071 newsgroup, to be precise.  If you select an article, it will be displayed
11072 in the article buffer, just as usual.
11073
11074 If you select a line that represents a directory, Gnus will pop you into
11075 a new summary buffer for this @code{nneething} group.  And so on.  You can
11076 traverse the entire disk this way, if you feel like, but remember that
11077 Gnus is not dired, really, and does not intend to be, either.
11078
11079 There are two overall modes to this action---ephemeral or solid.  When
11080 doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
11081 will not store information on what files you have read, and what files
11082 are new, and so on.  If you create a solid @code{nneething} group the
11083 normal way with @kbd{G m}, Gnus will store a mapping table between
11084 article numbers and file names, and you can treat this group like any
11085 other groups.  When you activate a solid @code{nneething} group, you will
11086 be told how many unread articles it contains, etc., etc.
11087
11088 Some variables:
11089
11090 @table @code
11091 @item nneething-map-file-directory
11092 @vindex nneething-map-file-directory
11093 All the mapping files for solid @code{nneething} groups will be stored
11094 in this directory, which defaults to @file{~/.nneething/}.
11095
11096 @item nneething-exclude-files
11097 @vindex nneething-exclude-files
11098 All files that match this regexp will be ignored.  Nice to use to exclude
11099 auto-save files and the like, which is what it does by default.
11100
11101 @item nneething-include-files
11102 @vindex nneething-include-files
11103 Regexp saying what files to include in the group.  If this variable is
11104 non-@code{nil}, only files matching this regexp will be included.
11105
11106 @item nneething-map-file
11107 @vindex nneething-map-file
11108 Name of the map files.
11109 @end table
11110
11111
11112 @node Document Groups
11113 @subsection Document Groups
11114 @cindex nndoc
11115 @cindex documentation group
11116 @cindex help group
11117
11118 @code{nndoc} is a cute little thing that will let you read a single file
11119 as a newsgroup.  Several files types are supported:
11120
11121 @table @code
11122 @cindex babyl
11123 @cindex rmail mbox
11124
11125 @item babyl
11126 The babyl (rmail) mail box.
11127 @cindex mbox
11128 @cindex Unix mbox
11129
11130 @item mbox
11131 The standard Unix mbox file.
11132
11133 @cindex MMDF mail box
11134 @item mmdf
11135 The MMDF mail box format.
11136
11137 @item news
11138 Several news articles appended into a file.
11139
11140 @item rnews
11141 @cindex rnews batch files
11142 The rnews batch transport format.
11143 @cindex forwarded messages
11144
11145 @item forward
11146 Forwarded articles.
11147
11148 @item mime-parts
11149 MIME multipart messages.
11150
11151 @item standard-digest
11152 The standard (RFC 1153) digest format.
11153
11154 @item slack-digest
11155 Non-standard digest format---matches most things, but does it badly.
11156 @end table
11157
11158 You can also use the special ``file type'' @code{guess}, which means
11159 that @code{nndoc} will try to guess what file type it is looking at.
11160 @code{digest} means that @code{nndoc} should guess what digest type the
11161 file is.
11162
11163 @code{nndoc} will not try to change the file or insert any extra headers into
11164 it---it will simply, like, let you use the file as the basis for a
11165 group.  And that's it.
11166
11167 If you have some old archived articles that you want to insert into your
11168 new & spiffy Gnus mail backend, @code{nndoc} can probably help you with
11169 that.  Say you have an old @file{RMAIL} file with mail that you now want
11170 to split into your new @code{nnml} groups.  You look at that file using
11171 @code{nndoc} (using the @kbd{G f} command in the group buffer
11172 (@pxref{Foreign Groups})), set the process mark on all the articles in
11173 the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
11174 using @code{nnml}.  If all goes well, all the mail in the @file{RMAIL}
11175 file is now also stored in lots of @code{nnml} directories, and you can
11176 delete that pesky @file{RMAIL} file.  If you have the guts!
11177
11178 Virtual server variables:
11179
11180 @table @code
11181 @item nndoc-article-type
11182 @vindex nndoc-article-type
11183 This should be one of @code{mbox}, @code{babyl}, @code{digest},
11184 @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
11185 @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
11186 @code{slack-digest}, @code{clari-briefs} or @code{guess}.
11187
11188 @item nndoc-post-type
11189 @vindex nndoc-post-type
11190 This variable says whether Gnus is to consider the group a news group or
11191 a mail group.  There are two valid values:  @code{mail} (the default)
11192 and @code{news}.
11193 @end table
11194
11195 @menu
11196 * Document Server Internals::   How to add your own document types.
11197 @end menu
11198
11199
11200 @node Document Server Internals
11201 @subsubsection Document Server Internals
11202
11203 Adding new document types to be recognized by @code{nndoc} isn't
11204 difficult.  You just have to whip up a definition of what the document
11205 looks like, write a predicate function to recognize that document type,
11206 and then hook into @code{nndoc}.
11207
11208 First, here's an example document type definition:
11209
11210 @example
11211 (mmdf
11212  (article-begin .  "^\^A\^A\^A\^A\n")
11213  (body-end .  "^\^A\^A\^A\^A\n"))
11214 @end example
11215
11216 The definition is simply a unique @dfn{name} followed by a series of
11217 regexp pseudo-variable settings.  Below are the possible
11218 variables---don't be daunted by the number of variables; most document
11219 types can be defined with very few settings:
11220
11221 @table @code
11222 @item first-article
11223 If present, @code{nndoc} will skip past all text until it finds
11224 something that match this regexp.  All text before this will be
11225 totally ignored.
11226
11227 @item article-begin
11228 This setting has to be present in all document type definitions.  It
11229 says what the beginning of each article looks like.
11230
11231 @item head-begin-function
11232 If present, this should be a function that moves point to the head of
11233 the article.
11234
11235 @item nndoc-head-begin
11236 If present, this should be a regexp that matches the head of the
11237 article.
11238
11239 @item nndoc-head-end
11240 This should match the end of the head of the article.  It defaults to
11241 @samp{^$}---the empty line.
11242
11243 @item body-begin-function
11244 If present, this function should move point to the beginning of the body
11245 of the article.
11246
11247 @item body-begin
11248 This should match the beginning of the body of the article.  It defaults
11249 to @samp{^\n}.
11250
11251 @item body-end-function
11252 If present, this function should move point to the end of the body of
11253 the article.
11254
11255 @item body-end
11256 If present, this should match the end of the body of the article.
11257
11258 @item file-end
11259 If present, this should match the end of the file.  All text after this
11260 regexp will be totally ignored.
11261
11262 @end table
11263
11264 So, using these variables @code{nndoc} is able to dissect a document
11265 file into a series of articles, each with a head and a body.  However, a
11266 few more variables are needed since not all document types are all that
11267 news-like---variables needed to transform the head or the body into
11268 something that's palatable for Gnus:
11269
11270 @table @code
11271 @item prepare-body-function
11272 If present, this function will be called when requesting an article.  It
11273 will be called with point at the start of the body, and is useful if the
11274 document has encoded some parts of its contents.
11275
11276 @item article-transform-function
11277 If present, this function is called when requesting an article.  It's
11278 meant to be used for more wide-ranging transformation of both head and
11279 body of the article.
11280
11281 @item generate-head-function
11282 If present, this function is called to generate a head that Gnus can
11283 understand.  It is called with the article number as a parameter, and is
11284 expected to generate a nice head for the article in question.  It is
11285 called when requesting the headers of all articles.
11286
11287 @end table
11288
11289 Let's look at the most complicated example I can come up with---standard
11290 digests:
11291
11292 @example
11293 (standard-digest
11294  (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
11295  (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
11296  (prepare-body-function . nndoc-unquote-dashes)
11297  (body-end-function . nndoc-digest-body-end)
11298  (head-end . "^ ?$")
11299  (body-begin . "^ ?\n")
11300  (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
11301  (subtype digest guess))
11302 @end example
11303
11304 We see that all text before a 70-width line of dashes is ignored; all
11305 text after a line that starts with that @samp{^End of} is also ignored;
11306 each article begins with a 30-width line of dashes; the line separating
11307 the head from the body may contain a single space; and that the body is
11308 run through @code{nndoc-unquote-dashes} before being delivered.
11309
11310 To hook your own document definition into @code{nndoc}, use the
11311 @code{nndoc-add-type} function.  It takes two parameters---the first is
11312 the definition itself and the second (optional) parameter says where in
11313 the document type definition alist to put this definition.  The alist is
11314 traversed sequentially, and @code{nndoc-TYPE-type-p} is called for a given type @code{TYPE}.  So @code{nndoc-mmdf-type-p} is called to see whether a document
11315 is of @code{mmdf} type, and so on.  These type predicates should return
11316 @code{nil} if the document is not of the correct type; @code{t} if it is
11317 of the correct type; and a number if the document might be of the
11318 correct type.  A high number means high probability; a low number means
11319 low probability with @samp{0} being the lowest valid number.
11320
11321
11322 @node SOUP
11323 @subsection SOUP
11324 @cindex SOUP
11325 @cindex offline
11326
11327 In the PC world people often talk about ``offline'' newsreaders.  These
11328 are thingies that are combined reader/news transport monstrosities.
11329 With built-in modem programs.  Yecchh!
11330
11331 Of course, us Unix Weenie types of human beans use things like
11332 @code{uucp} and, like, @code{nntpd} and set up proper news and mail
11333 transport things like Ghod intended.  And then we just use normal
11334 newsreaders.
11335
11336 However, it can sometimes be convenient to do something a that's a bit
11337 easier on the brain if you have a very slow modem, and you're not really
11338 that interested in doing things properly.
11339
11340 A file format called @sc{soup} has been developed for transporting news
11341 and mail from servers to home machines and back again.  It can be a bit
11342 fiddly.
11343
11344 First some terminology:
11345
11346 @table @dfn
11347
11348 @item server
11349 This is the machine that is connected to the outside world and where you
11350 get news and/or mail from.
11351
11352 @item home machine
11353 This is the machine that you want to do the actual reading and responding
11354 on.  It is typically not connected to the rest of the world in any way.
11355
11356 @item packet
11357 Something that contains messages and/or commands.  There are two kinds
11358 of packets:
11359
11360 @table @dfn
11361 @item message packets
11362 These are packets made at the server, and typically contain lots of
11363 messages for you to read.  These are called @file{SoupoutX.tgz} by
11364 default, where @var{X} is a number.
11365
11366 @item response packets
11367 These are packets made at the home machine, and typically contains
11368 replies that you've written.  These are called @file{SoupinX.tgz} by
11369 default, where @var{X} is a number.
11370
11371 @end table
11372
11373 @end table
11374
11375
11376 @enumerate
11377
11378 @item
11379 You log in on the server and create a @sc{soup} packet.  You can either
11380 use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
11381 can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
11382 s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
11383
11384 @item
11385 You transfer the packet home.  Rail, boat, car or modem will do fine.
11386
11387 @item
11388 You put the packet in your home directory.
11389
11390 @item
11391 You fire up Gnus on your home machine using the @code{nnsoup} backend as
11392 the native or secondary server.
11393
11394 @item
11395 You read articles and mail and answer and followup to the things you
11396 want (@pxref{SOUP Replies}).
11397
11398 @item
11399 You do the @kbd{G s r} command to pack these replies into a @sc{soup}
11400 packet.
11401
11402 @item
11403 You transfer this packet to the server.
11404
11405 @item
11406 You use Gnus to mail this packet out with the @kbd{G s s} command.
11407
11408 @item
11409 You then repeat until you die.
11410
11411 @end enumerate
11412
11413 So you basically have a bipartite system---you use @code{nnsoup} for
11414 reading and Gnus for packing/sending these @sc{soup} packets.
11415
11416 @menu
11417 * SOUP Commands::     Commands for creating and sending @sc{soup} packets
11418 * SOUP Groups::       A backend for reading @sc{soup} packets.
11419 * SOUP Replies::      How to enable @code{nnsoup} to take over mail and news.
11420 @end menu
11421
11422
11423 @node SOUP Commands
11424 @subsubsection SOUP Commands
11425
11426 These are commands for creating and manipulating @sc{soup} packets.
11427
11428 @table @kbd
11429 @item G s b
11430 @kindex G s b (Group)
11431 @findex gnus-group-brew-soup
11432 Pack all unread articles in the current group
11433 (@code{gnus-group-brew-soup}).  This command understands the
11434 process/prefix convention.
11435
11436 @item G s w
11437 @kindex G s w (Group)
11438 @findex gnus-soup-save-areas
11439 Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
11440
11441 @item G s s
11442 @kindex G s s (Group)
11443 @findex gnus-soup-send-replies
11444 Send all replies from the replies packet
11445 (@code{gnus-soup-send-replies}).
11446
11447 @item G s p
11448 @kindex G s p (Group)
11449 @findex gnus-soup-pack-packet
11450 Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
11451
11452 @item G s r
11453 @kindex G s r (Group)
11454 @findex nnsoup-pack-replies
11455 Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
11456
11457 @item O s
11458 @kindex O s (Summary)
11459 @findex gnus-soup-add-article
11460 This summary-mode command adds the current article to a @sc{soup} packet
11461 (@code{gnus-soup-add-article}).  It understands the process/prefix
11462 convention (@pxref{Process/Prefix}).
11463
11464 @end table
11465
11466
11467 There are a few variables to customize where Gnus will put all these
11468 thingies:
11469
11470 @table @code
11471
11472 @item gnus-soup-directory
11473 @vindex gnus-soup-directory
11474 Directory where Gnus will save intermediate files while composing
11475 @sc{soup} packets.  The default is @file{~/SoupBrew/}.
11476
11477 @item gnus-soup-replies-directory
11478 @vindex gnus-soup-replies-directory
11479 This is what Gnus will use as a temporary directory while sending our
11480 reply packets.  @file{~/SoupBrew/SoupReplies/} is the default.
11481
11482 @item gnus-soup-prefix-file
11483 @vindex gnus-soup-prefix-file
11484 Name of the file where Gnus stores the last used prefix.  The default is
11485 @samp{gnus-prefix}.
11486
11487 @item gnus-soup-packer
11488 @vindex gnus-soup-packer
11489 A format string command for packing a @sc{soup} packet.  The default is
11490 @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
11491
11492 @item gnus-soup-unpacker
11493 @vindex gnus-soup-unpacker
11494 Format string command for unpacking a @sc{soup} packet.  The default is
11495 @samp{gunzip -c %s | tar xvf -}.
11496
11497 @item gnus-soup-packet-directory
11498 @vindex gnus-soup-packet-directory
11499 Where Gnus will look for reply packets.  The default is @file{~/}.
11500
11501 @item gnus-soup-packet-regexp
11502 @vindex gnus-soup-packet-regexp
11503 Regular expression matching @sc{soup} reply packets in
11504 @code{gnus-soup-packet-directory}.
11505
11506 @end table
11507
11508
11509 @node SOUP Groups
11510 @subsubsection @sc{soup} Groups
11511 @cindex nnsoup
11512
11513 @code{nnsoup} is the backend for reading @sc{soup} packets.  It will
11514 read incoming packets, unpack them, and put them in a directory where
11515 you can read them at leisure.
11516
11517 These are the variables you can use to customize its behavior:
11518
11519 @table @code
11520
11521 @item nnsoup-tmp-directory
11522 @vindex nnsoup-tmp-directory
11523 When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
11524 directory.  (@file{/tmp/} by default.)
11525
11526 @item nnsoup-directory
11527 @vindex nnsoup-directory
11528 @code{nnsoup} then moves each message and index file to this directory.
11529 The default is @file{~/SOUP/}.
11530
11531 @item nnsoup-replies-directory
11532 @vindex nnsoup-replies-directory
11533 All replies will be stored in this directory before being packed into a
11534 reply packet.  The default is @file{~/SOUP/replies/"}.
11535
11536 @item nnsoup-replies-format-type
11537 @vindex nnsoup-replies-format-type
11538 The @sc{soup} format of the replies packets.  The default is @samp{?n}
11539 (rnews), and I don't think you should touch that variable.  I probably
11540 shouldn't even have documented it.  Drats!  Too late!
11541
11542 @item nnsoup-replies-index-type
11543 @vindex nnsoup-replies-index-type
11544 The index type of the replies packet.  The default is @samp{?n}, which
11545 means ``none''.  Don't fiddle with this one either!
11546
11547 @item nnsoup-active-file
11548 @vindex nnsoup-active-file
11549 Where @code{nnsoup} stores lots of information.  This is not an ``active
11550 file'' in the @code{nntp} sense; it's an Emacs Lisp file.  If you lose
11551 this file or mess it up in any way, you're dead.  The default is
11552 @file{~/SOUP/active}.
11553
11554 @item nnsoup-packer
11555 @vindex nnsoup-packer
11556 Format string command for packing a reply @sc{soup} packet.  The default
11557 is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
11558
11559 @item nnsoup-unpacker
11560 @vindex nnsoup-unpacker
11561 Format string command for unpacking incoming @sc{soup} packets.  The
11562 default is @samp{gunzip -c %s | tar xvf -}.
11563
11564 @item nnsoup-packet-directory
11565 @vindex nnsoup-packet-directory
11566 Where @code{nnsoup} will look for incoming packets.  The default is
11567 @file{~/}.
11568
11569 @item nnsoup-packet-regexp
11570 @vindex nnsoup-packet-regexp
11571 Regular expression matching incoming @sc{soup} packets.  The default is
11572 @samp{Soupout}.
11573
11574 @item nnsoup-always-save
11575 @vindex nnsoup-always-save
11576 If non-@code{nil}, save the replies buffer after each posted message.
11577
11578 @end table
11579
11580
11581 @node SOUP Replies
11582 @subsubsection SOUP Replies
11583
11584 Just using @code{nnsoup} won't mean that your postings and mailings end
11585 up in @sc{soup} reply packets automagically.  You have to work a bit
11586 more for that to happen.
11587
11588 @findex nnsoup-set-variables
11589 The @code{nnsoup-set-variables} command will set the appropriate
11590 variables to ensure that all your followups and replies end up in the
11591 @sc{soup} system.
11592
11593 In specific, this is what it does:
11594
11595 @lisp
11596 (setq message-send-news-function 'nnsoup-request-post)
11597 (setq message-send-mail-function 'nnsoup-request-mail)
11598 @end lisp
11599
11600 And that's it, really.  If you only want news to go into the @sc{soup}
11601 system you just use the first line.  If you only want mail to be
11602 @sc{soup}ed you use the second.
11603
11604
11605 @node Web Searches
11606 @subsection Web Searches
11607 @cindex nnweb
11608 @cindex DejaNews
11609 @cindex Alta Vista
11610 @cindex InReference
11611 @cindex Usenet searches
11612 @cindex searching the Usenet
11613
11614 It's, like, too neat to search the Usenet for articles that match a
11615 string, but it, like, totally @emph{sucks}, like, totally, to use one of
11616 those, like, Web browsers, and you, like, have to, rilly, like, look at
11617 the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
11618 searches without having to use a browser.
11619
11620 The @code{nnweb} backend allows an easy interface to the mighty search
11621 engine.  You create an @code{nnweb} group, enter a search pattern, and
11622 then enter the group and read the articles like you would any normal
11623 group.  The @kbd{G w} command in the group buffer (@pxref{Foreign
11624 Groups}) will do this in an easy-to-use fashion.
11625
11626 @code{nnweb} groups don't really lend themselves to being solid
11627 groups---they have a very fleeting idea of article numbers.  In fact,
11628 each time you enter an @code{nnweb} group (not even changing the search
11629 pattern), you are likely to get the articles ordered in a different
11630 manner.  Not even using duplicate suppression (@pxref{Duplicate
11631 Suppression}) will help, since @code{nnweb} doesn't even know the
11632 @code{Message-ID} of the articles before reading them using some search
11633 engines (DejaNews, for instance).  The only possible way to keep track
11634 of which articles you've read is by scoring on the @code{Date}
11635 header---mark all articles posted before the last date you read the
11636 group as read.
11637
11638 If the search engine changes its output substantially, @code{nnweb}
11639 won't be able to parse it and will fail.  One could hardly fault the Web
11640 providers if they were to do this---their @emph{raison d'être} is to
11641 make money off of advertisements, not to provide services to the
11642 community.  Since @code{nnweb} washes the ads off all the articles, one
11643 might think that the providers might be somewhat miffed.  We'll see.
11644
11645 You must have the @code{url} and @code{w3} package installed to be able
11646 to use @code{nnweb}.
11647
11648 Virtual server variables:
11649
11650 @table @code
11651 @item nnweb-type
11652 @vindex nnweb-type
11653 What search engine type is being used.  The currently supported types
11654 are @code{dejanews}, @code{dejanewsold}, @code{altavista} and
11655 @code{reference}.
11656
11657 @item nnweb-search
11658 @vindex nnweb-search
11659 The search string to feed to the search engine.
11660
11661 @item nnweb-max-hits
11662 @vindex nnweb-max-hits
11663 Advisory maximum number of hits per search to display.  The default is
11664 100.
11665
11666 @item nnweb-type-definition
11667 @vindex nnweb-type-definition
11668 Type-to-definition alist.  This alist says what @code{nnweb} should do
11669 with the various search engine types.  The following elements must be
11670 present:
11671
11672 @table @code
11673 @item article
11674 Function to decode the article and provide something that Gnus
11675 understands.
11676
11677 @item map
11678 Function to create an article number to message header and URL alist.
11679
11680 @item search
11681 Function to send the search string to the search engine.
11682
11683 @item address
11684 The address the aforementioned function should send the search string
11685 to.
11686
11687 @item id
11688 Format string URL to fetch an article by @code{Message-ID}.
11689 @end table
11690
11691 @end table
11692
11693
11694
11695 @node Mail-To-News Gateways
11696 @subsection Mail-To-News Gateways
11697 @cindex mail-to-news gateways
11698 @cindex gateways
11699
11700 If your local @code{nntp} server doesn't allow posting, for some reason
11701 or other, you can post using one of the numerous mail-to-news gateways.
11702 The @code{nngateway} backend provides the interface.
11703
11704 Note that you can't read anything from this backend---it can only be
11705 used to post with.
11706
11707 Server variables:
11708
11709 @table @code
11710 @item nngateway-address
11711 @vindex nngateway-address
11712 This is the address of the mail-to-news gateway.
11713
11714 @item nngateway-header-transformation
11715 @vindex nngateway-header-transformation
11716 News headers often have to be transformed in some odd way or other
11717 for the mail-to-news gateway to accept it.  This variable says what
11718 transformation should be called, and defaults to
11719 @code{nngateway-simple-header-transformation}.  The function is called
11720 narrowed to the headers to be transformed and with one parameter---the
11721 gateway address.
11722
11723 This default function just inserts a new @code{To} header based on the
11724 @code{Newsgroups} header and the gateway address.
11725 For instance, an article with this @code{Newsgroups} header:
11726
11727 @example
11728 Newsgroups: alt.religion.emacs
11729 @end example
11730
11731 will get this @code{From} header inserted:
11732
11733 @example
11734 To: alt-religion-emacs@@GATEWAY
11735 @end example
11736
11737 The following pre-defined functions exist:
11738
11739 @findex nngateway-simple-header-transformation
11740 @table @code
11741
11742 @item nngateway-simple-header-transformation
11743 Creates a @code{To} header that looks like
11744 @var{newsgroup}@@@code{nngateway-address}.
11745
11746 @findex nngateway-mail2news-header-transformation
11747
11748 @item nngateway-mail2news-header-transformation
11749 Creates a @code{To} header that looks like
11750 @code{nngateway-address}.
11751
11752 Here's an example:
11753
11754 @lisp
11755 (setq gnus-post-method
11756       '(nngateway "mail2news@@replay.com"
11757                   (nngateway-header-transformation
11758                    nngateway-mail2news-header-transformation)))
11759 @end lisp
11760
11761 @end table
11762
11763
11764 @end table
11765
11766 So, to use this, simply say something like:
11767
11768 @lisp
11769 (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
11770 @end lisp
11771
11772
11773 @node Combined Groups
11774 @section Combined Groups
11775
11776 Gnus allows combining a mixture of all the other group types into bigger
11777 groups.
11778
11779 @menu
11780 * Virtual Groups::     Combining articles from many groups.
11781 * Kibozed Groups::     Looking through parts of the newsfeed for articles.
11782 @end menu
11783
11784
11785 @node Virtual Groups
11786 @subsection Virtual Groups
11787 @cindex nnvirtual
11788 @cindex virtual groups
11789 @cindex merging groups
11790
11791 An @dfn{nnvirtual group} is really nothing more than a collection of
11792 other groups.
11793
11794 For instance, if you are tired of reading many small groups, you can
11795 put them all in one big group, and then grow tired of reading one
11796 big, unwieldy group.  The joys of computing!
11797
11798 You specify @code{nnvirtual} as the method.  The address should be a
11799 regexp to match component groups.
11800
11801 All marks in the virtual group will stick to the articles in the
11802 component groups.  So if you tick an article in a virtual group, the
11803 article will also be ticked in the component group from whence it came.
11804 (And vice versa---marks from the component groups will also be shown in
11805 the virtual group.)
11806
11807 Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
11808 newsgroups into one, big, happy newsgroup:
11809
11810 @lisp
11811 (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
11812 @end lisp
11813
11814 The component groups can be native or foreign; everything should work
11815 smoothly, but if your computer explodes, it was probably my fault.
11816
11817 Collecting the same group from several servers might actually be a good
11818 idea if users have set the Distribution header to limit distribution.
11819 If you would like to read @samp{soc.motss} both from a server in Japan
11820 and a server in Norway, you could use the following as the group regexp:
11821
11822 @example
11823 "^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
11824 @end example
11825
11826 (Remember, though, that if you're creating the group with @kbd{G m}, you
11827 shouldn't double the backslashes, and you should leave off the quote
11828 characters at the beginning and the end of the string.)
11829
11830 This should work kinda smoothly---all articles from both groups should
11831 end up in this one, and there should be no duplicates.  Threading (and
11832 the rest) will still work as usual, but there might be problems with the
11833 sequence of articles.  Sorting on date might be an option here
11834 (@pxref{Selecting a Group}).
11835
11836 One limitation, however---all groups included in a virtual
11837 group have to be alive (i.e., subscribed or unsubscribed).  Killed or
11838 zombie groups can't be component groups for @code{nnvirtual} groups.
11839
11840 @vindex nnvirtual-always-rescan
11841 If the @code{nnvirtual-always-rescan} is non-@code{nil},
11842 @code{nnvirtual} will always scan groups for unread articles when
11843 entering a virtual group.  If this variable is @code{nil} (which is the
11844 default) and you read articles in a component group after the virtual
11845 group has been activated, the read articles from the component group
11846 will show up when you enter the virtual group.  You'll also see this
11847 effect if you have two virtual groups that have a component group in
11848 common.  If that's the case, you should set this variable to @code{t}.
11849 Or you can just tap @code{M-g} on the virtual group every time before
11850 you enter it---it'll have much the same effect.
11851
11852 @code{nnvirtual} can have both mail and news groups as component groups.
11853 When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
11854 has to ask the backend of the component group the article comes from
11855 whether it is a news or mail backend.  However, when you do a @kbd{^},
11856 there is typically no sure way for the component backend to know this,
11857 and in that case @code{nnvirtual} tells Gnus that the article came from a
11858 not-news backend.  (Just to be on the safe side.)
11859
11860 @kbd{C-c C-t} in the message buffer will insert the @code{Newsgroups}
11861 line from the article you respond to in these cases.
11862
11863
11864
11865 @node Kibozed Groups
11866 @subsection Kibozed Groups
11867 @cindex nnkiboze
11868 @cindex kibozing
11869
11870 @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
11871 the news feed''.  @code{nnkiboze} is a backend that will do this for
11872 you.  Oh joy!  Now you can grind any @sc{nntp} server down to a halt
11873 with useless requests!  Oh happiness!
11874
11875 @kindex G k (Group)
11876 To create a kibozed group, use the @kbd{G k} command in the group
11877 buffer.
11878
11879 The address field of the @code{nnkiboze} method is, as with
11880 @code{nnvirtual}, a regexp to match groups to be ``included'' in the
11881 @code{nnkiboze} group.  That's where most similarities between @code{nnkiboze}
11882 and @code{nnvirtual} end.
11883
11884 In addition to this regexp detailing component groups, an @code{nnkiboze} group
11885 must have a score file to say what articles are to be included in
11886 the group (@pxref{Scoring}).
11887
11888 @kindex M-x nnkiboze-generate-groups
11889 @findex nnkiboze-generate-groups
11890 You must run @kbd{M-x nnkiboze-generate-groups} after creating the
11891 @code{nnkiboze} groups you want to have.  This command will take time.  Lots of
11892 time.  Oodles and oodles of time.  Gnus has to fetch the headers from
11893 all the articles in all the component groups and run them through the
11894 scoring process to determine if there are any articles in the groups
11895 that are to be part of the @code{nnkiboze} groups.
11896
11897 Please limit the number of component groups by using restrictive
11898 regexps.  Otherwise your sysadmin may become annoyed with you, and the
11899 @sc{nntp} site may throw you off and never let you back in again.
11900 Stranger things have happened.
11901
11902 @code{nnkiboze} component groups do not have to be alive---they can be dead,
11903 and they can be foreign.  No restrictions.
11904
11905 @vindex nnkiboze-directory
11906 The generation of an @code{nnkiboze} group means writing two files in
11907 @code{nnkiboze-directory}, which is @file{~/News/} by default.  One
11908 contains the @sc{nov} header lines for all the articles in the group,
11909 and the other is an additional @file{.newsrc} file to store information
11910 on what groups have been searched through to find component articles.
11911
11912 Articles marked as read in the @code{nnkiboze} group will have
11913 their @sc{nov} lines removed from the @sc{nov} file.
11914
11915
11916 @node Gnus Unplugged
11917 @section Gnus Unplugged
11918 @cindex offline
11919 @cindex unplugged
11920 @cindex Agent
11921 @cindex Gnus Agent
11922 @cindex Gnus Unplugged
11923
11924 In olden times (ca. February '88), people used to run their newsreaders
11925 on big machines with permanent connections to the net.  News transport
11926 was dealt with by news servers, and all the newsreaders had to do was to
11927 read news.  Believe it or not.
11928
11929 Nowadays most people read news and mail at home, and use some sort of
11930 modem to connect to the net.  To avoid running up huge phone bills, it
11931 would be nice to have a way to slurp down all the news and mail, hang up
11932 the phone, read for several hours, and then upload any responses you
11933 have to make.  And then you repeat the procedure.
11934
11935 Of course, you can use news servers for doing this as well.  I've used
11936 @code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
11937 for some years, but doing that's a bore.  Moving the news server
11938 functionality up to the newsreader makes sense if you're the only person
11939 reading news on a machine.
11940
11941 Using Gnus as an ``offline'' newsreader is quite simple.
11942
11943 @itemize @bullet
11944 @item
11945 First, set up Gnus as you would do if you were running it on a machine
11946 that has full connection to the net.  Go ahead.  I'll still be waiting
11947 here.
11948
11949 @item
11950 Then, put the following magical incantation at the end of your
11951 @file{.gnus.el} file:
11952
11953 @lisp
11954 (gnus-agentize)
11955 @end lisp
11956 @end itemize
11957
11958 That's it.  Gnus is now an ``offline'' newsreader.
11959
11960 Of course, to use it as such, you have to learn a few new commands.
11961
11962 @menu
11963 * Agent Basics::           How it all is supposed to work.
11964 * Agent Categories::       How to tell the Gnus Agent what to download.
11965 * Agent Commands::         New commands for all the buffers.
11966 * Agent Expiry::           How to make old articles go away.
11967 * Outgoing Messages::      What happens when you post/mail something?
11968 * Agent Variables::        Customizing is fun.
11969 * Example Setup::          An example @file{.gnus.el} file for offline people.
11970 * Batching Agents::        How to fetch news from a @code{cron} job.
11971 * Agent Caveats::          What you think it'll do and what it does.
11972 @end menu
11973
11974
11975 @node Agent Basics
11976 @subsection Agent Basics
11977
11978 First, let's get some terminology out of the way.
11979
11980 The Gnus Agent is said to be @dfn{unplugged} when you have severed the
11981 connection to the net (and notified the Agent that this is the case).
11982 When the connection to the net is up again (and Gnus knows this), the
11983 Agent is @dfn{plugged}.
11984
11985 The @dfn{local} machine is the one you're running on, and which isn't
11986 connected to the net continuously.
11987
11988 @dfn{Downloading} means fetching things from the net to your local
11989 machine.  @dfn{Uploading} is doing the opposite.
11990
11991 Let's take a typical Gnus session using the Agent.
11992
11993 @itemize @bullet
11994
11995 @item
11996 You start Gnus with @code{gnus-unplugged}.  This brings up the Gnus
11997 Agent in a disconnected state.  You can read all the news that you have
11998 already fetched while in this mode.
11999
12000 @item
12001 You then decide to see whether any new news has arrived.  You connect
12002 your machine to the net (using PPP or whatever), and then hit @kbd{J j}
12003 to make Gnus become @dfn{plugged}.
12004
12005 @item
12006 You can then read the new news immediately, or you can download the news
12007 onto your local machine.  If you want to do the latter, you press @kbd{J
12008 s} to fetch all the eligible articles in all the groups.  (To let Gnus
12009 know which articles you want to download, @pxref{Agent Categories}.)
12010
12011 @item
12012 After fetching the articles, you press @kbd{J j} to make Gnus become
12013 unplugged again, and you shut down the PPP thing (or whatever).  And
12014 then you read the news offline.
12015
12016 @item
12017 And then you go to step 2.
12018 @end itemize
12019
12020 Here are some things you should do the first time (or so) that you use
12021 the Agent.
12022
12023 @itemize @bullet
12024
12025 @item
12026 Decide which servers should be covered by the Agent.  If you have a mail
12027 backend, it would probably be nonsensical to have it covered by the
12028 Agent.  Go to the server buffer (@kbd{^} in the group buffer) and press
12029 @kbd{J a} the server (or servers) that you wish to have covered by the
12030 Agent (@pxref{Server Agent Commands}).  This will typically be only the
12031 primary select method, which is listed on the bottom in the buffer.
12032
12033 @item
12034 Decide on download policy.  @xref{Agent Categories}.
12035
12036 @item
12037 Uhm... that's it.
12038 @end itemize
12039
12040
12041 @node Agent Categories
12042 @subsection Agent Categories
12043
12044 One of the main reasons to integrate the news transport layer into the
12045 newsreader is to allow greater control over what articles to download.
12046 There's not much point in downloading huge amounts of articles, just to
12047 find out that you're not interested in reading any of them.  It's better
12048 to be somewhat more conservative in choosing what to download, and then
12049 mark the articles for downloading manually if it should turn out that
12050 you're interested in the articles anyway.
12051
12052 The main way to control what is to be downloaded is to create a
12053 @dfn{category} and then assign some (or all) groups to this category.
12054 Gnus has its own buffer for creating and managing categories.
12055
12056 @menu
12057 * Category Syntax::       What a category looks like.
12058 * The Category Buffer::   A buffer for maintaining categories.
12059 * Category Variables::    Customize'r'Us.
12060 @end menu
12061
12062
12063 @node Category Syntax
12064 @subsubsection Category Syntax
12065
12066 A category consists of two things.
12067
12068 @enumerate
12069 @item
12070 A predicate which (generally) gives a rough outline of which articles
12071 are eligible for downloading; and
12072
12073 @item
12074 a score rule which (generally) gives you a finer granularity when
12075 deciding what articles to download.  (Note that this @dfn{download
12076 score} is not necessarily related to normal scores.)
12077 @end enumerate
12078
12079 A predicate in its simplest form can be a single predicate such as
12080 @code{true} or @code{false}. These two will download every available
12081 article or nothing respectively. In the case of these two special
12082 predicates an additional score rule is superfluous.
12083
12084 Predicates of @code{high} or @code{low} download articles in respect of
12085 their scores in relationship to @code{gnus-agent-high-score} and
12086 @code{gnus-agent-low-score} as descibed below.
12087
12088 To gain even finer control of what is to be regarded eligible for
12089 download a predicate can consist of a number of predicates with logical
12090 operators sprinkled in between.
12091
12092 Perhaps some examples are in order.
12093
12094 Here's a simple predicate.  (It's the default predicate, in fact, used
12095 for all groups that don't belong to any other category.)
12096
12097 @lisp
12098 short
12099 @end lisp
12100
12101 Quite simple, eh?  This predicate is true if and only if the article is
12102 short (for some value of ``short'').
12103
12104 Here's a more complex predicate:
12105
12106 @lisp
12107 (or high
12108     (and
12109      (not low)
12110      (not long)))
12111 @end lisp
12112
12113 This means that an article should be downloaded if it has a high score,
12114 or if the score is not low and the article is not long.  You get the
12115 drift.
12116
12117 The available logical operators are @code{or}, @code{and} and
12118 @code{not}.  (If you prefer, you can use the more ``C''-ish operators
12119 @samp{|}, @code{&} and @code{!} instead.)
12120
12121 The following predicates are pre-defined, but if none of these fit what
12122 you want to do, you can write your own.
12123
12124 @table @code
12125 @item short
12126 True iff the article is shorter than @code{gnus-agent-short-article}
12127 lines; default 100.
12128
12129 @item long
12130 True iff the article is longer than @code{gnus-agent-long-article}
12131 lines; default 200.
12132
12133 @item low
12134 True iff the article has a download score less than
12135 @code{gnus-agent-low-score}; default 0.
12136
12137 @item high
12138 True iff the article has a download score greater than
12139 @code{gnus-agent-high-score}; default 0.
12140
12141 @item spam
12142 True iff the Gnus Agent guesses that the article is spam.  The
12143 heuristics may change over time, but at present it just computes a
12144 checksum and sees whether articles match.
12145
12146 @item true
12147 Always true.
12148
12149 @item false
12150 Always false.
12151 @end table
12152
12153 If you want to create your own predicate function, here's what you have
12154 to know:  The functions are called with no parameters, but the
12155 @code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
12156 useful values.
12157
12158 For example, you could decide that you don't want to download articles
12159 that were posted more than a certain number of days ago (e.g. posted
12160 more than @code{gnus-agent-expire-days} ago) you might write a function
12161 something along the lines of the following:
12162
12163 @lisp
12164 (defun my-article-old-p ()
12165   "Say whether an article is old."
12166   (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
12167      (- (time-to-days (current-time)) gnus-agent-expire-days)))
12168 @end lisp
12169
12170 with the predicate then defined as:
12171
12172 @lisp
12173 (not my-article-old-p)
12174 @end lisp
12175
12176 or you could append your predicate to the predefined
12177 @code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
12178 wherever.  (Note: this would have to be at a point *after*
12179 @code{gnus-agent} has been loaded via @code{(gnus-agentize)})
12180
12181 @lisp
12182 (defvar  gnus-category-predicate-alist
12183   (append gnus-category-predicate-alist
12184          '((old . my-article-old-p))))
12185 @end lisp
12186
12187 and simply specify your predicate as:
12188
12189 @lisp
12190 (not old)
12191 @end lisp
12192
12193 If/when using something like the above, be aware that there are many
12194 misconfigured systems/mailers out there and so an article's date is not
12195 always a reliable indication of when it was posted. Hell, some people
12196 just don't give a damm.
12197
12198
12199 The above predicates apply to *all* the groups which belong to the
12200 category. However, if you wish to have a specific predicate for an
12201 individual group within a category, or you're just too lazy to set up a
12202 new category, you can enter a group's individual predicate in it's group
12203 parameters like so:
12204
12205 @lisp
12206 (agent-predicate . short)
12207 @end lisp
12208
12209 This is the group parameter equivalent of the agent category
12210 default. Note that when specifying a single word predicate like this,
12211 the @code{agent-predicate} specification must be in dotted pair
12212 notation.
12213
12214 The equivalent of the longer example from above would be:
12215
12216 @lisp
12217 (agent-predicate or high (and (not low) (not long)))
12218 @end lisp
12219
12220 The outer parenthesis required in the category specification are not
12221 entered here as, not being in dotted pair notation, the value of the
12222 predicate is assumed to be a list.
12223
12224
12225 Now, the syntax of the download score is the same as the syntax of
12226 normal score files, except that all elements that require actually
12227 seeing the article itself are verboten.  This means that only the
12228 following headers can be scored on: @code{Subject}, @code{From},
12229 @code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
12230 @code{Lines}, and @code{Xref}.
12231
12232 As with predicates, the specification of the @code{download score rule}
12233 to use in respect of a group can be in either the category definition if
12234 it's to be applicable to all groups in therein, or a group's parameters
12235 if it's to be specific to that group.
12236
12237 In both of these places the @code{download score rule} can take one of
12238 three forms:
12239
12240 @enumerate
12241 @item
12242 Score rule
12243
12244 This has the same syntax as a normal gnus score file except only a
12245 subset of scoring keywords are available as mentioned above.
12246
12247 example:
12248
12249 @itemize @bullet
12250 @item
12251 Category specification
12252
12253 @lisp
12254 (("from"
12255        ("Lars Ingebrigtsen" 1000000 nil s))
12256 ("lines"
12257        (500 -100 nil <)))
12258 @end lisp
12259
12260 @item
12261 Group Parameter specification
12262
12263 @lisp
12264 (agent-score ("from"
12265                    ("Lars Ingebrigtsen" 1000000 nil s))
12266              ("lines"
12267                    (500 -100 nil <)))
12268 @end lisp
12269
12270 Again, note the omission of the outermost parenthesis here.
12271 @end itemize
12272
12273 @item
12274 Agent score file
12275
12276 These score files must *only* contain the permitted scoring keywords
12277 stated above.
12278
12279 example:
12280
12281 @itemize @bullet
12282 @item
12283 Category specification
12284
12285 @lisp
12286 ("~/News/agent.SCORE")
12287 @end lisp
12288
12289 or perhaps
12290
12291 @lisp
12292 ("~/News/agent.SCORE" "~/News/agent.group.SCORE")
12293 @end lisp
12294
12295 @item
12296 Group Parameter specification
12297
12298 @lisp
12299 (agent-score "~/News/agent.SCORE")
12300 @end lisp
12301
12302 Additional score files can be specified as above. Need I say anything
12303 about parenthesis.
12304 @end itemize
12305
12306 @item
12307 Use @code{normal} score files
12308
12309 If you dont want to maintain two sets of scoring rules for a group, and
12310 your desired @code{downloading} criteria for a group are the same as your
12311 @code{reading} criteria then you can tell the agent to refer to your
12312 @code{normal} score files when deciding what to download.
12313
12314 These directives in either the category definition or a group's
12315 parameters will cause the agent to read in all the applicable score
12316 files for a group, *filtering out* those those sections that do not
12317 relate to one of the permitted subset of scoring keywords.
12318
12319 @itemize @bullet
12320 @item
12321 Category Specification
12322
12323 @lisp
12324 file
12325 @end lisp
12326
12327 @item
12328 Group Parameter specification
12329
12330 @lisp
12331 (agent-score . file)
12332 @end lisp
12333 @end itemize
12334 @end enumerate
12335
12336 @node The Category Buffer
12337 @subsubsection The Category Buffer
12338
12339 You'd normally do all category maintenance from the category buffer.
12340 When you enter it for the first time (with the @kbd{J c} command from
12341 the group buffer), you'll only see the @code{default} category.
12342
12343 The following commands are available in this buffer:
12344
12345 @table @kbd
12346 @item q
12347 @kindex q (Category)
12348 @findex gnus-category-exit
12349 Return to the group buffer (@code{gnus-category-exit}).
12350
12351 @item k
12352 @kindex k (Category)
12353 @findex gnus-category-kill
12354 Kill the current category (@code{gnus-category-kill}).
12355
12356 @item c
12357 @kindex c (Category)
12358 @findex gnus-category-copy
12359 Copy the current category (@code{gnus-category-copy}).
12360
12361 @item a
12362 @kindex a (Category)
12363 @findex gnus-category-add
12364 Add a new category (@code{gnus-category-add}).
12365
12366 @item p
12367 @kindex p (Category)
12368 @findex gnus-category-edit-predicate
12369 Edit the predicate of the current category
12370 (@code{gnus-category-edit-predicate}).
12371
12372 @item g
12373 @kindex g (Category)
12374 @findex gnus-category-edit-groups
12375 Edit the list of groups belonging to the current category
12376 (@code{gnus-category-edit-groups}).
12377
12378 @item s
12379 @kindex s (Category)
12380 @findex gnus-category-edit-score
12381 Edit the download score rule of the current category
12382 (@code{gnus-category-edit-score}).
12383
12384 @item l
12385 @kindex l (Category)
12386 @findex gnus-category-list
12387 List all the categories (@code{gnus-category-list}).
12388 @end table
12389
12390
12391 @node Category Variables
12392 @subsubsection Category Variables
12393
12394 @table @code
12395 @item gnus-category-mode-hook
12396 @vindex gnus-category-mode-hook
12397 Hook run in category buffers.
12398
12399 @item gnus-category-line-format
12400 @vindex gnus-category-line-format
12401 Format of the lines in the category buffer (@pxref{Formatting
12402 Variables}).  Valid elements are:
12403
12404 @table @samp
12405 @item c
12406 The name of the category.
12407
12408 @item g
12409 The number of groups in the category.
12410 @end table
12411
12412 @item gnus-category-mode-line-format
12413 @vindex gnus-category-mode-line-format
12414 Format of the category mode line (@pxref{Mode Line Formatting}).
12415
12416 @item gnus-agent-short-article
12417 @vindex gnus-agent-short-article
12418 Articles that have fewer lines than this are short.  Default 100.
12419
12420 @item gnus-agent-long-article
12421 @vindex gnus-agent-long-article
12422 Articles that have more lines than this are long.  Default 200.
12423
12424 @item gnus-agent-low-score
12425 @vindex gnus-agent-low-score
12426 Articles that have a score lower than this have a low score.  Default
12427 0.
12428
12429 @item gnus-agent-high-score
12430 @vindex gnus-agent-high-score
12431 Articles that have a score higher than this have a high score.  Default
12432 0.
12433
12434 @end table
12435
12436
12437 @node Agent Commands
12438 @subsection Agent Commands
12439
12440 All the Gnus Agent commands are on the @kbd{J} submap.  The @kbd{J j}
12441 (@code{gnus-agent-toggle-plugged} command works in all modes, and
12442 toggles the plugged/unplugged state of the Gnus Agent.
12443
12444
12445 @menu
12446 * Group Agent Commands::
12447 * Summary Agent Commands::
12448 * Server Agent Commands::
12449 @end menu
12450
12451 You can run a complete batch fetch from the command line with the
12452 following incantation:
12453
12454 @cindex gnus-agent-batch-fetch
12455 @example
12456 $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch
12457 @end example
12458
12459
12460
12461 @node Group Agent Commands
12462 @subsubsection Group Agent Commands
12463
12464 @table @kbd
12465 @item J u
12466 @kindex J u (Agent Group)
12467 @findex gnus-agent-fetch-groups
12468 Fetch all eligible articles in the current group
12469 (@code{gnus-agent-fetch-groups}).
12470
12471 @item J c
12472 @kindex J c (Agent Group)
12473 @findex gnus-enter-category-buffer
12474 Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
12475
12476 @item J s
12477 @kindex J s (Agent Group)
12478 @findex gnus-agent-fetch-session
12479 Fetch all eligible articles in all groups
12480 (@code{gnus-agent-fetch-session}).
12481
12482 @item J S
12483 @kindex J S (Agent Group)
12484 @findex gnus-group-send-drafts
12485 Send all sendable messages in the draft group
12486 (@code{gnus-agent-fetch-session}).  @xref{Drafts}.
12487
12488 @item J a
12489 @kindex J a (Agent Group)
12490 @findex gnus-agent-add-group
12491 Add the current group to an Agent category
12492 (@code{gnus-agent-add-group}).  This command understands the
12493 process/prefix convention (@pxref{Process/Prefix}).
12494
12495 @item J r
12496 @kindex J r (Agent Group)
12497 @findex gnus-agent-remove-group
12498 Remove the current group from its category, if any
12499 (@code{gnus-agent-remove-group}).  This command understands the
12500 process/prefix convention (@pxref{Process/Prefix}).
12501
12502 @end table
12503
12504
12505 @node Summary Agent Commands
12506 @subsubsection Summary Agent Commands
12507
12508 @table @kbd
12509 @item J #
12510 @kindex J # (Agent Summary)
12511 @findex gnus-agent-mark-article
12512 Mark the article for downloading (@code{gnus-agent-mark-article}).
12513
12514 @item J M-#
12515 @kindex J M-# (Agent Summary)
12516 @findex gnus-agent-unmark-article
12517 Remove the downloading mark from the article
12518 (@code{gnus-agent-unmark-article}).
12519
12520 @item @@
12521 @kindex @@ (Agent Summary)
12522 @findex gnus-agent-toggle-mark
12523 Toggle whether to download the article (@code{gnus-agent-toggle-mark}).
12524
12525 @item J c
12526 @kindex J c (Agent Summary)
12527 @findex gnus-agent-catchup
12528 Mark all undownloaded articles as read (@code{gnus-agent-catchup}).
12529
12530 @end table
12531
12532
12533 @node Server Agent Commands
12534 @subsubsection Server Agent Commands
12535
12536 @table @kbd
12537 @item J a
12538 @kindex J a (Agent Server)
12539 @findex gnus-agent-add-server
12540 Add the current server to the list of servers covered by the Gnus Agent
12541 (@code{gnus-agent-add-server}).
12542
12543 @item J r
12544 @kindex J r (Agent Server)
12545 @findex gnus-agent-remove-server
12546 Remove the current server from the list of servers covered by the Gnus
12547 Agent (@code{gnus-agent-remove-server}).
12548
12549 @end table
12550
12551
12552 @node Agent Expiry
12553 @subsection Agent Expiry
12554
12555 @vindex gnus-agent-expire-days
12556 @findex gnus-agent-expire
12557 @kindex M-x gnus-agent-expire
12558 @cindex Agent expiry
12559 @cindex Gnus Agent expiry
12560 @cindex expiry
12561
12562 @code{nnagent} doesn't handle expiry.  Instead, there's a special
12563 @code{gnus-agent-expire} command that will expire all read articles that
12564 are older than @code{gnus-agent-expire-days} days.  It can be run
12565 whenever you feel that you're running out of space.  It's not
12566 particularly fast or efficient, and it's not a particularly good idea to
12567 interrupt it (with @kbd{C-g} or anything else) once you've started it.
12568
12569 @vindex gnus-agent-expire-all
12570 if @code{gnus-agent-expire-all} is non-@code{nil}, this command will
12571 expire all articles---unread, read, ticked and dormant.  If @code{nil}
12572 (which is the default), only read articles are eligible for expiry, and
12573 unread, ticked and dormant articles will be kept indefinitely.
12574
12575
12576 @node Outgoing Messages
12577 @subsection Outgoing Messages
12578
12579 When Gnus is unplugged, all outgoing messages (both mail and news) are
12580 stored in the draft groups (@pxref{Drafts}).  You can view them there
12581 after posting, and edit them at will.
12582
12583 When Gnus is plugged again, you can send the messages either from the
12584 draft group with the special commands available there, or you can use
12585 the @kbd{J S} command in the group buffer to send all the sendable
12586 messages in the draft group.
12587
12588
12589
12590 @node Agent Variables
12591 @subsection Agent Variables
12592
12593 @table @code
12594 @item gnus-agent-directory
12595 @vindex gnus-agent-directory
12596 Where the Gnus Agent will store its files.  The default is
12597 @file{~/News/agent/}.
12598
12599 @item gnus-agent-handle-level
12600 @vindex gnus-agent-handle-level
12601 Groups on levels (@pxref{Group Levels}) higher than this variable will
12602 be ignored by the Agent.  The default is @code{gnus-level-subscribed},
12603 which means that only subscribed group will be considered by the Agent
12604 by default.
12605
12606 @item gnus-agent-plugged-hook
12607 @vindex gnus-agent-plugged-hook
12608 Hook run when connecting to the network.
12609
12610 @item gnus-agent-unplugged-hook
12611 @vindex gnus-agent-unplugged-hook
12612 Hook run when disconnecting from the network.
12613
12614 @end table
12615
12616
12617 @node Example Setup
12618 @subsection Example Setup
12619
12620 If you don't want to read this manual, and you have a fairly standard
12621 setup, you may be able to use something like the following as your
12622 @file{.gnus.el} file to get started.
12623
12624 @lisp
12625 ;;; Define how Gnus is to fetch news.  We do this over NNTP
12626 ;;; from your ISP's server.
12627 (setq gnus-select-method '(nntp "nntp.your-isp.com"))
12628
12629 ;;; Define how Gnus is to read your mail.  We read mail from
12630 ;;; your ISP's POP server.
12631 (setenv "MAILHOST" "pop.your-isp.com")
12632 (setq nnmail-spool-file "po:username")
12633
12634 ;;; Say how Gnus is to store the mail.  We use nnml groups.
12635 (setq gnus-secondary-select-methods '((nnml "")))
12636
12637 ;;; Make Gnus into an offline newsreader.
12638 (gnus-agentize)
12639 @end lisp
12640
12641 That should be it, basically.  Put that in your @file{~/.gnus.el} file,
12642 edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
12643 gnus}.
12644
12645 If this is the first time you've run Gnus, you will be subscribed
12646 automatically to a few default newsgroups.  You'll probably want to
12647 subscribe to more groups, and to do that, you have to query the
12648 @sc{nntp} server for a complete list of groups with the @kbd{A A}
12649 command.  This usually takes quite a while, but you only have to do it
12650 once.
12651
12652 After reading and parsing a while, you'll be presented with a list of
12653 groups.  Subscribe to the ones you want to read with the @kbd{u}
12654 command.  @kbd{l} to make all the killed groups disappear after you've
12655 subscribe to all the groups you want to read.  (@kbd{A k} will bring
12656 back all the killed groups.)
12657
12658 You can now read the groups at once, or you can download the articles
12659 with the @kbd{J s} command.  And then read the rest of this manual to
12660 find out which of the other gazillion things you want to customize.
12661
12662
12663 @node Batching Agents
12664 @subsection Batching Agents
12665
12666 Having the Gnus Agent fetch articles (and post whatever messages you've
12667 written) is quite easy once you've gotten things set up properly.  The
12668 following shell script will do everything that is necessary:
12669
12670 @example
12671 #!/bin/sh
12672 emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null
12673 @end example
12674
12675
12676 @node Agent Caveats
12677 @subsection Agent Caveats
12678
12679 The Gnus Agent doesn't seem to work like most other offline
12680 newsreaders.  Here are some common questions that some imaginary people
12681 may ask:
12682
12683 @table @dfn
12684 @item If I read an article while plugged, do they get entered into the
12685 Agent?
12686
12687 @strong{No.}
12688
12689 @item If I read an article while plugged, and the article already exists
12690 in the Agent, will it get downloaded once more?
12691
12692 @strong{Yes.}
12693
12694 @end table
12695
12696 In short, when Gnus is unplugged, it only looks into the locally stored
12697 articles; when it's plugged, it only talks to your ISP.
12698
12699
12700 @node Scoring
12701 @chapter Scoring
12702 @cindex scoring
12703
12704 Other people use @dfn{kill files}, but we here at Gnus Towers like
12705 scoring better than killing, so we'd rather switch than fight.  They do
12706 something completely different as well, so sit up straight and pay
12707 attention!
12708
12709 @vindex gnus-summary-mark-below
12710 All articles have a default score (@code{gnus-summary-default-score}),
12711 which is 0 by default.  This score may be raised or lowered either
12712 interactively or by score files.  Articles that have a score lower than
12713 @code{gnus-summary-mark-below} are marked as read.
12714
12715 Gnus will read any @dfn{score files} that apply to the current group
12716 before generating the summary buffer.
12717
12718 There are several commands in the summary buffer that insert score
12719 entries based on the current article.  You can, for instance, ask Gnus to
12720 lower or increase the score of all articles with a certain subject.
12721
12722 There are two sorts of scoring entries: Permanent and temporary.
12723 Temporary score entries are self-expiring entries.  Any entries that are
12724 temporary and have not been used for, say, a week, will be removed
12725 silently to help keep the sizes of the score files down.
12726
12727 @menu
12728 * Summary Score Commands::   Adding score entries for the current group.
12729 * Group Score Commands::     General score commands.
12730 * Score Variables::          Customize your scoring.  (My, what terminology).
12731 * Score File Format::        What a score file may contain.
12732 * Score File Editing::       You can edit score files by hand as well.
12733 * Adaptive Scoring::         Big Sister Gnus knows what you read.
12734 * Home Score File::          How to say where new score entries are to go.
12735 * Followups To Yourself::    Having Gnus notice when people answer you.
12736 * Scoring Tips::             How to score effectively.
12737 * Reverse Scoring::          That problem child of old is not problem.
12738 * Global Score Files::       Earth-spanning, ear-splitting score files.
12739 * Kill Files::               They are still here, but they can be ignored.
12740 * Converting Kill Files::    Translating kill files to score files.
12741 * GroupLens::                Getting predictions on what you like to read.
12742 * Advanced Scoring::         Using logical expressions to build score rules.
12743 * Score Decays::             It can be useful to let scores wither away.
12744 @end menu
12745
12746
12747 @node Summary Score Commands
12748 @section Summary Score Commands
12749 @cindex score commands
12750
12751 The score commands that alter score entries do not actually modify real
12752 score files.  That would be too inefficient.  Gnus maintains a cache of
12753 previously loaded score files, one of which is considered the
12754 @dfn{current score file alist}.  The score commands simply insert
12755 entries into this list, and upon group exit, this list is saved.
12756
12757 The current score file is by default the group's local score file, even
12758 if no such score file actually exists.  To insert score commands into
12759 some other score file (e.g. @file{all.SCORE}), you must first make this
12760 score file the current one.
12761
12762 General score commands that don't actually change the score file:
12763
12764 @table @kbd
12765
12766 @item V s
12767 @kindex V s (Summary)
12768 @findex gnus-summary-set-score
12769 Set the score of the current article (@code{gnus-summary-set-score}).
12770
12771 @item V S
12772 @kindex V S (Summary)
12773 @findex gnus-summary-current-score
12774 Display the score of the current article
12775 (@code{gnus-summary-current-score}).
12776
12777 @item V t
12778 @kindex V t (Summary)
12779 @findex gnus-score-find-trace
12780 Display all score rules that have been used on the current article
12781 (@code{gnus-score-find-trace}).
12782
12783 @item V R
12784 @kindex V R (Summary)
12785 @findex gnus-summary-rescore
12786 Run the current summary through the scoring process
12787 (@code{gnus-summary-rescore}).  This might be useful if you're playing
12788 around with your score files behind Gnus' back and want to see the
12789 effect you're having.
12790
12791 @item V c
12792 @kindex V c (Summary)
12793 @findex gnus-score-change-score-file
12794 Make a different score file the current
12795 (@code{gnus-score-change-score-file}).
12796
12797 @item V e
12798 @kindex V e (Summary)
12799 @findex gnus-score-edit-current-scores
12800 Edit the current score file (@code{gnus-score-edit-current-scores}).
12801 You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
12802 File Editing}).
12803
12804 @item V f
12805 @kindex V f (Summary)
12806 @findex gnus-score-edit-file
12807 Edit a score file and make this score file the current one
12808 (@code{gnus-score-edit-file}).
12809
12810 @item V F
12811 @kindex V F (Summary)
12812 @findex gnus-score-flush-cache
12813 Flush the score cache (@code{gnus-score-flush-cache}).  This is useful
12814 after editing score files.
12815
12816 @item V C
12817 @kindex V C (Summary)
12818 @findex gnus-score-customize
12819 Customize a score file in a visually pleasing manner
12820 (@code{gnus-score-customize}).
12821
12822 @end table
12823
12824 The rest of these commands modify the local score file.
12825
12826 @table @kbd
12827
12828 @item V m
12829 @kindex V m (Summary)
12830 @findex gnus-score-set-mark-below
12831 Prompt for a score, and mark all articles with a score below this as
12832 read (@code{gnus-score-set-mark-below}).
12833
12834 @item V x
12835 @kindex V x (Summary)
12836 @findex gnus-score-set-expunge-below
12837 Prompt for a score, and add a score rule to the current score file to
12838 expunge all articles below this score
12839 (@code{gnus-score-set-expunge-below}).
12840 @end table
12841
12842 The keystrokes for actually making score entries follow a very regular
12843 pattern, so there's no need to list all the commands.  (Hundreds of
12844 them.)
12845
12846 @findex gnus-summary-increase-score
12847 @findex gnus-summary-lower-score
12848
12849 @enumerate
12850 @item
12851 The first key is either @kbd{I} (upper case i) for increasing the score
12852 or @kbd{L} for lowering the score.
12853 @item
12854 The second key says what header you want to score on.  The following
12855 keys are available:
12856 @table @kbd
12857
12858 @item a
12859 Score on the author name.
12860
12861 @item s
12862 Score on the subject line.
12863
12864 @item x
12865 Score on the @code{Xref} line---i.e., the cross-posting line.
12866
12867 @item r
12868 Score on the @code{References} line.
12869
12870 @item d
12871 Score on the date.
12872
12873 @item l
12874 Score on the number of lines.
12875
12876 @item i
12877 Score on the @code{Message-ID} header.
12878
12879 @item f
12880 Score on followups---this matches the author name, and adds scores to
12881 the followups to this author.
12882
12883 @item b
12884 Score on the body.
12885
12886 @item h
12887 Score on the head.
12888
12889 @item t
12890 Score on thead.
12891
12892 @end table
12893
12894 @item
12895 The third key is the match type.  Which match types are valid depends on
12896 what headers you are scoring on.
12897
12898 @table @code
12899
12900 @item strings
12901
12902 @table @kbd
12903
12904 @item e
12905 Exact matching.
12906
12907 @item s
12908 Substring matching.
12909
12910 @item f
12911 Fuzzy matching (@pxref{Fuzzy Matching}).
12912
12913 @item r
12914 Regexp matching
12915 @end table
12916
12917 @item date
12918 @table @kbd
12919
12920 @item b
12921 Before date.
12922
12923 @item a
12924 After date.
12925
12926 @item n
12927 This date.
12928 @end table
12929
12930 @item number
12931 @table @kbd
12932
12933 @item <
12934 Less than number.
12935
12936 @item =
12937 Equal to number.
12938
12939 @item >
12940 Greater than number.
12941 @end table
12942 @end table
12943
12944 @item
12945 The fourth and final key says whether this is a temporary (i.e., expiring)
12946 score entry, or a permanent (i.e., non-expiring) score entry, or whether
12947 it is to be done immediately, without adding to the score file.
12948 @table @kbd
12949
12950 @item t
12951 Temporary score entry.
12952
12953 @item p
12954 Permanent score entry.
12955
12956 @item i
12957 Immediately scoring.
12958 @end table
12959
12960 @end enumerate
12961
12962 So, let's say you want to increase the score on the current author with
12963 exact matching permanently: @kbd{I a e p}.  If you want to lower the
12964 score based on the subject line, using substring matching, and make a
12965 temporary score entry: @kbd{L s s t}.  Pretty easy.
12966
12967 To make things a bit more complicated, there are shortcuts.  If you use
12968 a capital letter on either the second or third keys, Gnus will use
12969 defaults for the remaining one or two keystrokes.  The defaults are
12970 ``substring'' and ``temporary''.  So @kbd{I A} is the same as @kbd{I a s
12971 t}, and @kbd{I a R} is the same as @kbd{I a r t}.
12972
12973 These functions take both the numerical prefix and the symbolic prefix
12974 (@pxref{Symbolic Prefixes}).  A numerical prefix says how much to lower
12975 (or increase) the score of the article.  A symbolic prefix of @code{a}
12976 says to use the @file{all.SCORE} file for the command instead of the
12977 current score file.
12978
12979 @vindex gnus-score-mimic-keymap
12980 The @code{gnus-score-mimic-keymap} says whether these commands will
12981 pretend they are keymaps or not.
12982
12983
12984 @node Group Score Commands
12985 @section Group Score Commands
12986 @cindex group score commands
12987
12988 There aren't many of these as yet, I'm afraid.
12989
12990 @table @kbd
12991
12992 @item W f
12993 @kindex W f (Group)
12994 @findex gnus-score-flush-cache
12995 Gnus maintains a cache of score alists to avoid having to reload them
12996 all the time.  This command will flush the cache
12997 (@code{gnus-score-flush-cache}).
12998
12999 @end table
13000
13001 You can do scoring from the command line by saying something like:
13002
13003 @findex gnus-batch-score
13004 @cindex batch scoring
13005 @example
13006 $ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
13007 @end example
13008
13009
13010 @node Score Variables
13011 @section Score Variables
13012 @cindex score variables
13013
13014 @table @code
13015
13016 @item gnus-use-scoring
13017 @vindex gnus-use-scoring
13018 If @code{nil}, Gnus will not check for score files, and will not, in
13019 general, do any score-related work.  This is @code{t} by default.
13020
13021 @item gnus-kill-killed
13022 @vindex gnus-kill-killed
13023 If this variable is @code{nil}, Gnus will never apply score files to
13024 articles that have already been through the kill process.  While this
13025 may save you lots of time, it also means that if you apply a kill file
13026 to a group, and then change the kill file and want to run it over you
13027 group again to kill more articles, it won't work.  You have to set this
13028 variable to @code{t} to do that.  (It is @code{t} by default.)
13029
13030 @item gnus-kill-files-directory
13031 @vindex gnus-kill-files-directory
13032 All kill and score files will be stored in this directory, which is
13033 initialized from the @code{SAVEDIR} environment variable by default.
13034 This is @file{~/News/} by default.
13035
13036 @item gnus-score-file-suffix
13037 @vindex gnus-score-file-suffix
13038 Suffix to add to the group name to arrive at the score file name
13039 (@samp{SCORE} by default.)
13040
13041 @item gnus-score-uncacheable-files
13042 @vindex gnus-score-uncacheable-files
13043 @cindex score cache
13044 All score files are normally cached to avoid excessive re-loading of
13045 score files.  However, if this might make you Emacs grow big and
13046 bloated, so this regexp can be used to weed out score files unlikely to be needed again.  It would be a bad idea to deny caching of
13047 @file{all.SCORE}, while it might be a good idea to not cache
13048 @file{comp.infosystems.www.authoring.misc.ADAPT}.  In fact, this
13049 variable is @samp{ADAPT$} by default, so no adaptive score files will
13050 be cached.
13051
13052 @item gnus-save-score
13053 @vindex gnus-save-score
13054 If you have really complicated score files, and do lots of batch
13055 scoring, then you might set this variable to @code{t}.  This will make
13056 Gnus save the scores into the @file{.newsrc.eld} file.
13057
13058 @item gnus-score-interactive-default-score
13059 @vindex gnus-score-interactive-default-score
13060 Score used by all the interactive raise/lower commands to raise/lower
13061 score with.  Default is 1000, which may seem excessive, but this is to
13062 ensure that the adaptive scoring scheme gets enough room to play with.
13063 We don't want the small changes from the adaptive scoring to overwrite
13064 manually entered data.
13065
13066 @item gnus-summary-default-score
13067 @vindex gnus-summary-default-score
13068 Default score of an article, which is 0 by default.
13069
13070 @item gnus-summary-expunge-below
13071 @vindex gnus-summary-expunge-below
13072 Don't display the summary lines of articles that have scores lower than
13073 this variable.  This is @code{nil} by default, which means that no
13074 articles will be hidden.  This variable is local to the summary buffers,
13075 and has to be set from @code{gnus-summary-mode-hook}.
13076
13077 @item gnus-score-over-mark
13078 @vindex gnus-score-over-mark
13079 Mark (in the third column) used for articles with a score over the
13080 default.  Default is @samp{+}.
13081
13082 @item gnus-score-below-mark
13083 @vindex gnus-score-below-mark
13084 Mark (in the third column) used for articles with a score below the
13085 default.  Default is @samp{-}.
13086
13087 @item gnus-score-find-score-files-function
13088 @vindex gnus-score-find-score-files-function
13089 Function used to find score files for the current group.  This function
13090 is called with the name of the group as the argument.
13091
13092 Predefined functions available are:
13093 @table @code
13094
13095 @item gnus-score-find-single
13096 @findex gnus-score-find-single
13097 Only apply the group's own score file.
13098
13099 @item gnus-score-find-bnews
13100 @findex gnus-score-find-bnews
13101 Apply all score files that match, using bnews syntax.  This is the
13102 default.  If the current group is @samp{gnu.emacs.gnus}, for instance,
13103 @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
13104 @file{gnu.all.SCORE} would all apply.  In short, the instances of
13105 @samp{all} in the score file names are translated into @samp{.*}, and
13106 then a regexp match is done.
13107
13108 This means that if you have some score entries that you want to apply to
13109 all groups, then you put those entries in the @file{all.SCORE} file.
13110
13111 The score files are applied in a semi-random order, although Gnus will
13112 try to apply the more general score files before the more specific score
13113 files.  It does this by looking at the number of elements in the score
13114 file names---discarding the @samp{all} elements.
13115
13116 @item gnus-score-find-hierarchical
13117 @findex gnus-score-find-hierarchical
13118 Apply all score files from all the parent groups.  This means that you
13119 can't have score files like @file{all.SCORE}, but you can have
13120 @file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE}.
13121
13122 @end table
13123 This variable can also be a list of functions.  In that case, all these
13124 functions will be called, and all the returned lists of score files will
13125 be applied.  These functions can also return lists of score alists
13126 directly.  In that case, the functions that return these non-file score
13127 alists should probably be placed before the ``real'' score file
13128 functions, to ensure that the last score file returned is the local
13129 score file.  Phu.
13130
13131 @item gnus-score-expiry-days
13132 @vindex gnus-score-expiry-days
13133 This variable says how many days should pass before an unused score file
13134 entry is expired.  If this variable is @code{nil}, no score file entries
13135 are expired.  It's 7 by default.
13136
13137 @item gnus-update-score-entry-dates
13138 @vindex gnus-update-score-entry-dates
13139 If this variable is non-@code{nil}, matching score entries will have
13140 their dates updated.  (This is how Gnus controls expiry---all
13141 non-matching entries will become too old while matching entries will
13142 stay fresh and young.)  However, if you set this variable to @code{nil},
13143 even matching entries will grow old and will have to face that oh-so
13144 grim reaper.
13145
13146 @item gnus-score-after-write-file-function
13147 @vindex gnus-score-after-write-file-function
13148 Function called with the name of the score file just written.
13149
13150 @item gnus-score-thread-simplify
13151 @vindex gnus-score-thread-simplify
13152 If this variable is non-@code{nil}, article subjects will be simplified
13153 for subject scoring purposes in the same manner as with
13154 threading---according to the current value of
13155 gnus-simplify-subject-functions.  If the scoring entry uses
13156 @code{substring} or @code{exact} matching, the match will also be
13157 simplified in this manner.
13158
13159 @end table
13160
13161
13162 @node Score File Format
13163 @section Score File Format
13164 @cindex score file format
13165
13166 A score file is an @code{emacs-lisp} file that normally contains just a
13167 single form.  Casual users are not expected to edit these files;
13168 everything can be changed from the summary buffer.
13169
13170 Anyway, if you'd like to dig into it yourself, here's an example:
13171
13172 @lisp
13173 (("from"
13174   ("Lars Ingebrigtsen" -10000)
13175   ("Per Abrahamsen")
13176   ("larsi\\|lmi" -50000 nil R))
13177  ("subject"
13178   ("Ding is Badd" nil 728373))
13179  ("xref"
13180   ("alt.politics" -1000 728372 s))
13181  ("lines"
13182   (2 -100 nil <))
13183  (mark 0)
13184  (expunge -1000)
13185  (mark-and-expunge -10)
13186  (read-only nil)
13187  (orphan -10)
13188  (adapt t)
13189  (files "/hom/larsi/News/gnu.SCORE")
13190  (exclude-files "all.SCORE")
13191  (local (gnus-newsgroup-auto-expire t)
13192         (gnus-summary-make-false-root empty))
13193  (eval (ding)))
13194 @end lisp
13195
13196 This example demonstrates most score file elements.  For a different
13197 approach, see @pxref{Advanced Scoring}.
13198
13199 Even though this looks much like lisp code, nothing here is actually
13200 @code{eval}ed.  The lisp reader is used to read this form, though, so it
13201 has to be valid syntactically, if not semantically.
13202
13203 Six keys are supported by this alist:
13204
13205 @table @code
13206
13207 @item STRING
13208 If the key is a string, it is the name of the header to perform the
13209 match on.  Scoring can only be performed on these eight headers:
13210 @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
13211 @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}.  In addition to
13212 these headers, there are three strings to tell Gnus to fetch the entire
13213 article and do the match on larger parts of the article: @code{Body}
13214 will perform the match on the body of the article, @code{Head} will
13215 perform the match on the head of the article, and @code{All} will
13216 perform the match on the entire article.  Note that using any of these
13217 last three keys will slow down group entry @emph{considerably}.  The
13218 final ``header'' you can score on is @code{Followup}.  These score
13219 entries will result in new score entries being added for all follow-ups
13220 to articles that matches these score entries.
13221
13222 Following this key is a arbitrary number of score entries, where each
13223 score entry has one to four elements.
13224 @enumerate
13225
13226 @item
13227 The first element is the @dfn{match element}.  On most headers this will
13228 be a string, but on the Lines and Chars headers, this must be an
13229 integer.
13230
13231 @item
13232 If the second element is present, it should be a number---the @dfn{score
13233 element}.  This number should be an integer in the neginf to posinf
13234 interval.  This number is added to the score of the article if the match
13235 is successful.  If this element is not present, the
13236 @code{gnus-score-interactive-default-score} number will be used
13237 instead.  This is 1000 by default.
13238
13239 @item
13240 If the third element is present, it should be a number---the @dfn{date
13241 element}.  This date says when the last time this score entry matched,
13242 which provides a mechanism for expiring the score entries.  It this
13243 element is not present, the score entry is permanent.  The date is
13244 represented by the number of days since December 31, 1 BCE.
13245
13246 @item
13247 If the fourth element is present, it should be a symbol---the @dfn{type
13248 element}.  This element specifies what function should be used to see
13249 whether this score entry matches the article.  What match types that can
13250 be used depends on what header you wish to perform the match on.
13251 @table @dfn
13252
13253 @item From, Subject, References, Xref, Message-ID
13254 For most header types, there are the @code{r} and @code{R} (regexp), as
13255 well as @code{s} and @code{S} (substring) types, and @code{e} and
13256 @code{E} (exact match), and @code{w} (word match) types.  If this
13257 element is not present, Gnus will assume that substring matching should
13258 be used.  @code{R}, @code{S}, and @code{E} differ from the others in
13259 that the matches will be done in a case-sensitive manner.  All these
13260 one-letter types are really just abbreviations for the @code{regexp},
13261 @code{string}, @code{exact}, and @code{word} types, which you can use
13262 instead, if you feel like.
13263
13264 @item Lines, Chars
13265 These two headers use different match types: @code{<}, @code{>},
13266 @code{=}, @code{>=} and @code{<=}.
13267
13268 These predicates are true if
13269
13270 @example
13271 (PREDICATE HEADER MATCH)
13272 @end example
13273
13274 evaluates to non-@code{nil}.  For instance, the advanced match
13275 @code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
13276 following form:
13277
13278 @lisp
13279 (< header-value 4)
13280 @end lisp
13281
13282 Or to put it another way: When using @code{<} on @code{Lines} with 4 as
13283 the match, we get the score added if the article has less than 4 lines.
13284 (It's easy to get confused and think it's the other way around.  But
13285 it's not.  I think.)
13286
13287 When matching on @code{Lines}, be careful because some backends (like
13288 @code{nndir}) do not generate @code{Lines} header, so every article ends
13289 up being marked as having 0 lines.  This can lead to strange results if
13290 you happen to lower score of the articles with few lines.
13291
13292 @item Date
13293 For the Date header we have three kinda silly match types:
13294 @code{before}, @code{at} and @code{after}.  I can't really imagine this
13295 ever being useful, but, like, it would feel kinda silly not to provide
13296 this function.  Just in case.  You never know.  Better safe than sorry.
13297 Once burnt, twice shy.  Don't judge a book by its cover.  Never not have
13298 sex on a first date.  (I have been told that at least one person, and I
13299 quote, ``found this function indispensable'', however.)
13300
13301 @cindex ISO8601
13302 @cindex date
13303 A more useful match type is @code{regexp}.  With it, you can match the
13304 date string using a regular expression.  The date is normalized to
13305 ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}.  If
13306 you want to match all articles that have been posted on April 1st in
13307 every year, you could use @samp{....0401.........} as a match string,
13308 for instance.  (Note that the date is kept in its original time zone, so
13309 this will match articles that were posted when it was April 1st where
13310 the article was posted from.  Time zones are such wholesome fun for the
13311 whole family, eh?)
13312
13313 @item Head, Body, All
13314 These three match keys use the same match types as the @code{From} (etc)
13315 header uses.
13316
13317 @item Followup
13318 This match key is somewhat special, in that it will match the
13319 @code{From} header, and affect the score of not only the matching
13320 articles, but also all followups to the matching articles.  This allows
13321 you e.g. increase the score of followups to your own articles, or
13322 decrease the score of followups to the articles of some known
13323 trouble-maker.  Uses the same match types as the @code{From} header
13324 uses.  (Using this match key will lead to creation of @file{ADAPT}
13325 files.)
13326
13327 @item Thread
13328 This match key works along the same lines as the @code{Followup} match
13329 key.  If you say that you want to score on a (sub-)thread started by an article with a @code{Message-ID} @var{X}, then you add a
13330 @samp{thread} match.  This will add a new @samp{thread} match for each
13331 article that has @var{X} in its @code{References} header.  (These new
13332 @samp{thread} matches will use the @code{Message-ID}s of these matching
13333 articles.)  This will ensure that you can raise/lower the score of an
13334 entire thread, even though some articles in the thread may not have
13335 complete @code{References} headers.  Note that using this may lead to
13336 undeterministic scores of the articles in the thread.  (Using this match
13337 key will lead to creation of @file{ADAPT} files.)
13338 @end table
13339 @end enumerate
13340
13341 @cindex Score File Atoms
13342 @item mark
13343 The value of this entry should be a number.  Any articles with a score
13344 lower than this number will be marked as read.
13345
13346 @item expunge
13347 The value of this entry should be a number.  Any articles with a score
13348 lower than this number will be removed from the summary buffer.
13349
13350 @item mark-and-expunge
13351 The value of this entry should be a number.  Any articles with a score
13352 lower than this number will be marked as read and removed from the
13353 summary buffer.
13354
13355 @item thread-mark-and-expunge
13356 The value of this entry should be a number.  All articles that belong to
13357 a thread that has a total score below this number will be marked as read
13358 and removed from the summary buffer.  @code{gnus-thread-score-function}
13359 says how to compute the total score for a thread.
13360
13361 @item files
13362 The value of this entry should be any number of file names.  These files
13363 are assumed to be score files as well, and will be loaded the same way
13364 this one was.
13365
13366 @item exclude-files
13367 The clue of this entry should be any number of files.  These files will
13368 not be loaded, even though they would normally be so, for some reason or
13369 other.
13370
13371 @item eval
13372 The value of this entry will be @code{eval}el.  This element will be
13373 ignored when handling global score files.
13374
13375 @item read-only
13376 Read-only score files will not be updated or saved.  Global score files
13377 should feature this atom (@pxref{Global Score Files}).  (Note:
13378 @dfn{Global} here really means @dfn{global}; not your personal
13379 apply-to-all-groups score files.)
13380
13381 @item orphan
13382 The value of this entry should be a number.  Articles that do not have
13383 parents will get this number added to their scores.  Imagine you follow
13384 some high-volume newsgroup, like @samp{comp.lang.c}.  Most likely you
13385 will only follow a few of the threads, also want to see any new threads.
13386
13387 You can do this with the following two score file entries:
13388
13389 @example
13390         (orphan -500)
13391         (mark-and-expunge -100)
13392 @end example
13393
13394 When you enter the group the first time, you will only see the new
13395 threads.  You then raise the score of the threads that you find
13396 interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
13397 rest.  Next time you enter the group, you will see new articles in the
13398 interesting threads, plus any new threads.
13399
13400 I.e.---the orphan score atom is for high-volume groups where there
13401 exist a few interesting threads which can't be found automatically by
13402 ordinary scoring rules.
13403
13404 @item adapt
13405 This entry controls the adaptive scoring.  If it is @code{t}, the
13406 default adaptive scoring rules will be used.  If it is @code{ignore}, no
13407 adaptive scoring will be performed on this group.  If it is a list, this
13408 list will be used as the adaptive scoring rules.  If it isn't present,
13409 or is something other than @code{t} or @code{ignore}, the default
13410 adaptive scoring rules will be used.  If you want to use adaptive
13411 scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
13412 @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
13413 not want adaptive scoring.  If you only want adaptive scoring in a few
13414 groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
13415 insert @code{(adapt t)} in the score files of the groups where you want
13416 it.
13417
13418 @item adapt-file
13419 All adaptive score entries will go to the file named by this entry.  It
13420 will also be applied when entering the group.  This atom might be handy
13421 if you want to adapt on several groups at once, using the same adaptive
13422 file for a number of groups.
13423
13424 @item local
13425 @cindex local variables
13426 The value of this entry should be a list of @code{(VAR VALUE)} pairs.
13427 Each @var{var} will be made buffer-local to the current summary buffer,
13428 and set to the value specified.  This is a convenient, if somewhat
13429 strange, way of setting variables in some groups if you don't like hooks
13430 much.  Note that the @var{value} won't be evaluated.
13431 @end table
13432
13433
13434 @node Score File Editing
13435 @section Score File Editing
13436
13437 You normally enter all scoring commands from the summary buffer, but you
13438 might feel the urge to edit them by hand as well, so we've supplied you
13439 with a mode for that.
13440
13441 It's simply a slightly customized @code{emacs-lisp} mode, with these
13442 additional commands:
13443
13444 @table @kbd
13445
13446 @item C-c C-c
13447 @kindex C-c C-c (Score)
13448 @findex gnus-score-edit-done
13449 Save the changes you have made and return to the summary buffer
13450 (@code{gnus-score-edit-done}).
13451
13452 @item C-c C-d
13453 @kindex C-c C-d (Score)
13454 @findex gnus-score-edit-insert-date
13455 Insert the current date in numerical format
13456 (@code{gnus-score-edit-insert-date}).  This is really the day number, if
13457 you were wondering.
13458
13459 @item C-c C-p
13460 @kindex C-c C-p (Score)
13461 @findex gnus-score-pretty-print
13462 The adaptive score files are saved in an unformatted fashion.  If you
13463 intend to read one of these files, you want to @dfn{pretty print} it
13464 first.  This command (@code{gnus-score-pretty-print}) does that for
13465 you.
13466
13467 @end table
13468
13469 Type @kbd{M-x gnus-score-mode} to use this mode.
13470
13471 @vindex gnus-score-mode-hook
13472 @code{gnus-score-menu-hook} is run in score mode buffers.
13473
13474 In the summary buffer you can use commands like @kbd{V f} and @kbd{V
13475 e} to begin editing score files.
13476
13477
13478 @node Adaptive Scoring
13479 @section Adaptive Scoring
13480 @cindex adaptive scoring
13481
13482 If all this scoring is getting you down, Gnus has a way of making it all
13483 happen automatically---as if by magic.  Or rather, as if by artificial
13484 stupidity, to be precise.
13485
13486 @vindex gnus-use-adaptive-scoring
13487 When you read an article, or mark an article as read, or kill an
13488 article, you leave marks behind.  On exit from the group, Gnus can sniff
13489 these marks and add score elements depending on what marks it finds.
13490 You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
13491 @code{t} or @code{(line)}.  If you want score adaptively on separate
13492 words appearing in the subjects, you should set this variable to
13493 @code{(word)}.  If you want to use both adaptive methods, set this
13494 variable to @code{(word line)}.
13495
13496 @vindex gnus-default-adaptive-score-alist
13497 To give you complete control over the scoring process, you can customize
13498 the @code{gnus-default-adaptive-score-alist} variable.  For instance, it
13499 might look something like this:
13500
13501 @lisp
13502 (defvar gnus-default-adaptive-score-alist
13503   '((gnus-unread-mark)
13504     (gnus-ticked-mark (from 4))
13505     (gnus-dormant-mark (from 5))
13506     (gnus-del-mark (from -4) (subject -1))
13507     (gnus-read-mark (from 4) (subject 2))
13508     (gnus-expirable-mark (from -1) (subject -1))
13509     (gnus-killed-mark (from -1) (subject -3))
13510     (gnus-kill-file-mark)
13511     (gnus-ancient-mark)
13512     (gnus-low-score-mark)
13513     (gnus-catchup-mark (from -1) (subject -1))))
13514 @end lisp
13515
13516 As you see, each element in this alist has a mark as a key (either a
13517 variable name or a ``real'' mark---a character).  Following this key is
13518 a arbitrary number of header/score pairs.  If there are no header/score
13519 pairs following the key, no adaptive scoring will be done on articles
13520 that have that key as the article mark.  For instance, articles with
13521 @code{gnus-unread-mark} in the example above will not get adaptive score
13522 entries.
13523
13524 Each article can have only one mark, so just a single of these rules
13525 will be applied to each article.
13526
13527 To take @code{gnus-del-mark} as an example---this alist says that all
13528 articles that have that mark (i.e., are marked with @samp{D}) will have a
13529 score entry added to lower based on the @code{From} header by -4, and
13530 lowered by @code{Subject} by -1.  Change this to fit your prejudices.
13531
13532 If you have marked 10 articles with the same subject with
13533 @code{gnus-del-mark}, the rule for that mark will be applied ten times.
13534 That means that that subject will get a score of ten times -1, which
13535 should be, unless I'm much mistaken, -10.
13536
13537 If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
13538 the read articles will be marked with the @samp{E} mark.  This'll
13539 probably make adaptive scoring slightly impossible, so auto-expiring and
13540 adaptive scoring doesn't really mix very well.
13541
13542 The headers you can score on are @code{from}, @code{subject},
13543 @code{message-id}, @code{references}, @code{xref}, @code{lines},
13544 @code{chars} and @code{date}.  In addition, you can score on
13545 @code{followup}, which will create an adaptive score entry that matches
13546 on the @code{References} header using the @code{Message-ID} of the
13547 current article, thereby matching the following thread.
13548
13549 You can also score on @code{thread}, which will try to score all
13550 articles that appear in a thread.  @code{thread} matches uses a
13551 @code{Message-ID} to match on the @code{References} header of the
13552 article.  If the match is made, the @code{Message-ID} of the article is
13553 added to the @code{thread} rule.  (Think about it.  I'd recommend two
13554 aspirins afterwards.)
13555
13556 If you use this scheme, you should set the score file atom @code{mark}
13557 to something small---like -300, perhaps, to avoid having small random
13558 changes result in articles getting marked as read.
13559
13560 After using adaptive scoring for a week or so, Gnus should start to
13561 become properly trained and enhance the authors you like best, and kill
13562 the authors you like least, without you having to say so explicitly.
13563
13564 You can control what groups the adaptive scoring is to be performed on
13565 by using the score files (@pxref{Score File Format}).  This will also
13566 let you use different rules in different groups.
13567
13568 @vindex gnus-adaptive-file-suffix
13569 The adaptive score entries will be put into a file where the name is the
13570 group name with @code{gnus-adaptive-file-suffix} appended.  The default
13571 is @samp{ADAPT}.
13572
13573 @vindex gnus-score-exact-adapt-limit
13574 When doing adaptive scoring, substring or fuzzy matching would probably
13575 give you the best results in most cases.  However, if the header one
13576 matches is short, the possibility for false positives is great, so if
13577 the length of the match is less than
13578 @code{gnus-score-exact-adapt-limit}, exact matching will be used.  If
13579 this variable is @code{nil}, exact matching will always be used to avoid
13580 this problem.
13581
13582 @vindex gnus-default-adaptive-word-score-alist
13583 As mentioned above, you can adapt either on individual words or entire
13584 headers.  If you adapt on words, the
13585 @code{gnus-default-adaptive-word-score-alist} variable says what score
13586 each instance of a word should add given a mark.
13587
13588 @lisp
13589 (setq gnus-default-adaptive-word-score-alist
13590       `((,gnus-read-mark . 30)
13591         (,gnus-catchup-mark . -10)
13592         (,gnus-killed-mark . -20)
13593         (,gnus-del-mark . -15)))
13594 @end lisp
13595
13596 This is the default value.  If you have adaption on words enabled, every
13597 word that appears in subjects of articles marked with
13598 @code{gnus-read-mark} will result in a score rule that increase the
13599 score with 30 points.
13600
13601 @vindex gnus-default-ignored-adaptive-words
13602 @vindex gnus-ignored-adaptive-words
13603 Words that appear in the @code{gnus-default-ignored-adaptive-words} list
13604 will be ignored.  If you wish to add more words to be ignored, use the
13605 @code{gnus-ignored-adaptive-words} list instead.
13606
13607 @vindex gnus-adaptive-word-syntax-table
13608 When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
13609 syntax table in effect.  It is similar to the standard syntax table, but
13610 it considers numbers to be non-word-constituent characters.
13611
13612 @vindex gnus-adaptive-word-minimum
13613 If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
13614 word scoring process will never bring down the score of an article to
13615 below this number.  The default is @code{nil}.
13616
13617 @vindex gnus-adaptive-word-no-group-words
13618 If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
13619 won't adaptively word score any of the words in the group name.  Useful
13620 for groups like @samp{comp.editors.emacs}, where most of the subject
13621 lines contain the word @samp{emacs}.
13622
13623 After using this scheme for a while, it might be nice to write a
13624 @code{gnus-psychoanalyze-user} command to go through the rules and see
13625 what words you like and what words you don't like.  Or perhaps not.
13626
13627 Note that the adaptive word scoring thing is highly experimental and is
13628 likely to change in the future.  Initial impressions seem to indicate
13629 that it's totally useless as it stands.  Some more work (involving more
13630 rigorous statistical methods) will have to be done to make this useful.
13631
13632
13633 @node Home Score File
13634 @section Home Score File
13635
13636 The score file where new score file entries will go is called the
13637 @dfn{home score file}.  This is normally (and by default) the score file
13638 for the group itself.  For instance, the home score file for
13639 @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
13640
13641 However, this may not be what you want.  It is often convenient to share
13642 a common home score file among many groups---all @samp{emacs} groups
13643 could perhaps use the same home score file.
13644
13645 @vindex gnus-home-score-file
13646 The variable that controls this is @code{gnus-home-score-file}.  It can
13647 be:
13648
13649 @enumerate
13650 @item
13651 A string.  Then this file will be used as the home score file for all
13652 groups.
13653
13654 @item
13655 A function. The result of this function will be used as the home score
13656 file.  The function will be called with the name of the group as the
13657 parameter.
13658
13659 @item
13660 A list.  The elements in this list can be:
13661
13662 @enumerate
13663 @item
13664 @var{(regexp file-name)}.  If the @var{regexp} matches the group name,
13665 the @var{file-name} will will be used as the home score file.
13666
13667 @item
13668 A function. If the function returns non-nil, the result will be used as
13669 the home score file.
13670
13671 @item
13672 A string.  Use the string as the home score file.
13673 @end enumerate
13674
13675 The list will be traversed from the beginning towards the end looking
13676 for matches.
13677
13678 @end enumerate
13679
13680 So, if you want to use just a single score file, you could say:
13681
13682 @lisp
13683 (setq gnus-home-score-file
13684       "my-total-score-file.SCORE")
13685 @end lisp
13686
13687 If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
13688 @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
13689
13690 @findex gnus-hierarchial-home-score-file
13691 @lisp
13692 (setq gnus-home-score-file
13693       'gnus-hierarchial-home-score-file)
13694 @end lisp
13695
13696 This is a ready-made function provided for your convenience.
13697 Other functions include
13698
13699 @table @code
13700 @item gnus-current-home-score-file
13701 @findex gnus-current-home-score-file
13702 Return the ``current'' regular score file.  This will make scoring
13703 commands add entry to the ``innermost'' matching score file.
13704
13705 @end table
13706
13707 If you want to have one score file for the @samp{emacs} groups and
13708 another for the @samp{comp} groups, while letting all other groups use
13709 their own home score files:
13710
13711 @lisp
13712 (setq gnus-home-score-file
13713       ;; All groups that match the regexp "\\.emacs"
13714       '(("\\.emacs" "emacs.SCORE")
13715         ;; All the comp groups in one score file
13716         ("^comp" "comp.SCORE")))
13717 @end lisp
13718
13719 @vindex gnus-home-adapt-file
13720 @code{gnus-home-adapt-file} works exactly the same way as
13721 @code{gnus-home-score-file}, but says what the home adaptive score file
13722 is instead.  All new adaptive file entries will go into the file
13723 specified by this variable, and the same syntax is allowed.
13724
13725 In addition to using @code{gnus-home-score-file} and
13726 @code{gnus-home-adapt-file}, you can also use group parameters
13727 (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
13728 Parameters}) to achieve much the same.  Group and topic parameters take
13729 precedence over this variable.
13730
13731
13732 @node Followups To Yourself
13733 @section Followups To Yourself
13734
13735 Gnus offers two commands for picking out the @code{Message-ID} header in
13736 the current buffer.  Gnus will then add a score rule that scores using
13737 this @code{Message-ID} on the @code{References} header of other
13738 articles.  This will, in effect, increase the score of all articles that
13739 respond to the article in the current buffer.  Quite useful if you want
13740 to easily note when people answer what you've said.
13741
13742 @table @code
13743
13744 @item gnus-score-followup-article
13745 @findex gnus-score-followup-article
13746 This will add a score to articles that directly follow up your own
13747 article.
13748
13749 @item gnus-score-followup-thread
13750 @findex gnus-score-followup-thread
13751 This will add a score to all articles that appear in a thread ``below''
13752 your own article.
13753 @end table
13754
13755 @vindex message-sent-hook
13756 These two functions are both primarily meant to be used in hooks like
13757 @code{message-sent-hook}.
13758
13759 If you look closely at your own @code{Message-ID}, you'll notice that
13760 the first two or three characters are always the same.  Here's two of
13761 mine:
13762
13763 @example
13764 <x6u3u47icf.fsf@@eyesore.no>
13765 <x6sp9o7ibw.fsf@@eyesore.no>
13766 @end example
13767
13768 So ``my'' ident on this machine is @samp{x6}.  This can be
13769 exploited---the following rule will raise the score on all followups to
13770 myself:
13771
13772 @lisp
13773 ("references"
13774  ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore.no>"
13775   1000 nil r))
13776 @end lisp
13777
13778 Whether it's the first two or first three characters that are ``yours''
13779 is system-dependent.
13780
13781
13782 @node Scoring Tips
13783 @section Scoring Tips
13784 @cindex scoring tips
13785
13786 @table @dfn
13787
13788 @item Crossposts
13789 @cindex crossposts
13790 @cindex scoring crossposts
13791 If you want to lower the score of crossposts, the line to match on is
13792 the @code{Xref} header.
13793 @lisp
13794 ("xref" (" talk.politics.misc:" -1000))
13795 @end lisp
13796
13797 @item Multiple crossposts
13798 If you want to lower the score of articles that have been crossposted to
13799 more than, say, 3 groups:
13800 @lisp
13801 ("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r))
13802 @end lisp
13803
13804 @item Matching on the body
13805 This is generally not a very good idea---it takes a very long time.
13806 Gnus actually has to fetch each individual article from the server.  But
13807 you might want to anyway, I guess.  Even though there are three match
13808 keys (@code{Head}, @code{Body} and @code{All}), you should choose one
13809 and stick with it in each score file.  If you use any two, each article
13810 will be fetched @emph{twice}.  If you want to match a bit on the
13811 @code{Head} and a bit on the @code{Body}, just use @code{All} for all
13812 the matches.
13813
13814 @item Marking as read
13815 You will probably want to mark articles that has a score below a certain
13816 number as read.  This is most easily achieved by putting the following
13817 in your @file{all.SCORE} file:
13818 @lisp
13819 ((mark -100))
13820 @end lisp
13821 You may also consider doing something similar with @code{expunge}.
13822
13823 @item Negated character classes
13824 If you say stuff like @code{[^abcd]*}, you may get unexpected results.
13825 That will match newlines, which might lead to, well, The Unknown.  Say
13826 @code{[^abcd\n]*} instead.
13827 @end table
13828
13829
13830 @node Reverse Scoring
13831 @section Reverse Scoring
13832 @cindex reverse scoring
13833
13834 If you want to keep just articles that have @samp{Sex with Emacs} in the
13835 subject header, and expunge all other articles, you could put something
13836 like this in your score file:
13837
13838 @lisp
13839 (("subject"
13840   ("Sex with Emacs" 2))
13841  (mark 1)
13842  (expunge 1))
13843 @end lisp
13844
13845 So, you raise all articles that match @samp{Sex with Emacs} and mark the
13846 rest as read, and expunge them to boot.
13847
13848
13849 @node Global Score Files
13850 @section Global Score Files
13851 @cindex global score files
13852
13853 Sure, other newsreaders have ``global kill files''.  These are usually
13854 nothing more than a single kill file that applies to all groups, stored
13855 in the user's home directory.  Bah!  Puny, weak newsreaders!
13856
13857 What I'm talking about here are Global Score Files.  Score files from
13858 all over the world, from users everywhere, uniting all nations in one
13859 big, happy score file union!  Ange-score!  New and untested!
13860
13861 @vindex gnus-global-score-files
13862 All you have to do to use other people's score files is to set the
13863 @code{gnus-global-score-files} variable.  One entry for each score file,
13864 or each score file directory.  Gnus will decide by itself what score
13865 files are applicable to which group.
13866
13867 Say you want to use the score file
13868 @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
13869 all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory:
13870
13871 @lisp
13872 (setq gnus-global-score-files
13873       '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
13874         "/ftp@@ftp.some-where:/pub/score/"))
13875 @end lisp
13876
13877 @findex gnus-score-search-global-directories
13878 Simple, eh?  Directory names must end with a @samp{/}.  These
13879 directories are typically scanned only once during each Gnus session.
13880 If you feel the need to manually re-scan the remote directories, you can
13881 use the @code{gnus-score-search-global-directories} command.
13882
13883 Note that, at present, using this option will slow down group entry
13884 somewhat.  (That is---a lot.)
13885
13886 If you want to start maintaining score files for other people to use,
13887 just put your score file up for anonymous ftp and announce it to the
13888 world.  Become a retro-moderator!  Participate in the retro-moderator
13889 wars sure to ensue, where retro-moderators battle it out for the
13890 sympathy of the people, luring them to use their score files on false
13891 premises!  Yay!  The net is saved!
13892
13893 Here are some tips for the would-be retro-moderator, off the top of my
13894 head:
13895
13896 @itemize @bullet
13897
13898 @item
13899 Articles heavily crossposted are probably junk.
13900 @item
13901 To lower a single inappropriate article, lower by @code{Message-ID}.
13902 @item
13903 Particularly brilliant authors can be raised on a permanent basis.
13904 @item
13905 Authors that repeatedly post off-charter for the group can safely be
13906 lowered out of existence.
13907 @item
13908 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
13909 articles completely.
13910
13911 @item
13912 Use expiring score entries to keep the size of the file down.  You
13913 should probably have a long expiry period, though, as some sites keep
13914 old articles for a long time.
13915 @end itemize
13916
13917 ... I wonder whether other newsreaders will support global score files
13918 in the future.  @emph{Snicker}.  Yup, any day now, newsreaders like Blue
13919 Wave, xrn and 1stReader are bound to implement scoring.  Should we start
13920 holding our breath yet?
13921
13922
13923 @node Kill Files
13924 @section Kill Files
13925 @cindex kill files
13926
13927 Gnus still supports those pesky old kill files.  In fact, the kill file
13928 entries can now be expiring, which is something I wrote before Daniel
13929 Quinlan thought of doing score files, so I've left the code in there.
13930
13931 In short, kill processing is a lot slower (and I do mean @emph{a lot})
13932 than score processing, so it might be a good idea to rewrite your kill
13933 files into score files.
13934
13935 Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
13936 forms into this file, which means that you can use kill files as some
13937 sort of primitive hook function to be run on group entry, even though
13938 that isn't a very good idea.
13939
13940 Normal kill files look like this:
13941
13942 @lisp
13943 (gnus-kill "From" "Lars Ingebrigtsen")
13944 (gnus-kill "Subject" "ding")
13945 (gnus-expunge "X")
13946 @end lisp
13947
13948 This will mark every article written by me as read, and remove the
13949 marked articles from the summary buffer.  Very useful, you'll agree.
13950
13951 Other programs use a totally different kill file syntax.  If Gnus
13952 encounters what looks like a @code{rn} kill file, it will take a stab at
13953 interpreting it.
13954
13955 Two summary functions for editing a GNUS kill file:
13956
13957 @table @kbd
13958
13959 @item M-k
13960 @kindex M-k (Summary)
13961 @findex gnus-summary-edit-local-kill
13962 Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
13963
13964 @item M-K
13965 @kindex M-K (Summary)
13966 @findex gnus-summary-edit-global-kill
13967 Edit the general kill file (@code{gnus-summary-edit-global-kill}).
13968 @end table
13969
13970 Two group mode functions for editing the kill files:
13971
13972 @table @kbd
13973
13974 @item M-k
13975 @kindex M-k (Group)
13976 @findex gnus-group-edit-local-kill
13977 Edit this group's kill file (@code{gnus-group-edit-local-kill}).
13978
13979 @item M-K
13980 @kindex M-K (Group)
13981 @findex gnus-group-edit-global-kill
13982 Edit the general kill file (@code{gnus-group-edit-global-kill}).
13983 @end table
13984
13985 Kill file variables:
13986
13987 @table @code
13988 @item gnus-kill-file-name
13989 @vindex gnus-kill-file-name
13990 A kill file for the group @samp{soc.motss} is normally called
13991 @file{soc.motss.KILL}.  The suffix appended to the group name to get
13992 this file name is detailed by the @code{gnus-kill-file-name} variable.
13993 The ``global'' kill file (not in the score file sense of ``global'', of
13994 course) is just called @file{KILL}.
13995
13996 @vindex gnus-kill-save-kill-file
13997 @item gnus-kill-save-kill-file
13998 If this variable is non-@code{nil}, Gnus will save the
13999 kill file after processing, which is necessary if you use expiring
14000 kills.
14001
14002 @item gnus-apply-kill-hook
14003 @vindex gnus-apply-kill-hook
14004 @findex gnus-apply-kill-file-unless-scored
14005 @findex gnus-apply-kill-file
14006 A hook called to apply kill files to a group.  It is
14007 @code{(gnus-apply-kill-file)} by default.  If you want to ignore the
14008 kill file if you have a score file for the same group, you can set this
14009 hook to @code{(gnus-apply-kill-file-unless-scored)}.  If you don't want
14010 kill files to be processed, you should set this variable to @code{nil}.
14011
14012 @item gnus-kill-file-mode-hook
14013 @vindex gnus-kill-file-mode-hook
14014 A hook called in kill-file mode buffers.
14015
14016 @end table
14017
14018
14019 @node Converting Kill Files
14020 @section Converting Kill Files
14021 @cindex kill files
14022 @cindex converting kill files
14023
14024 If you have loads of old kill files, you may want to convert them into
14025 score files.  If they are ``regular'', you can use
14026 the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
14027 by hand.
14028
14029 The kill to score conversion package isn't included in Gnus by default.
14030 You can fetch it from
14031 @file{http://www.stud.ifi.uio.no/~larsi/ding-other/gnus-kill-to-score}.
14032
14033 If your old kill files are very complex---if they contain more
14034 non-@code{gnus-kill} forms than not, you'll have to convert them by
14035 hand.  Or just let them be as they are.  Gnus will still use them as
14036 before.
14037
14038
14039 @node GroupLens
14040 @section GroupLens
14041 @cindex GroupLens
14042
14043 GroupLens is a collaborative filtering system that helps you work
14044 together with other people to find the quality news articles out of the
14045 huge volume of news articles generated every day.
14046
14047 To accomplish this the GroupLens system combines your opinions about
14048 articles you have already read with the opinions of others who have done
14049 likewise and gives you a personalized prediction for each unread news
14050 article.  Think of GroupLens as a matchmaker.  GroupLens watches how you
14051 rate articles, and finds other people that rate articles the same way.
14052 Once it has found some people you agree with it tells you, in the form
14053 of a prediction, what they thought of the article.  You can use this
14054 prediction to help you decide whether or not you want to read the
14055 article.
14056
14057 @menu
14058 * Using GroupLens::          How to make Gnus use GroupLens.
14059 * Rating Articles::          Letting GroupLens know how you rate articles.
14060 * Displaying Predictions::   Displaying predictions given by GroupLens.
14061 * GroupLens Variables::      Customizing GroupLens.
14062 @end menu
14063
14064
14065 @node Using GroupLens
14066 @subsection Using GroupLens
14067
14068 To use GroupLens you must register a pseudonym with your local Better
14069 Bit Bureau (BBB).
14070 @samp{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only
14071 better bit in town at the moment.
14072
14073 Once you have registered you'll need to set a couple of variables.
14074
14075 @table @code
14076
14077 @item gnus-use-grouplens
14078 @vindex gnus-use-grouplens
14079 Setting this variable to a non-@code{nil} value will make Gnus hook into
14080 all the relevant GroupLens functions.
14081
14082 @item grouplens-pseudonym
14083 @vindex grouplens-pseudonym
14084 This variable should be set to the pseudonym you got when registering
14085 with the Better Bit Bureau.
14086
14087 @item grouplens-newsgroups
14088 @vindex grouplens-newsgroups
14089 A list of groups that you want to get GroupLens predictions for.
14090
14091 @end table
14092
14093 That's the minimum of what you need to get up and running with GroupLens.
14094 Once you've registered, GroupLens will start giving you scores for
14095 articles based on the average of what other people think.  But, to get
14096 the real benefit of GroupLens you need to start rating articles
14097 yourself.  Then the scores GroupLens gives you will be personalized for
14098 you, based on how the people you usually agree with have already rated.
14099
14100
14101 @node Rating Articles
14102 @subsection Rating Articles
14103
14104 In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
14105 Where 1 means something like this article is a waste of bandwidth and 5
14106 means that the article was really good.  The basic question to ask
14107 yourself is, "on a scale from 1 to 5 would I like to see more articles
14108 like this one?"
14109
14110 There are four ways to enter a rating for an article in GroupLens.
14111
14112 @table @kbd
14113
14114 @item r
14115 @kindex r (GroupLens)
14116 @findex bbb-summary-rate-article
14117 This function will prompt you for a rating on a scale of one to five.
14118
14119 @item k
14120 @kindex k (GroupLens)
14121 @findex grouplens-score-thread
14122 This function will prompt you for a rating, and rate all the articles in
14123 the thread.  This is really useful for some of those long running giant
14124 threads in rec.humor.
14125
14126 @end table
14127
14128 The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
14129 the score of the article you're reading.
14130
14131 @table @kbd
14132
14133 @item 1-5 n
14134 @kindex n (GroupLens)
14135 @findex grouplens-next-unread-article
14136 Rate the article and go to the next unread article.
14137
14138 @item 1-5 ,
14139 @kindex , (GroupLens)
14140 @findex grouplens-best-unread-article
14141 Rate the article and go to the next unread article with the highest score.
14142
14143 @end table
14144
14145 If you want to give the current article a score of 4 and then go to the
14146 next article, just type @kbd{4 n}.
14147
14148
14149 @node Displaying Predictions
14150 @subsection Displaying Predictions
14151
14152 GroupLens makes a prediction for you about how much you will like a
14153 news article.  The predictions from GroupLens are on a scale from 1 to
14154 5, where 1 is the worst and 5 is the best.  You can use the predictions
14155 from GroupLens in one of three ways controlled by the variable
14156 @code{gnus-grouplens-override-scoring}.
14157
14158 @vindex gnus-grouplens-override-scoring
14159 There are three ways to display predictions in grouplens.  You may
14160 choose to have the GroupLens scores contribute to, or override the
14161 regular gnus scoring mechanism. override is the default; however, some
14162 people prefer to see the Gnus scores plus the grouplens scores.  To get
14163 the separate scoring behavior you need to set
14164 @code{gnus-grouplens-override-scoring} to @code{'separate}.  To have the
14165 GroupLens predictions combined with the grouplens scores set it to
14166 @code{'override} and to combine the scores set
14167 @code{gnus-grouplens-override-scoring} to @code{'combine}.  When you use
14168 the combine option you will also want to set the values for
14169 @code{grouplens-prediction-offset} and
14170 @code{grouplens-score-scale-factor}.
14171
14172 @vindex grouplens-prediction-display
14173 In either case, GroupLens gives you a few choices for how you would like
14174 to see your predictions displayed.  The display of predictions is
14175 controlled by the @code{grouplens-prediction-display} variable.
14176
14177 The following are valid values for that variable.
14178
14179 @table @code
14180 @item prediction-spot
14181 The higher the prediction, the further to the right an @samp{*} is
14182 displayed.
14183
14184 @item confidence-interval
14185 A numeric confidence interval.
14186
14187 @item prediction-bar
14188 The higher the prediction, the longer the bar.
14189
14190 @item confidence-bar
14191 Numerical confidence.
14192
14193 @item confidence-spot
14194 The spot gets bigger with more confidence.
14195
14196 @item prediction-num
14197 Plain-old numeric value.
14198
14199 @item confidence-plus-minus
14200 Prediction +/- confidence.
14201
14202 @end table
14203
14204
14205 @node GroupLens Variables
14206 @subsection GroupLens Variables
14207
14208 @table @code
14209
14210 @item gnus-summary-grouplens-line-format
14211 The summary line format used in GroupLens-enhanced summary buffers.  It
14212 accepts the same specs as the normal summary line format (@pxref{Summary
14213 Buffer Lines}).  The default is @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%)
14214 %s\n}.
14215
14216 @item grouplens-bbb-host
14217 Host running the bbbd server.  @samp{grouplens.cs.umn.edu} is the
14218 default.
14219
14220 @item grouplens-bbb-port
14221 Port of the host running the bbbd server.  The default is 9000.
14222
14223 @item grouplens-score-offset
14224 Offset the prediction by this value.  In other words, subtract the
14225 prediction value by this number to arrive at the effective score.  The
14226 default is 0.
14227
14228 @item grouplens-score-scale-factor
14229 This variable allows the user to magnify the effect of GroupLens scores.
14230 The scale factor is applied after the offset.  The default is 1.
14231
14232 @end table
14233
14234
14235 @node Advanced Scoring
14236 @section Advanced Scoring
14237
14238 Scoring on Subjects and From headers is nice enough, but what if you're
14239 really interested in what a person has to say only when she's talking
14240 about a particular subject?  Or what if you really don't want to
14241 read what person A has to say when she's following up to person B, but
14242 want to read what she says when she's following up to person C?
14243
14244 By using advanced scoring rules you may create arbitrarily complex
14245 scoring patterns.
14246
14247 @menu
14248 * Advanced Scoring Syntax::     A definition.
14249 * Advanced Scoring Examples::   What they look like.
14250 * Advanced Scoring Tips::       Getting the most out of it.
14251 @end menu
14252
14253
14254 @node Advanced Scoring Syntax
14255 @subsection Advanced Scoring Syntax
14256
14257 Ordinary scoring rules have a string as the first element in the rule.
14258 Advanced scoring rules have a list as the first element.  The second
14259 element is the score to be applied if the first element evaluated to a
14260 non-@code{nil} value.
14261
14262 These lists may consist of three logical operators, one redirection
14263 operator, and various match operators.
14264
14265 Logical operators:
14266
14267 @table @code
14268 @item &
14269 @itemx and
14270 This logical operator will evaluate each of its arguments until it finds
14271 one that evaluates to @code{false}, and then it'll stop.  If all arguments
14272 evaluate to @code{true} values, then this operator will return
14273 @code{true}.
14274
14275 @item |
14276 @itemx or
14277 This logical operator will evaluate each of its arguments until it finds
14278 one that evaluates to @code{true}.  If no arguments are @code{true},
14279 then this operator will return @code{false}.
14280
14281 @item !
14282 @itemx not
14283 @itemx Â¬
14284 This logical operator only takes a single argument.  It returns the
14285 logical negation of the value of its argument.
14286
14287 @end table
14288
14289 There is an @dfn{indirection operator} that will make its arguments
14290 apply to the ancestors of the current article being scored.  For
14291 instance, @code{1-} will make score rules apply to the parent of the
14292 current article.  @code{2-} will make score rules apply to the
14293 grandparent of the current article.  Alternatively, you can write
14294 @code{^^}, where the number of @code{^}s (carets) says how far back into
14295 the ancestry you want to go.
14296
14297 Finally, we have the match operators.  These are the ones that do the
14298 real work.  Match operators are header name strings followed by a match
14299 and a match type.  A typical match operator looks like @samp{("from"
14300 "Lars Ingebrigtsen" s)}.  The header names are the same as when using
14301 simple scoring, and the match types are also the same.
14302
14303
14304 @node Advanced Scoring Examples
14305 @subsection Advanced Scoring Examples
14306
14307 Let's say you want to increase the score of articles written by Lars
14308 when he's talking about Gnus:
14309
14310 @example
14311 ((&
14312   ("from" "Lars Ingebrigtsen")
14313   ("subject" "Gnus"))
14314  1000)
14315 @end example
14316
14317 Quite simple, huh?
14318
14319 When he writes long articles, he sometimes has something nice to say:
14320
14321 @example
14322 ((&
14323   ("from" "Lars Ingebrigtsen")
14324   (|
14325    ("subject" "Gnus")
14326    ("lines" 100 >)))
14327  1000)
14328 @end example
14329
14330 However, when he responds to things written by Reig Eigil Logge, you
14331 really don't want to read what he's written:
14332
14333 @example
14334 ((&
14335   ("from" "Lars Ingebrigtsen")
14336   (1- ("from" "Reig Eigir Logge")))
14337  -100000)
14338 @end example
14339
14340 Everybody that follows up Redmondo when he writes about disappearing
14341 socks should have their scores raised, but only when they talk about
14342 white socks.  However, when Lars talks about socks, it's usually not
14343 very interesting:
14344
14345 @example
14346 ((&
14347   (1-
14348    (&
14349     ("from" "redmondo@@.*no" r)
14350     ("body" "disappearing.*socks" t)))
14351   (! ("from" "Lars Ingebrigtsen"))
14352   ("body" "white.*socks"))
14353  1000)
14354 @end example
14355
14356 The possibilities are endless.
14357
14358
14359 @node Advanced Scoring Tips
14360 @subsection Advanced Scoring Tips
14361
14362 The @code{&} and @code{|} logical operators do short-circuit logic.
14363 That is, they stop processing their arguments when it's clear what the
14364 result of the operation will be.  For instance, if one of the arguments
14365 of an @code{&} evaluates to @code{false}, there's no point in evaluating
14366 the rest of the arguments.  This means that you should put slow matches
14367 (@samp{body}, @samp{header}) last and quick matches (@samp{from},
14368 @samp{subject}) first.
14369
14370 The indirection arguments (@code{1-} and so on) will make their
14371 arguments work on previous generations of the thread.  If you say
14372 something like:
14373
14374 @example
14375 ...
14376 (1-
14377  (1-
14378   ("from" "lars")))
14379 ...
14380 @end example
14381
14382 Then that means "score on the from header of the grandparent of the
14383 current article".  An indirection is quite fast, but it's better to say:
14384
14385 @example
14386 (1-
14387  (&
14388   ("from" "Lars")
14389   ("subject" "Gnus")))
14390 @end example
14391
14392 than it is to say:
14393
14394 @example
14395 (&
14396  (1- ("from" "Lars"))
14397  (1- ("subject" "Gnus")))
14398 @end example
14399
14400
14401 @node Score Decays
14402 @section Score Decays
14403 @cindex score decays
14404 @cindex decays
14405
14406 You may find that your scores have a tendency to grow without
14407 bounds, especially if you're using adaptive scoring.  If scores get too
14408 big, they lose all meaning---they simply max out and it's difficult to
14409 use them in any sensible way.
14410
14411 @vindex gnus-decay-scores
14412 @findex gnus-decay-score
14413 @vindex gnus-decay-score-function
14414 Gnus provides a mechanism for decaying scores to help with this problem.
14415 When score files are loaded and @code{gnus-decay-scores} is
14416 non-@code{nil}, Gnus will run the score files through the decaying
14417 mechanism thereby lowering the scores of all non-permanent score rules.
14418 The decay itself if performed by the @code{gnus-decay-score-function}
14419 function, which is @code{gnus-decay-score} by default.  Here's the
14420 definition of that function:
14421
14422 @lisp
14423 (defun gnus-decay-score (score)
14424   "Decay SCORE.
14425 This is done according to `gnus-score-decay-constant'
14426 and `gnus-score-decay-scale'."
14427   (floor
14428    (- score
14429       (* (if (< score 0) 1 -1)
14430          (min (abs score)
14431               (max gnus-score-decay-constant
14432                    (* (abs score)
14433                       gnus-score-decay-scale)))))))
14434 @end lisp
14435
14436 @vindex gnus-score-decay-scale
14437 @vindex gnus-score-decay-constant
14438 @code{gnus-score-decay-constant} is 3 by default and
14439 @code{gnus-score-decay-scale} is 0.05.  This should cause the following:
14440
14441 @enumerate
14442 @item
14443 Scores between -3 and 3 will be set to 0 when this function is called.
14444
14445 @item
14446 Scores with magnitudes between 3 and 60 will be shrunk by 3.
14447
14448 @item
14449 Scores with magnitudes greater than 60 will be shrunk by 5% of the
14450 score.
14451 @end enumerate
14452
14453 If you don't like this decay function, write your own.  It is called
14454 with the score to be decayed as its only parameter, and it should return
14455 the new score, which should be an integer.
14456
14457 Gnus will try to decay scores once a day.  If you haven't run Gnus for
14458 four days, Gnus will decay the scores four times, for instance.
14459
14460
14461 @node Various
14462 @chapter Various
14463
14464 @menu
14465 * Process/Prefix::             A convention used by many treatment commands.
14466 * Interactive::                Making Gnus ask you many questions.
14467 * Symbolic Prefixes::          How to supply some Gnus functions with options.
14468 * Formatting Variables::       You can specify what buffers should look like.
14469 * Windows Configuration::      Configuring the Gnus buffer windows.
14470 * Faces and Fonts::            How to change how faces look.
14471 * Compilation::                How to speed Gnus up.
14472 * Mode Lines::                 Displaying information in the mode lines.
14473 * Highlighting and Menus::     Making buffers look all nice and cozy.
14474 * Buttons::                    Get tendonitis in ten easy steps!
14475 * Daemons::                    Gnus can do things behind your back.
14476 * NoCeM::                      How to avoid spam and other fatty foods.
14477 * Undo::                       Some actions can be undone.
14478 * Moderation::                 What to do if you're a moderator.
14479 * XEmacs Enhancements::        There are more pictures and stuff under XEmacs.
14480 * Fuzzy Matching::             What's the big fuzz?
14481 * Thwarting Email Spam::       A how-to on avoiding unsolicited commercial email.
14482 * Various Various::            Things that are really various.
14483 @end menu
14484
14485
14486 @node Process/Prefix
14487 @section Process/Prefix
14488 @cindex process/prefix convention
14489
14490 Many functions, among them functions for moving, decoding and saving
14491 articles, use what is known as the @dfn{Process/Prefix convention}.
14492
14493 This is a method for figuring out what articles the user wants the
14494 command to be performed on.
14495
14496 It goes like this:
14497
14498 If the numeric prefix is N, perform the operation on the next N
14499 articles, starting with the current one.  If the numeric prefix is
14500 negative, perform the operation on the previous N articles, starting
14501 with the current one.
14502
14503 @vindex transient-mark-mode
14504 If @code{transient-mark-mode} in non-@code{nil} and the region is
14505 active, all articles in the region will be worked upon.
14506
14507 If there is no numeric prefix, but some articles are marked with the
14508 process mark, perform the operation on the articles marked with
14509 the process mark.
14510
14511 If there is neither a numeric prefix nor any articles marked with the
14512 process mark, just perform the operation on the current article.
14513
14514 Quite simple, really, but it needs to be made clear so that surprises
14515 are avoided.
14516
14517 Commands that react to the process mark will push the current list of
14518 process marked articles onto a stack and will then clear all process
14519 marked articles.  You can restore the previous configuration with the
14520 @kbd{M P y} command (@pxref{Setting Process Marks}).
14521
14522 @vindex gnus-summary-goto-unread
14523 One thing that seems to shock & horrify lots of people is that, for
14524 instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
14525 Since each @kbd{d} (which marks the current article as read) by default
14526 goes to the next unread article after marking, this means that @kbd{3 d}
14527 will mark the next three unread articles as read, no matter what the
14528 summary buffer looks like.  Set @code{gnus-summary-goto-unread} to
14529 @code{nil} for a more straightforward action.
14530
14531
14532 @node Interactive
14533 @section Interactive
14534 @cindex interaction
14535
14536 @table @code
14537
14538 @item gnus-novice-user
14539 @vindex gnus-novice-user
14540 If this variable is non-@code{nil}, you are either a newcomer to the
14541 World of Usenet, or you are very cautious, which is a nice thing to be,
14542 really.  You will be given questions of the type ``Are you sure you want
14543 to do this?'' before doing anything dangerous.  This is @code{t} by
14544 default.
14545
14546 @item gnus-expert-user
14547 @vindex gnus-expert-user
14548 If this variable is non-@code{nil}, you will seldom be asked any
14549 questions by Gnus.  It will simply assume you know what you're doing, no
14550 matter how strange.
14551
14552 @item gnus-interactive-catchup
14553 @vindex gnus-interactive-catchup
14554 Require confirmation before catching up a group if non-@code{nil}.  It
14555 is @code{t} by default.
14556
14557 @item gnus-interactive-exit
14558 @vindex gnus-interactive-exit
14559 Require confirmation before exiting Gnus.  This variable is @code{t} by
14560 default.
14561 @end table
14562
14563
14564 @node Symbolic Prefixes
14565 @section Symbolic Prefixes
14566 @cindex symbolic prefixes
14567
14568 Quite a lot of Emacs commands react to the (numeric) prefix.  For
14569 instance, @kbd{C-u 4 C-f} moves point four characters forward, and
14570 @kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
14571 rule of 900 to the current article.
14572
14573 This is all nice and well, but what if you want to give a command some
14574 additional information?  Well, what most commands do is interpret the
14575 ``raw'' prefix in some special way.  @kbd{C-u 0 C-x C-s} means that one
14576 doesn't want a backup file to be created when saving the current buffer,
14577 for instance.  But what if you want to save without making a backup
14578 file, and you want Emacs to flash lights and play a nice tune at the
14579 same time?  You can't, and you're probably perfectly happy that way.
14580
14581 @kindex M-i (Summary)
14582 @findex gnus-symbolic-argument
14583 I'm not, so I've added a second prefix---the @dfn{symbolic prefix}.  The
14584 prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
14585 character typed in is the value.  You can stack as many @kbd{M-i}
14586 prefixes as you want.  @kbd{M-i a M-C-u} means ``feed the @kbd{M-C-u}
14587 command the symbolic prefix @code{a}''.  @kbd{M-i a M-i b M-C-u} means
14588 ``feed the @kbd{M-C-u} command the symbolic prefixes @code{a} and
14589 @code{b}''.  You get the drift.
14590
14591 Typing in symbolic prefixes to commands that don't accept them doesn't
14592 hurt, but it doesn't do any good either.  Currently not many Gnus
14593 functions make use of the symbolic prefix.
14594
14595 If you're interested in how Gnus implements this, @pxref{Extended
14596 Interactive}.
14597
14598
14599 @node Formatting Variables
14600 @section Formatting Variables
14601 @cindex formatting variables
14602
14603 Throughout this manual you've probably noticed lots of variables called
14604 things like @code{gnus-group-line-format} and
14605 @code{gnus-summary-mode-line-format}.  These control how Gnus is to
14606 output lines in the various buffers.  There's quite a lot of them.
14607 Fortunately, they all use the same syntax, so there's not that much to
14608 be annoyed by.
14609
14610 Here's an example format spec (from the group buffer): @samp{%M%S%5y:
14611 %(%g%)\n}.  We see that it is indeed extremely ugly, and that there are
14612 lots of percentages everywhere.
14613
14614 @menu
14615 * Formatting Basics::     A formatting variable is basically a format string.
14616 * Mode Line Formatting::  Some rules about mode line formatting variables.
14617 * Advanced Formatting::   Modifying output in various ways.
14618 * User-Defined Specs::    Having Gnus call your own functions.
14619 * Formatting Fonts::      Making the formatting look colorful and nice.
14620 @end menu
14621
14622 Currently Gnus uses the following formatting variables:
14623 @code{gnus-group-line-format}, @code{gnus-summary-line-format},
14624 @code{gnus-server-line-format}, @code{gnus-topic-line-format},
14625 @code{gnus-group-mode-line-format},
14626 @code{gnus-summary-mode-line-format},
14627 @code{gnus-article-mode-line-format},
14628 @code{gnus-server-mode-line-format}, and
14629 @code{gnus-summary-pick-line-format}.
14630
14631 All these format variables can also be arbitrary elisp forms.  In that
14632 case, they will be @code{eval}ed to insert the required lines.
14633
14634 @kindex M-x gnus-update-format
14635 @findex gnus-update-format
14636 Gnus includes a command to help you while creating your own format
14637 specs.  @kbd{M-x gnus-update-format} will @code{eval} the current form,
14638 update the spec in question and pop you to a buffer where you can
14639 examine the resulting lisp code to be run to generate the line.
14640
14641
14642
14643 @node Formatting Basics
14644 @subsection Formatting Basics
14645
14646 Each @samp{%} element will be replaced by some string or other when the
14647 buffer in question is generated.  @samp{%5y} means ``insert the @samp{y}
14648 spec, and pad with spaces to get a 5-character field''.
14649
14650 As with normal C and Emacs Lisp formatting strings, the numerical
14651 modifier between the @samp{%} and the formatting type character will
14652 @dfn{pad} the output so that it is always at least that long.
14653 @samp{%5y} will make the field always (at least) five characters wide by
14654 padding with spaces to the left.  If you say @samp{%-5y}, it will pad to
14655 the right instead.
14656
14657 You may also wish to limit the length of the field to protect against
14658 particularly wide values.  For that you can say @samp{%4,6y}, which
14659 means that the field will never be more than 6 characters wide and never
14660 less than 4 characters wide.
14661
14662
14663 @node Mode Line Formatting
14664 @subsection Mode Line Formatting
14665
14666 Mode line formatting variables (e.g.,
14667 @code{gnus-summary-mode-line-format}) follow the same rules as other,
14668 buffer line oriented formatting variables (@pxref{Formatting Basics})
14669 with the following two differences:
14670
14671 @enumerate
14672
14673 @item
14674 There must be no newline (@samp{\n}) at the end.
14675
14676 @item
14677 The special @samp{%%b} spec can be used to display the buffer name.
14678 Well, it's no spec at all, really---@samp{%%} is just a way to quote
14679 @samp{%} to allow it to pass through the formatting machinery unmangled,
14680 so that Emacs receives @samp{%b}, which is something the Emacs mode line
14681 display interprets to mean ``show the buffer name''.  For a full list of
14682 mode line specs Emacs understands, see the documentation of the
14683 @code{mode-line-format} variable.
14684
14685 @end enumerate
14686
14687
14688 @node Advanced Formatting
14689 @subsection Advanced Formatting
14690
14691 It is frequently useful to post-process the fields in some way.
14692 Padding, limiting, cutting off parts and suppressing certain values can
14693 be achieved by using @dfn{tilde modifiers}.  A typical tilde spec might
14694 look like @samp{%~(cut 3)~(ignore "0")y}.
14695
14696 These are the valid modifiers:
14697
14698 @table @code
14699 @item pad
14700 @itemx pad-left
14701 Pad the field to the left with spaces until it reaches the required
14702 length.
14703
14704 @item pad-right
14705 Pad the field to the right with spaces until it reaches the required
14706 length.
14707
14708 @item max
14709 @itemx max-left
14710 Cut off characters from the left until it reaches the specified length.
14711
14712 @item max-right
14713 Cut off characters from the right until it reaches the specified
14714 length.
14715
14716 @item cut
14717 @itemx cut-left
14718 Cut off the specified number of characters from the left.
14719
14720 @item cut-right
14721 Cut off the specified number of characters from the right.
14722
14723 @item ignore
14724 Return an empty string if the field is equal to the specified value.
14725
14726 @item form
14727 Use the specified form as the field value when the @samp{@@} spec is
14728 used.
14729 @end table
14730
14731 Let's take an example.  The @samp{%o} spec in the summary mode lines
14732 will return a date in compact ISO8601 format---@samp{19960809T230410}.
14733 This is quite a mouthful, so we want to shave off the century number and
14734 the time, leaving us with a six-character date.  That would be
14735 @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}.  (Cutting is done before
14736 maxing, and we need the padding to ensure that the date is never less
14737 than 6 characters to make it look nice in columns.)
14738
14739 Ignoring is done first; then cutting; then maxing; and then as the very
14740 last operation, padding.
14741
14742 If you use lots of these advanced thingies, you'll find that Gnus gets
14743 quite slow.  This can be helped enormously by running @kbd{M-x
14744 gnus-compile} when you are satisfied with the look of your lines.
14745 @xref{Compilation}.
14746
14747
14748 @node User-Defined Specs
14749 @subsection User-Defined Specs
14750
14751 All the specs allow for inserting user defined specifiers---@samp{u}.
14752 The next character in the format string should be a letter.  Gnus
14753 will call the function @code{gnus-user-format-function-}@samp{X}, where
14754 @samp{X} is the letter following @samp{%u}.  The function will be passed
14755 a single parameter---what the parameter means depends on what buffer
14756 it's being called from.  The function should return a string, which will
14757 be inserted into the buffer just like information from any other
14758 specifier.  This function may also be called with dummy values, so it
14759 should protect against that.
14760
14761 You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
14762 much the same without defining new functions.  Here's an example:
14763 @samp{%~(form (count-lines (point-min) (point)))@@}.  The form
14764 given here will be evaluated to yield the current line number, and then
14765 inserted.
14766
14767
14768 @node Formatting Fonts
14769 @subsection Formatting Fonts
14770
14771 There are specs for highlighting, and these are shared by all the format
14772 variables.  Text inside the @samp{%(} and @samp{%)} specifiers will get
14773 the special @code{mouse-face} property set, which means that it will be
14774 highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
14775 over it.
14776
14777 Text inside the @samp{%@{} and @samp{%@}} specifiers will have their
14778 normal faces set using @code{gnus-face-0}, which is @code{bold} by
14779 default.  If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead,
14780 and so on.  Create as many faces as you wish.  The same goes for the
14781 @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
14782 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
14783
14784 Text inside the @samp{%<} and @samp{%>} specifiers will get the special
14785 @code{balloon-help} property set to @code{gnus-balloon-face-0}. If you say
14786 @samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The
14787 @code{gnus-balloon-face-*} variables should be either strings or
14788 symbols naming functions that return a string. Under @code{balloon-help-mode},
14789 when the mouse passes over text with this property set, a balloon window
14790 will appear and display the string. Please refer to the doc string of
14791 @code{balloon-help-mode} for more information on this.
14792
14793 Here's an alternative recipe for the group buffer:
14794
14795 @lisp
14796 ;; Create three face types.
14797 (setq gnus-face-1 'bold)
14798 (setq gnus-face-3 'italic)
14799
14800 ;; We want the article count to be in
14801 ;; a bold and green face.  So we create
14802 ;; a new face called `my-green-bold'.
14803 (copy-face 'bold 'my-green-bold)
14804 ;; Set the color.
14805 (set-face-foreground 'my-green-bold "ForestGreen")
14806 (setq gnus-face-2 'my-green-bold)
14807
14808 ;; Set the new & fancy format.
14809 (setq gnus-group-line-format
14810       "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
14811 @end lisp
14812
14813 I'm sure you'll be able to use this scheme to create totally unreadable
14814 and extremely vulgar displays.  Have fun!
14815
14816 Note that the @samp{%(} specs (and friends) do not make any sense on the
14817 mode-line variables.
14818
14819
14820 @node Windows Configuration
14821 @section Windows Configuration
14822 @cindex windows configuration
14823
14824 No, there's nothing here about X, so be quiet.
14825
14826 @vindex gnus-use-full-window
14827 If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
14828 other windows and occupy the entire Emacs screen by itself.  It is
14829 @code{t} by default.
14830
14831 Setting this variable to @code{nil} kinda works, but there are
14832 glitches.  Use at your own peril.
14833
14834 @vindex gnus-buffer-configuration
14835 @code{gnus-buffer-configuration} describes how much space each Gnus
14836 buffer should be given.  Here's an excerpt of this variable:
14837
14838 @lisp
14839 ((group (vertical 1.0 (group 1.0 point)
14840                       (if gnus-carpal (group-carpal 4))))
14841  (article (vertical 1.0 (summary 0.25 point)
14842                         (article 1.0))))
14843 @end lisp
14844
14845 This is an alist.  The @dfn{key} is a symbol that names some action or
14846 other.  For instance, when displaying the group buffer, the window
14847 configuration function will use @code{group} as the key.  A full list of
14848 possible names is listed below.
14849
14850 The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
14851 should occupy.  To take the @code{article} split as an example -
14852
14853 @lisp
14854 (article (vertical 1.0 (summary 0.25 point)
14855                        (article 1.0)))
14856 @end lisp
14857
14858 This @dfn{split} says that the summary buffer should occupy 25% of upper
14859 half of the screen, and that it is placed over the article buffer.  As
14860 you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
14861 reaching for that calculator there).  However, the special number
14862 @code{1.0} is used to signal that this buffer should soak up all the
14863 rest of the space available after the rest of the buffers have taken
14864 whatever they need.  There should be only one buffer with the @code{1.0}
14865 size spec per split.
14866
14867 Point will be put in the buffer that has the optional third element
14868 @code{point}.  In a @code{frame} split, the last subsplit having a leaf
14869 split where the tag @code{frame-focus} is a member (i.e. is the third or
14870 fourth element in the list, depending on whether the @code{point} tag is
14871 present) gets focus.
14872
14873 Here's a more complicated example:
14874
14875 @lisp
14876 (article (vertical 1.0 (group 4)
14877                        (summary 0.25 point)
14878                        (if gnus-carpal (summary-carpal 4))
14879                        (article 1.0)))
14880 @end lisp
14881
14882 If the size spec is an integer instead of a floating point number,
14883 then that number will be used to say how many lines a buffer should
14884 occupy, not a percentage.
14885
14886 If the @dfn{split} looks like something that can be @code{eval}ed (to be
14887 precise---if the @code{car} of the split is a function or a subr), this
14888 split will be @code{eval}ed.  If the result is non-@code{nil}, it will
14889 be used as a split.  This means that there will be three buffers if
14890 @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
14891 is non-@code{nil}.
14892
14893 Not complicated enough for you?  Well, try this on for size:
14894
14895 @lisp
14896 (article (horizontal 1.0
14897              (vertical 0.5
14898                  (group 1.0)
14899                  (gnus-carpal 4))
14900              (vertical 1.0
14901                  (summary 0.25 point)
14902                  (summary-carpal 4)
14903                  (article 1.0))))
14904 @end lisp
14905
14906 Whoops.  Two buffers with the mystery 100% tag.  And what's that
14907 @code{horizontal} thingie?
14908
14909 If the first element in one of the split is @code{horizontal}, Gnus will
14910 split the window horizontally, giving you two windows side-by-side.
14911 Inside each of these strips you may carry on all you like in the normal
14912 fashion.  The number following @code{horizontal} says what percentage of
14913 the screen is to be given to this strip.
14914
14915 For each split, there @emph{must} be one element that has the 100% tag.
14916 The splitting is never accurate, and this buffer will eat any leftover
14917 lines from the splits.
14918
14919 To be slightly more formal, here's a definition of what a valid split
14920 may look like:
14921
14922 @example
14923 split       = frame | horizontal | vertical | buffer | form
14924 frame       = "(frame " size *split ")"
14925 horizontal  = "(horizontal " size *split ")"
14926 vertical    = "(vertical " size *split ")"
14927 buffer      = "(" buffer-name " " size *[ "point" ] *[ "frame-focus"] ")"
14928 size        = number | frame-params
14929 buffer-name = group | article | summary ...
14930 @end example
14931
14932 The limitations are that the @code{frame} split can only appear as the
14933 top-level split.  @var{form} should be an Emacs Lisp form that should
14934 return a valid split.  We see that each split is fully recursive, and
14935 may contain any number of @code{vertical} and @code{horizontal} splits.
14936
14937 @vindex gnus-window-min-width
14938 @vindex gnus-window-min-height
14939 @cindex window height
14940 @cindex window width
14941 Finding the right sizes can be a bit complicated.  No window may be less
14942 than @code{gnus-window-min-height} (default 1) characters high, and all
14943 windows must be at least @code{gnus-window-min-width} (default 1)
14944 characters wide.  Gnus will try to enforce this before applying the
14945 splits.  If you want to use the normal Emacs window width/height limit,
14946 you can just set these two variables to @code{nil}.
14947
14948 If you're not familiar with Emacs terminology, @code{horizontal} and
14949 @code{vertical} splits may work the opposite way of what you'd expect.
14950 Windows inside a @code{horizontal} split are shown side-by-side, and
14951 windows within a @code{vertical} split are shown above each other.
14952
14953 @findex gnus-configure-frame
14954 If you want to experiment with window placement, a good tip is to call
14955 @code{gnus-configure-frame} directly with a split.  This is the function
14956 that does all the real work when splitting buffers.  Below is a pretty
14957 nonsensical configuration with 5 windows; two for the group buffer and
14958 three for the article buffer.  (I said it was nonsensical.)  If you
14959 @code{eval} the statement below, you can get an idea of how that would
14960 look straight away, without going through the normal Gnus channels.
14961 Play with it until you're satisfied, and then use
14962 @code{gnus-add-configuration} to add your new creation to the buffer
14963 configuration list.
14964
14965 @lisp
14966 (gnus-configure-frame
14967  '(horizontal 1.0
14968     (vertical 10
14969       (group 1.0)
14970       (article 0.3 point))
14971     (vertical 1.0
14972       (article 1.0)
14973       (horizontal 4
14974         (group 1.0)
14975         (article 10)))))
14976 @end lisp
14977
14978 You might want to have several frames as well.  No prob---just use the
14979 @code{frame} split:
14980
14981 @lisp
14982 (gnus-configure-frame
14983  '(frame 1.0
14984          (vertical 1.0
14985                    (summary 0.25 point frame-focus)
14986                    (article 1.0))
14987          (vertical ((height . 5) (width . 15)
14988                     (user-position . t)
14989                     (left . -1) (top . 1))
14990                    (picon 1.0))))
14991
14992 @end lisp
14993
14994 This split will result in the familiar summary/article window
14995 configuration in the first (or ``main'') frame, while a small additional
14996 frame will be created where picons will be shown.  As you can see,
14997 instead of the normal @code{1.0} top-level spec, each additional split
14998 should have a frame parameter alist as the size spec.
14999 @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
15000 Reference Manual}.  Under XEmacs, a frame property list will be
15001 accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}
15002 is such a plist.
15003 The list of all possible keys for @code{gnus-buffer-configuration} can
15004 be found in its default value.
15005
15006 Note that the @code{message} key is used for both
15007 @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}.  If
15008 it is desirable to distinguish between the two, something like this
15009 might be used:
15010
15011 @lisp
15012 (message (horizontal 1.0
15013                      (vertical 1.0 (message 1.0 point))
15014                      (vertical 0.24
15015                                (if (buffer-live-p gnus-summary-buffer)
15016                                    '(summary 0.5))
15017                                (group 1.0)))))
15018 @end lisp
15019
15020 One common desire for a multiple frame split is to have a separate frame
15021 for composing mail and news while leaving the original frame intact.  To
15022 accomplish that, something like the following can be done:
15023
15024 @lisp
15025 (message (frame 1.0
15026                 (if (not (buffer-live-p gnus-summary-buffer))
15027                     (car (cdr (assoc 'group gnus-buffer-configuration)))
15028                   (car (cdr (assoc 'summary gnus-buffer-configuration))))
15029                 (vertical ((user-position . t) (top . 1) (left . 1)
15030                            (name . "Message"))
15031                           (message 1.0 point))))
15032 @end lisp
15033
15034 @findex gnus-add-configuration
15035 Since the @code{gnus-buffer-configuration} variable is so long and
15036 complicated, there's a function you can use to ease changing the config
15037 of a single setting: @code{gnus-add-configuration}.  If, for instance,
15038 you want to change the @code{article} setting, you could say:
15039
15040 @lisp
15041 (gnus-add-configuration
15042  '(article (vertical 1.0
15043                (group 4)
15044                (summary .25 point)
15045                (article 1.0))))
15046 @end lisp
15047
15048 You'd typically stick these @code{gnus-add-configuration} calls in your
15049 @file{.gnus.el} file or in some startup hook---they should be run after
15050 Gnus has been loaded.
15051
15052 @vindex gnus-always-force-window-configuration
15053 If all windows mentioned in the configuration are already visible, Gnus
15054 won't change the window configuration.  If you always want to force the
15055 ``right'' window configuration, you can set
15056 @code{gnus-always-force-window-configuration} to non-@code{nil}.
15057
15058 If you're using tree displays (@pxref{Tree Display}), and the tree
15059 window is displayed vertically next to another window, you may also want
15060 to fiddle with @code{gnus-tree-minimize-window} to avoid having the
15061 windows resized.
15062
15063
15064 @node Faces and Fonts
15065 @section Faces and Fonts
15066 @cindex faces
15067 @cindex fonts
15068 @cindex colors
15069
15070 Fiddling with fonts and faces used to be very difficult, but these days
15071 it is very simple.  You simply say @kbd{M-x customize-face}, pick out
15072 the face you want to alter, and alter it via the standard Customize
15073 interface.
15074
15075
15076 @node Compilation
15077 @section Compilation
15078 @cindex compilation
15079 @cindex byte-compilation
15080
15081 @findex gnus-compile
15082
15083 Remember all those line format specification variables?
15084 @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
15085 on.  Now, Gnus will of course heed whatever these variables are, but,
15086 unfortunately, changing them will mean a quite significant slow-down.
15087 (The default values of these variables have byte-compiled functions
15088 associated with them, while the user-generated versions do not, of
15089 course.)
15090
15091 To help with this, you can run @kbd{M-x gnus-compile} after you've
15092 fiddled around with the variables and feel that you're (kind of)
15093 satisfied.  This will result in the new specs being byte-compiled, and
15094 you'll get top speed again.  Gnus will save these compiled specs in the
15095 @file{.newsrc.eld} file.  (User-defined functions aren't compiled by
15096 this function, though---you should compile them yourself by sticking
15097 them into the @code{.gnus.el} file and byte-compiling that file.)
15098
15099
15100 @node Mode Lines
15101 @section Mode Lines
15102 @cindex mode lines
15103
15104 @vindex gnus-updated-mode-lines
15105 @code{gnus-updated-mode-lines} says what buffers should keep their mode
15106 lines updated.  It is a list of symbols.  Supported symbols include
15107 @code{group}, @code{article}, @code{summary}, @code{server},
15108 @code{browse}, and @code{tree}.  If the corresponding symbol is present,
15109 Gnus will keep that mode line updated with information that may be
15110 pertinent.  If this variable is @code{nil}, screen refresh may be
15111 quicker.
15112
15113 @cindex display-time
15114
15115 @vindex gnus-mode-non-string-length
15116 By default, Gnus displays information on the current article in the mode
15117 lines of the summary and article buffers.  The information Gnus wishes
15118 to display (e.g. the subject of the article) is often longer than the
15119 mode lines, and therefore have to be cut off at some point.  The
15120 @code{gnus-mode-non-string-length} variable says how long the other
15121 elements on the line is (i.e., the non-info part).  If you put
15122 additional elements on the mode line (e.g. a clock), you should modify
15123 this variable:
15124
15125 @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
15126 @lisp
15127 (add-hook 'display-time-hook
15128           (lambda () (setq gnus-mode-non-string-length
15129                            (+ 21
15130                               (if line-number-mode 5 0)
15131                               (if column-number-mode 4 0)
15132                               (length display-time-string)))))
15133 @end lisp
15134
15135 If this variable is @code{nil} (which is the default), the mode line
15136 strings won't be chopped off, and they won't be padded either.  Note
15137 that the default is unlikely to be desirable, as even the percentage
15138 complete in the buffer may be crowded off the mode line; the user should
15139 configure this variable appropriately for her configuration.
15140
15141
15142 @node Highlighting and Menus
15143 @section Highlighting and Menus
15144 @cindex visual
15145 @cindex highlighting
15146 @cindex menus
15147
15148 @vindex gnus-visual
15149 The @code{gnus-visual} variable controls most of the Gnus-prettifying
15150 aspects.  If @code{nil}, Gnus won't attempt to create menus or use fancy
15151 colors or fonts.  This will also inhibit loading the @file{gnus-vis.el}
15152 file.
15153
15154 This variable can be a list of visual properties that are enabled.  The
15155 following elements are valid, and are all included by default:
15156
15157 @table @code
15158 @item group-highlight
15159 Do highlights in the group buffer.
15160 @item summary-highlight
15161 Do highlights in the summary buffer.
15162 @item article-highlight
15163 Do highlights in the article buffer.
15164 @item highlight
15165 Turn on highlighting in all buffers.
15166 @item group-menu
15167 Create menus in the group buffer.
15168 @item summary-menu
15169 Create menus in the summary buffers.
15170 @item article-menu
15171 Create menus in the article buffer.
15172 @item browse-menu
15173 Create menus in the browse buffer.
15174 @item server-menu
15175 Create menus in the server buffer.
15176 @item score-menu
15177 Create menus in the score buffers.
15178 @item menu
15179 Create menus in all buffers.
15180 @end table
15181
15182 So if you only want highlighting in the article buffer and menus in all
15183 buffers, you could say something like:
15184
15185 @lisp
15186 (setq gnus-visual '(article-highlight menu))
15187 @end lisp
15188
15189 If you want highlighting only and no menus whatsoever, you'd say:
15190
15191 @lisp
15192 (setq gnus-visual '(highlight))
15193 @end lisp
15194
15195 If @code{gnus-visual} is @code{t}, highlighting and menus will be used
15196 in all Gnus buffers.
15197
15198 Other general variables that influence the look of all buffers include:
15199
15200 @table @code
15201 @item gnus-mouse-face
15202 @vindex gnus-mouse-face
15203 This is the face (i.e., font) used for mouse highlighting in Gnus.  No
15204 mouse highlights will be done if @code{gnus-visual} is @code{nil}.
15205
15206 @end table
15207
15208 There are hooks associated with the creation of all the different menus:
15209
15210 @table @code
15211
15212 @item gnus-article-menu-hook
15213 @vindex gnus-article-menu-hook
15214 Hook called after creating the article mode menu.
15215
15216 @item gnus-group-menu-hook
15217 @vindex gnus-group-menu-hook
15218 Hook called after creating the group mode menu.
15219
15220 @item gnus-summary-menu-hook
15221 @vindex gnus-summary-menu-hook
15222 Hook called after creating the summary mode menu.
15223
15224 @item gnus-server-menu-hook
15225 @vindex gnus-server-menu-hook
15226 Hook called after creating the server mode menu.
15227
15228 @item gnus-browse-menu-hook
15229 @vindex gnus-browse-menu-hook
15230 Hook called after creating the browse mode menu.
15231
15232 @item gnus-score-menu-hook
15233 @vindex gnus-score-menu-hook
15234 Hook called after creating the score mode menu.
15235
15236 @end table
15237
15238
15239 @node Buttons
15240 @section Buttons
15241 @cindex buttons
15242 @cindex mouse
15243 @cindex click
15244
15245 Those new-fangled @dfn{mouse} contraptions is very popular with the
15246 young, hep kids who don't want to learn the proper way to do things
15247 these days.  Why, I remember way back in the summer of '89, when I was
15248 using Emacs on a Tops 20 system.  Three hundred users on one single
15249 machine, and every user was running Simula compilers.  Bah!
15250
15251 Right.
15252
15253 @vindex gnus-carpal
15254 Well, you can make Gnus display bufferfuls of buttons you can click to
15255 do anything by setting @code{gnus-carpal} to @code{t}.  Pretty simple,
15256 really.  Tell the chiropractor I sent you.
15257
15258
15259 @table @code
15260
15261 @item gnus-carpal-mode-hook
15262 @vindex gnus-carpal-mode-hook
15263 Hook run in all carpal mode buffers.
15264
15265 @item gnus-carpal-button-face
15266 @vindex gnus-carpal-button-face
15267 Face used on buttons.
15268
15269 @item gnus-carpal-header-face
15270 @vindex gnus-carpal-header-face
15271 Face used on carpal buffer headers.
15272
15273 @item gnus-carpal-group-buffer-buttons
15274 @vindex gnus-carpal-group-buffer-buttons
15275 Buttons in the group buffer.
15276
15277 @item gnus-carpal-summary-buffer-buttons
15278 @vindex gnus-carpal-summary-buffer-buttons
15279 Buttons in the summary buffer.
15280
15281 @item gnus-carpal-server-buffer-buttons
15282 @vindex gnus-carpal-server-buffer-buttons
15283 Buttons in the server buffer.
15284
15285 @item gnus-carpal-browse-buffer-buttons
15286 @vindex gnus-carpal-browse-buffer-buttons
15287 Buttons in the browse buffer.
15288 @end table
15289
15290 All the @code{buttons} variables are lists.  The elements in these list
15291 are either cons cells where the @code{car} contains a text to be displayed and
15292 the @code{cdr} contains a function symbol, or a simple string.
15293
15294
15295 @node Daemons
15296 @section Daemons
15297 @cindex demons
15298 @cindex daemons
15299
15300 Gnus, being larger than any program ever written (allegedly), does lots
15301 of strange stuff that you may wish to have done while you're not
15302 present.  For instance, you may want it to check for new mail once in a
15303 while.  Or you may want it to close down all connections to all servers
15304 when you leave Emacs idle.  And stuff like that.
15305
15306 Gnus will let you do stuff like that by defining various
15307 @dfn{handlers}.  Each handler consists of three elements:  A
15308 @var{function}, a @var{time}, and an @var{idle} parameter.
15309
15310 Here's an example of a handler that closes connections when Emacs has
15311 been idle for thirty minutes:
15312
15313 @lisp
15314 (gnus-demon-close-connections nil 30)
15315 @end lisp
15316
15317 Here's a handler that scans for PGP headers every hour when Emacs is
15318 idle:
15319
15320 @lisp
15321 (gnus-demon-scan-pgp 60 t)
15322 @end lisp
15323
15324 This @var{time} parameter and than @var{idle} parameter work together
15325 in a strange, but wonderful fashion.  Basically, if @var{idle} is
15326 @code{nil}, then the function will be called every @var{time} minutes.
15327
15328 If @var{idle} is @code{t}, then the function will be called after
15329 @var{time} minutes only if Emacs is idle.  So if Emacs is never idle,
15330 the function will never be called.  But once Emacs goes idle, the
15331 function will be called every @var{time} minutes.
15332
15333 If @var{idle} is a number and @var{time} is a number, the function will
15334 be called every @var{time} minutes only when Emacs has been idle for
15335 @var{idle} minutes.
15336
15337 If @var{idle} is a number and @var{time} is @code{nil}, the function
15338 will be called once every time Emacs has been idle for @var{idle}
15339 minutes.
15340
15341 And if @var{time} is a string, it should look like @samp{07:31}, and
15342 the function will then be called once every day somewhere near that
15343 time.  Modified by the @var{idle} parameter, of course.
15344
15345 @vindex gnus-demon-timestep
15346 (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
15347 seconds.  This is 60 by default.  If you change that variable,
15348 all the timings in the handlers will be affected.)
15349
15350 So, if you want to add a handler, you could put something like this in
15351 your @file{.gnus} file:
15352
15353 @findex gnus-demon-add-handler
15354 @lisp
15355 (gnus-demon-add-handler 'gnus-demon-close-connections 30 t)
15356 @end lisp
15357
15358 @findex gnus-demon-add-nocem
15359 @findex gnus-demon-add-scanmail
15360 @findex gnus-demon-add-rescan
15361 @findex gnus-demon-add-scan-timestamps
15362 @findex gnus-demon-add-disconnection
15363 Some ready-made functions to do this have been created:
15364 @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
15365 @code{gnus-demon-add-nntp-close-connection},
15366 @code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and
15367 @code{gnus-demon-add-scanmail}.  Just put those functions in your
15368 @file{.gnus} if you want those abilities.
15369
15370 @findex gnus-demon-init
15371 @findex gnus-demon-cancel
15372 @vindex gnus-demon-handlers
15373 If you add handlers to @code{gnus-demon-handlers} directly, you should
15374 run @code{gnus-demon-init} to make the changes take hold.  To cancel all
15375 daemons, you can use the @code{gnus-demon-cancel} function.
15376
15377 Note that adding daemons can be pretty naughty if you over do it.  Adding
15378 functions that scan all news and mail from all servers every two seconds
15379 is a sure-fire way of getting booted off any respectable system.  So
15380 behave.
15381
15382
15383 @node NoCeM
15384 @section NoCeM
15385 @cindex nocem
15386 @cindex spam
15387
15388 @dfn{Spamming} is posting the same article lots and lots of times.
15389 Spamming is bad.  Spamming is evil.
15390
15391 Spamming is usually canceled within a day or so by various anti-spamming
15392 agencies.  These agencies usually also send out @dfn{NoCeM} messages.
15393 NoCeM is pronounced ``no see-'em'', and means what the name
15394 implies---these are messages that make the offending articles, like, go
15395 away.
15396
15397 What use are these NoCeM messages if the articles are canceled anyway?
15398 Some sites do not honor cancel messages and some sites just honor cancels
15399 from a select few people.  Then you may wish to make use of the NoCeM
15400 messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
15401
15402 Gnus can read and parse the messages in this group automatically, and
15403 this will make spam disappear.
15404
15405 There are some variables to customize, of course:
15406
15407 @table @code
15408 @item gnus-use-nocem
15409 @vindex gnus-use-nocem
15410 Set this variable to @code{t} to set the ball rolling.  It is @code{nil}
15411 by default.
15412
15413 @item gnus-nocem-groups
15414 @vindex gnus-nocem-groups
15415 Gnus will look for NoCeM messages in the groups in this list.  The
15416 default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins"
15417 "alt.nocem.misc" "news.admin.net-abuse.announce")}.
15418
15419 @item gnus-nocem-issuers
15420 @vindex gnus-nocem-issuers
15421 There are many people issuing NoCeM messages.  This list says what
15422 people you want to listen to.  The default is @code{("Automoose-1"
15423 "rbraver@@ohww.norman.ok.us" "clewis@@ferret.ocunix.on.ca"
15424 "jem@@xpat.com" "snowhare@@xmission.com" "red@@redpoll.mrfs.oh.us
15425 (Richard E. Depew)")}; fine, upstanding citizens all of them.
15426
15427 Known despammers that you can put in this list include:
15428
15429 @table @samp
15430 @item clewis@@ferret.ocunix.on.ca;
15431 @cindex Chris Lewis
15432 Chris Lewis---Major Canadian despammer who has probably canceled more
15433 usenet abuse than anybody else.
15434
15435 @item Automoose-1
15436 @cindex CancelMoose[tm]
15437 The CancelMoose[tm] on autopilot.  The CancelMoose[tm] is reputed to be
15438 Norwegian, and was the person(s) who invented NoCeM.
15439
15440 @item jem@@xpat.com;
15441 @cindex Jem
15442 John Milburn---despammer located in Korea who is getting very busy these
15443 days.
15444
15445 @item red@@redpoll.mrfs.oh.us (Richard E. Depew)
15446 Richard E. Depew---lone American despammer.  He mostly cancels binary
15447 postings to non-binary groups and removes spews (regurgitated articles).
15448 @end table
15449
15450 You do not have to heed NoCeM messages from all these people---just the
15451 ones you want to listen to.  You also don't have to accept all NoCeM
15452 messages from the people you like.  Each NoCeM message has a @dfn{type}
15453 header that gives the message a (more or less, usually less) rigorous
15454 definition.  Common types are @samp{spam}, @samp{spew}, @samp{mmf},
15455 @samp{binary}, and @samp{troll}.  To specify this, you have to use
15456 @var{(issuer conditions ...)} elements in the list.  Each condition is
15457 either a string (which is a regexp that matches types you want to use)
15458 or a list on the form @code{(not STRING)}, where @var{string} is a
15459 regexp that matches types you don't want to use.
15460
15461 For instance, if you want all NoCeM messages from Chris Lewis except his
15462 @samp{troll} messages, you'd say:
15463
15464 @lisp
15465 ("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
15466 @end lisp
15467
15468 On the other hand, if you just want nothing but his @samp{spam} and
15469 @samp{spew} messages, you'd say:
15470
15471 @lisp
15472 ("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
15473 @end lisp
15474
15475 The specs are applied left-to-right.
15476
15477
15478 @item gnus-nocem-verifyer
15479 @vindex gnus-nocem-verifyer
15480 @findex mc-verify
15481 This should be a function for verifying that the NoCeM issuer is who she
15482 says she is.  The default is @code{mc-verify}, which is a Mailcrypt
15483 function.  If this is too slow and you don't care for verification
15484 (which may be dangerous), you can set this variable to @code{nil}.
15485
15486 If you want signed NoCeM messages to be verified and unsigned messages
15487 not to be verified (but used anyway), you could do something like:
15488
15489 @lisp
15490 (setq gnus-nocem-verifyer 'my-gnus-mc-verify)
15491
15492 (defun my-gnus-mc-verify ()
15493   (not (eq 'forged
15494            (ignore-errors
15495              (if (mc-verify)
15496                  t
15497                'forged)))))
15498 @end lisp
15499
15500 This might be dangerous, though.
15501
15502 @item gnus-nocem-directory
15503 @vindex gnus-nocem-directory
15504 This is where Gnus will store its NoCeM cache files.  The default is
15505 @file{~/News/NoCeM/}.
15506
15507 @item gnus-nocem-expiry-wait
15508 @vindex gnus-nocem-expiry-wait
15509 The number of days before removing old NoCeM entries from the cache.
15510 The default is 15.  If you make it shorter Gnus will be faster, but you
15511 might then see old spam.
15512
15513 @end table
15514
15515 Using NoCeM could potentially be a memory hog.  If you have many living
15516 (i. e., subscribed or unsubscribed groups), your Emacs process will grow
15517 big.  If this is a problem, you should kill off all (or most) of your
15518 unsubscribed groups (@pxref{Subscription Commands}).
15519
15520
15521 @node Undo
15522 @section Undo
15523 @cindex undo
15524
15525 It is very useful to be able to undo actions one has done.  In normal
15526 Emacs buffers, it's easy enough---you just push the @code{undo} button.
15527 In Gnus buffers, however, it isn't that simple.
15528
15529 The things Gnus displays in its buffer is of no value whatsoever to
15530 Gnus---it's all just data designed to look nice to the user.
15531 Killing a group in the group buffer with @kbd{C-k} makes the line
15532 disappear, but that's just a side-effect of the real action---the
15533 removal of the group in question from the internal Gnus structures.
15534 Undoing something like that can't be done by the normal Emacs
15535 @code{undo} function.
15536
15537 Gnus tries to remedy this somewhat by keeping track of what the user
15538 does and coming up with actions that would reverse the actions the user
15539 takes.  When the user then presses the @code{undo} key, Gnus will run
15540 the code to reverse the previous action, or the previous actions.
15541 However, not all actions are easily reversible, so Gnus currently offers
15542 a few key functions to be undoable.  These include killing groups,
15543 yanking groups, and changing the list of read articles of groups.
15544 That's it, really.  More functions may be added in the future, but each
15545 added function means an increase in data to be stored, so Gnus will
15546 never be totally undoable.
15547
15548 @findex gnus-undo-mode
15549 @vindex gnus-use-undo
15550 @findex gnus-undo
15551 The undoability is provided by the @code{gnus-undo-mode} minor mode.  It
15552 is used if @code{gnus-use-undo} is non-@code{nil}, which is the
15553 default.  The @kbd{M-C-_} key performs the @code{gnus-undo} command
15554 command, which should feel kinda like the normal Emacs @code{undo}
15555 command.
15556
15557
15558 @node Moderation
15559 @section Moderation
15560 @cindex moderation
15561
15562 If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
15563 It is not included in the standard Gnus package.  Write a mail to
15564 @samp{larsi@@gnus.org} and state what group you moderate, and you'll
15565 get a copy.
15566
15567 The moderation package is implemented as a minor mode for summary
15568 buffers.  Put
15569
15570 @lisp
15571 (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
15572 @end lisp
15573
15574 in your @file{.gnus.el} file.
15575
15576 If you are the moderator of @samp{rec.zoofle}, this is how it's
15577 supposed to work:
15578
15579 @enumerate
15580 @item
15581 You split your incoming mail by matching on
15582 @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
15583 articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
15584
15585 @item
15586 You enter that group once in a while and post articles using the @kbd{e}
15587 (edit-and-post) or @kbd{s} (just send unedited) commands.
15588
15589 @item
15590 If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
15591 articles that weren't approved by you, you can cancel them with the
15592 @kbd{c} command.
15593 @end enumerate
15594
15595 To use moderation mode in these two groups, say:
15596
15597 @lisp
15598 (setq gnus-moderated-list
15599       "^nnml:rec.zoofle$\\|^rec.zoofle$")
15600 @end lisp
15601
15602
15603 @node XEmacs Enhancements
15604 @section XEmacs Enhancements
15605 @cindex XEmacs
15606
15607 XEmacs is able to display pictures and stuff, so Gnus has taken
15608 advantage of that.
15609
15610 @menu
15611 * Picons::    How to display pictures of what your reading.
15612 * Smileys::   Show all those happy faces the way they were meant to be shown.
15613 * Toolbar::   Click'n'drool.
15614 * XVarious::  Other XEmacsy Gnusey variables.
15615 @end menu
15616
15617
15618 @node Picons
15619 @subsection Picons
15620
15621 @iftex
15622 @iflatex
15623 \include{picons}
15624 @end iflatex
15625 @end iftex
15626
15627 So...  You want to slow down your news reader even more!  This is a
15628 good way to do so.  Its also a great way to impress people staring
15629 over your shoulder as you read news.
15630
15631 @menu
15632 * Picon Basics::           What are picons and How do I get them.
15633 * Picon Requirements::     Don't go further if you aren't using XEmacs.
15634 * Easy Picons::            Displaying Picons---the easy way.
15635 * Hard Picons::            The way you should do it.  You'll learn something.
15636 * Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
15637 @end menu
15638
15639
15640 @node Picon Basics
15641 @subsubsection Picon Basics
15642
15643 What are Picons?  To quote directly from the Picons Web site:
15644
15645 @iftex
15646 @iflatex
15647 \margindex{}
15648 @end iflatex
15649 @end iftex
15650
15651 @quotation
15652 @dfn{Picons} is short for ``personal icons''.  They're small,
15653 constrained images used to represent users and domains on the net,
15654 organized into databases so that the appropriate image for a given
15655 e-mail address can be found.  Besides users and domains, there are picon
15656 databases for Usenet newsgroups and weather forecasts.  The picons are
15657 in either monochrome @code{XBM} format or color @code{XPM} and
15658 @code{GIF} formats.
15659 @end quotation
15660
15661 @vindex gnus-picons-piconsearch-url
15662 If you have a permanent connection to the Internet you can use Steve
15663 Kinzler's Picons Search engine by setting
15664 @code{gnus-picons-piconsearch-url} to the string @*
15665 @file{http://www.cs.indiana.edu/picons/search.html}.
15666
15667 @vindex gnus-picons-database
15668 Otherwise you need a local copy of his database.  For instructions on
15669 obtaining and installing the picons databases, point your Web browser at @*
15670 @file{http://www.cs.indiana.edu/picons/ftp/index.html}.  Gnus expects
15671 picons to be installed into a location pointed to by
15672 @code{gnus-picons-database}.
15673
15674
15675 @node Picon Requirements
15676 @subsubsection Picon Requirements
15677
15678 To have Gnus display Picons for you, you must be running XEmacs
15679 19.13 or greater since all other versions of Emacs aren't yet able to
15680 display images.
15681
15682 Additionally, you must have @code{x} support compiled into XEmacs.  To
15683 display color picons which are much nicer than the black & white one,
15684 you also need one of @code{xpm} or @code{gif} compiled into XEmacs.
15685
15686 @vindex gnus-picons-convert-x-face
15687 If you want to display faces from @code{X-Face} headers, you should have
15688 the @code{xface} support compiled into XEmacs.  Otherwise you must have
15689 the @code{netpbm} utilities installed, or munge the
15690 @code{gnus-picons-convert-x-face} variable to use something else.
15691
15692
15693 @node Easy Picons
15694 @subsubsection Easy Picons
15695
15696 To enable displaying picons, simply put the following line in your
15697 @file{~/.gnus} file and start Gnus.
15698
15699 @lisp
15700 (setq gnus-use-picons t)
15701 (setq gnus-treat-display-picons t)
15702 @end lisp
15703
15704 and make sure @code{gnus-picons-database} points to the directory
15705 containing the Picons databases.
15706
15707 Alternatively if you want to use the web piconsearch engine add this:
15708
15709 @lisp
15710 (setq gnus-picons-piconsearch-url
15711       "http://www.cs.indiana.edu:800/piconsearch")
15712 @end lisp
15713
15714
15715 @node Hard Picons
15716 @subsubsection Hard Picons
15717
15718 @iftex
15719 @iflatex
15720 \margindex{}
15721 @end iflatex
15722 @end iftex
15723
15724 Gnus can display picons for you as you enter and leave groups and
15725 articles.  It knows how to interact with three sections of the picons
15726 database.  Namely, it can display the picons newsgroup pictures,
15727 author's face picture(s), and the authors domain.  To enable this
15728 feature, you need to select where to get the picons from, and where to
15729 display them.
15730
15731 @table @code
15732
15733 @item gnus-picons-database
15734 @vindex gnus-picons-database
15735 The location of the picons database.  Should point to a directory
15736 containing the @file{news}, @file{domains}, @file{users} (and so on)
15737 subdirectories.  This is only useful if
15738 @code{gnus-picons-piconsearch-url} is @code{nil}.  Defaults to
15739 @file{/usr/local/faces/}.
15740
15741 @item gnus-picons-piconsearch-url
15742 @vindex gnus-picons-piconsearch-url
15743 The URL for the web picons search engine.  The only currently known
15744 engine is @file{http://www.cs.indiana.edu:800/piconsearch}.  To
15745 workaround network delays, icons will be fetched in the background.  If
15746 this is @code{nil} 'the default), then picons are fetched from local
15747 database indicated by @code{gnus-picons-database}.
15748
15749 @item gnus-picons-display-where
15750 @vindex gnus-picons-display-where
15751 Where the picon images should be displayed.  It is @code{picons} by
15752 default (which by default maps to the buffer @samp{*Picons*}).  Other
15753 valid places could be @code{article}, @code{summary}, or
15754 @samp{*scratch*} for all I care.  Just make sure that you've made the
15755 buffer visible using the standard Gnus window configuration
15756 routines---@pxref{Windows Configuration}.
15757
15758 @item gnus-picons-group-excluded-groups
15759 @vindex gnus-picons-group-excluded-groups
15760 Groups that are matched by this regexp won't have their group icons
15761 displayed.
15762
15763 @end table
15764
15765 Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your
15766 window configuration for you to include the @code{picons} buffer.
15767
15768 Now that you've made those decision, you need to add the following
15769 functions to the appropriate hooks so these pictures will get displayed
15770 at the right time.
15771
15772 @vindex gnus-picons-display-where
15773 @table @code
15774 @item gnus-article-display-picons
15775 @findex gnus-article-display-picons
15776 Looks up and displays the picons for the author and the author's domain
15777 in the @code{gnus-picons-display-where} buffer.
15778
15779 @item gnus-picons-article-display-x-face
15780 @findex gnus-article-display-picons
15781 Decodes and displays the X-Face header if present.
15782
15783 @end table
15784
15785
15786
15787 @node Picon Useless Configuration
15788 @subsubsection Picon Useless Configuration
15789
15790 @iftex
15791 @iflatex
15792 \margindex{}
15793 @end iflatex
15794 @end iftex
15795
15796 The following variables offer further control over how things are
15797 done, where things are located, and other useless stuff you really
15798 don't need to worry about.
15799
15800 @table @code
15801
15802 @item gnus-picons-news-directories
15803 @vindex gnus-picons-news-directories
15804 List of subdirectories to search in @code{gnus-picons-database} for
15805 newsgroups faces.  @code{("news")} is the default.
15806
15807 @item gnus-picons-user-directories
15808 @vindex gnus-picons-user-directories
15809 List of subdirectories to search in @code{gnus-picons-database} for user
15810 faces.  @code{("local" "users" "usenix" "misc")} is the default.
15811
15812 @item gnus-picons-domain-directories
15813 @vindex gnus-picons-domain-directories
15814 List of subdirectories to search in @code{gnus-picons-database} for
15815 domain name faces.  Defaults to @code{("domains")}.  Some people may
15816 want to add @samp{"unknown"} to this list.
15817
15818 @item gnus-picons-convert-x-face
15819 @vindex gnus-picons-convert-x-face
15820 If you don't have @code{xface} support builtin XEmacs, this is the
15821 command to use to convert the @code{X-Face} header to an X bitmap
15822 (@code{xbm}).  Defaults to @code{(format "@{ echo '/* Width=48,
15823 Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
15824 gnus-picons-x-face-file-name)}
15825
15826 @item gnus-picons-x-face-file-name
15827 @vindex gnus-picons-x-face-file-name
15828 Names a temporary file to store the @code{X-Face} bitmap in.  Defaults
15829 to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.
15830
15831 @item gnus-picons-has-modeline-p
15832 @vindex gnus-picons-has-modeline-p
15833 If you have set @code{gnus-picons-display-where} to @code{picons}, your
15834 XEmacs frame will become really cluttered.  To alleviate this a bit you
15835 can set @code{gnus-picons-has-modeline-p} to @code{nil}; this will
15836 remove the mode line from the Picons buffer.  This is only useful if
15837 @code{gnus-picons-display-where} is @code{picons}.
15838
15839 @item gnus-picons-refresh-before-display
15840 @vindex gnus-picons-refresh-before-display
15841 If non-nil, display the article buffer before computing the picons.
15842 Defaults to @code{nil}.
15843
15844 @item gnus-picons-display-as-address
15845 @vindex gnus-picons-display-as-address
15846 If @code{t} display textual email addresses along with pictures.
15847 Defaults to @code{t}.
15848
15849 @item gnus-picons-file-suffixes
15850 @vindex gnus-picons-file-suffixes
15851 Ordered list of suffixes on picon file names to try.  Defaults to
15852 @code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs.
15853
15854 @item gnus-picons-setup-hook
15855 @vindex gnus-picons-setup-hook
15856 Hook run in the picon buffer, if that is displayed.
15857
15858 @item gnus-picons-display-article-move-p
15859 @vindex gnus-picons-display-article-move-p
15860 Whether to move point to first empty line when displaying picons.  This
15861 has only an effect if `gnus-picons-display-where' has value `article'.
15862
15863 If @code{nil}, display the picons in the @code{From} and
15864 @code{Newsgroups} lines.  This is the defailt.
15865
15866 @item gnus-picons-clear-cache-on-shutdown
15867 @vindex gnus-picons-clear-cache-on-shutdown
15868 Whether to clear the picons cache when exiting gnus.  Gnus caches every
15869 picons it finds while it is running.  This saves some time in the search
15870 process but eats some memory.  If this variable is set to @code{nil},
15871 Gnus will never clear the cache itself; you will have to manually call
15872 @code{gnus-picons-clear-cache} to clear it.  Otherwise the cache will be
15873 cleared every time you exit Gnus.  Defaults to @code{t}.
15874
15875 @iftex
15876 @iflatex
15877 \margindex{}
15878 @end iflatex
15879 @end iftex
15880
15881 @end table
15882
15883 @node Smileys
15884 @subsection Smileys
15885 @cindex smileys
15886
15887 @iftex
15888 @iflatex
15889 \gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}}
15890 \input{smiley}
15891 @end iflatex
15892 @end iftex
15893
15894 @dfn{Smiley} is a package separate from Gnus, but since Gnus is
15895 currently the only package that uses Smiley, it is documented here.
15896
15897 In short---to use Smiley in Gnus, put the following in your
15898 @file{.gnus.el} file:
15899
15900 @lisp
15901 (setq gnus-treat-display-smiley t)
15902 @end lisp
15903
15904 Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and
15905 the like---to pictures and displays those instead of the text smiley
15906 faces.  The conversion is controlled by a list of regexps that matches
15907 text and maps that to file names.
15908
15909 @vindex smiley-nosey-regexp-alist
15910 @vindex smiley-deformed-regexp-alist
15911 Smiley supplies two example conversion alists by default:
15912 @code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(}
15913 and so on), and @code{smiley-nosey-regexp-alist} (which matches
15914 @samp{:-)}, @samp{:-(} and so on).
15915
15916 The alist used is specified by the @code{smiley-regexp-alist} variable,
15917 which defaults to the value of @code{smiley-deformed-regexp-alist}.
15918
15919 The first item in each element is the regexp to be matched; the second
15920 element is the regexp match group that is to be replaced by the picture;
15921 and the third element is the name of the file to be displayed.
15922
15923 The following variables customize where Smiley will look for these
15924 files, as well as the color to be used and stuff:
15925
15926 @table @code
15927
15928 @item smiley-data-directory
15929 @vindex smiley-data-directory
15930 Where Smiley will look for smiley faces files.
15931
15932 @item smiley-flesh-color
15933 @vindex smiley-flesh-color
15934 Skin color.  The default is @samp{yellow}, which is really racist.
15935
15936 @item smiley-features-color
15937 @vindex smiley-features-color
15938 Color of the features of the face.  The default is @samp{black}.
15939
15940 @item smiley-tongue-color
15941 @vindex smiley-tongue-color
15942 Color of the tongue.  The default is @samp{red}.
15943
15944 @item smiley-circle-color
15945 @vindex smiley-circle-color
15946 Color of the circle around the face.  The default is @samp{black}.
15947
15948 @item smiley-mouse-face
15949 @vindex smiley-mouse-face
15950 Face used for mouse highlighting over the smiley face.
15951
15952 @end table
15953
15954
15955 @node Toolbar
15956 @subsection Toolbar
15957
15958 @table @code
15959
15960 @iftex
15961 @iflatex
15962 \margindex{}
15963 @end iflatex
15964 @end iftex
15965
15966 @item gnus-use-toolbar
15967 @vindex gnus-use-toolbar
15968 If @code{nil}, don't display toolbars.  If non-@code{nil}, it should be
15969 one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
15970 @code{right-toolbar}, or @code{left-toolbar}.
15971
15972 @item gnus-group-toolbar
15973 @vindex gnus-group-toolbar
15974 The toolbar in the group buffer.
15975
15976 @item gnus-summary-toolbar
15977 @vindex gnus-summary-toolbar
15978 The toolbar in the summary buffer.
15979
15980 @item gnus-summary-mail-toolbar
15981 @vindex gnus-summary-mail-toolbar
15982 The toolbar in the summary buffer of mail groups.
15983
15984 @end table
15985
15986
15987 @node XVarious
15988 @subsection Various XEmacs Variables
15989
15990 @table @code
15991 @item gnus-xmas-glyph-directory
15992 @vindex gnus-xmas-glyph-directory
15993 This is where Gnus will look for pictures.  Gnus will normally
15994 auto-detect this directory, but you may set it manually if you have an
15995 unusual directory structure.
15996
15997 @item gnus-xmas-logo-color-alist
15998 @vindex gnus-xmas-logo-color-alist
15999 This is an alist where the key is a type symbol and the values are the
16000 foreground and background color of the splash page glyph.
16001
16002 @item gnus-xmas-logo-color-style
16003 @vindex gnus-xmas-logo-color-style
16004 This is the key used to look up the color in the alist described above.
16005 Valid values include @code{flame}, @code{pine}, @code{moss},
16006 @code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
16007 @code{labia}, @code{berry}, @code{neutral}, and @code{september}.
16008
16009 @item gnus-xmas-modeline-glyph
16010 @vindex gnus-xmas-modeline-glyph
16011 A glyph displayed in all Gnus mode lines.  It is a tiny gnu head by
16012 default.
16013
16014 @iftex
16015 @iflatex
16016 \margindex{}
16017 @end iflatex
16018 @end iftex
16019
16020 @end table
16021
16022
16023
16024
16025 @node Fuzzy Matching
16026 @section Fuzzy Matching
16027 @cindex fuzzy matching
16028
16029 Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing
16030 things like scoring, thread gathering and thread comparison.
16031
16032 As opposed to regular expression matching, fuzzy matching is very fuzzy.
16033 It's so fuzzy that there's not even a definition of what @dfn{fuzziness}
16034 means, and the implementation has changed over time.
16035
16036 Basically, it tries to remove all noise from lines before comparing.
16037 @samp{Re: }, parenthetical remarks, white space, and so on, are filtered
16038 out of the strings before comparing the results.  This often leads to
16039 adequate results---even when faced with strings generated by text
16040 manglers masquerading as newsreaders.
16041
16042
16043 @node Thwarting Email Spam
16044 @section Thwarting Email Spam
16045 @cindex email spam
16046 @cindex spam
16047 @cindex UCE
16048 @cindex unsolicited commercial email
16049
16050 In these last days of the Usenet, commercial vultures are hanging about
16051 and grepping through news like crazy to find email addresses they can
16052 foist off their scams and products to.  As a reaction to this, many
16053 people have started putting nonsense addresses into their @code{From}
16054 lines.  I think this is counterproductive---it makes it difficult for
16055 people to send you legitimate mail in response to things you write, as
16056 well as making it difficult to see who wrote what.  This rewriting may
16057 perhaps be a bigger menace than the unsolicited commercial email itself
16058 in the end.
16059
16060 The biggest problem I have with email spam is that it comes in under
16061 false pretenses.  I press @kbd{g} and Gnus merrily informs me that I
16062 have 10 new emails.  I say ``Golly gee!  Happy is me!'' and select the
16063 mail group, only to find two pyramid schemes, seven advertisements
16064 (``New!  Miracle tonic for growing full, lustrous hair on your toes!'')
16065 and one mail asking me to repent and find some god.
16066
16067 This is annoying.
16068
16069 The way to deal with this is having Gnus split out all spam into a
16070 @samp{spam} mail group (@pxref{Splitting Mail}).
16071
16072 First, pick one (1) valid mail address that you can be reached at, and
16073 put it in your @code{From} header of all your news articles.  (I've
16074 chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form
16075 @samp{larsi+usenet@@ifi.uio.no} will be a better choice.  Ask your
16076 sysadm whether your sendmail installation accepts keywords in the local
16077 part of the mail address.)
16078
16079 @lisp
16080 (setq message-default-news-headers
16081       "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
16082 @end lisp
16083
16084 Then put the following split rule in @code{nnmail-split-fancy}
16085 (@pxref{Fancy Mail Splitting}):
16086
16087 @lisp
16088 (
16089  ...
16090  (to "larsi@@trym.ifi.uio.no"
16091       (| ("subject" "re:.*" "misc")
16092          ("references" ".*@@.*" "misc")
16093          "spam"))
16094  ...
16095 )
16096 @end lisp
16097
16098 This says that all mail to this address is suspect, but if it has a
16099 @code{Subject} that starts with a @samp{Re:} or has a @code{References}
16100 header, it's probably ok.  All the rest goes to the @samp{spam} group.
16101 (This idea probably comes from Tim Pierce.)
16102
16103 In addition, many mail spammers talk directly to your @code{smtp} server
16104 and do not include your email address explicitly in the @code{To}
16105 header.  Why they do this is unknown---perhaps it's to thwart this
16106 thwarting scheme?  In any case, this is trivial to deal with---you just
16107 put anything not addressed to you in the @samp{spam} group by ending
16108 your fancy split rule in this way:
16109
16110 @lisp
16111 (
16112  ...
16113  (to "larsi" "misc")
16114  "spam")
16115 @end lisp
16116
16117 In my experience, this will sort virtually everything into the right
16118 group.  You still have to check the @samp{spam} group from time to time to
16119 check for legitimate mail, though.  If you feel like being a good net
16120 citizen, you can even send off complaints to the proper authorities on
16121 each unsolicited commercial email---at your leisure.
16122
16123 If you are also a lazy net citizen, you will probably prefer complaining
16124 automatically with the @file{gnus-junk.el} package, available FOR FREE
16125 at @* @file{<URL:http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html>}.
16126 Since most e-mail spam is sent automatically, this may reconcile the
16127 cosmic balance somewhat.
16128
16129 This works for me.  It allows people an easy way to contact me (they can
16130 just press @kbd{r} in the usual way), and I'm not bothered at all with
16131 spam.  It's a win-win situation.  Forging @code{From} headers to point
16132 to non-existent domains is yucky, in my opinion.
16133
16134
16135 @node Various Various
16136 @section Various Various
16137 @cindex mode lines
16138 @cindex highlights
16139
16140 @table @code
16141
16142 @item gnus-home-directory
16143 All Gnus path variables will be initialized from this variable, which
16144 defaults to @file{~/}.
16145
16146 @item gnus-directory
16147 @vindex gnus-directory
16148 Most Gnus storage path variables will be initialized from this variable,
16149 which defaults to the @samp{SAVEDIR} environment variable, or
16150 @file{~/News/} if that variable isn't set.
16151
16152 Note that Gnus is mostly loaded when the @file{.gnus.el} file is read.
16153 This means that other directory variables that are initialized from this
16154 variable won't be set properly if you set this variable in
16155 @file{.gnus.el}.  Set this variable in @file{.emacs} instead.
16156
16157 @item gnus-default-directory
16158 @vindex gnus-default-directory
16159 Not related to the above variable at all---this variable says what the
16160 default directory of all Gnus buffers should be.  If you issue commands
16161 like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
16162 default directory.  If this variable is @code{nil} (which is the
16163 default), the default directory will be the default directory of the
16164 buffer you were in when you started Gnus.
16165
16166 @item gnus-verbose
16167 @vindex gnus-verbose
16168 This variable is an integer between zero and ten.  The higher the value,
16169 the more messages will be displayed.  If this variable is zero, Gnus
16170 will never flash any messages, if it is seven (which is the default),
16171 most important messages will be shown, and if it is ten, Gnus won't ever
16172 shut up, but will flash so many messages it will make your head swim.
16173
16174 @item gnus-verbose-backends
16175 @vindex gnus-verbose-backends
16176 This variable works the same way as @code{gnus-verbose}, but it applies
16177 to the Gnus backends instead of Gnus proper.
16178
16179 @item nnheader-max-head-length
16180 @vindex nnheader-max-head-length
16181 When the backends read straight heads of articles, they all try to read
16182 as little as possible.  This variable (default 4096) specifies
16183 the absolute max length the backends will try to read before giving up
16184 on finding a separator line between the head and the body.  If this
16185 variable is @code{nil}, there is no upper read bound.  If it is
16186 @code{t}, the backends won't try to read the articles piece by piece,
16187 but read the entire articles.  This makes sense with some versions of
16188 @code{ange-ftp} or @code{efs}.
16189
16190 @item nnheader-head-chop-length
16191 @vindex nnheader-head-chop-length
16192 This variable (default 2048) says how big a piece of each article to
16193 read when doing the operation described above.
16194
16195 @item nnheader-file-name-translation-alist
16196 @vindex nnheader-file-name-translation-alist
16197 @cindex file names
16198 @cindex invalid characters in file names
16199 @cindex characters in file names
16200 This is an alist that says how to translate characters in file names.
16201 For instance, if @samp{:} is invalid as a file character in file names
16202 on your system (you OS/2 user you), you could say something like:
16203
16204 @lisp
16205 (setq nnheader-file-name-translation-alist
16206       '((?: . ?_)))
16207 @end lisp
16208
16209 In fact, this is the default value for this variable on OS/2 and MS
16210 Windows (phooey) systems.
16211
16212 @item gnus-hidden-properties
16213 @vindex gnus-hidden-properties
16214 This is a list of properties to use to hide ``invisible'' text.  It is
16215 @code{(invisible t intangible t)} by default on most systems, which
16216 makes invisible text invisible and intangible.
16217
16218 @item gnus-parse-headers-hook
16219 @vindex gnus-parse-headers-hook
16220 A hook called before parsing headers.  It can be used, for instance, to
16221 gather statistics on the headers fetched, or perhaps you'd like to prune
16222 some headers.  I don't see why you'd want that, though.
16223
16224 @item gnus-shell-command-separator
16225 @vindex gnus-shell-command-separator
16226 String used to separate two shell commands.  The default is @samp{;}.
16227
16228
16229 @end table
16230
16231
16232 @node The End
16233 @chapter The End
16234
16235 Well, that's the manual---you can get on with your life now.  Keep in
16236 touch.  Say hello to your cats from me.
16237
16238 My @strong{ghod}---I just can't stand goodbyes.  Sniffle.
16239
16240 Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
16241
16242 @quotation
16243 @strong{Te Deum}
16244
16245 @sp 1
16246 Not because of victories @*
16247 I sing,@*
16248 having none,@*
16249 but for the common sunshine,@*
16250 the breeze,@*
16251 the largess of the spring.
16252
16253 @sp 1
16254 Not for victory@*
16255 but for the day's work done@*
16256 as well as I was able;@*
16257 not for a seat upon the dais@*
16258 but at the common table.@*
16259 @end quotation
16260
16261
16262 @node Appendices
16263 @chapter Appendices
16264
16265 @menu
16266 * History::                        How Gnus got where it is today.
16267 * Terminology::                    We use really difficult, like, words here.
16268 * Customization::                  Tailoring Gnus to your needs.
16269 * Troubleshooting::                What you might try if things do not work.
16270 * Gnus Reference Guide::           Rilly, rilly technical stuff.
16271 * Emacs for Heathens::             A short introduction to Emacsian terms.
16272 * Frequently Asked Questions::     A question-and-answer session.
16273 @end menu
16274
16275
16276 @node History
16277 @section History
16278
16279 @cindex history
16280 @sc{gnus} was written by Masanobu @sc{Umeda}.  When autumn crept up in
16281 '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
16282
16283 If you want to investigate the person responsible for this outrage, you
16284 can point your (feh!) web browser to
16285 @file{http://www.stud.ifi.uio.no/~larsi/}.  This is also the primary
16286 distribution point for the new and spiffy versions of Gnus, and is known
16287 as The Site That Destroys Newsrcs And Drives People Mad.
16288
16289 During the first extended alpha period of development, the new Gnus was
16290 called ``(ding) Gnus''.  @dfn{(ding)} is, of course, short for
16291 @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
16292 (Besides, the ``Gnus'' in this abbreviation should probably be
16293 pronounced ``news'' as @sc{Umeda} intended, which makes it a more
16294 appropriate name, don't you think?)
16295
16296 In any case, after spending all that energy on coming up with a new and
16297 spunky name, we decided that the name was @emph{too} spunky, so we
16298 renamed it back again to ``Gnus''.  But in mixed case.  ``Gnus'' vs.
16299 ``@sc{gnus}''.  New vs. old.
16300
16301 The first ``proper'' release of Gnus 5 was done in November 1995 when it
16302 was included in the Emacs 19.30 distribution (132 (ding) Gnus releases
16303 plus 15 Gnus 5.0 releases).
16304
16305 In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99
16306 releases)) was released under the name ``Gnus 5.2'' (40 releases).
16307
16308 On July 28th 1996 work on Red Gnus was begun, and it was released on
16309 January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
16310
16311 On September 13th 1997, Quassia Gnus was started and lasted 37
16312 releases.  If was released as ``Gnus 5.6 on March 8th 1998.
16313
16314 If you happen upon a version of Gnus that has a prefixed name --
16315 ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' --
16316 don't panic.  Don't let it know that you're frightened.  Back away.
16317 Slowly.  Whatever you do, don't run.  Walk away, calmly, until you're
16318 out of its reach.  Find a proper released version of Gnus and snuggle up
16319 to that instead.
16320
16321 @menu
16322 * Why?::                What's the point of Gnus?
16323 * Compatibility::       Just how compatible is Gnus with @sc{gnus}?
16324 * Conformity::          Gnus tries to conform to all standards.
16325 * Emacsen::             Gnus can be run on a few modern Emacsen.
16326 * Contributors::        Oodles of people.
16327 * New Features::        Pointers to some of the new stuff in Gnus.
16328 * Newest Features::     Features so new that they haven't been written yet.
16329 @end menu
16330
16331
16332 @node Why?
16333 @subsection Why?
16334
16335 What's the point of Gnus?
16336
16337 I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
16338 newsreader, that lets you do anything you can think of.  That was my
16339 original motivation, but while working on Gnus, it has become clear to
16340 me that this generation of newsreaders really belong in the stone age.
16341 Newsreaders haven't developed much since the infancy of the net.  If the
16342 volume continues to rise with the current rate of increase, all current
16343 newsreaders will be pretty much useless.  How do you deal with
16344 newsgroups that have thousands of new articles each day?  How do you
16345 keep track of millions of people who post?
16346
16347 Gnus offers no real solutions to these questions, but I would very much
16348 like to see Gnus being used as a testing ground for new methods of
16349 reading and fetching news.  Expanding on @sc{Umeda}-san's wise decision
16350 to separate the newsreader from the backends, Gnus now offers a simple
16351 interface for anybody who wants to write new backends for fetching mail
16352 and news from different sources.  I have added hooks for customizations
16353 everywhere I could imagine it being useful.  By doing so, I'm inviting
16354 every one of you to explore and invent.
16355
16356 May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and
16357 @kbd{C-u 100 M-x all-hail-xemacs}.
16358
16359
16360 @node Compatibility
16361 @subsection Compatibility
16362
16363 @cindex compatibility
16364 Gnus was designed to be fully compatible with @sc{gnus}.  Almost all key
16365 bindings have been kept.  More key bindings have been added, of course,
16366 but only in one or two obscure cases have old bindings been changed.
16367
16368 Our motto is:
16369 @quotation
16370 @cartouche
16371 @center In a cloud bones of steel.
16372 @end cartouche
16373 @end quotation
16374
16375 All commands have kept their names.  Some internal functions have changed
16376 their names.
16377
16378 The @code{gnus-uu} package has changed drastically. @xref{Decoding
16379 Articles}.
16380
16381 One major compatibility question is the presence of several summary
16382 buffers.  All variables relevant while reading a group are
16383 buffer-local to the summary buffer they belong in.  Although many
16384 important variables have their values copied into their global
16385 counterparts whenever a command is executed in the summary buffer, this
16386 change might lead to incorrect values being used unless you are careful.
16387
16388 All code that relies on knowledge of @sc{gnus} internals will probably
16389 fail.  To take two examples: Sorting @code{gnus-newsrc-alist} (or
16390 changing it in any way, as a matter of fact) is strictly verboten.  Gnus
16391 maintains a hash table that points to the entries in this alist (which
16392 speeds up many functions), and changing the alist directly will lead to
16393 peculiar results.
16394
16395 @cindex hilit19
16396 @cindex highlighting
16397 Old hilit19 code does not work at all.  In fact, you should probably
16398 remove all hilit code from all Gnus hooks
16399 (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
16400 Gnus provides various integrated functions for highlighting.  These are
16401 faster and more accurate.  To make life easier for everybody, Gnus will
16402 by default remove all hilit calls from all hilit hooks.  Uncleanliness!
16403 Away!
16404
16405 Packages like @code{expire-kill} will no longer work.  As a matter of
16406 fact, you should probably remove all old @sc{gnus} packages (and other
16407 code) when you start using Gnus.  More likely than not, Gnus already
16408 does what you have written code to make @sc{gnus} do.  (Snicker.)
16409
16410 Even though old methods of doing things are still supported, only the
16411 new methods are documented in this manual.  If you detect a new method of
16412 doing something while reading this manual, that does not mean you have
16413 to stop doing it the old way.
16414
16415 Gnus understands all @sc{gnus} startup files.
16416
16417 @kindex M-x gnus-bug
16418 @findex gnus-bug
16419 @cindex reporting bugs
16420 @cindex bugs
16421 Overall, a casual user who hasn't written much code that depends on
16422 @sc{gnus} internals should suffer no problems.  If problems occur,
16423 please let me know by issuing that magic command @kbd{M-x gnus-bug}.
16424
16425 @vindex gnus-bug-create-help-buffer
16426 If you are in the habit of sending bug reports @emph{very} often, you
16427 may find the helpful help buffer annoying after a while.  If so, set
16428 @code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop
16429 up at you.
16430
16431
16432 @node Conformity
16433 @subsection Conformity
16434
16435 No rebels without a clue here, ma'am.  We conform to all standards known
16436 to (wo)man.  Except for those standards and/or conventions we disagree
16437 with, of course.
16438
16439 @table @strong
16440
16441 @item RFC 822
16442 @cindex RFC 822
16443 There are no known breaches of this standard.
16444
16445 @item RFC 1036
16446 @cindex RFC 1036
16447 There are no known breaches of this standard, either.
16448
16449 @item Son-of-RFC 1036
16450 @cindex Son-of-RFC 1036
16451 We do have some breaches to this one.
16452
16453 @table @emph
16454
16455 @item X-Newsreader
16456 @itemx User-Agent
16457 These are considered to be ``vanity headers'', while I consider them
16458 to be consumer information.  After seeing so many badly formatted
16459 articles coming from @code{tin} and @code{Netscape} I know not to use
16460 either of those for posting articles.  I would not have known that if
16461 it wasn't for the @code{X-Newsreader} header.
16462 @end table
16463
16464 @item USEFOR
16465 @cindex USEFOR
16466 USEFOR is an IETF working group writing a successor to RFC 1036, based
16467 on Son-of-RFC 1036.  They have produced a number of drafts proposing
16468 various changes to the format of news articles.  The Gnus towers will
16469 look into implementing the changes when the draft is accepted as an RFC.
16470
16471 @end table
16472
16473 If you ever notice Gnus acting non-compliant with regards to the texts
16474 mentioned above, don't hesitate to drop a note to Gnus Towers and let us
16475 know.
16476
16477
16478 @node Emacsen
16479 @subsection Emacsen
16480 @cindex Emacsen
16481 @cindex XEmacs
16482 @cindex Mule
16483 @cindex Emacs
16484
16485 Gnus should work on :
16486
16487 @itemize @bullet
16488
16489 @item
16490 Emacs 20.3 and up.
16491
16492 @item
16493 XEmacs 20.4 and up.
16494
16495 @end itemize
16496
16497 This Gnus version will absolutely not work on any Emacsen older than
16498 that.  Not reliably, at least.  Older versions of Gnus may work on older
16499 Emacs versions.
16500
16501 There are some vague differences between Gnus on the various
16502 platforms---XEmacs features more graphics (a logo and a toolbar)---but
16503 other than that, things should look pretty much the same under all
16504 Emacsen.
16505
16506
16507 @node Contributors
16508 @subsection Contributors
16509 @cindex contributors
16510
16511 The new Gnus version couldn't have been done without the help of all the
16512 people on the (ding) mailing list.  Every day for over a year I have
16513 gotten billions of nice bug reports from them, filling me with joy,
16514 every single one of them.  Smooches.  The people on the list have been
16515 tried beyond endurance, what with my ``oh, that's a neat idea <type
16516 type>, yup, I'll release it right away <ship off> no wait, that doesn't
16517 work at all <type type>, yup, I'll ship that one off right away <ship
16518 off> no, wait, that absolutely does not work'' policy for releases.
16519 Micro$oft---bah.  Amateurs.  I'm @emph{much} worse.  (Or is that
16520 ``worser''? ``much worser''?  ``worsest''?)
16521
16522 I would like to take this opportunity to thank the Academy for...  oops,
16523 wrong show.
16524
16525 @itemize @bullet
16526
16527 @item
16528 Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
16529
16530 @item
16531 Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
16532 well as numerous other things).
16533
16534 @item
16535 Luis Fernandes---design and graphics.
16536
16537 @item
16538 Erik Naggum---help, ideas, support, code and stuff.
16539
16540 @item
16541 Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el and many other things
16542 connected with @sc{mime} and other types of en/decoding.
16543
16544 @item
16545 Wes Hardaker---@file{gnus-picon.el} and the manual section on
16546 @dfn{picons} (@pxref{Picons}).
16547
16548 @item
16549 Kim-Minh Kaplan---further work on the picon code.
16550
16551 @item
16552 Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
16553 (@pxref{GroupLens}).
16554
16555 @item
16556 Sudish Joseph---innumerable bug fixes.
16557
16558 @item
16559 Ilja Weis---@file{gnus-topic.el}.
16560
16561 @item
16562 Steven L. Baur---lots and lots and lots of bugs detections and fixes.
16563
16564 @item
16565 Vladimir Alexiev---the refcard and reference booklets.
16566
16567 @item
16568 Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus
16569 distribution by Felix Lee and JWZ.
16570
16571 @item
16572 Scott Byer---@file{nnfolder.el} enhancements & rewrite.
16573
16574 @item
16575 Peter Mutsaers---orphan article scoring code.
16576
16577 @item
16578 Ken Raeburn---POP mail support.
16579
16580 @item
16581 Hallvard B Furuseth---various bits and pieces, especially dealing with
16582 .newsrc files.
16583
16584 @item
16585 Brian Edmonds---@file{gnus-bbdb.el}.
16586
16587 @item
16588 David Moore---rewrite of @file{nnvirtual.el} and many other things.
16589
16590 @item
16591 Kevin Davidson---came up with the name @dfn{ding}, so blame him.
16592
16593 @item
16594 François Pinard---many, many interesting and thorough bug reports, as
16595 well as autoconf support.
16596
16597 @end itemize
16598
16599 This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark
16600 Borges, and Jost Krieger proof-reading parts of the manual.
16601
16602 The following people have contributed many patches and suggestions:
16603
16604 Christopher Davis,
16605 Andrew Eskilsson,
16606 Kai Grossjohann,
16607 David KÃ¥gedal,
16608 Richard Pieri,
16609 Fabrice Popineau,
16610 Daniel Quinlan,
16611 Jason L. Tibbitts, III,
16612 and
16613 Jack Vinson.
16614
16615 Also thanks to the following for patches and stuff:
16616
16617 Jari Aalto,
16618 Adrian Aichner,
16619 Vladimir Alexiev,
16620 Russ Allbery,
16621 Peter Arius,
16622 Matt Armstrong,
16623 Marc Auslander,
16624 Miles Bader,
16625 Frank Bennett,
16626 Robert Bihlmeyer,
16627 Chris Bone,
16628 Mark Borges,
16629 Mark Boyns,
16630 Lance A. Brown,
16631 Kees de Bruin,
16632 Martin Buchholz,
16633 Joe Buehler,
16634 Kevin Buhr,
16635 Alastair Burt,
16636 Joao Cachopo,
16637 Zlatko Calusic,
16638 Massimo Campostrini,
16639 Castor,
16640 David Charlap,
16641 Dan Christensen,
16642 Kevin Christian,
16643 Michael R. Cook,
16644 Glenn Coombs,
16645 Frank D. Cringle,
16646 Geoffrey T. Dairiki,
16647 Andre Deparade,
16648 Ulrik Dickow,
16649 Dave Disser,
16650 Rui-Tao Dong, @c ?
16651 Joev Dubach,
16652 Michael Welsh Duggan,
16653 Dave Edmondson,
16654 Paul Eggert,
16655 Karl Eichwalder,
16656 Enami Tsugutomo, @c Enami
16657 Michael Ernst,
16658 Luc Van Eycken,
16659 Sam Falkner,
16660 Nelson Jose dos Santos Ferreira,
16661 Sigbjorn Finne,
16662 Paul Fisher,
16663 Decklin Foster,
16664 Gary D. Foster,
16665 Paul Franklin,
16666 Guy Geens,
16667 Arne Georg Gleditsch,
16668 David S. Goldberg,
16669 Michelangelo Grigni,
16670 Dale Hagglund,
16671 D. Hall,
16672 Magnus Hammerin,
16673 Kenichi Handa, @c Handa
16674 Raja R. Harinath,
16675 Yoshiki Hayashi, @c ?
16676 P. E. Jareth Hein,
16677 Hisashige Kenji, @c Hisashige
16678 Marc Horowitz,
16679 Gunnar Horrigmo,
16680 Richard Hoskins,
16681 Brad Howes,
16682 François Felix Ingrand,
16683 Ishikawa Ichiro, @c Ishikawa
16684 Lee Iverson,
16685 Iwamuro Motonori, @c Iwamuro
16686 Rajappa Iyer,
16687 Andreas Jaeger,
16688 Randell Jesup,
16689 Fred Johansen,
16690 Gareth Jones,
16691 Simon Josefsson,
16692 Greg Klanderman,
16693 Karl Kleinpaste,
16694 Peter Skov Knudsen,
16695 Shuhei Kobayashi, @c Kobayashi
16696 Koseki Yoshinori, @c Koseki
16697 Thor Kristoffersen,
16698 Jens Lautenbacher,
16699 Martin Larose,
16700 Seokchan Lee, @c Lee
16701 Joerg Lenneis,
16702 Carsten Leonhardt,
16703 James LewisMoss,
16704 Christian Limpach,
16705 Markus Linnala,
16706 Dave Love,
16707 Mike McEwan,
16708 Tonny Madsen,
16709 Shlomo Mahlab,
16710 Nat Makarevitch,
16711 Istvan Marko,
16712 David Martin,
16713 Jason R. Mastaler,
16714 Gordon Matzigkeit,
16715 Timo Metzemakers,
16716 Richard Mlynarik,
16717 Lantz Moore,
16718 Morioka Tomohiko, @c Morioka
16719 Erik Toubro Nielsen,
16720 Hrvoje Niksic,
16721 Andy Norman,
16722 Fred Oberhauser,
16723 C. R. Oldham,
16724 Alexandre Oliva,
16725 Ken Olstad,
16726 Masaharu Onishi, @c Onishi
16727 Hideki Ono, @c Ono
16728 William Perry,
16729 Stephen Peters,
16730 Jens-Ulrik Holger Petersen,
16731 Ulrich Pfeifer,
16732 Matt Pharr,
16733 Andy Piper,
16734 John McClary Prevost,
16735 Bill Pringlemeir,
16736 Mike Pullen,
16737 Jim Radford,
16738 Colin Rafferty,
16739 Lasse Rasinen,
16740 Lars Balker Rasmussen,
16741 Joe Reiss,
16742 Renaud Rioboo,
16743 Roland B. Roberts,
16744 Bart Robinson,
16745 Christian von Roques,
16746 Markus Rost,
16747 Jason Rumney,
16748 Wolfgang Rupprecht,
16749 Jay Sachs,
16750 Dewey M. Sasser,
16751 Conrad Sauerwald,
16752 Loren Schall,
16753 Dan Schmidt,
16754 Ralph Schleicher,
16755 Philippe Schnoebelen,
16756 Andreas Schwab,
16757 Randal L. Schwartz,
16758 Justin Sheehy,
16759 Danny Siu,
16760 Matt Simmons,
16761 Paul D. Smith,
16762 Jeff Sparkes,
16763 Toby Speight,
16764 Michael Sperber,
16765 Darren Stalder,
16766 Richard Stallman,
16767 Greg Stark,
16768 Sam Steingold,
16769 Jonas Steverud,
16770 Paul Stodghill,
16771 Kurt Swanson,
16772 Samuel Tardieu,
16773 Teddy,
16774 Chuck Thompson,
16775 Philippe Troin,
16776 James Troup,
16777 Trung Tran-Duc,
16778 Aaron M. Ucko,
16779 Aki Vehtari,
16780 Didier Verna,
16781 Jan Vroonhof,
16782 Stefan Waldherr,
16783 Pete Ware,
16784 Barry A. Warsaw,
16785 Christoph Wedler,
16786 Joe Wells,
16787 Lee Willis,
16788 Katsumi Yamaoka @c Yamaoka
16789 and
16790 Lloyd Zusman.
16791
16792
16793 For a full overview of what each person has done, the ChangeLogs
16794 included in the Gnus alpha distributions should give ample reading
16795 (550kB and counting).
16796
16797 Apologies to everybody that I've forgotten, of which there are many, I'm
16798 sure.
16799
16800 Gee, that's quite a list of people.  I guess that must mean that there
16801 actually are people who are using Gnus.  Who'd'a thunk it!
16802
16803
16804 @node New Features
16805 @subsection New Features
16806 @cindex new features
16807
16808 @menu
16809 * ding Gnus::          New things in Gnus 5.0/5.1, the first new Gnus.
16810 * September Gnus::     The Thing Formally Known As Gnus 5.3/5.3.
16811 * Red Gnus::           Third time best---Gnus 5.4/5.5.
16812 * Quassia Gnus::       Two times two is four, or Gnus 5.6/5.7.
16813 @end menu
16814
16815 These lists are, of course, just @emph{short} overviews of the
16816 @emph{most} important new features.  No, really.  There are tons more.
16817 Yes, we have feeping creaturism in full effect.
16818
16819
16820 @node ding Gnus
16821 @subsubsection (ding) Gnus
16822
16823 New features in Gnus 5.0/5.1:
16824
16825 @itemize @bullet
16826
16827 @item
16828 The look of all buffers can be changed by setting format-like variables
16829 (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}).
16830
16831 @item
16832 Local spool and several @sc{nntp} servers can be used at once
16833 (@pxref{Select Methods}).
16834
16835 @item
16836 You can combine groups into virtual groups (@pxref{Virtual Groups}).
16837
16838 @item
16839 You can read a number of different mail formats (@pxref{Getting Mail}).
16840 All the mail backends implement a convenient mail expiry scheme
16841 (@pxref{Expiring Mail}).
16842
16843 @item
16844 Gnus can use various strategies for gathering threads that have lost
16845 their roots (thereby gathering loose sub-threads into one thread) or it
16846 can go back and retrieve enough headers to build a complete thread
16847 (@pxref{Customizing Threading}).
16848
16849 @item
16850 Killed groups can be displayed in the group buffer, and you can read
16851 them as well (@pxref{Listing Groups}).
16852
16853 @item
16854 Gnus can do partial group updates---you do not have to retrieve the
16855 entire active file just to check for new articles in a few groups
16856 (@pxref{The Active File}).
16857
16858 @item
16859 Gnus implements a sliding scale of subscribedness to groups
16860 (@pxref{Group Levels}).
16861
16862 @item
16863 You can score articles according to any number of criteria
16864 (@pxref{Scoring}).  You can even get Gnus to find out how to score
16865 articles for you (@pxref{Adaptive Scoring}).
16866
16867 @item
16868 Gnus maintains a dribble buffer that is auto-saved the normal Emacs
16869 manner, so it should be difficult to lose much data on what you have
16870 read if your machine should go down (@pxref{Auto Save}).
16871
16872 @item
16873 Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up
16874 the @file{.emacs} file.
16875
16876 @item
16877 You can set the process mark on both groups and articles and perform
16878 operations on all the marked items (@pxref{Process/Prefix}).
16879
16880 @item
16881 You can grep through a subset of groups and create a group from the
16882 results (@pxref{Kibozed Groups}).
16883
16884 @item
16885 You can list subsets of groups according to, well, anything
16886 (@pxref{Listing Groups}).
16887
16888 @item
16889 You can browse foreign servers and subscribe to groups from those
16890 servers (@pxref{Browse Foreign Server}).
16891
16892 @item
16893 Gnus can fetch articles, asynchronously, on a second connection to the
16894 server (@pxref{Asynchronous Fetching}).
16895
16896 @item
16897 You can cache articles locally (@pxref{Article Caching}).
16898
16899 @item
16900 The uudecode functions have been expanded and generalized
16901 (@pxref{Decoding Articles}).
16902
16903 @item
16904 You can still post uuencoded articles, which was a little-known feature
16905 of @sc{gnus}' past (@pxref{Uuencoding and Posting}).
16906
16907 @item
16908 Fetching parents (and other articles) now actually works without
16909 glitches (@pxref{Finding the Parent}).
16910
16911 @item
16912 Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
16913
16914 @item
16915 Digests (and other files) can be used as the basis for groups
16916 (@pxref{Document Groups}).
16917
16918 @item
16919 Articles can be highlighted and customized (@pxref{Customizing
16920 Articles}).
16921
16922 @item
16923 URLs and other external references can be buttonized (@pxref{Article
16924 Buttons}).
16925
16926 @item
16927 You can do lots of strange stuff with the Gnus window & frame
16928 configuration (@pxref{Windows Configuration}).
16929
16930 @item
16931 You can click on buttons instead of using the keyboard
16932 (@pxref{Buttons}).
16933
16934 @end itemize
16935
16936
16937 @node September Gnus
16938 @subsubsection September Gnus
16939
16940 @iftex
16941 @iflatex
16942 \gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}}
16943 @end iflatex
16944 @end iftex
16945
16946 New features in Gnus 5.2/5.3:
16947
16948 @itemize @bullet
16949
16950 @item
16951 A new message composition mode is used.  All old customization variables
16952 for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
16953 now obsolete.
16954
16955 @item
16956 Gnus is now able to generate @dfn{sparse} threads---threads where
16957 missing articles are represented by empty nodes (@pxref{Customizing
16958 Threading}).
16959
16960 @lisp
16961 (setq gnus-build-sparse-threads 'some)
16962 @end lisp
16963
16964 @item
16965 Outgoing articles are stored on a special archive server
16966 (@pxref{Archived Messages}).
16967
16968 @item
16969 Partial thread regeneration now happens when articles are
16970 referred.
16971
16972 @item
16973 Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
16974
16975 @item
16976 Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}).
16977
16978 @item
16979 A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).
16980
16981 @lisp
16982 (setq gnus-use-trees t)
16983 @end lisp
16984
16985 @item
16986 An @code{nn}-like pick-and-read minor mode is available for the summary
16987 buffers (@pxref{Pick and Read}).
16988
16989 @lisp
16990 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
16991 @end lisp
16992
16993 @item
16994 In binary groups you can use a special binary minor mode (@pxref{Binary
16995 Groups}).
16996
16997 @item
16998 Groups can be grouped in a folding topic hierarchy (@pxref{Group
16999 Topics}).
17000
17001 @lisp
17002 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
17003 @end lisp
17004
17005 @item
17006 Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
17007
17008 @item
17009 Groups can now have a score, and bubbling based on entry frequency
17010 is possible (@pxref{Group Score}).
17011
17012 @lisp
17013 (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
17014 @end lisp
17015
17016 @item
17017 Groups can be process-marked, and commands can be performed on
17018 groups of groups (@pxref{Marking Groups}).
17019
17020 @item
17021 Caching is possible in virtual groups.
17022
17023 @item
17024 @code{nndoc} now understands all kinds of digests, mail boxes, rnews
17025 news batches, ClariNet briefs collections, and just about everything
17026 else (@pxref{Document Groups}).
17027
17028 @item
17029 Gnus has a new backend (@code{nnsoup}) to create/read SOUP packets
17030 (@pxref{SOUP}).
17031
17032 @item
17033 The Gnus cache is much faster.
17034
17035 @item
17036 Groups can be sorted according to many criteria (@pxref{Sorting
17037 Groups}).
17038
17039 @item
17040 New group parameters have been introduced to set list-addresses and
17041 expiry times (@pxref{Group Parameters}).
17042
17043 @item
17044 All formatting specs allow specifying faces to be used
17045 (@pxref{Formatting Fonts}).
17046
17047 @item
17048 There are several more commands for setting/removing/acting on process
17049 marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
17050
17051 @item
17052 The summary buffer can be limited to show parts of the available
17053 articles based on a wide range of criteria.  These commands have been
17054 bound to keys on the @kbd{/} submap (@pxref{Limiting}).
17055
17056 @item
17057 Articles can be made persistent with the @kbd{*} command
17058 (@pxref{Persistent Articles}).
17059
17060 @item
17061 All functions for hiding article elements are now toggles.
17062
17063 @item
17064 Article headers can be buttonized (@pxref{Article Washing}).
17065
17066 @item
17067 All mail backends support fetching articles by @code{Message-ID}.
17068
17069 @item
17070 Duplicate mail can now be treated properly (@pxref{Duplicates}).
17071
17072 @item
17073 All summary mode commands are available directly from the article
17074 buffer (@pxref{Article Keymap}).
17075
17076 @item
17077 Frames can be part of @code{gnus-buffer-configuration} (@pxref{Windows
17078 Configuration}).
17079
17080 @item
17081 Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
17082 @iftex
17083 @iflatex
17084 \marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}}
17085 @end iflatex
17086 @end iftex
17087
17088 @item
17089 Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
17090
17091 @lisp
17092 (setq gnus-use-nocem t)
17093 @end lisp
17094
17095 @item
17096 Groups can be made permanently visible (@pxref{Listing Groups}).
17097
17098 @lisp
17099 (setq gnus-permanently-visible-groups "^nnml:")
17100 @end lisp
17101
17102 @item
17103 Many new hooks have been introduced to make customizing easier.
17104
17105 @item
17106 Gnus respects the @code{Mail-Copies-To} header.
17107
17108 @item
17109 Threads can be gathered by looking at the @code{References} header
17110 (@pxref{Customizing Threading}).
17111
17112 @lisp
17113 (setq gnus-summary-thread-gathering-function
17114       'gnus-gather-threads-by-references)
17115 @end lisp
17116
17117 @item
17118 Read articles can be stored in a special backlog buffer to avoid
17119 refetching (@pxref{Article Backlog}).
17120
17121 @lisp
17122 (setq gnus-keep-backlog 50)
17123 @end lisp
17124
17125 @item
17126 A clean copy of the current article is always stored in a separate
17127 buffer to allow easier treatment.
17128
17129 @item
17130 Gnus can suggest where to save articles (@pxref{Saving Articles}).
17131
17132 @item
17133 Gnus doesn't have to do as much prompting when saving (@pxref{Saving
17134 Articles}).
17135
17136 @lisp
17137 (setq gnus-prompt-before-saving t)
17138 @end lisp
17139
17140 @item
17141 @code{gnus-uu} can view decoded files asynchronously while fetching
17142 articles (@pxref{Other Decode Variables}).
17143
17144 @lisp
17145 (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
17146 @end lisp
17147
17148 @item
17149 Filling in the article buffer now works properly on cited text
17150 (@pxref{Article Washing}).
17151
17152 @item
17153 Hiding cited text adds buttons to toggle hiding, and how much
17154 cited text to hide is now customizable (@pxref{Article Hiding}).
17155
17156 @lisp
17157 (setq gnus-cited-lines-visible 2)
17158 @end lisp
17159
17160 @item
17161 Boring headers can be hidden (@pxref{Article Hiding}).
17162
17163 @item
17164 Default scoring values can now be set from the menu bar.
17165
17166 @item
17167 Further syntax checking of outgoing articles have been added.
17168
17169 @end itemize
17170
17171
17172 @node Red Gnus
17173 @subsubsection Red Gnus
17174
17175 New features in Gnus 5.4/5.5:
17176
17177 @iftex
17178 @iflatex
17179 \gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}}
17180 @end iflatex
17181 @end iftex
17182
17183 @itemize @bullet
17184
17185 @item
17186 @file{nntp.el} has been totally rewritten in an asynchronous fashion.
17187
17188 @item
17189 Article prefetching functionality has been moved up into
17190 Gnus (@pxref{Asynchronous Fetching}).
17191
17192 @item
17193 Scoring can now be performed with logical operators like @code{and},
17194 @code{or}, @code{not}, and parent redirection (@pxref{Advanced
17195 Scoring}).
17196
17197 @item
17198 Article washing status can be displayed in the
17199 article mode line (@pxref{Misc Article}).
17200
17201 @item
17202 @file{gnus.el} has been split into many smaller files.
17203
17204 @item
17205 Suppression of duplicate articles based on Message-ID can be done
17206 (@pxref{Duplicate Suppression}).
17207
17208 @lisp
17209 (setq gnus-suppress-duplicates t)
17210 @end lisp
17211
17212 @item
17213 New variables for specifying what score and adapt files are to be
17214 considered home score and adapt files (@pxref{Home Score File}) have
17215 been added.
17216
17217 @item
17218 @code{nndoc} was rewritten to be easily extendable (@pxref{Document
17219 Server Internals}).
17220
17221 @item
17222 Groups can inherit group parameters from parent topics (@pxref{Topic
17223 Parameters}).
17224
17225 @item
17226 Article editing has been revamped and is now actually usable.
17227
17228 @item
17229 Signatures can be recognized in more intelligent fashions
17230 (@pxref{Article Signature}).
17231
17232 @item
17233 Summary pick mode has been made to look more @code{nn}-like.  Line
17234 numbers are displayed and the @kbd{.} command can be used to pick
17235 articles (@code{Pick and Read}).
17236
17237 @item
17238 Commands for moving the @file{.newsrc.eld} from one server to
17239 another have been added (@pxref{Changing Servers}).
17240
17241 @item
17242 There's a way now to specify that ``uninteresting'' fields be suppressed
17243 when generating lines in buffers (@pxref{Advanced Formatting}).
17244
17245 @item
17246 Several commands in the group buffer can be undone with @kbd{M-C-_}
17247 (@pxref{Undo}).
17248
17249 @item
17250 Scoring can be done on words using the new score type @code{w}
17251 (@pxref{Score File Format}).
17252
17253 @item
17254 Adaptive scoring can be done on a Subject word-by-word basis
17255 (@pxref{Adaptive Scoring}).
17256
17257 @lisp
17258 (setq gnus-use-adaptive-scoring '(word))
17259 @end lisp
17260
17261 @item
17262 Scores can be decayed (@pxref{Score Decays}).
17263
17264 @lisp
17265 (setq gnus-decay-scores t)
17266 @end lisp
17267
17268 @item
17269 Scoring can be performed using a regexp on the Date header.  The Date is
17270 normalized to compact ISO 8601 format first (@pxref{Score File Format}).
17271
17272 @item
17273 A new command has been added to remove all data on articles from
17274 the native server (@pxref{Changing Servers}).
17275
17276 @item
17277 A new command for reading collections of documents
17278 (@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{M-C-d}
17279 (@pxref{Really Various Summary Commands}).
17280
17281 @item
17282 Process mark sets can be pushed and popped (@pxref{Setting Process
17283 Marks}).
17284
17285 @item
17286 A new mail-to-news backend makes it possible to post even when the NNTP
17287 server doesn't allow posting (@pxref{Mail-To-News Gateways}).
17288
17289 @item
17290 A new backend for reading searches from Web search engines
17291 (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
17292 (@pxref{Web Searches}).
17293
17294 @item
17295 Groups inside topics can now be sorted using the standard sorting
17296 functions, and each topic can be sorted independently (@pxref{Topic
17297 Sorting}).
17298
17299 @item
17300 Subsets of the groups can be sorted independently (@code{Sorting
17301 Groups}).
17302
17303 @item
17304 Cached articles can be pulled into the groups (@pxref{Summary Generation
17305 Commands}).
17306 @iftex
17307 @iflatex
17308 \marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}}
17309 @end iflatex
17310 @end iftex
17311
17312 @item
17313 Score files are now applied in a more reliable order (@pxref{Score
17314 Variables}).
17315
17316 @item
17317 Reports on where mail messages end up can be generated (@pxref{Splitting
17318 Mail}).
17319
17320 @item
17321 More hooks and functions have been added to remove junk from incoming
17322 mail before saving the mail (@pxref{Washing Mail}).
17323
17324 @item
17325 Emphasized text can be properly fontisized:
17326
17327 @end itemize
17328
17329
17330 @node Quassia Gnus
17331 @subsubsection Quassia Gnus
17332
17333 New features in Gnus 5.6:
17334
17335 @itemize @bullet
17336
17337 @item
17338 New functionality for using Gnus as an offline newsreader has been
17339 added.  A plethora of new commands and modes have been added.  See
17340 @pxref{Gnus Unplugged} for the full story.
17341
17342 @item
17343  The @code{nndraft} backend has returned, but works differently than
17344 before.  All Message buffers are now also articles in the @code{nndraft}
17345 group, which is created automatically.
17346
17347 @item
17348 @code{gnus-alter-header-function} can now be used to alter header
17349 values.
17350
17351 @item
17352  @code{gnus-summary-goto-article} now accept Message-ID's.
17353
17354 @item
17355  A new Message command for deleting text in the body of a message
17356 outside the region: @kbd{C-c C-v}.
17357
17358 @item
17359  You can now post to component group in @code{nnvirtual} groups with
17360 @kbd{C-u C-c C-c}.
17361
17362 @item
17363  @code{nntp-rlogin-program}---new variable to ease customization.
17364
17365 @item
17366  @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit
17367 re-highlighting of the article buffer.
17368
17369 @item
17370  New element in @code{gnus-boring-article-headers}---@code{long-to}.
17371
17372 @item
17373  @kbd{M-i} symbolic prefix command.  See the section "Symbolic
17374 Prefixes" in the Gnus manual for details.
17375
17376 @item
17377  @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix
17378 @kbd{a} to add the score rule to the "all.SCORE" file.
17379
17380 @item
17381  @code{gnus-simplify-subject-functions} variable to allow greater
17382 control over simplification.
17383
17384 @item
17385  @kbd{A T}---new command for fetching the current thread.
17386
17387 @item
17388  @kbd{/ T}---new command for including the current thread in the
17389 limit.
17390
17391 @item
17392  @kbd{M-RET} is a new Message command for breaking cited text.
17393
17394 @item
17395  @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}.
17396
17397 @item
17398  The @code{custom-face-lookup} function has been removed.
17399 If you used this function in your initialization files, you must
17400 rewrite them to use @code{face-spec-set} instead.
17401
17402 @item
17403  Canceling now uses the current select method.  Symbolic prefix
17404 @kbd{a} forces normal posting method.
17405
17406 @item
17407  New command to translate M******** sm*rtq**t*s into proper
17408 text---@kbd{W d}.
17409
17410 @item
17411  For easier debugging of @code{nntp}, you can set
17412 @code{nntp-record-commands} to a non-@code{nil} value.
17413
17414 @item
17415  @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for
17416 controlling where and how to send @sc{authinfo} to @sc{nntp} servers.
17417
17418 @item
17419  A command for editing group parameters from the summary buffer
17420 has been added.
17421
17422 @item
17423  A history of where mails have been split is available.
17424
17425 @item
17426  A new article date command has been added---@code{article-date-iso8601}.
17427
17428 @item
17429  Subjects can be simplified when threading by setting
17430 @code{gnus-score-thread-simplify}.
17431
17432 @item
17433  A new function for citing in Message has been
17434 added---@code{message-cite-original-without-signature}.
17435
17436 @item
17437  @code{article-strip-all-blank-lines}---new article command.
17438
17439 @item
17440  A new Message command to kill to the end of the article has
17441 been added.
17442
17443 @item
17444  A minimum adaptive score can be specified by using the
17445 @code{gnus-adaptive-word-minimum} variable.
17446
17447 @item
17448  The "lapsed date" article header can be kept continually
17449 updated by the @code{gnus-start-date-timer} command.
17450
17451 @item
17452  Web listserv archives can be read with the @code{nnlistserv} backend.
17453
17454 @item
17455  Old dejanews archives can now be read by @code{nnweb}.
17456
17457 @end itemize
17458
17459
17460 @node Newest Features
17461 @subsection Newest Features
17462 @cindex todo
17463
17464 Also known as the @dfn{todo list}.  Sure to be implemented before the
17465 next millennium.
17466
17467 Be afraid.  Be very afraid.
17468
17469 (That a feature appears in this list doesn't necessarily mean that I've
17470 decided to actually implement it.  It just means that I think it sounds
17471 interesting.)
17472
17473 (Yes, this is the actual, up-to-the-second todo list.)
17474
17475 @itemize @bullet
17476
17477 @item
17478  I would like the zombie-page to contain an URL to the source of the
17479 latest version of gnus or some explanation on where to find it.
17480
17481 @item
17482  A way to continue editing the latest Message composition.
17483
17484 @item
17485  http://www.sonicnet.com/feature/ari3/
17486
17487 @item
17488  facep is not declared.
17489
17490 @item
17491  Include a section in the manual on why the number of articles
17492 isn't the same in the group buffer and on the SPC prompt.
17493
17494 @item
17495  Interacting with rmail fcc isn't easy.
17496
17497 @item
17498 @example
17499  Hypermail:
17500 <URL:http://www.falch.no/people/pepper/DSSSL-Lite/archives/>
17501 <URL:http://www.eit.com/software/hypermail/hypermail.html>
17502 <URL:http://homer.ncm.com/>
17503 <URL:http://www.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/HTML_Converters/>
17504 http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610/index.html
17505 <URL:http://union.ncsa.uiuc.edu/HyperNews/get/www/html/converters.html>
17506 http://www.miranova.com/gnus-list/
17507
17508 @end example
17509
17510 @item
17511 @samp{^-- } is made into - in LaTeX.
17512
17513 @item
17514  gnus-kill is much slower than it was in GNUS 4.1.3.
17515
17516 @item
17517  when expunging articles on low score, the sparse nodes keep hanging on?
17518 @item
17519  starting the first time seems to hang Gnus on some systems.  Does
17520 NEWGROUPS answer too fast?
17521 @item
17522  nndir doesn't read gzipped files.
17523 @item
17524  FAQ doesn't have an up node?
17525 @item
17526  when moving mail from a procmail spool to the crash-box,
17527 the crash-box is only appropriate to one specific group.
17528 @item
17529  `t' `t' makes X-Faces disappear.
17530 @item
17531  nnmh-be-safe means that crossposted articles will
17532 be marked as unread.
17533 @item
17534  Orphan score entries don't show on "V t" score trace
17535 @item
17536  when clearing out data, the cache data should also be reset.
17537 @item
17538  rewrite gnus-summary-limit-children to be non-recursive
17539 to avoid exceeding lisp nesting on huge groups.
17540 @item
17541  expunged articles are counted when computing scores.
17542 @item
17543  implement gnus-batch-brew-soup
17544 @item
17545  ticked articles aren't easy to read in pick mode -- `n' and
17546 stuff just skips past them.  Read articles are the same.
17547 @item
17548  topics that contain just groups with ticked
17549 articles aren't displayed.
17550 @item
17551  nndoc should always allocate unique Message-IDs.
17552 @item
17553  If there are mail groups the first time you use Gnus, Gnus'll
17554 make the mail groups killed.
17555 @item
17556  no "no news is good news" when using topics.
17557 @item
17558  when doing crosspost marking, the cache has to be consulted
17559 and articles have to be removed.
17560 @item
17561  nnweb should fetch complete articles when they are split into several
17562 parts.
17563 @item
17564  scoring on head immediate doesn't work.
17565 @item
17566  finding short score file names takes forever.
17567 @item
17568  canceling articles in foreign groups.
17569 @item
17570  nntp-open-rlogin no longer works.
17571 @item
17572  C-u C-x C-s (Summary) switches to the group buffer.
17573 @item
17574  move nnmail-split-history out to the backends.
17575 @item
17576  nnweb doesn't work properly.
17577 @item
17578  using a virtual server name as `gnus-select-method' doesn't work?
17579 @item
17580  when killing/yanking a group from one topic to another in a slave, the
17581 master will yank it first to one topic and then add it to another.
17582 Perhaps.
17583
17584 @item
17585  warn user about `=' redirection of a group in the active file?
17586 @item
17587  take over the XEmacs menubar and offer a toggle between the XEmacs
17588 bar and the Gnus bar.
17589 @item
17590 @example
17591  push active file and NOV file parsing down into C code.
17592 `(canonize-message-id id)'
17593 `(mail-parent-message-id references n)'
17594 `(parse-news-nov-line &optional dependency-hashtb)'
17595 `(parse-news-nov-region beg end &optional dependency-hashtb fullp)'
17596 `(parse-news-active-region beg end hashtb)'
17597
17598 @end example
17599
17600 @item
17601  nnml .overview directory with splits.
17602 @item
17603  asynchronous cache
17604 @item
17605  postponed commands.
17606 @item
17607  the selected article show have its Subject displayed in its summary line.
17608 @item
17609  when entering groups, get the real number of unread articles from
17610 the server?
17611 @item
17612  sort after gathering threads -- make false roots have the
17613 headers of the oldest orphan with a 0 article number?
17614 @item
17615  nndoc groups should inherit the score files of their parents?  Also
17616 inherit copy prompts and save files.
17617 @item
17618  command to start up Gnus (if not running) and enter a mail mode buffer.
17619 @item
17620  allow editing the group description from the group buffer
17621 for backends that support that.
17622 @item
17623 gnus-hide,show-all-topics
17624 @item
17625  groups and sub-topics should be allowed to mingle inside each topic,
17626 and not just list all subtopics at the end.
17627 @item
17628  a command to remove all read articles that are not needed to connect
17629 threads -- `gnus-summary-limit-to-sparse-unread'?
17630 @item
17631  a variable to turn off limiting/cutting of threads in the tree buffer.
17632 @item
17633  a variable to limit how many files are uudecoded.
17634 @item
17635  add zombie groups to a special "New Groups" topic.
17636 @item
17637  server mode command: close/open all connections
17638 @item
17639  put a file date in gnus-score-alist and check whether the file
17640 has been changed before using it.
17641 @item
17642  on exit from a digest group, go to the next article in the parent group.
17643 @item
17644  hide (sub)threads with low score.
17645 @item
17646  when expiring, remove all marks from expired articles.
17647 @item
17648  gnus-summary-limit-to-body
17649 @item
17650  a regexp alist that says what level groups are to be subscribed
17651 on.  Eg. -- `(("nnml:" . 1))'.
17652 @item
17653  easier interface to nnkiboze to create ephemeral groups that
17654 contain groups that match a regexp.
17655 @item
17656  allow newlines in <URL:> urls, but remove them before using
17657 the URL.
17658 @item
17659  If there is no From line, the mail backends should fudge one from the
17660 "From " line.
17661 @item
17662  fuzzy simplifying should strip all non-alpha-numerical info
17663 from subject lines.
17664 @item
17665  gnus-soup-brew-soup-with-high-scores.
17666 @item
17667  nntp-ping-before-connect
17668 @item
17669  command to check whether NOV is evil.  "list overview.fmt".
17670 @item
17671  when entering a group, Gnus should look through the score
17672 files very early for `local' atoms and set those local variables.
17673 @item
17674  message annotations.
17675 @item
17676  topics are always yanked before groups, and that's not good.
17677 @item
17678  (set-extent-property extent 'help-echo "String to display in minibuf")
17679 to display help in the minibuffer on buttons under XEmacs.
17680 @item
17681  allow group line format spec to say how many articles there
17682 are in the cache.
17683 @item
17684  AUTHINFO GENERIC
17685 @item
17686  support qmail maildir spools
17687 @item
17688  `run-with-idle-timer' in gnus-demon.
17689 @item
17690  stop using invisible text properties and start using overlays instead
17691 @item
17692  C-c C-f C-e to add an Expires header.
17693 @item
17694  go from one group to the next; everything is expunged; go to the
17695 next group instead of going to the group buffer.
17696 @item
17697  gnus-renumber-cache -- to renumber the cache using "low" numbers.
17698 @item
17699  record topic changes in the dribble buffer.
17700 @item
17701  `nnfolder-generate-active-file' should look at the folders it
17702 finds and generate proper active ranges.
17703 @item
17704  nneething-look-in-files-for-article-heads variable to control
17705 whether nneething should sniff all files in the directories.
17706 @item
17707  gnus-fetch-article -- start Gnus, enter group, display article
17708 @item
17709  gnus-dont-move-articles-to-same-group variable when respooling.
17710 @item
17711  when messages are crossposted between several auto-expirable groups,
17712 articles aren't properly marked as expirable.
17713 @item
17714  nneething should allow deletion/moving.
17715 @item
17716  TAB on the last button should go to the first button.
17717 @item
17718  if the car of an element in `mail-split-methods' is a function,
17719 and the function returns non-nil, use that as the name of the group(s) to
17720 save mail in.
17721 @item
17722  command for listing all score files that have been applied.
17723 @item
17724  a command in the article buffer to return to `summary' config.
17725 @item
17726  `gnus-always-post-using-current-server' -- variable to override
17727 `C-c C-c' when posting.
17728 @item
17729  nnmail-group-spool-alist -- says where each group should use
17730 as a spool file.
17731 @item
17732  when an article is crossposted to an auto-expirable group, the article
17733 should be marker as expirable.
17734 @item
17735  article mode command/menu for "send region as URL to browser".
17736 @item
17737  on errors, jump to info nodes that explain the error.  For instance,
17738 on invalid From headers, or on error messages from the nntp server.
17739 @item
17740  when gathering threads, make the article that has no "Re: " the parent.
17741 Also consult Date headers.
17742 @item
17743  a token in splits to call shrink-window-if-larger-than-buffer
17744 @item
17745  `1 0 A M' to do matches on the active hashtb.
17746 @item
17747  duplicates -- command to remove Gnus-Warning header, use the read
17748 Message-ID, delete the "original".
17749 @item
17750  when replying to several messages at once, put the "other" message-ids
17751 into a See-Also header.
17752 @item
17753  support setext: URL:http://www.bsdi.com/setext/
17754 @item
17755  support ProleText: <URL:http://proletext.clari.net/prole/proletext.html>
17756 @item
17757  when browsing a foreign server, the groups that are already subscribed
17758 should be listed as such and not as "K".
17759 @item
17760  generate font names dynamically.
17761 @item
17762  score file mode auto-alist.
17763 @item
17764  allow nndoc to change/add/delete things from documents.  Implement
17765 methods for each format for adding an article to the document.
17766 @item
17767  `gnus-fetch-old-headers' `all' value to incorporate
17768 absolutely all headers there is.
17769 @item
17770  function like `|', but concatenate all marked articles
17771 and pipe them to the process.
17772 @item
17773  cache the list of killed (or active) groups in a separate file.  Update
17774 the file whenever we read the active file or the list
17775 of killed groups in the .eld file reaches a certain length.
17776 @item
17777  function for starting to edit a file to put into
17778 the current mail group.
17779 @item
17780  score-find-trace should display the total score of the article.
17781 @item
17782  "ghettozie" -- score on Xref header and nix it out after using it
17783 to avoid marking as read in other groups it has been crossposted to.
17784 @item
17785  look at procmail splitting.  The backends should create
17786 the groups automatically if a spool file exists for that group.
17787 @item
17788  function for backends to register themselves with Gnus.
17789 @item
17790  when replying to several process-marked articles,
17791 have all the From end up in Cc headers?  Variable to toggle.
17792 @item
17793  command to delete a crossposted mail article from all
17794 groups it has been mailed to.
17795 @item
17796  `B c' and `B m' should be crosspost aware.
17797 @item
17798  hide-pgp should also hide PGP public key blocks.
17799 @item
17800  Command in the group buffer to respool process-marked groups.
17801 @item
17802  `gnus-summary-find-matching' should accept
17803 pseudo-"headers" like "body", "head" and "all"
17804 @item
17805  When buttifying <URL: > things, all white space (including
17806 newlines) should be ignored.
17807 @item
17808  Process-marking all groups in a topic should process-mark
17809 groups in subtopics as well.
17810 @item
17811  Add non-native groups to the list of killed groups when killing them.
17812 @item
17813  nntp-suggest-kewl-config to probe the nntp server and suggest
17814 variable settings.
17815 @item
17816  add edit and forward secondary marks.
17817 @item
17818  nnml shouldn't visit its .overview files.
17819 @item
17820  allow customizing sorting within gathered threads.
17821 @item
17822  `B q' shouldn't select the current article.
17823 @item
17824  nnmbox should support a newsgroups file for descriptions.
17825 @item
17826  allow fetching mail from several pop servers.
17827 @item
17828  Be able to specify whether the saving commands save the original
17829 or the formatted article.
17830 @item
17831  a command to reparent with the child process-marked (cf. `T ^'.).
17832 @item
17833  I think the possibility to send a password with nntp-open-rlogin
17834 should be a feature in Red Gnus.
17835 @item
17836  The `Z n' command should be possible to execute from a mouse click.
17837 @item
17838  more limiting functions -- date, etc.
17839 @item
17840  be able to limit on a random header; on body; using reverse matches.
17841 @item
17842  a group parameter (`absofucking-total-expiry') that will make Gnus expire
17843 even unread articles.
17844 @item
17845  a command to print the article buffer as postscript.
17846 @item
17847  variable to disable password fetching when opening by nntp-open-telnet.
17848 @item
17849  manual: more example servers -- nntp with rlogin, telnet
17850 @item
17851  checking for bogus groups should clean topic alists as well.
17852 @item
17853  canceling articles in foreign groups.
17854 @item
17855  article number in folded topics isn't properly updated by
17856 Xref handling.
17857 @item
17858  Movement in the group buffer to the next unread group should go to the
17859 next closed topic with unread messages if no group can be found.
17860 @item
17861  Extensive info pages generated on the fly with help everywhere --
17862 in the "*Gnus edit*" buffers, for instance.
17863 @item
17864  Topic movement commands -- like thread movement.  Up, down, forward, next.
17865 @item
17866  a way to tick/mark as read Gcc'd articles.
17867 @item
17868  a way to say that all groups within a specific topic comes
17869 from a particular server?  Hm.
17870 @item
17871  `gnus-article-fill-if-long-lines' -- a function to fill
17872 the article buffer if there are any looong lines there.
17873 @item
17874  `T h' should jump to the parent topic and fold it.
17875 @item
17876  a command to create an ephemeral nndoc group out of a file,
17877 and then splitting it/moving it to some other group/backend.
17878 @item
17879  a group parameter for nnkiboze groups that says that
17880 all kibozed articles should be entered into the cache.
17881 @item
17882  It should also probably be possible to delimit what
17883 `gnus-jog-cache' does -- for instance, work on just some groups, or on
17884 some levels, and entering just articles that have a score higher than
17885 a certain number.
17886 @item
17887  nnfolder should append to the folder instead of re-writing
17888 the entire folder to disk when accepting new messages.
17889 @item
17890  allow all backends to do the proper thing with .gz files.
17891 @item
17892  a backend for reading collections of babyl files nnbabylfolder?
17893 @item
17894  a command for making the native groups into foreign groups.
17895 @item
17896  server mode command for clearing read marks from all groups
17897 from a server.
17898 @item
17899  when following up multiple articles, include all To, Cc, etc headers
17900 from all articles.
17901 @item
17902  a command for deciding what the total score of the current
17903 thread is.  Also a way to highlight based on this.
17904 @item
17905  command to show and edit group scores
17906 @item
17907  a gnus-tree-minimize-horizontal to minimize tree buffers
17908 horizontally.
17909 @item
17910  command to generate nnml overview file for one group.
17911 @item
17912  `C-u C-u a' -- prompt for many crossposted groups.
17913 @item
17914  keep track of which mail groups have received new articles (in this session).
17915 Be able to generate a report and perhaps do some marking in the group
17916 buffer.
17917 @item
17918  gnus-build-sparse-threads to a number -- build only sparse threads
17919 that are of that length.
17920 @item
17921  have nnmh respect mh's unseen sequence in .mh_profile.
17922 @item
17923  cache the newsgroups descriptions locally.
17924 @item
17925  asynchronous posting under nntp.
17926 @item
17927  be able to control word adaptive scoring from the score files.
17928 @item
17929  a variable to make `C-c C-c' post using the "current" select method.
17930 @item
17931  `limit-exclude-low-scored-articles'.
17932 @item
17933  if `gnus-summary-show-thread' is a number, hide threads that have
17934 a score lower than this number.
17935 @item
17936  split newsgroup subscription variable up into "order" and "method".
17937 @item
17938  buttonize ange-ftp file names.
17939 @item
17940  a command to make a duplicate copy of the current article
17941 so that each copy can be edited separately.
17942 @item
17943  nnweb should allow fetching from the local nntp server.
17944 @item
17945  record the sorting done in the summary buffer so that
17946 it can be repeated when limiting/regenerating the buffer.
17947 @item
17948  nnml-generate-nov-databses should generate for
17949 all nnml servers.
17950 @item
17951  when the user does commands in the group buffer, check
17952 the modification time of the .newsrc.eld file and use
17953 ask-user-about-supersession-threat.  Also warn when trying
17954 to save .newsrc.eld and it has changed.
17955 @item
17956  M-g on a topic will display all groups with 0 articles in
17957 the topic.
17958 @item
17959  command to remove all topic stuff.
17960 @item
17961  allow exploding incoming digests when reading incoming mail
17962 and splitting the resulting digests.
17963 @item
17964  nnsoup shouldn't set the `message-' variables.
17965 @item
17966  command to nix out all nnoo state information.
17967 @item
17968  nnmail-process-alist that calls functions if group names
17969 matches an alist -- before saving.
17970 @item
17971  use buffer-invisibility-spec everywhere for hiding text.
17972 @item
17973  variable to activate each group before entering them
17974 to get the (new) number of articles.  `gnus-activate-before-entering'.
17975 @item
17976  command to fetch a Message-ID from any buffer, even
17977 starting Gnus first if necessary.
17978 @item
17979  when posting and checking whether a group exists or not, just
17980 ask the nntp server instead of relying on the active hashtb.
17981 @item
17982  buttonize the output of `C-c C-a' in an apropos-like way.
17983 @item
17984  `G p' should understand process/prefix, and allow editing
17985 of several groups at once.
17986 @item
17987  command to create an ephemeral nnvirtual group that
17988 matches some regexp(s).
17989 @item
17990  nndoc should understand "Content-Type: message/rfc822" forwarded messages.
17991 @item
17992  it should be possible to score "thread" on the From header.
17993 @item
17994  hitting RET on a "gnus-uu-archive" pseudo article should unpack it.
17995 @item
17996  `B i' should display the article at once in the summary buffer.
17997 @item
17998  remove the "*" mark at once when unticking an article.
17999 @item
18000  `M-s' should highlight the matching text.
18001 @item
18002  when checking for duplicated mails, use Resent-Message-ID if present.
18003 @item
18004  killing and yanking groups in topics should be better.  If killing one copy
18005 of a group that exists in multiple topics, only that copy should
18006 be removed.  Yanking should insert the copy, and yanking topics
18007 should be possible to be interspersed with the other yankings.
18008 @item
18009  command for enter a group just to read the cached articles.  A way to say
18010 "ignore the nntp connection; just read from the cache."
18011 @item
18012  `X u' should decode base64 articles.
18013 @item
18014  a way to hide all "inner" cited text, leaving just the most
18015 recently cited text.
18016 @item
18017  nnvirtual should be asynchronous.
18018 @item
18019  after editing an article, gnus-original-article-buffer should
18020 be invalidated.
18021 @item
18022  there should probably be a way to make Gnus not connect to the
18023 server and just read the articles in the server
18024 @item
18025  allow a `set-default' (or something) to change the default
18026 value of nnoo variables.
18027 @item
18028  a command to import group infos from a .newsrc.eld file.
18029 @item
18030  groups from secondary servers have the entire select method
18031 listed in each group info.
18032 @item
18033  a command for just switching from the summary buffer to the group
18034 buffer.
18035 @item
18036  a way to specify that some incoming mail washing functions
18037 should only be applied to some groups.
18038 @item
18039  Message `C-f C-t' should ask the user whether to heed
18040 mail-copies-to: never.
18041 @item
18042  new group parameter -- `post-to-server' that says to post
18043 using the current server.  Also a variable to do the same.
18044 @item
18045  the slave dribble files should auto-save to the slave file names.
18046 @item
18047  a group parameter that says what articles to display on group entry, based
18048 on article marks.
18049 @item
18050  a way to visually distinguish slave Gnusae from masters.  (Whip instead
18051 of normal logo?)
18052 @item
18053  Use DJ Bernstein "From " quoting/dequoting, where applicable.
18054 @item
18055  Why is hide-citation-maybe and hide-citation different?  Also
18056 clear up info.
18057 @item
18058  group user-defined meta-parameters.
18059
18060
18061
18062 From: John Griffith <griffith@@sfs.nphil.uni-tuebingen.de>
18063 @item
18064  I like the option for trying to retrieve the FAQ for a group and I was
18065 thinking it would be great if for those newsgroups that had archives
18066 you could also try to read the archive for that group.  Part of the
18067 problem is that archives are spread all over the net, unlike FAQs.
18068 What would be best I suppose is to find the one closest to your site.
18069
18070 In any case, there is a list of general news group archives at @*
18071 ftp://ftp.neosoft.com/pub/users/claird/news.lists/newsgroup_archives.html
18072
18073
18074
18075
18076 @item
18077 @example
18078 From: Jason L Tibbitts III <tibbs@@hpc.uh.edu>
18079 (add-hook 'gnus-select-group-hook
18080   (lambda ()
18081     (gnus-group-add-parameter group
18082        (cons 'gnus-group-date-last-entered (list (current-time-string))))))
18083
18084 (defun gnus-user-format-function-d (headers)
18085   "Return the date the group was last read."
18086   (cond ((car (gnus-group-get-parameter gnus-tmp-group 'gnus-group-date-last-entered)))
18087       (t "")))
18088 @end example
18089
18090 @item
18091  tanken var at nÃ¥r du bruker `gnus-startup-file' som prefix (FOO) til Ã¥ lete
18092 opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den være en
18093 liste hvor du bruker hvert element i listen som FOO, istedet.  da kunne man
18094 hatt forskjellige serveres startup-filer forskjellige steder.
18095
18096
18097 @item
18098 LMI> Well, nnbabyl could alter the group info to heed labels like
18099 LMI> answered and read, I guess.
18100
18101 It could also keep them updated (the same for the Status: header of
18102 unix mbox files).
18103
18104 They could be used like this:
18105
18106
18107 @example
18108 `M l <name> RET' add label <name> to current message.
18109 `M u <name> RET' remove label <name> from current message.
18110 `/ l <expr> RET' limit summary buffer according to <expr>.
18111
18112 <expr> would be a boolean expression on the labels, e.g.
18113
18114 `/ l bug & !fixed RET'
18115 @end example
18116
18117 would show all the messages which are labeled `bug' but not labeled
18118 `fixed'.
18119
18120 One could also imagine the labels being used for highlighting, or
18121 affect the summary line format.
18122
18123
18124 @item
18125 Sender: abraham@@dina.kvl.dk
18126
18127 I'd like a gnus-find-file which work like find file, except that it
18128 would recognize things that looks like messages or folders:
18129
18130 - If it is a directory containing numbered files, create an nndir
18131 summary buffer.
18132
18133 - For other directories, create a nneething summary buffer.
18134
18135 - For files matching "\\`From ", create a nndoc/mbox summary.
18136
18137 - For files matching "\\`BABYL OPTIONS:", create a nndoc/baby summary.
18138
18139 - For files matching "\\`[^ \t\n]+:", create an *Article* buffer.
18140
18141 - For other files, just find them normally.
18142
18143 I'd like `nneething' to use this function, so it would work on a
18144 directory potentially containing mboxes or babyl files.
18145
18146 @item
18147 Please send a mail to bwarsaw@@cnri.reston.va.us (Barry A. Warsaw) and
18148 tell him what you are doing.
18149
18150 @item
18151 Currently, I get prompted:
18152
18153 decend into sci?
18154 - type y
18155 decend into sci.something ?
18156 - type n
18157 decend into ucd?
18158
18159 The problem above is that since there is really only one subsection of
18160 science, shouldn't it prompt you for only descending sci.something?  If
18161 there was a sci.somethingelse group or section, then it should prompt
18162 for sci? first the sci.something? then sci.somethingelse?...
18163
18164 @item
18165 Ja, det burde være en mÃ¥te Ã¥ si slikt.  Kanskje en ny variabel?
18166 `gnus-use-few-score-files'?  SÃ¥ kunne score-regler legges til den
18167 "mest" lokale score-fila.  F. eks. ville no-gruppene betjenes av
18168 "no.all.SCORE", osv.
18169
18170 @item
18171 What i want is for Gnus to treat any sequence or combination of the following
18172 as a single spoiler warning and hide it all, replacing it with a "Next Page"
18173 button:
18174
18175
18176 ^L's
18177
18178 more than n blank lines
18179
18180 more than m identical lines
18181 (which should be replaced with button to show them)
18182
18183 any whitespace surrounding any of the above
18184
18185
18186 @item
18187 Well, we could allow a new value to `gnus-thread-ignore-subject' --
18188 `spaces', or something.  (We could even default to that.)  And then
18189 subjects that differ in white space only could be considered the
18190 "same" subject for threading purposes.
18191
18192 @item
18193 Modes to preprocess the contents (e.g. jka-compr) use the second form
18194 "(REGEXP FUNCTION NON-NIL)" while ordinary modes (e.g. tex) use the first
18195 form "(REGEXP . FUNCTION)", so you could use it to distinguish between
18196 those two types of modes. (auto-modes-alist, insert-file-contents-literally.)
18197
18198 @item
18199  Under XEmacs -- do funny article marks:
18200 tick - thumb tack
18201 killed - skull
18202 soup - bowl of soup
18203 score below - dim light bulb
18204 score over - bright light bulb
18205
18206 @item
18207 Yes. I think the algorithm is as follows:
18208
18209 @example
18210 Group-mode
18211
18212    show-list-of-articles-in-group
18213         if (key-pressed == SPACE)
18214                 if (no-more-articles-in-group-to-select)
18215                         if (articles-selected)
18216                                 start-reading-selected-articles;
18217                         junk-unread-articles;
18218                         next-group;
18219                  else
18220                         show-next-page;
18221
18222          else if (key-pressed = '.')
18223                 if (consolidated-menus)         # same as hide-thread in Gnus
18224                         select-thread-under-cursor;
18225                 else
18226                         select-article-under-cursor;
18227
18228
18229 Article-mode
18230         if (key-pressed == SPACE)
18231                 if (more-pages-in-article)
18232                         next-page;
18233                 else if (more-selected-articles-to-read)
18234                         next-article;
18235                 else
18236                         next-group;
18237 @end example
18238
18239 @item
18240 My precise need here would have been to limit files to Incoming*.
18241 One could think of some `nneething-only-files' variable, but I guess
18242 it would have been unacceptable if one was using many unrelated such
18243 nneething groups.
18244
18245 A more useful approach would be to, in response to the `G D' prompt, be
18246 allowed to say something like: `~/.mail/Incoming*', somewhat limiting
18247 the top-level directory only (in case directories would be matched by
18248 the wildcard expression).
18249
18250 @item
18251 It would be nice if it also handled
18252
18253         <URL:news://sunsite.auc.dk/>
18254
18255 which should correspond to `B nntp RET sunsite.auc.dk' in *Group*.
18256
18257
18258 @item
18259
18260   Take a look at w3-menu.el in the Emacs-W3 distribution - this works out
18261 really well.  Each menu is 'named' by a symbol that would be on a
18262 gnus-*-menus (where * would be whatever, but at least group, summary, and
18263 article versions) variable.
18264
18265   So for gnus-summary-menus, I would set to '(sort mark dispose ...)
18266
18267   A value of '1' would just put _all_ the menus in a single 'GNUS' menu in
18268 the main menubar.  This approach works really well for Emacs-W3 and VM.
18269
18270
18271 @item
18272  nndoc should take care to create unique Message-IDs for all its
18273 articles.
18274 @item
18275  gnus-score-followup-article only works when you have a summary buffer
18276 active.  Make it work when posting from the group buffer as well.
18277 (message-sent-hook).
18278 @item
18279  rewrite gnus-demon to use run-with-idle-timers.
18280
18281 @item
18282  * Enhancements to Gnus:
18283
18284   Add two commands:
18285
18286   * gnus-servers (gnus-start-server-buffer?)--enters Gnus and goes
18287     straight to the server buffer, without opening any connections to
18288     servers first.
18289
18290   * gnus-server-read-server-newsrc--produces a buffer very similar to
18291     the group buffer, but with only groups from that server listed;
18292     quitting this buffer returns to the server buffer.
18293
18294 @item
18295  add a command to check the integrity of an nnfolder folder --
18296 go through the article numbers and see that there are no duplicates,
18297 and stuff.
18298
18299 @item
18300  `unsmileyfy-buffer' to undo smileification.
18301
18302 @item
18303  a command to give all relevant info on an article, including all
18304 secondary marks.
18305
18306 @item
18307  when doing `-request-accept-article', the backends should do
18308 the nnmail duplicate checking.
18309
18310 @item
18311  allow `message-signature-file' to be a function to return the
18312 value of the signature file.
18313
18314 @item
18315  In addition, I would love it if I could configure message-tab so that it
18316 could call `bbdb-complete-name' in other headers.  So, some sort of
18317 interface like
18318
18319 (setq message-tab-alist
18320       '((message-header-regexp message-expand-group)
18321         ("^\\(To\\|[cC]c\\|[bB]cc\\)"  bbdb-complete-name)))
18322
18323 then you could run the relevant function to complete the information in
18324 the header
18325
18326 @item
18327  cache the newsgroups file locally to avoid reloading it all the time.
18328
18329 @item
18330  a command to import a buffer into a group.
18331
18332 @item
18333  nnweb should allow fetching by Message-ID from servers.
18334
18335 @item
18336  point in the article buffer doesn't always go to the
18337 beginning of the buffer when selecting new articles.
18338
18339 @item
18340  a command to process mark all unread articles.
18341
18342 @item
18343  `gnus-gather-threads-by-references-and-subject' -- first
18344 do gathering by references, and then go through the dummy roots and
18345 do more gathering by subject.
18346
18347 @item
18348  gnus-uu-mark-in-numerical-order -- process mark articles in
18349 article numerical order.
18350
18351 @item
18352  (gnus-thread-total-score
18353  (gnus-id-to-thread (mail-header-id (gnus-summary-article-header))))
18354 bind to a key.
18355
18356 @item
18357  sorting by score is wrong when using sparse threads.
18358
18359 @item
18360  a command to fetch an arbitrary article -- without having to be
18361 in the summary buffer.
18362
18363 @item
18364  a new nncvs backend.  Each group would show an article, using
18365 version branches as threading, checkin date as the date, etc.
18366
18367 @item
18368  http://www.dejanews.com/forms/dnsetfilter_exp.html ?
18369 This filter allows one to construct advance queries on the Dejanews
18370 database such as specifying start and end dates, subject, author,
18371 and/or newsgroup name.
18372
18373 @item
18374  new Date header scoring type -- older, newer
18375
18376 @item
18377  use the summary toolbar in the article buffer.
18378
18379 @item
18380  a command to fetch all articles that are less than X days old.
18381
18382 @item
18383  in pick mode, `q' should save the list of selected articles in the
18384 group info.  The next time the group is selected, these articles
18385 will automatically get the process mark.
18386
18387 @item
18388  Isn't it possible to (also?) allow M-^ to automatically try the
18389 default server if it fails on the current server?  (controlled by a
18390 user variable, (nil, t, 'ask)).
18391
18392 @item
18393  make it possible to cancel articles using the select method for the
18394 current group.
18395
18396 @item
18397  `gnus-summary-select-article-on-entry' or something.  It'll default
18398 to t and will select whatever article decided by `gnus-auto-select-first'.
18399
18400 @item
18401  a new variable to control which selection commands should be unselecting.
18402 `first', `best', `next', `prev', `next-unread', `prev-unread' are
18403 candidates.
18404
18405 @item
18406  be able to select groups that have no articles in them
18407 to be able to post in them (using the current select method).
18408
18409 @item
18410  be able to post via DejaNews.
18411
18412 @item
18413  `x' should retain any sortings that have been performed.
18414
18415 @item
18416  allow the user to specify the precedence of the secondary marks.  Also
18417 allow them to be displayed separately.
18418
18419 @item
18420  gnus-summary-save-in-pipe should concatenate the results from
18421 the processes when doing a process marked pipe.
18422
18423 @item
18424  a new match type, like Followup, but which adds Thread matches on all
18425 articles that match a certain From header.
18426
18427 @item
18428  a function that can be read from kill-emacs-query-functions to offer
18429 saving living summary buffers.
18430
18431 @item
18432  a function for selecting a particular group which will contain
18433 the articles listed in a list of article numbers/id's.
18434
18435 @item
18436  a battery of character translation functions to translate common
18437 Mac, MS (etc) characters into ISO 8859-1.
18438
18439 @example
18440 (defun article-fix-m$word ()
18441   "Fix M$Word smartquotes in an article."
18442   (interactive)
18443   (save-excursion
18444     (let ((buffer-read-only nil))
18445       (goto-char (point-min))
18446       (while (search-forward "\221" nil t)
18447         (replace-match "`" t t))
18448       (goto-char (point-min))
18449       (while (search-forward "\222" nil t)
18450         (replace-match "'" t t))
18451       (goto-char (point-min))
18452       (while (search-forward "\223" nil t)
18453         (replace-match "\"" t t))
18454       (goto-char (point-min))
18455       (while (search-forward "\224" nil t)
18456         (replace-match "\"" t t)))))
18457 @end example
18458
18459 @item
18460 @example
18461  (add-hook 'gnus-exit-query-functions
18462 '(lambda ()
18463    (if (and (file-exists-p nnmail-spool-file)
18464             (> (nnheader-file-size nnmail-spool-file) 0))
18465        (yes-or-no-p "New mail has arrived.  Quit Gnus anyways? ")
18466        (y-or-n-p "Are you sure you want to quit Gnus? "))))
18467 @end example
18468
18469 @item
18470  allow message-default-headers to be a function.
18471
18472 @item
18473  new Date score match types -- < > = (etc) that take floating point
18474 numbers and match on the age of the article.
18475
18476 @item
18477 @example
18478 >  > > If so, I've got one gripe: It seems that when I fire up gnus 5.2.25
18479 >  > > under xemacs-19.14, it's creating a new frame, but is erasing the
18480 >  > > buffer in the frame that it was called from =:-O
18481 >
18482 >  > Hm.  How do you start up Gnus?  From the toolbar or with
18483 >  > `M-x gnus-other-frame'?
18484 >
18485 >    I normally start it up from the toolbar; at
18486 > least that's the way I've caught it doing the
18487 > deed before.
18488 @end example
18489
18490 @item
18491  all commands that react to the process mark should push
18492 the current process mark set onto the stack.
18493
18494 @item
18495  gnus-article-hide-pgp
18496 Selv ville jeg nok ha valgt Ã¥ slette den dersom teksten matcher
18497 @example
18498 "\\(This\s+\\)?[^ ]+ has been automatically signed by"
18499 @end example
18500 og det er maks hundre tegn mellom match-end og ----linja.  Men -det-
18501 er min type heuristikk og langt fra alles.
18502
18503 @item
18504  `gnus-subscribe-sorted' -- insert new groups where they would have been
18505 sorted to if `gnus-group-sort-function' were run.
18506
18507 @item
18508  gnus-(group,summary)-highlight should respect any `face' text props set
18509 on the lines.
18510
18511 @item
18512  use run-with-idle-timer for gnus-demon instead of the
18513 home-brewed stuff for better reliability.
18514
18515 @item
18516  add a way to select which NoCeM type to apply -- spam, troll, etc.
18517
18518 @item
18519  nndraft-request-group should tally auto-save files.
18520
18521 @item
18522  implement nntp-retry-on-break and nntp-command-timeout.
18523
18524 @item
18525  gnus-article-highlight-limit that says when not to highlight (long)
18526 articles.
18527
18528 @item
18529  (nnoo-set SERVER VARIABLE VALUE)
18530
18531 @item
18532  nn*-spool-methods
18533
18534 @item
18535  interrupitng agent fetching of articles should save articles.
18536
18537 @item
18538  command to open a digest group, and copy all the articles there to the
18539 current group.
18540
18541 @item
18542  a variable to disable article body highlights if there's more than
18543 X characters in the body.
18544
18545 @item
18546  handle 480/381 authinfo requests separately.
18547
18548 @item
18549  include the texi/dir file in the distribution.
18550
18551 @item
18552  format spec to "tab" to a position.
18553
18554 @item
18555  Move all prompting to the new `M-n' default style.
18556
18557 @item
18558  command to display all dormant articles.
18559
18560 @item
18561  gnus-auto-select-next makeover -- list of things it should do.
18562
18563 @item
18564  a score match type that adds scores matching on From if From has replied
18565 to something someone else has said.
18566
18567 @item
18568  Read Netscape discussion groups:
18569 snews://secnews.netscape.com/netscape.communicator.unix
18570
18571 @item
18572 One command to edit the original version if an article, and one to edit
18573 the displayed version.
18574
18575 @item
18576 @kbd{T v} -- make all process-marked articles the children of the
18577 current article.
18578
18579 @item
18580 Switch from initial text to the new default text mechanism.
18581
18582 @item
18583 How about making it possible to expire local articles?  Will it be
18584 possible to make various constraints on when an article can be
18585 expired, e.g. (read), (age > 14 days), or the more interesting (read
18586 & age > 14 days)?
18587
18588 @item
18589 New limit command---limit to articles that have a certain string
18590 in the head or body.
18591
18592 @item
18593 Allow breaking lengthy NNTP commands.
18594
18595 @item
18596 gnus-article-highlight-limit, to disable highlighting in big articles.
18597
18598 @item
18599 Editing an article should put the article to be edited
18600 in a special, unique buffer.
18601
18602 @item
18603 A command to send a mail to the admin-address group param.
18604
18605 @item
18606 A Date scoring type that will match if the article
18607 is less than a certain number of days old.
18608
18609 @item
18610 New spec: %~(tab 56) to put point on column 56
18611
18612 @item
18613 Allow Gnus Agent scoring to use normal score files.
18614
18615 @item
18616 Rething the Agent active file thing.  `M-g' doesn't update the active
18617 file, for instance.
18618
18619 @item
18620 With dummy roots, `^' and then selecing the first article
18621 in any other dummy thread will make Gnus highlight the
18622 dummy root instead of the first article.
18623
18624 @item
18625 Propagate all group properties (marks, article numbers, etc) up to the
18626 topics for displaying.
18627
18628 @item
18629 `n' in the group buffer with topics should go to the next group
18630 with unread articles, even if that group is hidden in a topic.
18631
18632 @item
18633 gnus-posting-styles doesn't work in drafts.
18634
18635 @item
18636 gnus-summary-limit-include-cached is slow when there are
18637 many articles in the cache, since it regenerates big parts of the
18638 summary buffer for each article.
18639
18640 @item
18641 Implement gnus-batch-brew-soup.
18642
18643 @item
18644 Group parameters and summary commands for un/subscribing to mailing
18645 lists.
18646
18647 @item
18648 Introduce nnmail-home-directory.
18649
18650 @item
18651 gnus-fetch-group and friends should exit Gnus when the user
18652 exits the group.
18653
18654 @item
18655 The jingle is only played on the second invocation of Gnus.
18656
18657 @item
18658 Bouncing articles should do MIME.
18659
18660 @item
18661 Crossposted articles should "inherit" the % or @ mark from the other
18662 groups it has been crossposted to, or something.  (Agent.)
18663
18664 @item
18665 `S D r' should allow expansion of aliases.
18666
18667 @item
18668 If point is on a group that appears multiple times in topics, and
18669 you press `l', point will move to the first instance of the group.
18670
18671 @item
18672 The documentation should mention pop3.el, fetchmail, smtpmail and why
18673 po:username often fails.
18674
18675 @item
18676 Fetch by Message-ID from dejanews.
18677
18678 <URL:http://search.dejanews.com/msgid.xp?MID=%3C62h9l9$hm4@@basement.replay.com%3E&fmt=raw>
18679
18680 @item
18681 A spec for the group line format to display the number of
18682 agent-downloaded articles in the group.
18683
18684 @item
18685 Some nntp servers never respond when posting, so there should be a
18686 timeout for all commands.
18687
18688 @item
18689 Solve the halting problem.
18690
18691 @c TODO
18692 @end itemize
18693
18694 @iftex
18695
18696 @page
18697 @node The Manual
18698 @section The Manual
18699 @cindex colophon
18700 @cindex manual
18701
18702 This manual was generated from a TeXinfo file and then run through
18703 either @code{texi2dvi}
18704 @iflatex
18705 or my own home-brewed TeXinfo to \LaTeX\ transformer,
18706 and then run through @code{latex} and @code{dvips}
18707 @end iflatex
18708 to get what you hold in your hands now.
18709
18710 The following conventions have been used:
18711
18712 @enumerate
18713
18714 @item
18715 This is a @samp{string}
18716
18717 @item
18718 This is a @kbd{keystroke}
18719
18720 @item
18721 This is a @file{file}
18722
18723 @item
18724 This is a @code{symbol}
18725
18726 @end enumerate
18727
18728 So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
18729 mean:
18730
18731 @lisp
18732 (setq flargnoze "yes")
18733 @end lisp
18734
18735 If I say ``set @code{flumphel} to @code{yes}'', that would mean:
18736
18737 @lisp
18738 (setq flumphel 'yes)
18739 @end lisp
18740
18741 @samp{yes} and @code{yes} are two @emph{very} different things---don't
18742 ever get them confused.
18743
18744 @iflatex
18745 @c @head
18746 Of course, everything in this manual is of vital interest, so you should
18747 read it all.  Several times.  However, if you feel like skimming the
18748 manual, look for that gnu head you should see in the margin over
18749 there---it means that what's being discussed is of more importance than
18750 the rest of the stuff.  (On the other hand, if everything is infinitely
18751 important, how can anything be more important than that?  Just one more
18752 of the mysteries of this world, I guess.)
18753 @end iflatex
18754
18755 @end iftex
18756
18757
18758 @page
18759 @node Terminology
18760 @section Terminology
18761
18762 @cindex terminology
18763 @table @dfn
18764
18765 @item news
18766 @cindex news
18767 This is what you are supposed to use this thing for---reading news.
18768 News is generally fetched from a nearby @sc{nntp} server, and is
18769 generally publicly available to everybody.  If you post news, the entire
18770 world is likely to read just what you have written, and they'll all
18771 snigger mischievously.  Behind your back.
18772
18773 @item mail
18774 @cindex mail
18775 Everything that's delivered to you personally is mail.  Some news/mail
18776 readers (like Gnus) blur the distinction between mail and news, but
18777 there is a difference.  Mail is private.  News is public.  Mailing is
18778 not posting, and replying is not following up.
18779
18780 @item reply
18781 @cindex reply
18782 Send a mail to the person who has written what you are reading.
18783
18784 @item follow up
18785 @cindex follow up
18786 Post an article to the current newsgroup responding to the article you
18787 are reading.
18788
18789 @item backend
18790 @cindex backend
18791 Gnus gets fed articles from a number of backends, both news and mail
18792 backends.  Gnus does not handle the underlying media, so to speak---this
18793 is all done by the backends.
18794
18795 @item native
18796 @cindex native
18797 Gnus will always use one method (and backend) as the @dfn{native}, or
18798 default, way of getting news.
18799
18800 @item foreign
18801 @cindex foreign
18802 You can also have any number of foreign groups active at the same time.
18803 These are groups that use non-native non-secondary backends for getting
18804 news.
18805
18806 @item secondary
18807 @cindex secondary
18808 Secondary backends are somewhere half-way between being native and being
18809 foreign, but they mostly act like they are native.
18810
18811 @item article
18812 @cindex article
18813 A message that has been posted as news.
18814
18815 @item mail message
18816 @cindex mail message
18817 A message that has been mailed.
18818
18819 @item message
18820 @cindex message
18821 A mail message or news article
18822
18823 @item head
18824 @cindex head
18825 The top part of a message, where administrative information (etc.) is
18826 put.
18827
18828 @item body
18829 @cindex body
18830 The rest of an article.  Everything not in the head is in the
18831 body.
18832
18833 @item header
18834 @cindex header
18835 A line from the head of an article.
18836
18837 @item headers
18838 @cindex headers
18839 A collection of such lines, or a collection of heads.  Or even a
18840 collection of @sc{nov} lines.
18841
18842 @item @sc{nov}
18843 @cindex nov
18844 When Gnus enters a group, it asks the backend for the headers of all
18845 unread articles in the group.  Most servers support the News OverView
18846 format, which is more compact and much faster to read and parse than the
18847 normal @sc{head} format.
18848
18849 @item level
18850 @cindex levels
18851 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
18852 that have a lower level are ``more'' subscribed than the groups with a
18853 higher level.  In fact, groups on levels 1-5 are considered
18854 @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
18855 are @dfn{killed}.  Commands for listing groups and scanning for new
18856 articles will all use the numeric prefix as @dfn{working level}.
18857
18858 @item killed groups
18859 @cindex killed groups
18860 No information on killed groups is stored or updated, which makes killed
18861 groups much easier to handle than subscribed groups.
18862
18863 @item zombie groups
18864 @cindex zombie groups
18865 Just like killed groups, only slightly less dead.
18866
18867 @item active file
18868 @cindex active file
18869 The news server has to keep track of what articles it carries, and what
18870 groups exist.  All this information in stored in the active file, which
18871 is rather large, as you might surmise.
18872
18873 @item bogus groups
18874 @cindex bogus groups
18875 A group that exists in the @file{.newsrc} file, but isn't known to the
18876 server (i.e.,  it isn't in the active file), is a @emph{bogus group}.
18877 This means that the group probably doesn't exist (any more).
18878
18879 @item activating
18880 @cindex activating groups
18881 The act of asking the server for info on a group and computing the
18882 number of unread articles is called @dfn{activating the group}.
18883 Un-activated groups are listed with @samp{*} in the group buffer.
18884
18885 @item server
18886 @cindex server
18887 A machine one can connect to and get news (or mail) from.
18888
18889 @item select method
18890 @cindex select method
18891 A structure that specifies the backend, the server and the virtual
18892 server settings.
18893
18894 @item virtual server
18895 @cindex virtual server
18896 A named select method.  Since a select method defines all there is to
18897 know about connecting to a (physical) server, taking the thing as a
18898 whole is a virtual server.
18899
18900 @item washing
18901 @cindex washing
18902 Taking a buffer and running it through a filter of some sort.  The
18903 result will (more often than not) be cleaner and more pleasing than the
18904 original.
18905
18906 @item ephemeral groups
18907 @cindex ephemeral groups
18908 Most groups store data on what articles you have read.  @dfn{Ephemeral}
18909 groups are groups that will have no data stored---when you exit the
18910 group, it'll disappear into the aether.
18911
18912 @item solid groups
18913 @cindex solid groups
18914 This is the opposite of ephemeral groups.  All groups listed in the
18915 group buffer are solid groups.
18916
18917 @item sparse articles
18918 @cindex sparse articles
18919 These are article placeholders shown in the summary buffer when
18920 @code{gnus-build-sparse-threads} has been switched on.
18921
18922 @item threading
18923 @cindex threading
18924 To put responses to articles directly after the articles they respond
18925 to---in a hierarchical fashion.
18926
18927 @item root
18928 @cindex root
18929 @cindex thread root
18930 The first article in a thread is the root.  It is the ancestor of all
18931 articles in the thread.
18932
18933 @item parent
18934 @cindex parent
18935 An article that has responses.
18936
18937 @item child
18938 @cindex child
18939 An article that responds to a different article---its parent.
18940
18941 @item digest
18942 @cindex digest
18943 A collection of messages in one file.  The most common digest format is
18944 specified by RFC1153.
18945
18946 @end table
18947
18948
18949 @page
18950 @node Customization
18951 @section Customization
18952 @cindex general customization
18953
18954 All variables are properly documented elsewhere in this manual.  This
18955 section is designed to give general pointers on how to customize Gnus
18956 for some quite common situations.
18957
18958 @menu
18959 * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
18960 * Slow Terminal Connection::  You run a remote Emacs.
18961 * Little Disk Space::         You feel that having large setup files is icky.
18962 * Slow Machine::              You feel like buying a faster machine.
18963 @end menu
18964
18965
18966 @node Slow/Expensive Connection
18967 @subsection Slow/Expensive @sc{nntp} Connection
18968
18969 If you run Emacs on a machine locally, and get your news from a machine
18970 over some very thin strings, you want to cut down on the amount of data
18971 Gnus has to get from the @sc{nntp} server.
18972
18973 @table @code
18974
18975 @item gnus-read-active-file
18976 Set this to @code{nil}, which will inhibit Gnus from requesting the
18977 entire active file from the server.  This file is often v.  large.  You
18978 also have to set @code{gnus-check-new-newsgroups} and
18979 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
18980 doesn't suddenly decide to fetch the active file anyway.
18981
18982 @item gnus-nov-is-evil
18983 This one has to be @code{nil}.  If not, grabbing article headers from
18984 the @sc{nntp} server will not be very fast.  Not all @sc{nntp} servers
18985 support @sc{xover}; Gnus will detect this by itself.
18986 @end table
18987
18988
18989 @node Slow Terminal Connection
18990 @subsection Slow Terminal Connection
18991
18992 Let's say you use your home computer for dialing up the system that runs
18993 Emacs and Gnus.  If your modem is slow, you want to reduce (as much as
18994 possible) the amount of data sent over the wires.
18995
18996 @table @code
18997
18998 @item gnus-auto-center-summary
18999 Set this to @code{nil} to inhibit Gnus from re-centering the summary
19000 buffer all the time.  If it is @code{vertical}, do only vertical
19001 re-centering.  If it is neither @code{nil} nor @code{vertical}, do both
19002 horizontal and vertical recentering.
19003
19004 @item gnus-visible-headers
19005 Cut down on the headers included in the articles to the
19006 minimum.  You can, in fact, make do without them altogether---most of the
19007 useful data is in the summary buffer, anyway.  Set this variable to
19008 @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
19009
19010 Set this hook to all the available hiding commands:
19011 @lisp
19012 (setq gnus-treat-hide-headers 'head
19013       gnus-treat-hide-signature t
19014       gnus-treat-hide-citation t)
19015 @end lisp
19016
19017 @item gnus-use-full-window
19018 By setting this to @code{nil}, you can make all the windows smaller.
19019 While this doesn't really cut down much generally, it means that you
19020 have to see smaller portions of articles before deciding that you didn't
19021 want to read them anyway.
19022
19023 @item gnus-thread-hide-subtree
19024 If this is non-@code{nil}, all threads in the summary buffer will be
19025 hidden initially.
19026
19027 @item gnus-updated-mode-lines
19028 If this is @code{nil}, Gnus will not put information in the buffer mode
19029 lines, which might save some time.
19030 @end table
19031
19032
19033 @node Little Disk Space
19034 @subsection Little Disk Space
19035 @cindex disk space
19036
19037 The startup files can get rather large, so you may want to cut their
19038 sizes a bit if you are running out of space.
19039
19040 @table @code
19041
19042 @item gnus-save-newsrc-file
19043 If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
19044 only save @file{.newsrc.eld}.  This means that you will not be able to
19045 use any other newsreaders than Gnus.  This variable is @code{t} by
19046 default.
19047
19048 @item gnus-save-killed-list
19049 If this is @code{nil}, Gnus will not save the list of dead groups.  You
19050 should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
19051 and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
19052 variable to @code{nil}.  This variable is @code{t} by default.
19053
19054 @end table
19055
19056
19057 @node Slow Machine
19058 @subsection Slow Machine
19059 @cindex slow machine
19060
19061 If you have a slow machine, or are just really impatient, there are a
19062 few things you can do to make Gnus run faster.
19063
19064 Set @code{gnus-check-new-newsgroups} and
19065 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
19066
19067 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
19068 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
19069 summary buffer faster.
19070
19071
19072 @page
19073 @node Troubleshooting
19074 @section Troubleshooting
19075 @cindex troubleshooting
19076
19077 Gnus works @emph{so} well straight out of the box---I can't imagine any
19078 problems, really.
19079
19080 Ahem.
19081
19082 @enumerate
19083
19084 @item
19085 Make sure your computer is switched on.
19086
19087 @item
19088 Make sure that you really load the current Gnus version.  If you have
19089 been running @sc{gnus}, you need to exit Emacs and start it up again before
19090 Gnus will work.
19091
19092 @item
19093 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
19094 like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded.  If,
19095 on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp
19096 flee}, you have some old @file{.el} files lying around.  Delete these.
19097
19098 @item
19099 Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
19100 how-to.
19101
19102 @item
19103 @vindex max-lisp-eval-depth
19104 Gnus works on many recursive structures, and in some extreme (and very
19105 rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
19106 you.  If this happens to you, set @code{max-lisp-eval-depth} to 500 or
19107 something like that.
19108 @end enumerate
19109
19110 If all else fails, report the problem as a bug.
19111
19112 @cindex bugs
19113 @cindex reporting bugs
19114
19115 @kindex M-x gnus-bug
19116 @findex gnus-bug
19117 If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
19118 command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send
19119 me the backtrace.  I will fix bugs, but I can only fix them if you send
19120 me a precise description as to how to reproduce the bug.
19121
19122 You really can never be too detailed in a bug report.  Always use the
19123 @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
19124 a 10Kb mail each time you use it, and even if you have sent me your
19125 environment 500 times before.  I don't care.  I want the full info each
19126 time.
19127
19128 It is also important to remember that I have no memory whatsoever.  If
19129 you send a bug report, and I send you a reply, and then you just send
19130 back ``No, it's not! Moron!'', I will have no idea what you are
19131 insulting me about.  Always over-explain everything.  It's much easier
19132 for all of us---if I don't have all the information I need, I will just
19133 mail you and ask for more info, and everything takes more time.
19134
19135 If the problem you're seeing is very visual, and you can't quite explain
19136 it, copy the Emacs window to a file (with @code{xwd}, for instance), put
19137 it somewhere it can be reached, and include the URL of the picture in
19138 the bug report.
19139
19140 If you just need help, you are better off asking on
19141 @samp{gnu.emacs.gnus}.  I'm not very helpful.
19142
19143 @cindex gnu.emacs.gnus
19144 @cindex ding mailing list
19145 You can also ask on the ding mailing list---@samp{ding@@gnus.org}.
19146 Write to @samp{ding-request@@gnus.org} to subscribe.
19147
19148
19149 @page
19150 @node Gnus Reference Guide
19151 @section Gnus Reference Guide
19152
19153 It is my hope that other people will figure out smart stuff that Gnus
19154 can do, and that other people will write those smart things as well.  To
19155 facilitate that I thought it would be a good idea to describe the inner
19156 workings of Gnus.  And some of the not-so-inner workings, while I'm at
19157 it.
19158
19159 You can never expect the internals of a program not to change, but I
19160 will be defining (in some details) the interface between Gnus and its
19161 backends (this is written in stone), the format of the score files
19162 (ditto), data structures (some are less likely to change than others)
19163 and general methods of operation.
19164
19165 @menu
19166 * Gnus Utility Functions::   Common functions and variable to use.
19167 * Backend Interface::        How Gnus communicates with the servers.
19168 * Score File Syntax::        A BNF definition of the score file standard.
19169 * Headers::                  How Gnus stores headers internally.
19170 * Ranges::                   A handy format for storing mucho numbers.
19171 * Group Info::               The group info format.
19172 * Extended Interactive::     Symbolic prefixes and stuff.
19173 * Emacs/XEmacs Code::        Gnus can be run under all modern Emacsen.
19174 * Various File Formats::     Formats of files that Gnus use.
19175 @end menu
19176
19177
19178 @node Gnus Utility Functions
19179 @subsection Gnus Utility Functions
19180 @cindex Gnus utility functions
19181 @cindex utility functions
19182 @cindex functions
19183 @cindex internal variables
19184
19185 When writing small functions to be run from hooks (and stuff), it's
19186 vital to have access to the Gnus internal functions and variables.
19187 Below is a list of the most common ones.
19188
19189 @table @code
19190
19191 @item gnus-newsgroup-name
19192 @vindex gnus-newsgroup-name
19193 This variable holds the name of the current newsgroup.
19194
19195 @item gnus-find-method-for-group
19196 @findex gnus-find-method-for-group
19197 A function that returns the select method for @var{group}.
19198
19199 @item gnus-group-real-name
19200 @findex gnus-group-real-name
19201 Takes a full (prefixed) Gnus group name, and returns the unprefixed
19202 name.
19203
19204 @item gnus-group-prefixed-name
19205 @findex gnus-group-prefixed-name
19206 Takes an unprefixed group name and a select method, and returns the full
19207 (prefixed) Gnus group name.
19208
19209 @item gnus-get-info
19210 @findex gnus-get-info
19211 Returns the group info list for @var{group}.
19212
19213 @item gnus-group-unread
19214 @findex gnus-group-unread
19215 The number of unread articles in @var{group}, or @code{t} if that is
19216 unknown.
19217
19218 @item gnus-active
19219 @findex gnus-active
19220 The active entry for @var{group}.
19221
19222 @item gnus-set-active
19223 @findex gnus-set-active
19224 Set the active entry for @var{group}.
19225
19226 @item gnus-add-current-to-buffer-list
19227 @findex gnus-add-current-to-buffer-list
19228 Adds the current buffer to the list of buffers to be killed on Gnus
19229 exit.
19230
19231 @item gnus-continuum-version
19232 @findex gnus-continuum-version
19233 Takes a Gnus version string as a parameter and returns a floating point
19234 number.  Earlier versions will always get a lower number than later
19235 versions.
19236
19237 @item gnus-group-read-only-p
19238 @findex gnus-group-read-only-p
19239 Says whether @var{group} is read-only or not.
19240
19241 @item gnus-news-group-p
19242 @findex gnus-news-group-p
19243 Says whether @var{group} came from a news backend.
19244
19245 @item gnus-ephemeral-group-p
19246 @findex gnus-ephemeral-group-p
19247 Says whether @var{group} is ephemeral or not.
19248
19249 @item gnus-server-to-method
19250 @findex gnus-server-to-method
19251 Returns the select method corresponding to @var{server}.
19252
19253 @item gnus-server-equal
19254 @findex gnus-server-equal
19255 Says whether two virtual servers are equal.
19256
19257 @item gnus-group-native-p
19258 @findex gnus-group-native-p
19259 Says whether @var{group} is native or not.
19260
19261 @item gnus-group-secondary-p
19262 @findex gnus-group-secondary-p
19263 Says whether @var{group} is secondary or not.
19264
19265 @item gnus-group-foreign-p
19266 @findex gnus-group-foreign-p
19267 Says whether @var{group} is foreign or not.
19268
19269 @item group-group-find-parameter
19270 @findex group-group-find-parameter
19271 Returns the parameter list of @var{group}.  If given a second parameter,
19272 returns the value of that parameter for @var{group}.
19273
19274 @item gnus-group-set-parameter
19275 @findex gnus-group-set-parameter
19276 Takes three parameters; @var{group}, @var{parameter} and @var{value}.
19277
19278 @item gnus-narrow-to-body
19279 @findex gnus-narrow-to-body
19280 Narrows the current buffer to the body of the article.
19281
19282 @item gnus-check-backend-function
19283 @findex gnus-check-backend-function
19284 Takes two parameters, @var{function} and @var{group}.  If the backend
19285 @var{group} comes from supports @var{function}, return non-@code{nil}.
19286
19287 @lisp
19288 (gnus-check-backend-function "request-scan" "nnml:misc")
19289 @result{} t
19290 @end lisp
19291
19292 @item gnus-read-method
19293 @findex gnus-read-method
19294 Prompts the user for a select method.
19295
19296 @end table
19297
19298
19299 @node Backend Interface
19300 @subsection Backend Interface
19301
19302 Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
19303 groups.  It only knows how to talk to @dfn{virtual servers}.  A virtual
19304 server is a @dfn{backend} and some @dfn{backend variables}.  As examples
19305 of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}.  As
19306 examples of the latter we have @code{nntp-port-number} and
19307 @code{nnmbox-directory}.
19308
19309 When Gnus asks for information from a backend---say @code{nntp}---on
19310 something, it will normally include a virtual server name in the
19311 function parameters.  (If not, the backend should use the ``current''
19312 virtual server.)  For instance, @code{nntp-request-list} takes a virtual
19313 server as its only (optional) parameter.  If this virtual server hasn't
19314 been opened, the function should fail.
19315
19316 Note that a virtual server name has no relation to some physical server
19317 name.  Take this example:
19318
19319 @lisp
19320 (nntp "odd-one"
19321       (nntp-address "ifi.uio.no")
19322       (nntp-port-number 4324))
19323 @end lisp
19324
19325 Here the virtual server name is @samp{odd-one} while the name of
19326 the physical server is @samp{ifi.uio.no}.
19327
19328 The backends should be able to switch between several virtual servers.
19329 The standard backends implement this by keeping an alist of virtual
19330 server environments that they pull down/push up when needed.
19331
19332 There are two groups of interface functions: @dfn{required functions},
19333 which must be present, and @dfn{optional functions}, which Gnus will
19334 always check for presence before attempting to call 'em.
19335
19336 All these functions are expected to return data in the buffer
19337 @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
19338 unfortunately named, but we'll have to live with it.  When I talk about
19339 @dfn{resulting data}, I always refer to the data in that buffer.  When I
19340 talk about @dfn{return value}, I talk about the function value returned by
19341 the function call.  Functions that fail should return @code{nil} as the
19342 return value.
19343
19344 Some backends could be said to be @dfn{server-forming} backends, and
19345 some might be said not to be.  The latter are backends that generally
19346 only operate on one group at a time, and have no concept of ``server''
19347 -- they have a group, and they deliver info on that group and nothing
19348 more.
19349
19350 In the examples and definitions I will refer to the imaginary backend
19351 @code{nnchoke}.
19352
19353 @cindex @code{nnchoke}
19354
19355 @menu
19356 * Required Backend Functions::        Functions that must be implemented.
19357 * Optional Backend Functions::        Functions that need not be implemented.
19358 * Error Messaging::                   How to get messages and report errors.
19359 * Writing New Backends::              Extending old backends.
19360 * Hooking New Backends Into Gnus::    What has to be done on the Gnus end.
19361 * Mail-like Backends::                Some tips on mail backends.
19362 @end menu
19363
19364
19365 @node Required Backend Functions
19366 @subsubsection Required Backend Functions
19367
19368 @table @code
19369
19370 @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
19371
19372 @var{articles} is either a range of article numbers or a list of
19373 @code{Message-ID}s.  Current backends do not fully support either---only
19374 sequences (lists) of article numbers, and most backends do not support
19375 retrieval of @code{Message-ID}s.  But they should try for both.
19376
19377 The result data should either be HEADs or NOV lines, and the result
19378 value should either be @code{headers} or @code{nov} to reflect this.
19379 This might later be expanded to @code{various}, which will be a mixture
19380 of HEADs and NOV lines, but this is currently not supported by Gnus.
19381
19382 If @var{fetch-old} is non-@code{nil} it says to try fetching "extra
19383 headers", in some meaning of the word.  This is generally done by
19384 fetching (at most) @var{fetch-old} extra headers less than the smallest
19385 article number in @code{articles}, and filling the gaps as well.  The
19386 presence of this parameter can be ignored if the backend finds it
19387 cumbersome to follow the request.  If this is non-@code{nil} and not a
19388 number, do maximum fetches.
19389
19390 Here's an example HEAD:
19391
19392 @example
19393 221 1056 Article retrieved.
19394 Path: ifi.uio.no!sturles
19395 From: sturles@@ifi.uio.no (Sturle Sunde)
19396 Newsgroups: ifi.discussion
19397 Subject: Re: Something very droll
19398 Date: 27 Oct 1994 14:02:57 +0100
19399 Organization: Dept. of Informatics, University of Oslo, Norway
19400 Lines: 26
19401 Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
19402 References: <38jdmq$4qu@@visbur.ifi.uio.no>
19403 NNTP-Posting-Host: holmenkollen.ifi.uio.no
19404 .
19405 @end example
19406
19407 So a @code{headers} return value would imply that there's a number of
19408 these in the data buffer.
19409
19410 Here's a BNF definition of such a buffer:
19411
19412 @example
19413 headers        = *head
19414 head           = error / valid-head
19415 error-message  = [ "4" / "5" ] 2number " " <error message> eol
19416 valid-head     = valid-message *header "." eol
19417 valid-message  = "221 " <number> " Article retrieved." eol
19418 header         = <text> eol
19419 @end example
19420
19421 If the return value is @code{nov}, the data buffer should contain
19422 @dfn{network overview database} lines.  These are basically fields
19423 separated by tabs.
19424
19425 @example
19426 nov-buffer = *nov-line
19427 nov-line   = 8*9 [ field <TAB> ] eol
19428 field      = <text except TAB>
19429 @end example
19430
19431 For a closer look at what should be in those fields,
19432 @pxref{Headers}.
19433
19434
19435 @item (nnchoke-open-server SERVER &optional DEFINITIONS)
19436
19437 @var{server} is here the virtual server name.  @var{definitions} is a
19438 list of @code{(VARIABLE VALUE)} pairs that define this virtual server.
19439
19440 If the server can't be opened, no error should be signaled.  The backend
19441 may then choose to refuse further attempts at connecting to this
19442 server.  In fact, it should do so.
19443
19444 If the server is opened already, this function should return a
19445 non-@code{nil} value.  There should be no data returned.
19446
19447
19448 @item (nnchoke-close-server &optional SERVER)
19449
19450 Close connection to @var{server} and free all resources connected
19451 to it.  Return @code{nil} if the server couldn't be closed for some
19452 reason.
19453
19454 There should be no data returned.
19455
19456
19457 @item (nnchoke-request-close)
19458
19459 Close connection to all servers and free all resources that the backend
19460 have reserved.  All buffers that have been created by that backend
19461 should be killed.  (Not the @code{nntp-server-buffer}, though.)  This
19462 function is generally only called when Gnus is shutting down.
19463
19464 There should be no data returned.
19465
19466
19467 @item (nnchoke-server-opened &optional SERVER)
19468
19469 If @var{server} is the current virtual server, and the connection to the
19470 physical server is alive, then this function should return a
19471 non-@code{nil} vlue.  This function should under no circumstances
19472 attempt to reconnect to a server we have lost connection to.
19473
19474 There should be no data returned.
19475
19476
19477 @item (nnchoke-status-message &optional SERVER)
19478
19479 This function should return the last error message from @var{server}.
19480
19481 There should be no data returned.
19482
19483
19484 @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
19485
19486 The result data from this function should be the article specified by
19487 @var{article}.  This might either be a @code{Message-ID} or a number.
19488 It is optional whether to implement retrieval by @code{Message-ID}, but
19489 it would be nice if that were possible.
19490
19491 If @var{to-buffer} is non-@code{nil}, the result data should be returned
19492 in this buffer instead of the normal data buffer.  This is to make it
19493 possible to avoid copying large amounts of data from one buffer to
19494 another, while Gnus mainly requests articles to be inserted directly
19495 into its article buffer.
19496
19497 If it is at all possible, this function should return a cons cell where
19498 the @code{car} is the group name the article was fetched from, and the @code{cdr} is
19499 the article number.  This will enable Gnus to find out what the real
19500 group and article numbers are when fetching articles by
19501 @code{Message-ID}.  If this isn't possible, @code{t} should be returned
19502 on successful article retrieval.
19503
19504
19505 @item (nnchoke-request-group GROUP &optional SERVER FAST)
19506
19507 Get data on @var{group}.  This function also has the side effect of
19508 making @var{group} the current group.
19509
19510 If @var{FAST}, don't bother to return useful data, just make @var{group}
19511 the current group.
19512
19513 Here's an example of some result data and a definition of the same:
19514
19515 @example
19516 211 56 1000 1059 ifi.discussion
19517 @end example
19518
19519 The first number is the status, which should be 211.  Next is the
19520 total number of articles in the group, the lowest article number, the
19521 highest article number, and finally the group name.  Note that the total
19522 number of articles may be less than one might think while just
19523 considering the highest and lowest article numbers, but some articles
19524 may have been canceled.  Gnus just discards the total-number, so
19525 whether one should take the bother to generate it properly (if that is a
19526 problem) is left as an exercise to the reader.
19527
19528 @example
19529 group-status = [ error / info ] eol
19530 error        = [ "4" / "5" ] 2<number> " " <Error message>
19531 info         = "211 " 3* [ <number> " " ] <string>
19532 @end example
19533
19534
19535 @item (nnchoke-close-group GROUP &optional SERVER)
19536
19537 Close @var{group} and free any resources connected to it.  This will be
19538 a no-op on most backends.
19539
19540 There should be no data returned.
19541
19542
19543 @item (nnchoke-request-list &optional SERVER)
19544
19545 Return a list of all groups available on @var{server}.  And that means
19546 @emph{all}.
19547
19548 Here's an example from a server that only carries two groups:
19549
19550 @example
19551 ifi.test 0000002200 0000002000 y
19552 ifi.discussion 3324 3300 n
19553 @end example
19554
19555 On each line we have a group name, then the highest article number in
19556 that group, the lowest article number, and finally a flag.
19557
19558 @example
19559 active-file = *active-line
19560 active-line = name " " <number> " " <number> " " flags eol
19561 name        = <string>
19562 flags       = "n" / "y" / "m" / "x" / "j" / "=" name
19563 @end example
19564
19565 The flag says whether the group is read-only (@samp{n}), is moderated
19566 (@samp{m}), is dead (@samp{x}), is aliased to some other group
19567 (@samp{=other-group}) or none of the above (@samp{y}).
19568
19569
19570 @item (nnchoke-request-post &optional SERVER)
19571
19572 This function should post the current buffer.  It might return whether
19573 the posting was successful or not, but that's not required.  If, for
19574 instance, the posting is done asynchronously, it has generally not been
19575 completed by the time this function concludes.  In that case, this
19576 function should set up some kind of sentinel to beep the user loud and
19577 clear if the posting could not be completed.
19578
19579 There should be no result data from this function.
19580
19581 @end table
19582
19583
19584 @node Optional Backend Functions
19585 @subsubsection Optional Backend Functions
19586
19587 @table @code
19588
19589 @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
19590
19591 @var{groups} is a list of groups, and this function should request data
19592 on all those groups.  How it does it is of no concern to Gnus, but it
19593 should attempt to do this in a speedy fashion.
19594
19595 The return value of this function can be either @code{active} or
19596 @code{group}, which says what the format of the result data is.  The
19597 former is in the same format as the data from
19598 @code{nnchoke-request-list}, while the latter is a buffer full of lines
19599 in the same format as @code{nnchoke-request-group} gives.
19600
19601 @example
19602 group-buffer = *active-line / *group-status
19603 @end example
19604
19605
19606 @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
19607
19608 A Gnus group info (@pxref{Group Info}) is handed to the backend for
19609 alterations.  This comes in handy if the backend really carries all the
19610 information (as is the case with virtual and imap groups).  This
19611 function should destructively alter the info to suit its needs, and
19612 should return the (altered) group info.
19613
19614 There should be no result data from this function.
19615
19616
19617 @item (nnchoke-request-type GROUP &optional ARTICLE)
19618
19619 When the user issues commands for ``sending news'' (@kbd{F} in the
19620 summary buffer, for instance), Gnus has to know whether the article the
19621 user is following up on is news or mail.  This function should return
19622 @code{news} if @var{article} in @var{group} is news, @code{mail} if it
19623 is mail and @code{unknown} if the type can't be decided.  (The
19624 @var{article} parameter is necessary in @code{nnvirtual} groups which
19625 might very well combine mail groups and news groups.)  Both @var{group}
19626 and @var{article} may be @code{nil}.
19627
19628 There should be no result data from this function.
19629
19630
19631 @item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)
19632
19633 Set/remove/add marks on articles. Normally Gnus handles the article
19634 marks (such as read, ticked, expired etc) internally, and store them in
19635 @code{~/.newsrc.eld}. Some backends (such as IMAP) however carry all
19636 information about the articles on the server, so Gnus need to propagate
19637 the mark information to the server.
19638
19639 ACTION is a list of mark setting requests, having this format:
19640
19641 @example
19642 (RANGE ACTION MARK)
19643 @end example
19644
19645 Range is a range of articles you wish to update marks on. Action is
19646 @code{set}, @code{add} or @code{del}, respectively used for removing all
19647 existing marks and setting them as specified, adding (preserving the
19648 marks not mentioned) mark and removing (preserving the marks not
19649 mentioned) marks. Mark is a list of marks; where each mark is a
19650 symbol. Currently used marks are @code{read}, @code{tick}, @code{reply},
19651 @code{expire}, @code{killed}, @code{dormant}, @code{save},
19652 @code{download} and @code{unsend}, but your backend should, if possible,
19653 not limit itself to theese.
19654
19655 Given contradictory actions, the last action in the list should be the
19656 effective one. That is, if your action contains a request to add the
19657 @code{tick} mark on article 1 and, later in the list, a request to
19658 remove the mark on the same article, the mark should in fact be removed.
19659
19660 An example action list:
19661
19662 @example
19663 (((5 12 30) 'del '(tick))
19664  ((10 . 90) 'add '(read expire))
19665  ((92 94) 'del '(read)))
19666 @end example
19667
19668 The function should return a range of articles it wasn't able to set the
19669 mark on (currently not used for anything).
19670
19671 There should be no result data from this function.
19672
19673 @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
19674
19675 If the user tries to set a mark that the backend doesn't like, this
19676 function may change the mark.  Gnus will use whatever this function
19677 returns as the mark for @var{article} instead of the original
19678 @var{mark}.  If the backend doesn't care, it must return the original
19679 @var{mark}, and not @code{nil} or any other type of garbage.
19680
19681 The only use for this I can see is what @code{nnvirtual} does with
19682 it---if a component group is auto-expirable, marking an article as read
19683 in the virtual group should result in the article being marked as
19684 expirable.
19685
19686 There should be no result data from this function.
19687
19688
19689 @item (nnchoke-request-scan &optional GROUP SERVER)
19690
19691 This function may be called at any time (by Gnus or anything else) to
19692 request that the backend check for incoming articles, in one way or
19693 another.  A mail backend will typically read the spool file or query the
19694 POP server when this function is invoked.  The @var{group} doesn't have
19695 to be heeded---if the backend decides that it is too much work just
19696 scanning for a single group, it may do a total scan of all groups.  It
19697 would be nice, however, to keep things local if that's practical.
19698
19699 There should be no result data from this function.
19700
19701
19702 @item (nnchoke-request-group-description GROUP &optional SERVER)
19703
19704 The result data from this function should be a description of
19705 @var{group}.
19706
19707 @example
19708 description-line = name <TAB> description eol
19709 name             = <string>
19710 description      = <text>
19711 @end example
19712
19713 @item (nnchoke-request-list-newsgroups &optional SERVER)
19714
19715 The result data from this function should be the description of all
19716 groups available on the server.
19717
19718 @example
19719 description-buffer = *description-line
19720 @end example
19721
19722
19723 @item (nnchoke-request-newgroups DATE &optional SERVER)
19724
19725 The result data from this function should be all groups that were
19726 created after @samp{date}, which is in normal human-readable date
19727 format.  The data should be in the active buffer format.
19728
19729
19730 @item (nnchoke-request-create-group GROUP &optional SERVER)
19731
19732 This function should create an empty group with name @var{group}.
19733
19734 There should be no return data.
19735
19736
19737 @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
19738
19739 This function should run the expiry process on all articles in the
19740 @var{articles} range (which is currently a simple list of article
19741 numbers.)  It is left up to the backend to decide how old articles
19742 should be before they are removed by this function.  If @var{force} is
19743 non-@code{nil}, all @var{articles} should be deleted, no matter how new
19744 they are.
19745
19746 This function should return a list of articles that it did not/was not
19747 able to delete.
19748
19749 There should be no result data returned.
19750
19751
19752 @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
19753 &optional LAST)
19754
19755 This function should move @var{article} (which is a number) from
19756 @var{group} by calling @var{accept-form}.
19757
19758 This function should ready the article in question for moving by
19759 removing any header lines it has added to the article, and generally
19760 should ``tidy up'' the article.  Then it should @code{eval}
19761 @var{accept-form} in the buffer where the ``tidy'' article is.  This
19762 will do the actual copying.  If this @code{eval} returns a
19763 non-@code{nil} value, the article should be removed.
19764
19765 If @var{last} is @code{nil}, that means that there is a high likelihood
19766 that there will be more requests issued shortly, so that allows some
19767 optimizations.
19768
19769 The function should return a cons where the @code{car} is the group name and
19770 the @code{cdr} is the article number that the article was entered as.
19771
19772 There should be no data returned.
19773
19774
19775 @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
19776
19777 This function takes the current buffer and inserts it into @var{group}.
19778 If @var{last} in @code{nil}, that means that there will be more calls to
19779 this function in short order.
19780
19781 The function should return a cons where the @code{car} is the group name and
19782 the @code{cdr} is the article number that the article was entered as.
19783
19784 There should be no data returned.
19785
19786
19787 @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
19788
19789 This function should remove @var{article} (which is a number) from
19790 @var{group} and insert @var{buffer} there instead.
19791
19792 There should be no data returned.
19793
19794
19795 @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
19796
19797 This function should delete @var{group}.  If @var{force}, it should
19798 really delete all the articles in the group, and then delete the group
19799 itself.  (If there is such a thing as ``the group itself''.)
19800
19801 There should be no data returned.
19802
19803
19804 @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
19805
19806 This function should rename @var{group} into @var{new-name}.  All
19807 articles in @var{group} should move to @var{new-name}.
19808
19809 There should be no data returned.
19810
19811 @end table
19812
19813
19814 @node Error Messaging
19815 @subsubsection Error Messaging
19816
19817 @findex nnheader-report
19818 @findex nnheader-get-report
19819 The backends should use the function @code{nnheader-report} to report
19820 error conditions---they should not raise errors when they aren't able to
19821 perform a request.  The first argument to this function is the backend
19822 symbol, and the rest are interpreted as arguments to @code{format} if
19823 there are multiple of them, or just a string if there is one of them.
19824 This function must always returns @code{nil}.
19825
19826 @lisp
19827 (nnheader-report 'nnchoke "You did something totally bogus")
19828
19829 (nnheader-report 'nnchoke "Could not request group %s" group)
19830 @end lisp
19831
19832 Gnus, in turn, will call @code{nnheader-get-report} when it gets a
19833 @code{nil} back from a server, and this function returns the most
19834 recently reported message for the backend in question.  This function
19835 takes one argument---the server symbol.
19836
19837 Internally, these functions access @var{backend}@code{-status-string},
19838 so the @code{nnchoke} backend will have its error message stored in
19839 @code{nnchoke-status-string}.
19840
19841
19842 @node Writing New Backends
19843 @subsubsection Writing New Backends
19844
19845 Many backends are quite similar.  @code{nnml} is just like
19846 @code{nnspool}, but it allows you to edit the articles on the server.
19847 @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
19848 and it doesn't maintain overview databases.  @code{nndir} is just like
19849 @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
19850 editing articles.
19851
19852 It would make sense if it were possible to ``inherit'' functions from
19853 backends when writing new backends.  And, indeed, you can do that if you
19854 want to.  (You don't have to if you don't want to, of course.)
19855
19856 All the backends declare their public variables and functions by using a
19857 package called @code{nnoo}.
19858
19859 To inherit functions from other backends (and allow other backends to
19860 inherit functions from the current backend), you should use the
19861 following macros:
19862
19863 @table @code
19864
19865 @item nnoo-declare
19866 This macro declares the first parameter to be a child of the subsequent
19867 parameters.  For instance:
19868
19869 @lisp
19870 (nnoo-declare nndir
19871   nnml nnmh)
19872 @end lisp
19873
19874 @code{nndir} has declared here that it intends to inherit functions from
19875 both @code{nnml} and @code{nnmh}.
19876
19877 @item defvoo
19878 This macro is equivalent to @code{defvar}, but registers the variable as
19879 a public server variable.  Most state-oriented variables should be
19880 declared with @code{defvoo} instead of @code{defvar}.
19881
19882 In addition to the normal @code{defvar} parameters, it takes a list of
19883 variables in the parent backends to map the variable to when executing
19884 a function in those backends.
19885
19886 @lisp
19887 (defvoo nndir-directory nil
19888   "Where nndir will look for groups."
19889   nnml-current-directory nnmh-current-directory)
19890 @end lisp
19891
19892 This means that @code{nnml-current-directory} will be set to
19893 @code{nndir-directory} when an @code{nnml} function is called on behalf
19894 of @code{nndir}.  (The same with @code{nnmh}.)
19895
19896 @item nnoo-define-basics
19897 This macro defines some common functions that almost all backends should
19898 have.
19899
19900 @example
19901 (nnoo-define-basics nndir)
19902 @end example
19903
19904 @item deffoo
19905 This macro is just like @code{defun} and takes the same parameters.  In
19906 addition to doing the normal @code{defun} things, it registers the
19907 function as being public so that other backends can inherit it.
19908
19909 @item nnoo-map-functions
19910 This macro allows mapping of functions from the current backend to
19911 functions from the parent backends.
19912
19913 @example
19914 (nnoo-map-functions nndir
19915   (nnml-retrieve-headers 0 nndir-current-group 0 0)
19916   (nnmh-request-article 0 nndir-current-group 0 0))
19917 @end example
19918
19919 This means that when @code{nndir-retrieve-headers} is called, the first,
19920 third, and fourth parameters will be passed on to
19921 @code{nnml-retrieve-headers}, while the second parameter is set to the
19922 value of @code{nndir-current-group}.
19923
19924 @item nnoo-import
19925 This macro allows importing functions from backends.  It should be the
19926 last thing in the source file, since it will only define functions that
19927 haven't already been defined.
19928
19929 @example
19930 (nnoo-import nndir
19931   (nnmh
19932    nnmh-request-list
19933    nnmh-request-newgroups)
19934   (nnml))
19935 @end example
19936
19937 This means that calls to @code{nndir-request-list} should just be passed
19938 on to @code{nnmh-request-list}, while all public functions from
19939 @code{nnml} that haven't been defined in @code{nndir} yet should be
19940 defined now.
19941
19942 @end table
19943
19944 Below is a slightly shortened version of the @code{nndir} backend.
19945
19946 @lisp
19947 ;;; nndir.el --- single directory newsgroup access for Gnus
19948 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
19949
19950 ;;; Code:
19951
19952 (require 'nnheader)
19953 (require 'nnmh)
19954 (require 'nnml)
19955 (require 'nnoo)
19956 (eval-when-compile (require 'cl))
19957
19958 (nnoo-declare nndir
19959   nnml nnmh)
19960
19961 (defvoo nndir-directory nil
19962   "Where nndir will look for groups."
19963   nnml-current-directory nnmh-current-directory)
19964
19965 (defvoo nndir-nov-is-evil nil
19966   "*Non-nil means that nndir will never retrieve NOV headers."
19967   nnml-nov-is-evil)
19968
19969 (defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group)
19970 (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
19971 (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
19972
19973 (defvoo nndir-status-string "" nil nnmh-status-string)
19974 (defconst nndir-version "nndir 1.0")
19975
19976 ;;; Interface functions.
19977
19978 (nnoo-define-basics nndir)
19979
19980 (deffoo nndir-open-server (server &optional defs)
19981   (setq nndir-directory
19982         (or (cadr (assq 'nndir-directory defs))
19983             server))
19984   (unless (assq 'nndir-directory defs)
19985     (push `(nndir-directory ,server) defs))
19986   (push `(nndir-current-group
19987           ,(file-name-nondirectory (directory-file-name nndir-directory)))
19988         defs)
19989   (push `(nndir-top-directory
19990           ,(file-name-directory (directory-file-name nndir-directory)))
19991         defs)
19992   (nnoo-change-server 'nndir server defs))
19993
19994 (nnoo-map-functions nndir
19995   (nnml-retrieve-headers 0 nndir-current-group 0 0)
19996   (nnmh-request-article 0 nndir-current-group 0 0)
19997   (nnmh-request-group nndir-current-group 0 0)
19998   (nnmh-close-group nndir-current-group 0))
19999
20000 (nnoo-import nndir
20001   (nnmh
20002    nnmh-status-message
20003    nnmh-request-list
20004    nnmh-request-newgroups))
20005
20006 (provide 'nndir)
20007 @end lisp
20008
20009
20010 @node Hooking New Backends Into Gnus
20011 @subsubsection Hooking New Backends Into Gnus
20012
20013 @vindex gnus-valid-select-methods
20014 Having Gnus start using your new backend is rather easy---you just
20015 declare it with the @code{gnus-declare-backend} functions.  This will
20016 enter the backend into the @code{gnus-valid-select-methods} variable.
20017
20018 @code{gnus-declare-backend} takes two parameters---the backend name and
20019 an arbitrary number of @dfn{abilities}.
20020
20021 Here's an example:
20022
20023 @lisp
20024 (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
20025 @end lisp
20026
20027 The abilities can be:
20028
20029 @table @code
20030 @item mail
20031 This is a mailish backend---followups should (probably) go via mail.
20032 @item post
20033 This is a newsish backend---followups should (probably) go via news.
20034 @item post-mail
20035 This backend supports both mail and news.
20036 @item none
20037 This is neither a post nor mail backend---it's something completely
20038 different.
20039 @item respool
20040 It supports respooling---or rather, it is able to modify its source
20041 articles and groups.
20042 @item address
20043 The name of the server should be in the virtual server name.  This is
20044 true for almost all backends.
20045 @item prompt-address
20046 The user should be prompted for an address when doing commands like
20047 @kbd{B} in the group buffer.  This is true for backends like
20048 @code{nntp}, but not @code{nnmbox}, for instance.
20049 @end table
20050
20051
20052 @node Mail-like Backends
20053 @subsubsection Mail-like Backends
20054
20055 One of the things that separate the mail backends from the rest of the
20056 backends is the heavy dependence by the mail backends on common
20057 functions in @file{nnmail.el}.  For instance, here's the definition of
20058 @code{nnml-request-scan}:
20059
20060 @lisp
20061 (deffoo nnml-request-scan (&optional group server)
20062   (setq nnml-article-file-alist nil)
20063   (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
20064 @end lisp
20065
20066 It simply calls @code{nnmail-get-new-mail} with a few parameters,
20067 and @code{nnmail} takes care of all the moving and splitting of the
20068 mail.
20069
20070 This function takes four parameters.
20071
20072 @table @var
20073 @item method
20074 This should be a symbol to designate which backend is responsible for
20075 the call.
20076
20077 @item exit-function
20078 This function should be called after the splitting has been performed.
20079
20080 @item temp-directory
20081 Where the temporary files should be stored.
20082
20083 @item group
20084 This optional argument should be a group name if the splitting is to be
20085 performed for one group only.
20086 @end table
20087
20088 @code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to
20089 save each article.  @var{backend}@code{-active-number} will be called to
20090 find the article number assigned to this article.
20091
20092 The function also uses the following variables:
20093 @var{backend}@code{-get-new-mail} (to see whether to get new mail for
20094 this backend); and @var{backend}@code{-group-alist} and
20095 @var{backend}@code{-active-file} to generate the new active file.
20096 @var{backend}@code{-group-alist} should be a group-active alist, like
20097 this:
20098
20099 @example
20100 (("a-group" (1 . 10))
20101  ("some-group" (34 . 39)))
20102 @end example
20103
20104
20105 @node Score File Syntax
20106 @subsection Score File Syntax
20107
20108 Score files are meant to be easily parseable, but yet extremely
20109 mallable.   It was decided that something that had the same read syntax
20110 as an Emacs Lisp list would fit that spec.
20111
20112 Here's a typical score file:
20113
20114 @lisp
20115 (("summary"
20116   ("win95" -10000 nil s)
20117   ("Gnus"))
20118  ("from"
20119   ("Lars" -1000))
20120  (mark -100))
20121 @end lisp
20122
20123 BNF definition of a score file:
20124
20125 @example
20126 score-file       = "" / "(" *element ")"
20127 element          = rule / atom
20128 rule             = string-rule / number-rule / date-rule
20129 string-rule      = "(" quote string-header quote space *string-match ")"
20130 number-rule      = "(" quote number-header quote space *number-match ")"
20131 date-rule        = "(" quote date-header quote space *date-match ")"
20132 quote            = <ascii 34>
20133 string-header    = "subject" / "from" / "references" / "message-id" /
20134                    "xref" / "body" / "head" / "all" / "followup"
20135 number-header    = "lines" / "chars"
20136 date-header      = "date"
20137 string-match     = "(" quote <string> quote [ "" / [ space score [ "" /
20138                    space date [ "" / [ space string-match-t ] ] ] ] ] ")"
20139 score            = "nil" / <integer>
20140 date             = "nil" / <natural number>
20141 string-match-t   = "nil" / "s" / "substring" / "S" / "Substring" /
20142                    "r" / "regex" / "R" / "Regex" /
20143                    "e" / "exact" / "E" / "Exact" /
20144                    "f" / "fuzzy" / "F" / "Fuzzy"
20145 number-match     = "(" <integer> [ "" / [ space score [ "" /
20146                    space date [ "" / [ space number-match-t ] ] ] ] ] ")"
20147 number-match-t   = "nil" / "=" / "<" / ">" / ">=" / "<="
20148 date-match       = "(" quote <string> quote [ "" / [ space score [ "" /
20149                    space date [ "" / [ space date-match-t ] ] ] ] ")"
20150 date-match-t     = "nil" / "at" / "before" / "after"
20151 atom             = "(" [ required-atom / optional-atom ] ")"
20152 required-atom    = mark / expunge / mark-and-expunge / files /
20153                    exclude-files / read-only / touched
20154 optional-atom    = adapt / local / eval
20155 mark             = "mark" space nil-or-number
20156 nil-or-number    = "nil" / <integer>
20157 expunge          = "expunge" space nil-or-number
20158 mark-and-expunge = "mark-and-expunge" space nil-or-number
20159 files            = "files" *[ space <string> ]
20160 exclude-files    = "exclude-files" *[ space <string> ]
20161 read-only        = "read-only" [ space "nil" / space "t" ]
20162 adapt            = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
20163 adapt-rule       = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
20164 local            = "local" *[ space "(" <string> space <form> ")" ]
20165 eval             = "eval" space <form>
20166 space            = *[ " " / <TAB> / <NEWLINE> ]
20167 @end example
20168
20169 Any unrecognized elements in a score file should be ignored, but not
20170 discarded.
20171
20172 As you can see, white space is needed, but the type and amount of white
20173 space is irrelevant.  This means that formatting of the score file is
20174 left up to the programmer---if it's simpler to just spew it all out on
20175 one looong line, then that's ok.
20176
20177 The meaning of the various atoms are explained elsewhere in this
20178 manual (@pxref{Score File Format}).
20179
20180
20181 @node Headers
20182 @subsection Headers
20183
20184 Internally Gnus uses a format for storing article headers that
20185 corresponds to the @sc{nov} format in a mysterious fashion.  One could
20186 almost suspect that the author looked at the @sc{nov} specification and
20187 just shamelessly @emph{stole} the entire thing, and one would be right.
20188
20189 @dfn{Header} is a severely overloaded term.  ``Header'' is used in
20190 RFC1036 to talk about lines in the head of an article (e.g.,
20191 @code{From}).  It is used by many people as a synonym for
20192 ``head''---``the header and the body''.  (That should be avoided, in my
20193 opinion.)  And Gnus uses a format internally that it calls ``header'',
20194 which is what I'm talking about here.  This is a 9-element vector,
20195 basically, with each header (ouch) having one slot.
20196
20197 These slots are, in order: @code{number}, @code{subject}, @code{from},
20198 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
20199 @code{xref}, and @code{extra}.  There are macros for accessing and
20200 setting these slots---they all have predictable names beginning with
20201 @code{mail-header-} and @code{mail-header-set-}, respectively.
20202
20203 All these slots contain strings, except the @code{extra} slot, which
20204 contains an alist of header/value pairs (@pxref{To From Newsgroups}).
20205
20206
20207 @node Ranges
20208 @subsection Ranges
20209
20210 @sc{gnus} introduced a concept that I found so useful that I've started
20211 using it a lot and have elaborated on it greatly.
20212
20213 The question is simple: If you have a large amount of objects that are
20214 identified by numbers (say, articles, to take a @emph{wild} example)
20215 that you want to qualify as being ``included'', a normal sequence isn't
20216 very useful.  (A 200,000 length sequence is a bit long-winded.)
20217
20218 The solution is as simple as the question: You just collapse the
20219 sequence.
20220
20221 @example
20222 (1 2 3 4 5 6 10 11 12)
20223 @end example
20224
20225 is transformed into
20226
20227 @example
20228 ((1 . 6) (10 . 12))
20229 @end example
20230
20231 To avoid having those nasty @samp{(13 . 13)} elements to denote a
20232 lonesome object, a @samp{13} is a valid element:
20233
20234 @example
20235 ((1 . 6) 7 (10 . 12))
20236 @end example
20237
20238 This means that comparing two ranges to find out whether they are equal
20239 is slightly tricky:
20240
20241 @example
20242 ((1 . 5) 7 8 (10 . 12))
20243 @end example
20244
20245 and
20246
20247 @example
20248 ((1 . 5) (7 . 8) (10 . 12))
20249 @end example
20250
20251 are equal.  In fact, any non-descending list is a range:
20252
20253 @example
20254 (1 2 3 4 5)
20255 @end example
20256
20257 is a perfectly valid range, although a pretty long-winded one.  This is
20258 also valid:
20259
20260 @example
20261 (1 . 5)
20262 @end example
20263
20264 and is equal to the previous range.
20265
20266 Here's a BNF definition of ranges.  Of course, one must remember the
20267 semantic requirement that the numbers are non-descending.  (Any number
20268 of repetition of the same number is allowed, but apt to disappear in
20269 range handling.)
20270
20271 @example
20272 range           = simple-range / normal-range
20273 simple-range    = "(" number " . " number ")"
20274 normal-range    = "(" start-contents ")"
20275 contents        = "" / simple-range *[ " " contents ] /
20276                   number *[ " " contents ]
20277 @end example
20278
20279 Gnus currently uses ranges to keep track of read articles and article
20280 marks.  I plan on implementing a number of range operators in C if The
20281 Powers That Be are willing to let me.  (I haven't asked yet, because I
20282 need to do some more thinking on what operators I need to make life
20283 totally range-based without ever having to convert back to normal
20284 sequences.)
20285
20286
20287 @node Group Info
20288 @subsection Group Info
20289
20290 Gnus stores all permanent info on groups in a @dfn{group info} list.
20291 This list is from three to six elements (or more) long and exhaustively
20292 describes the group.
20293
20294 Here are two example group infos; one is a very simple group while the
20295 second is a more complex one:
20296
20297 @example
20298 ("no.group" 5 ((1 . 54324)))
20299
20300 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
20301                 ((tick (15 . 19)) (replied 3 6 (19 . 3)))
20302                 (nnml "")
20303                 ((auto-expire . t) (to-address . "ding@@gnus.org")))
20304 @end example
20305
20306 The first element is the @dfn{group name}---as Gnus knows the group,
20307 anyway.  The second element is the @dfn{subscription level}, which
20308 normally is a small integer.  (It can also be the @dfn{rank}, which is a
20309 cons cell where the @code{car} is the level and the @code{cdr} is the
20310 score.)  The third element is a list of ranges of read articles.  The
20311 fourth element is a list of lists of article marks of various kinds.
20312 The fifth element is the select method (or virtual server, if you like).
20313 The sixth element is a list of @dfn{group parameters}, which is what
20314 this section is about.
20315
20316 Any of the last three elements may be missing if they are not required.
20317 In fact, the vast majority of groups will normally only have the first
20318 three elements, which saves quite a lot of cons cells.
20319
20320 Here's a BNF definition of the group info format:
20321
20322 @example
20323 info          = "(" group space ralevel space read
20324                 [ "" / [ space marks-list [ "" / [ space method [ "" /
20325                 space parameters ] ] ] ] ] ")"
20326 group         = quote <string> quote
20327 ralevel       = rank / level
20328 level         = <integer in the range of 1 to inf>
20329 rank          = "(" level "." score ")"
20330 score         = <integer in the range of 1 to inf>
20331 read          = range
20332 marks-lists   = nil / "(" *marks ")"
20333 marks         = "(" <string> range ")"
20334 method        = "(" <string> *elisp-forms ")"
20335 parameters    = "(" *elisp-forms ")"
20336 @end example
20337
20338 Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
20339 @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
20340 in pseudo-BNF.
20341
20342 If you have a Gnus info and want to access the elements, Gnus offers a
20343 series of macros for getting/setting these elements.
20344
20345 @table @code
20346 @item gnus-info-group
20347 @itemx gnus-info-set-group
20348 @findex gnus-info-group
20349 @findex gnus-info-set-group
20350 Get/set the group name.
20351
20352 @item gnus-info-rank
20353 @itemx gnus-info-set-rank
20354 @findex gnus-info-rank
20355 @findex gnus-info-set-rank
20356 Get/set the group rank (@pxref{Group Score}).
20357
20358 @item gnus-info-level
20359 @itemx gnus-info-set-level
20360 @findex gnus-info-level
20361 @findex gnus-info-set-level
20362 Get/set the group level.
20363
20364 @item gnus-info-score
20365 @itemx gnus-info-set-score
20366 @findex gnus-info-score
20367 @findex gnus-info-set-score
20368 Get/set the group score (@pxref{Group Score}).
20369
20370 @item gnus-info-read
20371 @itemx gnus-info-set-read
20372 @findex gnus-info-read
20373 @findex gnus-info-set-read
20374 Get/set the ranges of read articles.
20375
20376 @item gnus-info-marks
20377 @itemx gnus-info-set-marks
20378 @findex gnus-info-marks
20379 @findex gnus-info-set-marks
20380 Get/set the lists of ranges of marked articles.
20381
20382 @item gnus-info-method
20383 @itemx gnus-info-set-method
20384 @findex gnus-info-method
20385 @findex gnus-info-set-method
20386 Get/set the group select method.
20387
20388 @item gnus-info-params
20389 @itemx gnus-info-set-params
20390 @findex gnus-info-params
20391 @findex gnus-info-set-params
20392 Get/set the group parameters.
20393 @end table
20394
20395 All the getter functions take one parameter---the info list.  The setter
20396 functions take two parameters---the info list and the new value.
20397
20398 The last three elements in the group info aren't mandatory, so it may be
20399 necessary to extend the group info before setting the element.  If this
20400 is necessary, you can just pass on a non-@code{nil} third parameter to
20401 the three final setter functions to have this happen automatically.
20402
20403
20404 @node Extended Interactive
20405 @subsection Extended Interactive
20406 @cindex interactive
20407 @findex gnus-interactive
20408
20409 Gnus extends the standard Emacs @code{interactive} specification
20410 slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
20411 Prefixes}).  Here's an example of how this is used:
20412
20413 @lisp
20414 (defun gnus-summary-increase-score (&optional score symp)
20415   (interactive (gnus-interactive "P\ny"))
20416   ...
20417   )
20418 @end lisp
20419
20420 The best thing to do would have been to implement
20421 @code{gnus-interactive} as a macro which would have returned an
20422 @code{interactive} form, but this isn't possible since Emacs checks
20423 whether a function is interactive or not by simply doing an @code{assq}
20424 on the lambda form.  So, instead we have @code{gnus-interactive}
20425 function that takes a string and returns values that are usable to
20426 @code{interactive}.
20427
20428 This function accepts (almost) all normal @code{interactive} specs, but
20429 adds a few more.
20430
20431 @table @samp
20432 @item y
20433 @vindex gnus-current-prefix-symbol
20434 The current symbolic prefix---the @code{gnus-current-prefix-symbol}
20435 variable.
20436
20437 @item Y
20438 @vindex gnus-current-prefix-symbols
20439 A list of the current symbolic prefixes---the
20440 @code{gnus-current-prefix-symbol} variable.
20441
20442 @item A
20443 The current article number---the @code{gnus-summary-article-number}
20444 function.
20445
20446 @item H
20447 The current article header---the @code{gnus-summary-article-header}
20448 function.
20449
20450 @item g
20451 The current group name---the @code{gnus-group-group-name}
20452 function.
20453
20454 @end table
20455
20456
20457 @node Emacs/XEmacs Code
20458 @subsection Emacs/XEmacs Code
20459 @cindex XEmacs
20460 @cindex Emacsen
20461
20462 While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
20463 platforms must be the primary one.  I chose Emacs.  Not because I don't
20464 like XEmacs or Mule, but because it comes first alphabetically.
20465
20466 This means that Gnus will byte-compile under Emacs with nary a warning,
20467 while XEmacs will pump out gigabytes of warnings while byte-compiling.
20468 As I use byte-compilation warnings to help me root out trivial errors in
20469 Gnus, that's very useful.
20470
20471 I've also consistently used Emacs function interfaces, but have used
20472 Gnusey aliases for the functions.  To take an example:  Emacs defines a
20473 @code{run-at-time} function while XEmacs defines a @code{start-itimer}
20474 function.  I then define a function called @code{gnus-run-at-time} that
20475 takes the same parameters as the Emacs @code{run-at-time}.  When running
20476 Gnus under Emacs, the former function is just an alias for the latter.
20477 However, when running under XEmacs, the former is an alias for the
20478 following function:
20479
20480 @lisp
20481 (defun gnus-xmas-run-at-time (time repeat function &rest args)
20482   (start-itimer
20483    "gnus-run-at-time"
20484    `(lambda ()
20485       (,function ,@@args))
20486    time repeat))
20487 @end lisp
20488
20489 This sort of thing has been done for bunches of functions.  Gnus does
20490 not redefine any native Emacs functions while running under XEmacs---it
20491 does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
20492 all over.
20493
20494 In the cases where the XEmacs function interface was obviously cleaner,
20495 I used it instead.  For example @code{gnus-region-active-p} is an alias
20496 for @code{region-active-p} in XEmacs, whereas in Emacs it is a function.
20497
20498 Of course, I could have chosen XEmacs as my native platform and done
20499 mapping functions the other way around.  But I didn't.  The performance
20500 hit these indirections impose on Gnus under XEmacs should be slight.
20501
20502
20503 @node Various File Formats
20504 @subsection Various File Formats
20505
20506 @menu
20507 * Active File Format::      Information on articles and groups available.
20508 * Newsgroups File Format::  Group descriptions.
20509 @end menu
20510
20511
20512 @node Active File Format
20513 @subsubsection Active File Format
20514
20515 The active file lists all groups available on the server in
20516 question.  It also lists the highest and lowest current article numbers
20517 in each group.
20518
20519 Here's an excerpt from a typical active file:
20520
20521 @example
20522 soc.motss 296030 293865 y
20523 alt.binaries.pictures.fractals 3922 3913 n
20524 comp.sources.unix 1605 1593 m
20525 comp.binaries.ibm.pc 5097 5089 y
20526 no.general 1000 900 y
20527 @end example
20528
20529 Here's a pseudo-BNF definition of this file:
20530
20531 @example
20532 active      = *group-line
20533 group-line  = group space high-number space low-number space flag <NEWLINE>
20534 group       = <non-white-space string>
20535 space       = " "
20536 high-number = <non-negative integer>
20537 low-number  = <positive integer>
20538 flag        = "y" / "n" / "m" / "j" / "x" / "=" group
20539 @end example
20540
20541 For a full description of this file, see the manual pages for
20542 @samp{innd}, in particular @samp{active(5)}.
20543
20544
20545 @node Newsgroups File Format
20546 @subsubsection Newsgroups File Format
20547
20548 The newsgroups file lists groups along with their descriptions.  Not all
20549 groups on the server have to be listed,  and not all groups in the file
20550 have to exist on the server.  The file is meant purely as information to
20551 the user.
20552
20553 The format is quite simple; a group name, a tab, and the description.
20554 Here's the definition:
20555
20556 @example
20557 newsgroups    = *line
20558 line          = group tab description <NEWLINE>
20559 group         = <non-white-space string>
20560 tab           = <TAB>
20561 description   = <string>
20562 @end example
20563
20564
20565 @page
20566 @node Emacs for Heathens
20567 @section Emacs for Heathens
20568
20569 Believe it or not, but some people who use Gnus haven't really used
20570 Emacs much before they embarked on their journey on the Gnus Love Boat.
20571 If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the
20572 region'', and ``set @code{gnus-flargblossen} to an alist where the key
20573 is a regexp that is used for matching on the group name'' are magical
20574 phrases with little or no meaning, then this appendix is for you.  If
20575 you are already familiar with Emacs, just ignore this and go fondle your
20576 cat instead.
20577
20578 @menu
20579 * Keystrokes::      Entering text and executing commands.
20580 * Emacs Lisp::      The built-in Emacs programming language.
20581 @end menu
20582
20583
20584 @node Keystrokes
20585 @subsection Keystrokes
20586
20587 @itemize @bullet
20588 @item
20589 Q: What is an experienced Emacs user?
20590
20591 @item
20592 A: A person who wishes that the terminal had pedals.
20593 @end itemize
20594
20595 Yes, when you use Emacs, you are apt to use the control key, the shift
20596 key and the meta key a lot.  This is very annoying to some people
20597 (notably @code{vi}le users), and the rest of us just love the hell out
20598 of it.  Just give up and submit.  Emacs really does stand for
20599 ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
20600 may have heard from other disreputable sources (like the Emacs author).
20601
20602 The shift keys are normally located near your pinky fingers, and are
20603 normally used to get capital letters and stuff.  You probably use it all
20604 the time.  The control key is normally marked ``CTRL'' or something like
20605 that.  The meta key is, funnily enough, never marked as such on any
20606 keyboard.  The one I'm currently at has a key that's marked ``Alt'',
20607 which is the meta key on this keyboard.  It's usually located somewhere
20608 to the left hand side of the keyboard, usually on the bottom row.
20609
20610 Now, us Emacs people don't say ``press the meta-control-m key'',
20611 because that's just too inconvenient.  We say ``press the @kbd{M-C-m}
20612 key''.  @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
20613 prefix that means ``control''.  So ``press @kbd{C-k}'' means ``press
20614 down the control key, and hold it down while you press @kbd{k}''.
20615 ``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and
20616 the control key and then press @kbd{k}''.  Simple, ay?
20617
20618 This is somewhat complicated by the fact that not all keyboards have a
20619 meta key.  In that case you can use the ``escape'' key.  Then @kbd{M-k}
20620 means ``press escape, release escape, press @kbd{k}''.  That's much more
20621 work than if you have a meta key, so if that's the case, I respectfully
20622 suggest you get a real keyboard with a meta key.  You can't live without
20623 it.
20624
20625
20626
20627 @node Emacs Lisp
20628 @subsection Emacs Lisp
20629
20630 Emacs is the King of Editors because it's really a Lisp interpreter.
20631 Each and every key you tap runs some Emacs Lisp code snippet, and since
20632 Emacs Lisp is an interpreted language, that means that you can configure
20633 any key to run any arbitrary code.  You just, like, do it.
20634
20635 Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
20636 functions.  (These are byte-compiled for speed, but it's still
20637 interpreted.)  If you decide that you don't like the way Gnus does
20638 certain things, it's trivial to have it do something a different way.
20639 (Well, at least if you know how to write Lisp code.)  However, that's
20640 beyond the scope of this manual, so we are simply going to talk about
20641 some common constructs that you normally use in your @file{.emacs} file
20642 to customize Gnus.
20643
20644 If you want to set the variable @code{gnus-florgbnize} to four (4), you
20645 write the following:
20646
20647 @lisp
20648 (setq gnus-florgbnize 4)
20649 @end lisp
20650
20651 This function (really ``special form'') @code{setq} is the one that can
20652 set a variable to some value.  This is really all you need to know.  Now
20653 you can go and fill your @code{.emacs} file with lots of these to change
20654 how Gnus works.
20655
20656 If you have put that thing in your @code{.emacs} file, it will be read
20657 and @code{eval}ed (which is lisp-ese for ``run'') the next time you
20658 start Emacs.  If you want to change the variable right away, simply say
20659 @kbd{C-x C-e} after the closing parenthesis.  That will @code{eval} the
20660 previous ``form'', which is a simple @code{setq} statement here.
20661
20662 Go ahead---just try it, if you're located at your Emacs.  After you
20663 @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
20664 is the return value of the form you @code{eval}ed.
20665
20666 Some pitfalls:
20667
20668 If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
20669 that means:
20670
20671 @lisp
20672 (setq gnus-read-active-file 'some)
20673 @end lisp
20674
20675 On the other hand, if the manual says ``set @code{gnus-nntp-server} to
20676 @samp{nntp.ifi.uio.no}'', that means:
20677
20678 @lisp
20679 (setq gnus-nntp-server "nntp.ifi.uio.no")
20680 @end lisp
20681
20682 So be careful not to mix up strings (the latter) with symbols (the
20683 former).  The manual is unambiguous, but it can be confusing.
20684
20685 @page
20686 @include gnus-faq.texi
20687
20688 @node Index
20689 @chapter Index
20690 @printindex cp
20691
20692 @node Key Index
20693 @chapter Key Index
20694 @printindex ky
20695
20696 @summarycontents
20697 @contents
20698 @bye
20699
20700 @iftex
20701 @iflatex
20702 \end{document}
20703 @end iflatex
20704 @end iftex
20705
20706 @c End: