Mercurial > hg > xemacs-beta
comparison man/gnus.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 \input texinfo @c -*-texinfo-*- | |
2 | |
3 @setfilename ../info/gnus.info | |
4 @settitle Gnus 5.2 Manual | |
5 @synindex fn cp | |
6 @synindex vr cp | |
7 @synindex pg cp | |
8 @iftex | |
9 @finalout | |
10 @end iftex | |
11 @setchapternewpage odd | |
12 | |
13 @iftex | |
14 @iflatex | |
15 \documentclass[twoside,a4paper,openright]{book} | |
16 \usepackage[latin1]{inputenc} | |
17 % \usepackage{fontenc} | |
18 % \usepackage{babel} | |
19 \usepackage{pagestyle} | |
20 \usepackage{epsfig} | |
21 % \usepackage{ifitricks} | |
22 \fontfamily{bembo}\selectfont | |
23 | |
24 \makeindex | |
25 \begin{document} | |
26 | |
27 \newcommand{\gnuschaptername}{} | |
28 \newcommand{\gnussectionname}{} | |
29 | |
30 \newcommand{\gnusbackslash}{/} | |
31 | |
32 \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}} | |
33 \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}} | |
34 | |
35 \newcommand{\gnuskindex}[1]{\index{#1}} | |
36 \newcommand{\gnusindex}[1]{\index{#1}} | |
37 | |
38 \newcommand{\gnustt}[1]{{\textbf{\textsf{#1}}}} | |
39 \newcommand{\gnuscode}[1]{\gnustt{#1}} | |
40 \newcommand{\gnussamp}[1]{``\gnustt{#1}''} | |
41 \newcommand{\gnuslisp}[1]{\gnustt{#1}} | |
42 \newcommand{\gnuskbd}[1]{`\gnustt{#1}'} | |
43 \newcommand{\gnusfile}[1]{`\gnustt{#1}'} | |
44 \newcommand{\gnusdfn}[1]{\textit{#1}} | |
45 \newcommand{\gnusi}[1]{\textit{#1}} | |
46 \newcommand{\gnusstrong}[1]{\textbf{#1}} | |
47 \newcommand{\gnusemph}[1]{\textit{#1}} | |
48 \newcommand{\gnusvar}[1]{\textsl{\textsf{#1}}} | |
49 \newcommand{\gnussc}[1]{\textsc{#1}} | |
50 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}} | |
51 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}} | |
52 | |
53 \newcommand{\gnusbullet}{{${\bullet}$}} | |
54 \newcommand{\gnusdollar}{\$} | |
55 \newcommand{\gnusampersand}{\&} | |
56 \newcommand{\gnuspercent}{\%} | |
57 \newcommand{\gnushash}{\#} | |
58 \newcommand{\gnushat}{\symbol{"5E}} | |
59 \newcommand{\gnusunderline}{\symbol{"5F}} | |
60 \newcommand{\gnustilde}{\symbol{"7E}} | |
61 \newcommand{\gnusless}{{$<$}} | |
62 \newcommand{\gnusgreater}{{$>$}} | |
63 | |
64 \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=gnus-head.eps,height=1cm}}} | |
65 \newcommand{\gnusinteresting}{ | |
66 \marginpar[\hspace{2.5cm}\gnushead]{\gnushead} | |
67 } | |
68 | |
69 \newcommand{\gnuschapter}[1]{ | |
70 \renewcommand{\gnussectionname}{} | |
71 \chapter{#1} | |
72 \renewcommand{\gnuschaptername}{#1} | |
73 \thispagestyle{empty} | |
74 % \epsfig{figure=gnus-herd-\arabic{chapter}.eps,height=15cm} | |
75 \clearpage | |
76 } | |
77 | |
78 \newcommand{\gnusitemx}[1]{\vspace{-\itemsep}\item#1} | |
79 | |
80 \newcommand{\gnussection}[1]{ | |
81 \renewcommand{\gnussectionname}{#1} | |
82 \section{#1} | |
83 } | |
84 | |
85 \newenvironment{codelist}% | |
86 {\begin{list}{}{ | |
87 } | |
88 }{\end{list}} | |
89 | |
90 \newenvironment{kbdlist}% | |
91 {\begin{list}{}{ | |
92 \labelwidth=0cm | |
93 } | |
94 }{\end{list}} | |
95 | |
96 \newenvironment{dfnlist}% | |
97 {\begin{list}{}{ | |
98 } | |
99 }{\end{list}} | |
100 | |
101 \newenvironment{stronglist}% | |
102 {\begin{list}{}{ | |
103 } | |
104 }{\end{list}} | |
105 | |
106 \newenvironment{samplist}% | |
107 {\begin{list}{}{ | |
108 } | |
109 }{\end{list}} | |
110 | |
111 \newenvironment{varlist}% | |
112 {\begin{list}{}{ | |
113 } | |
114 }{\end{list}} | |
115 | |
116 \newenvironment{emphlist}% | |
117 {\begin{list}{}{ | |
118 } | |
119 }{\end{list}} | |
120 | |
121 \newpagestyle{gnus}% | |
122 { | |
123 { | |
124 \ifodd\count0 | |
125 { | |
126 \hspace*{-2ex} | |
127 \underline{ | |
128 \makebox[\headtextwidth]{ | |
129 \hspace*{-2.3ex} | |
130 \textbf{\arabic{chapter}.\arabic{section}} | |
131 \textbf{\gnussectionname\hfill\arabic{page}} | |
132 }} | |
133 } | |
134 \else | |
135 { | |
136 \hspace*{-2.25cm} | |
137 \underline{ | |
138 \hspace*{-2.3ex} | |
139 \makebox[\headtextwidth]{ | |
140 \textbf{\arabic{page}\hfill\gnuschaptername} | |
141 }} | |
142 } | |
143 \fi | |
144 } | |
145 } | |
146 { | |
147 \ifodd\count0 | |
148 \mbox{} \hfill | |
149 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}} | |
150 \else | |
151 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}} | |
152 \hfill \mbox{} | |
153 \fi | |
154 } | |
155 \pagestyle{gnus} | |
156 | |
157 @end iflatex | |
158 @end iftex | |
159 | |
160 @iftex | |
161 @iflatex | |
162 \begin{titlepage} | |
163 { | |
164 | |
165 %\addtolength{\oddsidemargin}{-5cm} | |
166 %\addtolength{\evensidemargin}{-5cm} | |
167 \parindent=0cm | |
168 \addtolength{\textheight}{2cm} | |
169 | |
170 \gnustitle{\gnustitlename}\\ | |
171 \rule{15cm}{1mm}\\ | |
172 \vfill | |
173 \hspace*{-1cm}\epsfig{figure=gnus-big-logo.eps,height=15cm} | |
174 \vfill | |
175 \rule{15cm}{1mm}\\ | |
176 \gnusauthor{by Lars Magne Ingebrigtsen} | |
177 \newpage | |
178 } | |
179 | |
180 \mbox{} | |
181 \vfill | |
182 | |
183 \thispagestyle{empty} | |
184 | |
185 Copyright \copyright{} 1995,96 Free Software Foundation, Inc. | |
186 | |
187 Permission is granted to make and distribute verbatim copies of | |
188 this manual provided the copyright notice and this permission notice | |
189 are preserved on all copies. | |
190 | |
191 Permission is granted to copy and distribute modified versions of this | |
192 manual under the conditions for verbatim copying, provided that the | |
193 entire resulting derived work is distributed under the terms of a | |
194 permission notice identical to this one. | |
195 | |
196 Permission is granted to copy and distribute translations of this manual | |
197 into another language, under the above conditions for modified versions. | |
198 | |
199 \newpage | |
200 \end{titlepage} | |
201 @end iflatex | |
202 @end iftex | |
203 | |
204 @ifinfo | |
205 | |
206 This file documents Gnus, the GNU Emacs newsreader. | |
207 | |
208 Copyright (C) 1995,96 Free Software Foundation, Inc. | |
209 | |
210 Permission is granted to make and distribute verbatim copies of | |
211 this manual provided the copyright notice and this permission notice | |
212 are preserved on all copies. | |
213 | |
214 @ignore | |
215 Permission is granted to process this file through Tex and print the | |
216 results, provided the printed document carries copying permission | |
217 notice identical to this one except for the removal of this paragraph | |
218 (this paragraph not being relevant to the printed manual). | |
219 | |
220 @end ignore | |
221 Permission is granted to copy and distribute modified versions of this | |
222 manual under the conditions for verbatim copying, provided also that the | |
223 entire resulting derived work is distributed under the terms of a | |
224 permission notice identical to this one. | |
225 | |
226 Permission is granted to copy and distribute translations of this manual | |
227 into another language, under the above conditions for modified versions. | |
228 @end ifinfo | |
229 | |
230 @tex | |
231 | |
232 @titlepage | |
233 @title Gnus Manual | |
234 | |
235 @author by Lars Magne Ingebrigtsen | |
236 @page | |
237 | |
238 @vskip 0pt plus 1filll | |
239 Copyright @copyright{} 1995,96 Free Software Foundation, Inc. | |
240 | |
241 Permission is granted to make and distribute verbatim copies of | |
242 this manual provided the copyright notice and this permission notice | |
243 are preserved on all copies. | |
244 | |
245 Permission is granted to copy and distribute modified versions of this | |
246 manual under the conditions for verbatim copying, provided that the | |
247 entire resulting derived work is distributed under the terms of a | |
248 permission notice identical to this one. | |
249 | |
250 Permission is granted to copy and distribute translations of this manual | |
251 into another language, under the above conditions for modified versions. | |
252 | |
253 @end titlepage | |
254 @page | |
255 | |
256 @end tex | |
257 | |
258 | |
259 @node Top | |
260 @top The Gnus Newsreader | |
261 | |
262 @ifinfo | |
263 | |
264 You can read news (and mail) from within Emacs by using Gnus. The news | |
265 can be gotten by any nefarious means you can think of---@sc{nntp}, local | |
266 spool or your mbox file. All at the same time, if you want to push your | |
267 luck. | |
268 | |
269 @end ifinfo | |
270 | |
271 @iftex | |
272 | |
273 @iflatex | |
274 \thispagestyle{empty} | |
275 @end iflatex | |
276 | |
277 Gnus is the advanced, self-documenting, customizable, extensible | |
278 unreal-time newsreader for GNU Emacs. | |
279 | |
280 Oops. That sounds oddly familiar, so let's start over again to avoid | |
281 being accused of plagiarism: | |
282 | |
283 Gnus is a message-reading laboratory. It will let you look at just | |
284 about anything as if it were a newsgroup. You can read mail with it, | |
285 you can browse directories with it, you can @code{ftp} with it---you can | |
286 even read news with it! | |
287 | |
288 Gnus tries to empower people who read news the same way Emacs empowers | |
289 people who edit text. Gnus sets no limits to what the user should be | |
290 allowed to do. Users are encouraged to extend Gnus to make it behave | |
291 like they want it to behave. A program should not control people; | |
292 people should be empowered to do what they want by using (or abusing) | |
293 the program. | |
294 | |
295 @end iftex | |
296 | |
297 | |
298 @menu | |
299 * Starting Up:: Finding news can be a pain. | |
300 * The Group Buffer:: Selecting, subscribing and killing groups. | |
301 * The Summary Buffer:: Reading, saving and posting articles. | |
302 * The Article Buffer:: Displaying and handling articles. | |
303 * Composing Messages:: Information on sending mail and news. | |
304 * Select Methods:: Gnus reads all messages from various select methods. | |
305 * Scoring:: Assigning values to articles. | |
306 * Various:: General purpose settings. | |
307 * The End:: Farewell and goodbye. | |
308 * Appendices:: Terminology, Emacs intro, FAQ, History, Internals. | |
309 * Index:: Variable, function and concept index. | |
310 * Key Index:: Key Index. | |
311 @end menu | |
312 | |
313 | |
314 @node Starting Up | |
315 @chapter Starting Gnus | |
316 @cindex starting up | |
317 | |
318 @kindex M-x gnus | |
319 @findex gnus | |
320 If your system administrator has set things up properly, starting Gnus | |
321 and reading news is extremely easy---you just type @kbd{M-x gnus} in | |
322 your Emacs. | |
323 | |
324 @findex gnus-other-frame | |
325 @kindex M-x gnus-other-frame | |
326 If you want to start Gnus in a different frame, you can use the command | |
327 @kbd{M-x gnus-other-frame} instead. | |
328 | |
329 If things do not go smoothly at startup, you have to twiddle some | |
330 variables. | |
331 | |
332 @menu | |
333 * Finding the News:: Choosing a method for getting news. | |
334 * The First Time:: What does Gnus do the first time you start it? | |
335 * The Server is Down:: How can I read my mail then? | |
336 * Slave Gnusii:: You can have more than one Gnus active at a time. | |
337 * Fetching a Group:: Starting Gnus just to read a group. | |
338 * New Groups:: What is Gnus supposed to do with new groups? | |
339 * Startup Files:: Those pesky startup files---@file{.newsrc}. | |
340 * Auto Save:: Recovering from a crash. | |
341 * The Active File:: Reading the active file over a slow line Takes Time. | |
342 * Startup Variables:: Other variables you might change. | |
343 @end menu | |
344 | |
345 | |
346 @node Finding the News | |
347 @section Finding the News | |
348 | |
349 @vindex gnus-select-method | |
350 @c @head | |
351 The @code{gnus-select-method} variable says where Gnus should look for | |
352 news. This variable should be a list where the first element says | |
353 @dfn{how} and the second element says @dfn{where}. This method is your | |
354 native method. All groups that are not fetched with this method are | |
355 foreign groups. | |
356 | |
357 For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where | |
358 you want to get your daily dosage of news from, you'd say: | |
359 | |
360 @lisp | |
361 (setq gnus-select-method '(nntp "news.somewhere.edu")) | |
362 @end lisp | |
363 | |
364 If you want to read directly from the local spool, say: | |
365 | |
366 @lisp | |
367 (setq gnus-select-method '(nnspool "")) | |
368 @end lisp | |
369 | |
370 If you can use a local spool, you probably should, as it will almost | |
371 certainly be much faster. | |
372 | |
373 @vindex gnus-nntpserver-file | |
374 @cindex NNTPSERVER | |
375 @cindex @sc{nntp} server | |
376 If this variable is not set, Gnus will take a look at the | |
377 @code{NNTPSERVER} environment variable. If that variable isn't set, | |
378 Gnus will see whether @code{gnus-nntpserver-file} | |
379 (@file{/etc/nntpserver} by default) has any opinions on the matter. If | |
380 that fails as well, Gnus will will try to use the machine that is | |
381 running Emacs as an @sc{nntp} server. That's a long-shot, though. | |
382 | |
383 @vindex gnus-nntp-server | |
384 If @code{gnus-nntp-server} is set, this variable will override | |
385 @code{gnus-select-method}. You should therefore set | |
386 @code{gnus-nntp-server} to @code{nil}, which is what it is by default. | |
387 | |
388 @vindex gnus-secondary-servers | |
389 You can also make Gnus prompt you interactively for the name of an | |
390 @sc{nntp} server. If you give a non-numerical prefix to @code{gnus} | |
391 (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers | |
392 in the @code{gnus-secondary-servers} list (if any). You can also just | |
393 type in the name of any server you feel like visiting. | |
394 | |
395 @findex gnus-group-browse-foreign-server | |
396 @kindex B (Group) | |
397 However, if you use one @sc{nntp} server regularly and are just | |
398 interested in a couple of groups from a different server, you would be | |
399 better served by using the @kbd{B} command in the group buffer. It will | |
400 let you have a look at what groups are available, and you can subscribe | |
401 to any of the groups you want to. This also makes @file{.newsrc} | |
402 maintenance much tidier. @xref{Foreign Groups}. | |
403 | |
404 @vindex gnus-secondary-select-methods | |
405 @c @head | |
406 A slightly different approach to foreign groups is to set the | |
407 @code{gnus-secondary-select-methods} variable. The select methods | |
408 listed in this variable are in many ways just as native as the | |
409 @code{gnus-select-method} server. They will also be queried for active | |
410 files during startup (if that's required), and new newsgroups that | |
411 appear on these servers will be subscribed (or not) just as native | |
412 groups are. | |
413 | |
414 For instance, if you use the @code{nnmbox} backend to read your mail, you | |
415 would typically set this variable to | |
416 | |
417 @lisp | |
418 (setq gnus-secondary-select-methods '((nnmbox ""))) | |
419 @end lisp | |
420 | |
421 | |
422 @node The First Time | |
423 @section The First Time | |
424 @cindex first time usage | |
425 | |
426 If no startup files exist, Gnus will try to determine what groups should | |
427 be subscribed by default. | |
428 | |
429 @vindex gnus-default-subscribed-newsgroups | |
430 If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus | |
431 will subscribe you to just those groups in that list, leaving the rest | |
432 killed. Your system administrator should have set this variable to | |
433 something useful. | |
434 | |
435 Since she hasn't, Gnus will just subscribe you to a few arbitrarily | |
436 picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is here | |
437 defined as @dfn{whatever Lars thinks you should read}.) | |
438 | |
439 You'll also be subscribed to the Gnus documentation group, which should | |
440 help you with most common problems. | |
441 | |
442 If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just | |
443 use the normal functions for handling new groups, and not do anything | |
444 special. | |
445 | |
446 | |
447 @node The Server is Down | |
448 @section The Server is Down | |
449 @cindex server errors | |
450 | |
451 If the default server is down, Gnus will understandably have some | |
452 problems starting. However, if you have some mail groups in addition to | |
453 the news groups, you may want to start Gnus anyway. | |
454 | |
455 Gnus, being the trusting sort of program, will ask whether to proceed | |
456 without a native select method if that server can't be contacted. This | |
457 will happen whether the server doesn't actually exist (i.e., you have | |
458 given the wrong address) or the server has just momentarily taken ill | |
459 for some reason or other. If you decide to continue and have no foreign | |
460 groups, you'll find it difficult to actually do anything in the group | |
461 buffer. But, hey, that's your problem. Blllrph! | |
462 | |
463 @findex gnus-no-server | |
464 @c @head | |
465 If you know that the server is definitely down, or you just want to read | |
466 your mail without bothering with the server at all, you can use the | |
467 @code{gnus-no-server} command to start Gnus. That might come in handy | |
468 if you're in a hurry as well. | |
469 | |
470 | |
471 @node Slave Gnusii | |
472 @section Slave Gnusiï | |
473 @cindex slave | |
474 | |
475 You might want to run more than one Emacs with more than one Gnus at the | |
476 same time. If you are using different @file{.newsrc} files (eg., if you | |
477 are using the two different Gnusiï to read from two different servers), | |
478 that is no problem whatsoever. You just do it. | |
479 | |
480 The problem appears when you want to run two Gnusiï that use the same | |
481 @code{.newsrc} file. | |
482 | |
483 To work around that problem some, we here at the Think-Tank at the Gnus | |
484 Towers have come up with a new concept: @dfn{Masters} and | |
485 @dfn{servants}. (We have applied for a patent on this concept, and have | |
486 taken out a copyright on those words. If you wish to use those words in | |
487 conjunction with each other, you have to send $1 per usage instance to | |
488 me. Usage of the patent (@dfn{Master/Slave Relationships In Computer | |
489 Applications}) will be much more expensive, of course.) | |
490 | |
491 Anyways, you start one Gnus up the normal way with @kbd{M-x gnus} (or | |
492 however you do it). Each subsequent slave Gnusiï should be started with | |
493 @kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc} | |
494 files, but instead save @dfn{slave files} that contains information only | |
495 on what groups have been read in the slave session. When a master Gnus | |
496 starts, it will read (and delete) these slave files, incorporating all | |
497 information from them. (The slave files will be read in the sequence | |
498 they were created, so the latest changes will have precedence.) | |
499 | |
500 Information from the slave files has, of course, precedence over the | |
501 information in the normal (i. e., master) @code{.newsrc} file. | |
502 | |
503 | |
504 @node Fetching a Group | |
505 @section Fetching a Group | |
506 | |
507 @findex gnus-fetch-group | |
508 It it sometime convenient to be able to just say ``I want to read this | |
509 group and I don't care whether Gnus has been started or not''. This is | |
510 perhaps more useful for people who write code than for users, but the | |
511 command @code{gnus-fetch-group} provides this functionality in any case. | |
512 It takes the group name as a parameter. | |
513 | |
514 | |
515 @node New Groups | |
516 @section New Groups | |
517 @cindex new groups | |
518 | |
519 @vindex gnus-subscribe-newsgroup-method | |
520 What Gnus does when it encounters a new group is determined by the | |
521 @code{gnus-subscribe-newsgroup-method} variable. | |
522 | |
523 This variable should contain a function. Some handy pre-fab values | |
524 are: | |
525 | |
526 @table @code | |
527 | |
528 @item gnus-subscribe-zombies | |
529 @vindex gnus-subscribe-zombies | |
530 Make all new groups zombies. You can browse the zombies later (with | |
531 @kbd{A z}) and either kill them all off properly, or subscribe to them. | |
532 This is the default. | |
533 | |
534 @item gnus-subscribe-randomly | |
535 @vindex gnus-subscribe-randomly | |
536 Subscribe all new groups randomly. | |
537 | |
538 @item gnus-subscribe-alphabetically | |
539 @vindex gnus-subscribe-alphabetically | |
540 Subscribe all new groups alphabetically. | |
541 | |
542 @item gnus-subscribe-hierarchically | |
543 @vindex gnus-subscribe-hierarchically | |
544 Subscribe all new groups hierarchically. | |
545 | |
546 @item gnus-subscribe-interactively | |
547 @vindex gnus-subscribe-interactively | |
548 Subscribe new groups interactively. This means that Gnus will ask | |
549 you about @strong{all} new groups. | |
550 | |
551 @item gnus-subscribe-killed | |
552 @vindex gnus-subscribe-killed | |
553 Kill all new groups. | |
554 | |
555 @end table | |
556 | |
557 @vindex gnus-subscribe-hierarchical-interactive | |
558 A closely related variable is | |
559 @code{gnus-subscribe-hierarchical-interactive}. (That's quite a | |
560 mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a | |
561 hierarchical fashion whether to subscribe to new groups or not. Gnus | |
562 will ask you for each sub-hierarchy whether you want to descend the | |
563 hierarchy or not. | |
564 | |
565 One common mistake is to set the variable a few paragraphs above to | |
566 @code{gnus-subscribe-hierarchical-interactive}. This is an error. This | |
567 will not work. This is ga-ga. So don't do it. | |
568 | |
569 A nice and portable way to control which new newsgroups should be | |
570 subscribed (or ignored) is to put an @dfn{options} line at the start of | |
571 the @file{.newsrc} file. Here's an example: | |
572 | |
573 @example | |
574 options -n !alt.all !rec.all sci.all | |
575 @end example | |
576 | |
577 @vindex gnus-subscribe-options-newsgroup-method | |
578 This line obviously belongs to a serious-minded intellectual scientific | |
579 person (or she may just be plain old boring), because it says that all | |
580 groups that have names beginning with @samp{alt} and @samp{rec} should | |
581 be ignored, and all groups with names beginning with @samp{sci} should | |
582 be subscribed. Gnus will not use the normal subscription method for | |
583 subscribing these groups. | |
584 @code{gnus-subscribe-options-newsgroup-method} is used instead. This | |
585 variable defaults to @code{gnus-subscribe-alphabetically}. | |
586 | |
587 @vindex gnus-options-not-subscribe | |
588 @vindex gnus-options-subscribe | |
589 If you don't want to mess with your @file{.newsrc} file, you can just | |
590 set the two variables @code{gnus-options-subscribe} and | |
591 @code{gnus-options-not-subscribe}. These two variables do exactly the | |
592 same as the @file{.newsrc} @samp{options -n} trick. Both are regexps, | |
593 and if the the new group matches the former, it will be unconditionally | |
594 subscribed, and if it matches the latter, it will be ignored. | |
595 | |
596 @vindex gnus-auto-subscribed-groups | |
597 Yet another variable that meddles here is | |
598 @code{gnus-auto-subscribed-groups}. It works exactly like | |
599 @code{gnus-options-subscribe}, and is therefore really superfluous, but I | |
600 thought it would be nice to have two of these. This variable is more | |
601 meant for setting some ground rules, while the other variable is used | |
602 more for user fiddling. By default this variable makes all new groups | |
603 that come from mail backends (@code{nnml}, @code{nnbabyl}, | |
604 @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed. If you | |
605 don't like that, just set this variable to @code{nil}. | |
606 | |
607 @vindex gnus-check-new-newsgroups | |
608 If you are satisfied that you really never want to see any new groups, | |
609 you could set @code{gnus-check-new-newsgroups} to @code{nil}. This will | |
610 also save you some time at startup. Even if this variable is | |
611 @code{nil}, you can always subscribe to the new groups just by pressing | |
612 @kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable | |
613 is @code{t} by default. | |
614 | |
615 Gnus normally determines whether a group is new or not by comparing the | |
616 list of groups from the active file(s) with the lists of subscribed and | |
617 dead groups. This isn't a particularly fast method. If | |
618 @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the | |
619 server for new groups since the last time. This is both faster & | |
620 cheaper. This also means that you can get rid of the list of killed | |
621 groups altogether, so you may set @code{gnus-save-killed-list} to | |
622 @code{nil}, which will save time both at startup, at exit, and all over. | |
623 Saves disk space, too. Why isn't this the default, then? | |
624 Unfortunately, not all servers support this command. | |
625 | |
626 I bet I know what you're thinking now: How do I find out whether my | |
627 server supports @code{ask-server}? No? Good, because I don't have a | |
628 fail-safe answer. I would suggest just setting this variable to | |
629 @code{ask-server} and see whether any new groups appear within the next | |
630 few days. If any do, then it works. If any don't, then it doesn't | |
631 work. I could write a function to make Gnus guess whether the server | |
632 supports @code{ask-server}, but it would just be a guess. So I won't. | |
633 You could @code{telnet} to the server and say @code{HELP} and see | |
634 whether it lists @samp{NEWGROUPS} among the commands it understands. If | |
635 it does, then it might work. (But there are servers that lists | |
636 @samp{NEWGROUPS} without supporting the function properly.) | |
637 | |
638 This variable can also be a list of select methods. If so, Gnus will | |
639 issue an @code{ask-server} command to each of the select methods, and | |
640 subscribe them (or not) using the normal methods. This might be handy | |
641 if you are monitoring a few servers for new groups. A side effect is | |
642 that startup will take much longer, so you can meditate while waiting. | |
643 Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss. | |
644 | |
645 | |
646 @node Startup Files | |
647 @section Startup Files | |
648 @cindex startup files | |
649 @cindex .newsrc | |
650 | |
651 Now, you all know about the @file{.newsrc} file. All subscription | |
652 information is traditionally stored in this file. | |
653 | |
654 Things got a bit more complicated with @sc{gnus}. In addition to | |
655 keeping the @file{.newsrc} file updated, it also used a file called | |
656 @file{.newsrc.el} for storing all the information that didn't fit into | |
657 the @file{.newsrc} file. (Actually, it also duplicated everything in | |
658 the @file{.newsrc} file.) @sc{gnus} would read whichever one of these | |
659 files was the most recently saved, which enabled people to swap between | |
660 @sc{gnus} and other newsreaders. | |
661 | |
662 That was kinda silly, so Gnus went one better: In addition to the | |
663 @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called | |
664 @file{.newsrc.eld}. It will read whichever of these files that are most | |
665 recent, but it will never write a @file{.newsrc.el} file. | |
666 | |
667 @vindex gnus-save-newsrc-file | |
668 You can turn off writing the @file{.newsrc} file by setting | |
669 @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete | |
670 the file and save some space, as well as making exit from Gnus faster. | |
671 However, this will make it impossible to use other newsreaders than | |
672 Gnus. But hey, who would want to, right? | |
673 | |
674 @vindex gnus-save-killed-list | |
675 If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus | |
676 will not save the list of killed groups to the startup file. This will | |
677 save both time (when starting and quitting) and space (on disk). It | |
678 will also means that Gnus has no record of what groups are new or old, | |
679 so the automatic new groups subscription methods become meaningless. | |
680 You should always set @code{gnus-check-new-newsgroups} to @code{nil} or | |
681 @code{ask-server} if you set this variable to @code{nil} (@pxref{New | |
682 Groups}). | |
683 | |
684 @vindex gnus-startup-file | |
685 The @code{gnus-startup-file} variable says where the startup files are. | |
686 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup | |
687 file being whatever that one is with a @samp{.eld} appended. | |
688 | |
689 @vindex gnus-save-newsrc-hook | |
690 @vindex gnus-save-quick-newsrc-hook | |
691 @vindex gnus-save-standard-newsrc-hook | |
692 @code{gnus-save-newsrc-hook} is called before saving any of the newsrc | |
693 files, while @code{gnus-save-quick-newsrc-hook} is called just before | |
694 saving the @file{.newsrc.eld} file, and | |
695 @code{gnus-save-standard-newsrc-hook} is called just before saving the | |
696 @file{.newsrc} file. The latter two are commonly used to turn version | |
697 control on or off. Version control is off by default when saving the | |
698 startup files. | |
699 | |
700 | |
701 @node Auto Save | |
702 @section Auto Save | |
703 @cindex dribble file | |
704 @cindex auto-save | |
705 | |
706 Whenever you do something that changes the Gnus data (reading articles, | |
707 catching up, killing/subscribing groups), the change is added to a | |
708 special @dfn{dribble buffer}. This buffer is auto-saved the normal | |
709 Emacs way. If your Emacs should crash before you have saved the | |
710 @file{.newsrc} files, all changes you have made can be recovered from | |
711 this file. | |
712 | |
713 If Gnus detects this file at startup, it will ask the user whether to | |
714 read it. The auto save file is deleted whenever the real startup file is | |
715 saved. | |
716 | |
717 @vindex gnus-use-dribble-file | |
718 If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and | |
719 maintain a dribble buffer. The default is @code{t}. | |
720 | |
721 @vindex gnus-dribble-directory | |
722 Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If | |
723 this variable is @code{nil}, which it is by default, Gnus will dribble | |
724 into the directory where the @file{.newsrc} file is located. (This is | |
725 normally the user's home directory.) The dribble file will get the same | |
726 file permissions as the @code{.newsrc} file. | |
727 | |
728 | |
729 @node The Active File | |
730 @section The Active File | |
731 @cindex active file | |
732 @cindex ignored groups | |
733 | |
734 When Gnus starts, or indeed whenever it tries to determine whether new | |
735 articles have arrived, it reads the active file. This is a very large | |
736 file that lists all the active groups and articles on the server. | |
737 | |
738 @vindex gnus-ignored-newsgroups | |
739 Before examining the active file, Gnus deletes all lines that match the | |
740 regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject | |
741 any groups with bogus names, but you can use this variable to make Gnus | |
742 ignore hierarchies you aren't ever interested in. However, this is not | |
743 recommended. In fact, it's highly discouraged. Instead, @pxref{New | |
744 Groups} for an overview of other variables that can be used instead. | |
745 | |
746 @c This variable is | |
747 @c @code{nil} by default, and will slow down active file handling somewhat | |
748 @c if you set it to anything else. | |
749 | |
750 @vindex gnus-read-active-file | |
751 @c @head | |
752 The active file can be rather Huge, so if you have a slow network, you | |
753 can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from | |
754 reading the active file. This variable is @code{t} by default. | |
755 | |
756 Gnus will try to make do by getting information just on the groups that | |
757 you actually subscribe to. | |
758 | |
759 Note that if you subscribe to lots and lots of groups, setting this | |
760 variable to @code{nil} will probably make Gnus slower, not faster. At | |
761 present, having this variable @code{nil} will slow Gnus down | |
762 considerably, unless you read news over a 2400 baud modem. | |
763 | |
764 This variable can also have the value @code{some}. Gnus will then | |
765 attempt to read active info only on the subscribed groups. On some | |
766 servers this is quite fast (on sparkling, brand new INN servers that | |
767 support the @code{LIST ACTIVE group} command), on others this isn't fast | |
768 at all. In any case, @code{some} should be faster than @code{nil}, and | |
769 is certainly faster than @code{t} over slow lines. | |
770 | |
771 If this variable is @code{nil}, Gnus will ask for group info in total | |
772 lock-step, which isn't very fast. If it is @code{some} and you use an | |
773 @sc{nntp} server, Gnus will pump out commands as fast as it can, and | |
774 read all the replies in one swoop. This will normally result in better | |
775 performance, but if the server does not support the aforementioned | |
776 @code{LIST ACTIVE group} command, this isn't very nice to the server. | |
777 | |
778 In any case, if you use @code{some} or @code{nil}, you should definitely | |
779 kill all groups that you aren't interested in to speed things up. | |
780 | |
781 | |
782 @node Startup Variables | |
783 @section Startup Variables | |
784 | |
785 @table @code | |
786 | |
787 @item gnus-load-hook | |
788 @vindex gnus-load-hook | |
789 A hook that is run while Gnus is being loaded. Note that this hook will | |
790 normally be run just once in each Emacs session, no matter how many | |
791 times you start Gnus. | |
792 | |
793 @item gnus-startup-hook | |
794 @vindex gnus-startup-hook | |
795 A hook that is run after starting up Gnus successfully. | |
796 | |
797 @item gnus-check-bogus-newsgroups | |
798 @vindex gnus-check-bogus-newsgroups | |
799 If non-@code{nil}, Gnus will check for and delete all bogus groups at | |
800 startup. A @dfn{bogus group} is a group that you have in your | |
801 @file{.newsrc} file, but doesn't exist on the news server. Checking for | |
802 bogus groups can take quite a while, so to save time and resources it's | |
803 best to leave this option off, and do the checking for bogus groups once | |
804 in a while from the group buffer instead (@pxref{Group Maintenance}). | |
805 | |
806 @item gnus-inhibit-startup-message | |
807 @vindex gnus-inhibit-startup-message | |
808 If non-@code{nil}, the startup message won't be displayed. That way, | |
809 your boss might not notice that you are reading news instead of doing | |
810 your job as easily. | |
811 | |
812 @item gnus-no-groups-message | |
813 @vindex gnus-no-groups-message | |
814 Message displayed by Gnus when no groups are available. | |
815 @end table | |
816 | |
817 | |
818 @node The Group Buffer | |
819 @chapter The Group Buffer | |
820 @cindex group buffer | |
821 | |
822 The @dfn{group buffer} lists all (or parts) of the available groups. It | |
823 is the first buffer shown when Gnus starts, and will never be killed as | |
824 long as Gnus is active. | |
825 | |
826 @menu | |
827 * Group Buffer Format:: Information listed and how you can change it. | |
828 * Group Maneuvering:: Commands for moving in the group buffer. | |
829 * Selecting a Group:: Actually reading news. | |
830 * Subscription Commands:: Unsubscribing, killing, subscribing. | |
831 * Group Levels:: Levels? What are those, then? | |
832 * Group Score:: A mechanism for finding out what groups you like. | |
833 * Marking Groups:: You can mark groups for later processing. | |
834 * Foreign Groups:: Creating and editing groups. | |
835 * Group Parameters:: Each group may have different parameters set. | |
836 * Listing Groups:: Gnus can list various subsets of the groups. | |
837 * Sorting Groups:: Re-arrange the group order. | |
838 * Group Maintenance:: Maintaining a tidy @file{.newsrc} file. | |
839 * Browse Foreign Server:: You can browse a server. See what it has to offer. | |
840 * Exiting Gnus:: Stop reading news and get some work done. | |
841 * Group Topics:: A folding group mode divided into topics. | |
842 * Misc Group Stuff:: Other stuff that you can to do. | |
843 @end menu | |
844 | |
845 | |
846 @node Group Buffer Format | |
847 @section Group Buffer Format | |
848 @cindex group buffer format | |
849 | |
850 @menu | |
851 * Group Line Specification:: Deciding how the group buffer is to look. | |
852 * Group Modeline Specification:: The group buffer modeline. | |
853 * Group Highlighting:: Having nice colors in the group buffer. | |
854 @end menu | |
855 | |
856 | |
857 @node Group Line Specification | |
858 @subsection Group Line Specification | |
859 | |
860 The default format of the group buffer is nice and dull, but you can | |
861 make it as exciting and ugly as you feel like. | |
862 | |
863 Here's a couple of example group lines: | |
864 | |
865 @example | |
866 25: news.announce.newusers | |
867 * 0: alt.fan.andrea-dworkin | |
868 @end example | |
869 | |
870 Quite simple, huh? | |
871 | |
872 You can see that there are 25 unread articles in | |
873 @samp{news.announce.newusers}. There are no unread articles, but some | |
874 ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little | |
875 asterisk at the beginning of the line?) | |
876 | |
877 @vindex gnus-group-line-format | |
878 You can change that format to whatever you want by fiddling with the | |
879 @code{gnus-group-line-format} variable. This variable works along the | |
880 lines of a @code{format} specification, which is pretty much the same as | |
881 a @code{printf} specifications, for those of you who use (feh!) C. | |
882 @xref{Formatting Variables}. | |
883 | |
884 The default value that produced those lines above is | |
885 @samp{%M%S%5y: %(%g%)\n}. | |
886 | |
887 There should always be a colon on the line; the cursor always moves to | |
888 the colon after performing an operation. Nothing else is required---not | |
889 even the group name. All displayed text is just window dressing, and is | |
890 never examined by Gnus. Gnus stores all real information it needs using | |
891 text properties. | |
892 | |
893 (Note that if you make a really strange, wonderful, spreadsheet-like | |
894 layout, everybody will believe you are hard at work with the accounting | |
895 instead of wasting time reading news.) | |
896 | |
897 Here's a list of all available format characters: | |
898 | |
899 @table @samp | |
900 | |
901 @item M | |
902 Only marked articles. | |
903 | |
904 @item S | |
905 Whether the group is subscribed. | |
906 | |
907 @item L | |
908 Level of subscribedness. | |
909 | |
910 @item N | |
911 Number of unread articles. | |
912 | |
913 @item I | |
914 Number of dormant articles. | |
915 | |
916 @item T | |
917 Number of ticked articles. | |
918 | |
919 @item R | |
920 Number of read articles. | |
921 | |
922 @item t | |
923 Total number of articles. | |
924 | |
925 @item y | |
926 Number of unread, unticked, non-dormant articles. | |
927 | |
928 @item i | |
929 Number of ticked and dormant articles. | |
930 | |
931 @item g | |
932 Full group name. | |
933 | |
934 @item G | |
935 Group name. | |
936 | |
937 @item D | |
938 Newsgroup description. | |
939 | |
940 @item o | |
941 @samp{m} if moderated. | |
942 | |
943 @item O | |
944 @samp{(m)} if moderated. | |
945 | |
946 @item s | |
947 Select method. | |
948 | |
949 @item n | |
950 Select from where. | |
951 | |
952 @item z | |
953 A string that looks like @samp{<%s:%n>} if a foreign select method is | |
954 used. | |
955 | |
956 @item P | |
957 Indentation based on the level of the topic (@pxref{Group Topics}). | |
958 | |
959 @item c | |
960 @vindex gnus-group-uncollapsed-levels | |
961 Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels} | |
962 variable says how many levels to leave at the end of the group name. | |
963 The default is @code{1}. | |
964 | |
965 @item u | |
966 User defined specifier. The next character in the format string should | |
967 be a letter. @sc{gnus} will call the function | |
968 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter | |
969 following @samp{%u}. The function will be passed the current headers as | |
970 argument. The function should return a string, which will be inserted | |
971 into the buffer just like information from any other specifier. | |
972 @end table | |
973 | |
974 @cindex * | |
975 All the ``number-of'' specs will be filled with an asterisk (@samp{*}) | |
976 if no info is available---for instance, if it is a non-activated foreign | |
977 group, or a bogus (or semi-bogus) native group. | |
978 | |
979 | |
980 @node Group Modeline Specification | |
981 @subsection Group Modeline Specification | |
982 | |
983 @vindex gnus-group-mode-line-format | |
984 The mode line can be changed by setting | |
985 (@code{gnus-group-mode-line-format}). It doesn't understand that many | |
986 format specifiers: | |
987 | |
988 @table @samp | |
989 @item S | |
990 The native news server. | |
991 @item M | |
992 The native select method. | |
993 @end table | |
994 | |
995 | |
996 @node Group Highlighting | |
997 @subsection Group Highlighting | |
998 | |
999 @vindex gnus-group-highlight | |
1000 Highlighting in the group buffer is controlled by the | |
1001 @code{gnus-group-highlight} variable. This is an alist with elements | |
1002 that look like @var{(form . face)}. If @var{form} evaluates to | |
1003 something non-@code{nil}, the @var{face} will be used on the line. | |
1004 | |
1005 Here's an example value for this variable that might look nice if the | |
1006 background is dark: | |
1007 | |
1008 @lisp | |
1009 (setq gnus-group-highlight | |
1010 `(((> unread 200) . | |
1011 ,(custom-face-lookup "Red" nil nil t nil nil)) | |
1012 ((and (< level 3) (zerop unread)) . | |
1013 ,(custom-face-lookup "SeaGreen" nil nil t nil nil)) | |
1014 ((< level 3) . | |
1015 ,(custom-face-lookup "SpringGreen" nil nil t nil nil)) | |
1016 ((zerop unread) . | |
1017 ,(custom-face-lookup "SteelBlue" nil nil t nil nil)) | |
1018 (t . | |
1019 ,(custom-face-lookup "SkyBlue" nil nil t nil nil)) | |
1020 )) | |
1021 @end lisp | |
1022 | |
1023 Variables that are dynamically bound when the forms are evaluated | |
1024 include: | |
1025 | |
1026 @table @code | |
1027 @item group | |
1028 The group name. | |
1029 @item unread | |
1030 The number of unread articles in the group. | |
1031 @item method | |
1032 The select method. | |
1033 @item mailp | |
1034 Whether the group is a mail group. | |
1035 @item level | |
1036 The level of the group. | |
1037 @item score | |
1038 The score of the group. | |
1039 @item ticked | |
1040 The number of ticked articles in the group. | |
1041 @item topic | |
1042 When using the topic minor mode, this variable is bound to the current | |
1043 topic being inserted. | |
1044 @end table | |
1045 | |
1046 When the forms are @code{eval}ed, point is at the beginning of the line | |
1047 of the group in question, so you can use many of the normal Gnus | |
1048 functions for snarfing info on the group. | |
1049 | |
1050 @vindex gnus-group-update-hook | |
1051 @findex gnus-group-highlight-line | |
1052 @code{gnus-group-update-hook} is called when a group line is changed. | |
1053 It will not be called when @code{gnus-visual} is @code{nil}. This hook | |
1054 calls @code{gnus-group-highlight-line} by default. | |
1055 | |
1056 | |
1057 @node Group Maneuvering | |
1058 @section Group Maneuvering | |
1059 @cindex group movement | |
1060 | |
1061 All movement commands understand the numeric prefix and will behave as | |
1062 expected, hopefully. | |
1063 | |
1064 @table @kbd | |
1065 | |
1066 @item n | |
1067 @kindex n (Group) | |
1068 @findex gnus-group-next-unread-group | |
1069 Go to the next group that has unread articles | |
1070 (@code{gnus-group-next-unread-group}). | |
1071 | |
1072 @item p | |
1073 | |
1074 @itemx DEL | |
1075 @kindex DEL (Group) | |
1076 @kindex p (Group) | |
1077 @findex gnus-group-prev-unread-group | |
1078 Go to the previous group group that has unread articles | |
1079 (@code{gnus-group-prev-unread-group}). | |
1080 | |
1081 @item N | |
1082 @kindex N (Group) | |
1083 @findex gnus-group-next-group | |
1084 Go to the next group (@code{gnus-group-next-group}). | |
1085 | |
1086 @item P | |
1087 @kindex P (Group) | |
1088 @findex gnus-group-prev-group | |
1089 Go to the previous group (@code{gnus-group-prev-group}). | |
1090 | |
1091 @item M-p | |
1092 @kindex M-p (Group) | |
1093 @findex gnus-group-next-unread-group-same-level | |
1094 Go to the next unread group on the same level (or lower) | |
1095 (@code{gnus-group-next-unread-group-same-level}). | |
1096 | |
1097 @item M-n | |
1098 @kindex M-n (Group) | |
1099 @findex gnus-group-prev-unread-group-same-level | |
1100 Go to the previous unread group on the same level (or lower) | |
1101 (@code{gnus-group-prev-unread-group-same-level}). | |
1102 @end table | |
1103 | |
1104 Three commands for jumping to groups: | |
1105 | |
1106 @table @kbd | |
1107 | |
1108 @item j | |
1109 @kindex j (Group) | |
1110 @findex gnus-group-jump-to-group | |
1111 Jump to a group (and make it visible if it isn't already) | |
1112 (@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just | |
1113 like living groups. | |
1114 | |
1115 @item , | |
1116 @kindex , (Group) | |
1117 @findex gnus-group-best-unread-group | |
1118 Jump to the unread group with the lowest level | |
1119 (@code{gnus-group-best-unread-group}). | |
1120 | |
1121 @item . | |
1122 @kindex . (Group) | |
1123 @findex gnus-group-first-unread-group | |
1124 Jump to the first group with unread articles | |
1125 (@code{gnus-group-first-unread-group}). | |
1126 @end table | |
1127 | |
1128 @vindex gnus-group-goto-unread | |
1129 If @code{gnus-group-goto-unread} is @code{nil}, all the movement | |
1130 commands will move to the next group, not the next unread group. Even | |
1131 the commands that say they move to the next unread group. The default | |
1132 is @code{t}. | |
1133 | |
1134 | |
1135 @node Selecting a Group | |
1136 @section Selecting a Group | |
1137 @cindex group selection | |
1138 | |
1139 @table @kbd | |
1140 | |
1141 @item SPACE | |
1142 @kindex SPACE (Group) | |
1143 @findex gnus-group-read-group | |
1144 Select the current group, switch to the summary buffer and display the | |
1145 first unread article (@code{gnus-group-read-group}). If there are no | |
1146 unread articles in the group, or if you give a non-numerical prefix to | |
1147 this command, Gnus will offer to fetch all the old articles in this | |
1148 group from the server. If you give a numerical prefix @var{N}, Gnus | |
1149 will fetch @var{N} number of articles. If @var{N} is positive, fetch | |
1150 the @var{N} newest articles, if @var{N} is negative, fetch the | |
1151 @var{abs(N)} oldest articles. | |
1152 | |
1153 @item RET | |
1154 @kindex RET (Group) | |
1155 @findex gnus-group-select-group | |
1156 Select the current group and switch to the summary buffer | |
1157 (@code{gnus-group-select-group}). Takes the same arguments as | |
1158 @code{gnus-group-read-group}---the only difference is that this command | |
1159 does not display the first unread article automatically upon group | |
1160 entry. | |
1161 | |
1162 @item M-RET | |
1163 @kindex M-RET (Group) | |
1164 @findex gnus-group-quick-select-group | |
1165 This does the same as the command above, but tries to do it with the | |
1166 minimum amount off fuzz (@code{gnus-group-quick-select-group}). No | |
1167 scoring/killing will be performed, there will be no highlights and no | |
1168 expunging. This might be useful if you're in a real hurry and have to | |
1169 enter some humongous group. | |
1170 | |
1171 @item M-SPACE | |
1172 @kindex M-RET (Group) | |
1173 @findex gnus-group-visible-select-group | |
1174 This is yet one more command that does the same as the one above, but | |
1175 this one does it without expunging and hiding dormants | |
1176 (@code{gnus-group-visible-select-group}). | |
1177 | |
1178 @item c | |
1179 @kindex c (Group) | |
1180 @findex gnus-group-catchup-current | |
1181 @vindex gnus-group-catchup-group-hook | |
1182 Mark all unticked articles in this group as read | |
1183 (@code{gnus-group-catchup-current}). | |
1184 @code{gnus-group-catchup-group-hook} is when catching up a group from | |
1185 the group buffer. | |
1186 | |
1187 @item C | |
1188 @kindex C (Group) | |
1189 @findex gnus-group-catchup-current-all | |
1190 Mark all articles in this group, even the ticked ones, as read | |
1191 (@code{gnus-group-catchup-current-all}). | |
1192 @end table | |
1193 | |
1194 @vindex gnus-large-newsgroup | |
1195 The @code{gnus-large-newsgroup} variable says what Gnus should consider | |
1196 to be a big group. This is 200 by default. If the group has more | |
1197 unread articles than this, Gnus will query the user before entering the | |
1198 group. The user can then specify how many articles should be fetched | |
1199 from the server. If the user specifies a negative number (@code{-n}), | |
1200 the @code{n} oldest articles will be fetched. If it is positive, the | |
1201 @code{n} articles that have arrived most recently will be fetched. | |
1202 | |
1203 @vindex gnus-select-group-hook | |
1204 @vindex gnus-auto-select-first | |
1205 @code{gnus-auto-select-first} control whether any articles are selected | |
1206 automatically when entering a group. | |
1207 | |
1208 @table @code | |
1209 | |
1210 @item nil | |
1211 Don't select any articles when entering the group. Just display the | |
1212 full summary buffer. | |
1213 | |
1214 @item t | |
1215 Select the first unread article when entering the group. | |
1216 | |
1217 @item best | |
1218 Select the most high-scored article in the group when entering the | |
1219 group. | |
1220 @end table | |
1221 | |
1222 If you want to prevent automatic selection in some group (say, in a | |
1223 binary group with Huge articles) you can set this variable to @code{nil} | |
1224 in @code{gnus-select-group-hook}, which is called when a group is | |
1225 selected. | |
1226 | |
1227 | |
1228 @node Subscription Commands | |
1229 @section Subscription Commands | |
1230 @cindex subscribing | |
1231 | |
1232 @table @kbd | |
1233 | |
1234 @item S t | |
1235 @itemx u | |
1236 @kindex S t (Group) | |
1237 @kindex u (Group) | |
1238 @findex gnus-group-unsubscribe-current-group | |
1239 Toggle subscription to the current group | |
1240 (@code{gnus-group-unsubscribe-current-group}). | |
1241 | |
1242 @item S s | |
1243 @itemx U | |
1244 @kindex S s (Group) | |
1245 @kindex U (Group) | |
1246 @findex gnus-group-unsubscribe-group | |
1247 Prompt for a group to subscribe, and then subscribe it. If it was | |
1248 subscribed already, unsubscribe it instead | |
1249 (@code{gnus-group-unsubscribe-group}). | |
1250 | |
1251 @item S k | |
1252 @itemx C-k | |
1253 @kindex S k (Group) | |
1254 @kindex C-k (Group) | |
1255 @findex gnus-group-kill-group | |
1256 Kill the current group (@code{gnus-group-kill-group}). | |
1257 | |
1258 @item S y | |
1259 @itemx C-y | |
1260 @kindex S y (Group) | |
1261 @kindex C-y (Group) | |
1262 @findex gnus-group-yank-group | |
1263 Yank the last killed group (@code{gnus-group-yank-group}). | |
1264 | |
1265 @item C-x C-t | |
1266 @kindex C-x C-t (Group) | |
1267 @findex gnus-group-transpose-groups | |
1268 Transpose two groups (@code{gnus-group-transpose-groups}). This isn't | |
1269 really a subscription command, but you can use it instead of a | |
1270 kill-and-yank sequence sometimes. | |
1271 | |
1272 @item S w | |
1273 @itemx C-w | |
1274 @kindex S w (Group) | |
1275 @kindex C-w (Group) | |
1276 @findex gnus-group-kill-region | |
1277 Kill all groups in the region (@code{gnus-group-kill-region}). | |
1278 | |
1279 @item S z | |
1280 @kindex S z (Group) | |
1281 @findex gnus-group-kill-all-zombies | |
1282 Kill all zombie groups (@code{gnus-group-kill-all-zombies}). | |
1283 | |
1284 @item S C-k | |
1285 @kindex S C-k (Group) | |
1286 @findex gnus-group-kill-level | |
1287 Kill all groups on a certain level (@code{gnus-group-kill-level}). | |
1288 These groups can't be yanked back after killing, so this command should | |
1289 be used with some caution. The only thing where this command comes in | |
1290 really handy is when you have a @file{.newsrc} with lots of unsubscribed | |
1291 groups that you want to get rid off. @kbd{S C-k} on level @code{7} will | |
1292 kill off all unsubscribed groups that do not have message numbers in the | |
1293 @file{.newsrc} file. | |
1294 | |
1295 @end table | |
1296 | |
1297 Also @pxref{Group Levels}. | |
1298 | |
1299 | |
1300 @node Group Levels | |
1301 @section Group Levels | |
1302 @cindex group level | |
1303 | |
1304 All groups have a level of @dfn{subscribedness}. For instance, if a | |
1305 group is on level 2, it is more subscribed than a group on level 5. You | |
1306 can ask Gnus to just list groups on a given level or lower | |
1307 (@pxref{Listing Groups}), or to just check for new articles in groups on | |
1308 a given level or lower (@pxref{Scanning New Messages}). | |
1309 | |
1310 Remember: The higher the level of the group, the less important it is. | |
1311 | |
1312 @table @kbd | |
1313 | |
1314 @item S l | |
1315 @kindex S l (Group) | |
1316 @findex gnus-group-set-current-level | |
1317 Set the level of the current group. If a numeric prefix is given, the | |
1318 next @var{n} groups will have their levels set. The user will be | |
1319 prompted for a level. | |
1320 @end table | |
1321 | |
1322 @vindex gnus-level-killed | |
1323 @vindex gnus-level-zombie | |
1324 @vindex gnus-level-unsubscribed | |
1325 @vindex gnus-level-subscribed | |
1326 Gnus considers groups on between levels 1 and | |
1327 @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed, | |
1328 @code{gnus-level-subscribed} (exclusive) and | |
1329 @code{gnus-level-unsubscribed} (inclusive) (default 7) to be | |
1330 unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead) | |
1331 (default 8) and @code{gnus-level-killed} to be killed (default 9), | |
1332 completely dead. Gnus treats subscribed and unsubscribed groups exactly | |
1333 the same, but zombie and killed groups have no information on what | |
1334 articles you have read, etc, stored. This distinction between dead and | |
1335 living groups isn't done because it is nice or clever, it is done purely | |
1336 for reasons of efficiency. | |
1337 | |
1338 It is recommended that you keep all your mail groups (if any) on quite | |
1339 low levels (eg. 1 or 2). | |
1340 | |
1341 If you want to play with the level variables, you should show some care. | |
1342 Set them once, and don't touch them ever again. Better yet, don't touch | |
1343 them at all unless you know exactly what you're doing. | |
1344 | |
1345 @vindex gnus-level-default-unsubscribed | |
1346 @vindex gnus-level-default-subscribed | |
1347 Two closely related variables are @code{gnus-level-default-subscribed} | |
1348 (default 3) and @code{gnus-level-default-unsubscribed} (default 6), | |
1349 which are the levels that new groups will be put on if they are | |
1350 (un)subscribed. These two variables should, of course, be inside the | |
1351 relevant legal ranges. | |
1352 | |
1353 @vindex gnus-keep-same-level | |
1354 If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands | |
1355 will only move to groups that are of the same level (or lower). In | |
1356 particular, going from the last article in one group to the next group | |
1357 will go to the next group of the same level (or lower). This might be | |
1358 handy if you want to read the most important groups before you read the | |
1359 rest. | |
1360 | |
1361 @vindex gnus-group-default-list-level | |
1362 All groups with a level less than or equal to | |
1363 @code{gnus-group-default-list-level} will be listed in the group buffer | |
1364 by default. | |
1365 | |
1366 @vindex gnus-group-list-inactive-groups | |
1367 If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active | |
1368 groups will be listed along with the unread groups. This variable is | |
1369 @code{t} by default. If it is @code{nil}, inactive groups won't be | |
1370 listed. | |
1371 | |
1372 @vindex gnus-group-use-permanent-levels | |
1373 If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you | |
1374 give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will | |
1375 use this level as the ``work'' level. | |
1376 | |
1377 @vindex gnus-activate-level | |
1378 Gnus will normally just activate groups that are on level | |
1379 @code{gnus-activate-level} or less. If you don't want to activate | |
1380 unsubscribed groups, for instance, you might set this variable to | |
1381 @code{5}. | |
1382 | |
1383 | |
1384 @node Group Score | |
1385 @section Group Score | |
1386 @cindex group score | |
1387 | |
1388 You would normally keep important groups on high levels, but that scheme | |
1389 is somewhat restrictive. Don't you wish you could have Gnus sort the | |
1390 group buffer according to how often you read groups, perhaps? Within | |
1391 reason? | |
1392 | |
1393 This is what @dfn{group score} is for. You can assign a score to each | |
1394 group. You can then sort the group buffer based on this score. | |
1395 Alternatively, you can sort on score and then level. (Taken together, | |
1396 the level and the score is called the @dfn{rank} of the group. A group | |
1397 that is on level 4 and has a score of 1 has a higher rank than a group | |
1398 on level 5 that has a score of 300. (The level is the most significant | |
1399 part and the score is the least significant part.) | |
1400 | |
1401 @findex gnus-summary-bubble-group | |
1402 If you want groups you read often to get higher scores than groups you | |
1403 read seldom you can add the @code{gnus-summary-bubble-group} function to | |
1404 the @code{gnus-summary-exit-hook} hook. This will result (after | |
1405 sorting) in a bubbling sort of action. If you want to see that in | |
1406 action after each summary exit, you can add | |
1407 @code{gnus-group-sort-groups-by-rank} or | |
1408 @code{gnus-group-sort-groups-by-score} to the same hook, but that will | |
1409 slow things down somewhat. | |
1410 | |
1411 | |
1412 @node Marking Groups | |
1413 @section Marking Groups | |
1414 @cindex marking groups | |
1415 | |
1416 If you want to perform some command on several groups, and they appear | |
1417 subsequently in the group buffer, you would normally just give a | |
1418 numerical prefix to the command. Most group commands will then do your | |
1419 bidding on those groups. | |
1420 | |
1421 However, if the groups are not in sequential order, you can still | |
1422 perform a command on several groups. You simply mark the groups first | |
1423 with the process mark and then execute the command. | |
1424 | |
1425 @table @kbd | |
1426 | |
1427 @item # | |
1428 @kindex # (Group) | |
1429 @itemx M m | |
1430 @kindex M m (Group) | |
1431 @findex gnus-group-mark-group | |
1432 Set the mark on the current group (@code{gnus-group-mark-group}). | |
1433 | |
1434 @item M-# | |
1435 @kindex M-# (Group) | |
1436 @itemx M u | |
1437 @kindex M u (Group) | |
1438 @findex gnus-group-unmark-group | |
1439 Remove the mark from the current group | |
1440 (@code{gnus-group-unmark-group}). | |
1441 | |
1442 @item M U | |
1443 @kindex M U (Group) | |
1444 @findex gnus-group-unmark-all-groups | |
1445 Remove the mark from all groups (@code{gnus-group-unmark-all-groups}). | |
1446 | |
1447 @item M w | |
1448 @kindex M w (Group) | |
1449 @findex gnus-group-mark-region | |
1450 Mark all groups between point and mark (@code{gnus-group-mark-region}). | |
1451 | |
1452 @item M b | |
1453 @kindex M b (Group) | |
1454 @findex gnus-group-mark-buffer | |
1455 Mark all groups in the buffer (@code{gnus-group-mark-buffer}). | |
1456 | |
1457 @item M r | |
1458 @kindex M r (Group) | |
1459 @findex gnus-group-mark-regexp | |
1460 Mark all groups that match some regular expression | |
1461 (@code{gnus-group-mark-regexp}). | |
1462 @end table | |
1463 | |
1464 Also @pxref{Process/Prefix}. | |
1465 | |
1466 @findex gnus-group-universal-argument | |
1467 If you want to execute some command on all groups that have been marked | |
1468 with the process mark, you can use the @kbd{M-&} | |
1469 (@code{gnus-group-universal-argument}) command. It will prompt you for | |
1470 the command to be executed. | |
1471 | |
1472 | |
1473 @node Foreign Groups | |
1474 @section Foreign Groups | |
1475 | |
1476 Here are some group mode commands for making and editing general foreign | |
1477 groups, as well as commands to ease the creation of a few | |
1478 special-purpose groups: | |
1479 | |
1480 @table @kbd | |
1481 | |
1482 @item G m | |
1483 @kindex G m (Group) | |
1484 @findex gnus-group-make-group | |
1485 Make a new group (@code{gnus-group-make-group}). Gnus will prompt you | |
1486 for a name, a method and possibly an @dfn{address}. For an easier way | |
1487 to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}. | |
1488 | |
1489 @item G r | |
1490 @kindex G r (Group) | |
1491 @findex gnus-group-rename-group | |
1492 Rename the current group to something else | |
1493 (@code{gnus-group-rename-group}). This is legal only on some groups -- | |
1494 mail groups mostly. This command might very well be quite slow on some | |
1495 backends. | |
1496 | |
1497 @item G e | |
1498 @kindex G e (Group) | |
1499 @findex gnus-group-edit-group-method | |
1500 Enter a buffer where you can edit the select method of the current | |
1501 group (@code{gnus-group-edit-group-method}). | |
1502 | |
1503 @item G p | |
1504 @kindex G p (Group) | |
1505 @findex gnus-group-edit-group-parameters | |
1506 Enter a buffer where you can edit the group parameters | |
1507 (@code{gnus-group-edit-group-parameters}). | |
1508 | |
1509 @item G E | |
1510 @kindex G E (Group) | |
1511 @findex gnus-group-edit-group | |
1512 Enter a buffer where you can edit the group info | |
1513 (@code{gnus-group-edit-group}). | |
1514 | |
1515 @item G d | |
1516 @kindex G d (Group) | |
1517 @findex gnus-group-make-directory-group | |
1518 Make a directory group. You will be prompted for a directory name | |
1519 (@code{gnus-group-make-directory-group}). | |
1520 | |
1521 @item G h | |
1522 @kindex G h (Group) | |
1523 @findex gnus-group-make-help-group | |
1524 Make the Gnus help group (@code{gnus-group-make-help-group}). | |
1525 | |
1526 @item G a | |
1527 @kindex G a (Group) | |
1528 @findex gnus-group-make-archive-group | |
1529 @vindex gnus-group-archive-directory | |
1530 @vindex gnus-group-recent-archive-directory | |
1531 Make a Gnus archive group (@code{gnus-group-make-archive-group}). By | |
1532 default a group pointing to the most recent articles will be created | |
1533 (@code{gnus-group-recent-archive-directory}), but given a prefix, a full | |
1534 group will be created from from @code{gnus-group-archive-directory}. | |
1535 | |
1536 @item G k | |
1537 @kindex G k (Group) | |
1538 @findex gnus-group-make-kiboze-group | |
1539 Make a kiboze group. You will be prompted for a name, for a regexp to | |
1540 match groups to be ``included'' in the kiboze group, and a series of | |
1541 strings to match on headers (@code{gnus-group-make-kiboze-group}). | |
1542 | |
1543 @item G D | |
1544 @kindex G D (Group) | |
1545 @findex gnus-group-enter-directory | |
1546 Read an arbitrary directory as if with were a newsgroup with the | |
1547 @code{nneething} backend (@code{gnus-group-enter-directory}). | |
1548 | |
1549 @item G f | |
1550 @kindex G f (Group) | |
1551 @findex gnus-group-make-doc-group | |
1552 @cindex ClariNet Briefs | |
1553 Make a group based on some file or other | |
1554 (@code{gnus-group-make-doc-group}). If you give a prefix to this | |
1555 command, you will be prompted for a file name and a file type. | |
1556 Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, | |
1557 @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, and | |
1558 @code{forward}. If you run this command without a prefix, Gnus will | |
1559 guess at the file type. | |
1560 | |
1561 @item G DEL | |
1562 @kindex G DEL (Group) | |
1563 @findex gnus-group-delete-group | |
1564 This function will delete the current group | |
1565 (@code{gnus-group-delete-group}). If given a prefix, this function will | |
1566 actually delete all the articles in the group, and forcibly remove the | |
1567 group itself from the face of the Earth. Use a prefix only if you are | |
1568 absolutely sure of what you are doing. | |
1569 | |
1570 @item G V | |
1571 @kindex G V (Group) | |
1572 @findex gnus-group-make-empty-virtual | |
1573 Make a new, fresh, empty @code{nnvirtual} group | |
1574 (@code{gnus-group-make-empty-virtual}). | |
1575 | |
1576 @item G v | |
1577 @kindex G v (Group) | |
1578 @findex gnus-group-add-to-virtual | |
1579 Add the current group to an @code{nnvirtual} group | |
1580 (@code{gnus-group-add-to-virtual}). Uses the process/prefix convention. | |
1581 @end table | |
1582 | |
1583 @xref{Select Methods} for more information on the various select | |
1584 methods. | |
1585 | |
1586 @vindex gnus-activate-foreign-newsgroups | |
1587 If the @code{gnus-activate-foreign-newsgroups} is a positive number, | |
1588 Gnus will check all foreign groups with this level or lower at startup. | |
1589 This might take quite a while, especially if you subscribe to lots of | |
1590 groups from different @sc{nntp} servers. | |
1591 | |
1592 | |
1593 @node Group Parameters | |
1594 @section Group Parameters | |
1595 @cindex group parameters | |
1596 | |
1597 Gnus stores all information on a group in a list that is usually known | |
1598 as the @dfn{group info}. This list has from three to six elements. | |
1599 Here's an example info. | |
1600 | |
1601 @lisp | |
1602 ("nnml:mail.ding" 3 ((1 . 232) 244 (256 . 270)) ((tick 246 249)) | |
1603 (nnml "private") ((to-address . "ding@@ifi.uio.no"))) | |
1604 @end lisp | |
1605 | |
1606 The first element is the @dfn{group name}, as Gnus knows the group, | |
1607 anyway. The second element is the @dfn{subscription level}, which | |
1608 normally is a small integer. The third element is a list of ranges of | |
1609 read articles. The fourth element is a list of lists of article marks | |
1610 of various kinds. The fifth element is the select method (or virtual | |
1611 server, if you like). The sixth element is a list of @dfn{group | |
1612 parameters}, which is what this section is about. | |
1613 | |
1614 Any of the last three elements may be missing if they are not required. | |
1615 In fact, the vast majority of groups will normally only have the first | |
1616 three elements, which saves quite a lot of cons cells. | |
1617 | |
1618 The group parameters store information local to a particular group: | |
1619 | |
1620 @table @code | |
1621 @item to-address | |
1622 @cindex to-address | |
1623 If the group parameter list contains an element that looks like | |
1624 @code{(to-address . "some@@where.com")}, that address will be used by | |
1625 the backend when doing followups and posts. This is primarily useful in | |
1626 mail groups that represent closed mailing lists---mailing lists where | |
1627 it's expected that everybody that writes to the mailing list is | |
1628 subscribed to it. Since using this parameter ensures that the mail only | |
1629 goes to the mailing list itself, it means that members won't receive two | |
1630 copies of your followups. | |
1631 | |
1632 Using @code{to-address} will actually work whether the group is foreign | |
1633 or not. Let's say there's a group on the server that is called | |
1634 @samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten | |
1635 the articles from a mail-to-news gateway. Posting directly to this | |
1636 group is therefore impossible---you have to send mail to the mailing | |
1637 list address instead. | |
1638 | |
1639 @item to-list | |
1640 @cindex to-list | |
1641 If the group parameter list has an element that looks like | |
1642 @code{(to-list . "some@@where.com")}, that address will be used when | |
1643 doing a @kbd{a} in any group. It is totally ignored when doing a | |
1644 followup---except that if it is present in a news group, you'll get mail | |
1645 group semantics when doing @kbd{f}. | |
1646 | |
1647 @item broken-reply-to | |
1648 @cindex broken-reply-to | |
1649 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To} | |
1650 headers in this group are to be ignored. This can be useful if you're | |
1651 reading a mailing list group where the listserv has inserted | |
1652 @code{Reply-To} headers that point back to the listserv itself. This is | |
1653 broken behavior. So there! | |
1654 | |
1655 @item to-group | |
1656 @cindex to-group | |
1657 If the group parameter list contains an element like @code{(to-group | |
1658 . "some.group.name")}, all posts will be sent to that group. | |
1659 | |
1660 @item auto-expire | |
1661 @cindex auto-expire | |
1662 If this symbol is present in the group parameter list, all articles that | |
1663 are read will be marked as expirable. For an alternative approach, | |
1664 @pxref{Expiring Mail}. | |
1665 | |
1666 @item total-expire | |
1667 @cindex total-expire | |
1668 If this symbol is present, all read articles will be put through the | |
1669 expiry process, even if they are not marked as expirable. Use with | |
1670 caution. | |
1671 | |
1672 @item expiry-wait | |
1673 @cindex expiry-wait | |
1674 @vindex nnmail-expiry-wait-function | |
1675 If the group parameter has an element that looks like @code{(expiry-wait | |
1676 . 10)}, this value will override any @code{nnmail-expiry-wait} and | |
1677 @code{nnmail-expiry-wait-function} when expiring expirable messages. | |
1678 The value can either be a number of days (not necessarily an integer) or | |
1679 the symbols @code{never} or @code{immediate}. | |
1680 | |
1681 @item score-file | |
1682 Elements that look like @code{(score-file . "file")} will make | |
1683 @samp{file} into the current score file for the group in question. This | |
1684 means that all score commands you issue will end up in that file. | |
1685 | |
1686 @item admin-address | |
1687 When unsubscribing to a mailing list you should never send the | |
1688 unsubscription notice to the mailing list itself. Instead, you'd send | |
1689 messages to the administrative address. This parameter allows you to | |
1690 put the admin address somewhere convenient. | |
1691 | |
1692 @item comment | |
1693 This parameter allows you to enter a arbitrary comment on the group. | |
1694 | |
1695 @item @var{(variable form)} | |
1696 You can use the group parameters to set variables local to the group you | |
1697 are entering. Say you want to turn threading off in | |
1698 @samp{news.answers}. You'd then put @code{(gnus-show-threads nil)} in | |
1699 the group parameters of that group. @code{gnus-show-threads} will be | |
1700 made into a local variable in the summary buffer you enter, and the form | |
1701 @code{nil} will be @code{eval}ed there. | |
1702 | |
1703 This can also be used as a group-specific hook function, if you'd like. | |
1704 If you want to hear a beep when you enter the group | |
1705 @samp{alt.binaries.pictures.furniture}, you could put something like | |
1706 @code{(dummy-variable (ding))} in the parameters of that group. | |
1707 @code{dummy-variable} will be set to the result of the @code{(ding)} | |
1708 form, but who cares? | |
1709 | |
1710 @end table | |
1711 | |
1712 If you want to change the group info you can use the @kbd{G E} command | |
1713 to enter a buffer where you can edit it. | |
1714 | |
1715 You usually don't want to edit the entire group info, so you'd be better | |
1716 off using the @kbd{G p} command to just edit the group parameters. | |
1717 | |
1718 | |
1719 @node Listing Groups | |
1720 @section Listing Groups | |
1721 @cindex group listing | |
1722 | |
1723 These commands all list various slices of the groups that are available. | |
1724 | |
1725 @table @kbd | |
1726 | |
1727 @item l | |
1728 @itemx A s | |
1729 @kindex A s (Group) | |
1730 @kindex l (Group) | |
1731 @findex gnus-group-list-groups | |
1732 List all groups that have unread articles | |
1733 (@code{gnus-group-list-groups}). If the numeric prefix is used, this | |
1734 command will list only groups of level ARG and lower. By default, it | |
1735 only lists groups of level five or lower (i.e., just subscribed groups). | |
1736 | |
1737 @item L | |
1738 @itemx A u | |
1739 @kindex A u (Group) | |
1740 @kindex L (Group) | |
1741 @findex gnus-group-list-all-groups | |
1742 List all groups, whether they have unread articles or not | |
1743 (@code{gnus-group-list-all-groups}). If the numeric prefix is used, | |
1744 this command will list only groups of level ARG and lower. By default, | |
1745 it lists groups of level seven or lower (i.e., just subscribed and | |
1746 unsubscribed groups). | |
1747 | |
1748 @item A l | |
1749 @kindex A l (Group) | |
1750 @findex gnus-group-list-level | |
1751 List all unread groups on a specific level | |
1752 (@code{gnus-group-list-level}). If given a prefix, also list the groups | |
1753 with no unread articles. | |
1754 | |
1755 @item A k | |
1756 @kindex A k (Group) | |
1757 @findex gnus-group-list-killed | |
1758 List all killed groups (@code{gnus-group-list-killed}). If given a | |
1759 prefix argument, really list all groups that are available, but aren't | |
1760 currently (un)subscribed. This could entail reading the active file | |
1761 from the server. | |
1762 | |
1763 @item A z | |
1764 @kindex A z (Group) | |
1765 @findex gnus-group-list-zombies | |
1766 List all zombie groups (@code{gnus-group-list-zombies}). | |
1767 | |
1768 @item A m | |
1769 @kindex A m (Group) | |
1770 @findex gnus-group-list-matching | |
1771 List all subscribed groups with unread articles that match a regexp | |
1772 (@code{gnus-group-list-matching}). | |
1773 | |
1774 @item A M | |
1775 @kindex A M (Group) | |
1776 @findex gnus-group-list-all-matching | |
1777 List groups that match a regexp (@code{gnus-group-list-all-matching}). | |
1778 | |
1779 @item A A | |
1780 @kindex A A (Group) | |
1781 @findex gnus-group-list-active | |
1782 List absolutely all groups that are in the active file(s) of the | |
1783 server(s) you are connected to (@code{gnus-group-list-active}). This | |
1784 might very well take quite a while. It might actually be a better idea | |
1785 to do a @kbd{A m} to list all matching, and just give @samp{.} as the | |
1786 thing to match on. | |
1787 | |
1788 @item A a | |
1789 @kindex A a (Group) | |
1790 @findex gnus-group-apropos | |
1791 List all groups that have names that match a regexp | |
1792 (@code{gnus-group-apropos}). | |
1793 | |
1794 @item A d | |
1795 @kindex A d (Group) | |
1796 @findex gnus-group-description-apropos | |
1797 List all groups that have names or descriptions that match a regexp | |
1798 (@code{gnus-group-description-apropos}). | |
1799 | |
1800 @end table | |
1801 | |
1802 @vindex gnus-permanently-visible-groups | |
1803 @cindex visible group parameter | |
1804 Groups that match the @code{gnus-permanently-visible-groups} regexp will | |
1805 always be shown, whether they have unread articles or not. You can also | |
1806 add the @code{visible} element to the group parameters in question to | |
1807 get the same effect. | |
1808 | |
1809 @vindex gnus-list-groups-with-ticked-articles | |
1810 Groups that have just ticked articles in it are normally listed in the | |
1811 group buffer. If @code{gnus-list-groups-with-ticked-articles} is | |
1812 @code{nil}, these groups will be treated just like totally empty | |
1813 groups. It is @code{t} by default. | |
1814 | |
1815 | |
1816 @node Sorting Groups | |
1817 @section Sorting Groups | |
1818 @cindex sorting groups | |
1819 | |
1820 @kindex C-c C-s (Group) | |
1821 @findex gnus-group-sort-groups | |
1822 @vindex gnus-group-sort-function | |
1823 The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the | |
1824 group buffer according to the function(s) given by the | |
1825 @code{gnus-group-sort-function} variable. Available sorting functions | |
1826 include: | |
1827 | |
1828 @table @code | |
1829 | |
1830 @item gnus-group-sort-by-alphabet | |
1831 @findex gnus-group-sort-by-alphabet | |
1832 Sort the group names alphabetically. This is the default. | |
1833 | |
1834 @item gnus-group-sort-by-level | |
1835 @findex gnus-group-sort-by-level | |
1836 Sort by group level. | |
1837 | |
1838 @item gnus-group-sort-by-score | |
1839 @findex gnus-group-sort-by-score | |
1840 Sort by group score. | |
1841 | |
1842 @item gnus-group-sort-by-rank | |
1843 @findex gnus-group-sort-by-rank | |
1844 Sort by group score and then the group level. The level and the score | |
1845 are, when taken together, the group's @dfn{rank}. | |
1846 | |
1847 @item gnus-group-sort-by-unread | |
1848 @findex gnus-group-sort-by-unread | |
1849 Sort by number of unread articles. | |
1850 | |
1851 @item gnus-group-sort-by-method | |
1852 @findex gnus-group-sort-by-method | |
1853 Sort by alphabetically on the select method. | |
1854 | |
1855 | |
1856 @end table | |
1857 | |
1858 @code{gnus-group-sort-function} can also be a list of sorting | |
1859 functions. In that case, the most significant sort key function must be | |
1860 the last one. | |
1861 | |
1862 | |
1863 There are also a number of commands for sorting directly according to | |
1864 some sorting criteria: | |
1865 | |
1866 @table @kbd | |
1867 @item G S a | |
1868 @kindex G S a (Group) | |
1869 @findex gnus-group-sort-groups-by-alphabet | |
1870 Sort the group buffer alphabetically by group name | |
1871 (@code{gnus-group-sort-groups-by-alphabet}). | |
1872 | |
1873 @item G S u | |
1874 @kindex G S u (Group) | |
1875 @findex gnus-group-sort-groups-by-unread | |
1876 Sort the group buffer by the number of unread articles | |
1877 (@code{gnus-group-sort-groups-by-unread}). | |
1878 | |
1879 @item G S l | |
1880 @kindex G S l (Group) | |
1881 @findex gnus-group-sort-groups-by-level | |
1882 Sort the group buffer by group level | |
1883 (@code{gnus-group-sort-groups-by-level}). | |
1884 | |
1885 @item G S v | |
1886 @kindex G S v (Group) | |
1887 @findex gnus-group-sort-groups-by-score | |
1888 Sort the group buffer by group score | |
1889 (@code{gnus-group-sort-groups-by-score}). | |
1890 | |
1891 @item G S r | |
1892 @kindex G S r (Group) | |
1893 @findex gnus-group-sort-groups-by-rank | |
1894 Sort the group buffer by group level | |
1895 (@code{gnus-group-sort-groups-by-rank}). | |
1896 | |
1897 @item G S m | |
1898 @kindex G S m (Group) | |
1899 @findex gnus-group-sort-groups-by-method | |
1900 Sort the group buffer alphabetically by backend name | |
1901 (@code{gnus-group-sort-groups-by-method}). | |
1902 | |
1903 @end table | |
1904 | |
1905 When given a prefix, all these commands will sort in reverse order. | |
1906 | |
1907 | |
1908 @node Group Maintenance | |
1909 @section Group Maintenance | |
1910 @cindex bogus groups | |
1911 | |
1912 @table @kbd | |
1913 @item b | |
1914 @kindex b (Group) | |
1915 @findex gnus-group-check-bogus-groups | |
1916 Find bogus groups and delete them | |
1917 (@code{gnus-group-check-bogus-groups}). | |
1918 | |
1919 @item F | |
1920 @kindex F (Group) | |
1921 @findex gnus-find-new-newsgroups | |
1922 Find new groups and process them (@code{gnus-find-new-newsgroups}). If | |
1923 given a prefix, use the @code{ask-server} method to query the server for | |
1924 new groups. | |
1925 | |
1926 @item C-c C-x | |
1927 @kindex C-c C-x (Group) | |
1928 @findex gnus-group-expire-articles | |
1929 Run all expirable articles in the current group through the expiry | |
1930 process (if any) (@code{gnus-group-expire-articles}). | |
1931 | |
1932 @item C-c M-C-x | |
1933 @kindex C-c M-C-x (Group) | |
1934 @findex gnus-group-expire-all-groups | |
1935 Run all articles in all groups through the expiry process | |
1936 (@code{gnus-group-expire-all-groups}). | |
1937 | |
1938 @end table | |
1939 | |
1940 | |
1941 @node Browse Foreign Server | |
1942 @section Browse Foreign Server | |
1943 @cindex foreign servers | |
1944 @cindex browsing servers | |
1945 | |
1946 @table @kbd | |
1947 @item B | |
1948 @kindex B (Group) | |
1949 @findex gnus-group-browse-foreign-server | |
1950 You will be queried for a select method and a server name. Gnus will | |
1951 then attempt to contact this server and let you browse the groups there | |
1952 (@code{gnus-group-browse-foreign-server}). | |
1953 @end table | |
1954 | |
1955 @findex gnus-browse-mode | |
1956 A new buffer with a list of available groups will appear. This buffer | |
1957 will be use the @code{gnus-browse-mode}. This buffer looks a bit | |
1958 (well, a lot) like a normal group buffer, but with one major difference | |
1959 - you can't enter any of the groups. If you want to read any of the | |
1960 news available on that server, you have to subscribe to the groups you | |
1961 think may be interesting, and then you have to exit this buffer. The | |
1962 new groups will be added to the group buffer, and then you can read them | |
1963 as you would any other group. | |
1964 | |
1965 Future versions of Gnus may possibly permit reading groups straight from | |
1966 the browse buffer. | |
1967 | |
1968 Here's a list of keystrokes available in the browse mode: | |
1969 | |
1970 @table @kbd | |
1971 @item n | |
1972 @kindex n (Browse) | |
1973 @findex gnus-group-next-group | |
1974 Go to the next group (@code{gnus-group-next-group}). | |
1975 | |
1976 @item p | |
1977 @kindex p (Browse) | |
1978 @findex gnus-group-prev-group | |
1979 Go to the previous group (@code{gnus-group-prev-group}). | |
1980 | |
1981 @item SPACE | |
1982 @kindex SPACE (Browse) | |
1983 @findex gnus-browse-read-group | |
1984 Enter the current group and display the first article | |
1985 (@code{gnus-browse-read-group}). | |
1986 | |
1987 @item RET | |
1988 @kindex RET (Browse) | |
1989 @findex gnus-browse-select-group | |
1990 Enter the current group (@code{gnus-browse-select-group}). | |
1991 | |
1992 @item u | |
1993 @kindex u (Browse) | |
1994 @findex gnus-browse-unsubscribe-current-group | |
1995 Unsubscribe to the current group, or, as will be the case here, | |
1996 subscribe to it (@code{gnus-browse-unsubscribe-current-group}). | |
1997 | |
1998 @item l | |
1999 @itemx q | |
2000 @kindex q (Browse) | |
2001 @kindex l (Browse) | |
2002 @findex gnus-browse-exit | |
2003 Exit browse mode (@code{gnus-browse-exit}). | |
2004 | |
2005 @item ? | |
2006 @kindex ? (Browse) | |
2007 @findex gnus-browse-describe-briefly | |
2008 Describe browse mode briefly (well, there's not much to describe, is | |
2009 there) (@code{gnus-browse-describe-briefly}). | |
2010 @end table | |
2011 | |
2012 | |
2013 @node Exiting Gnus | |
2014 @section Exiting Gnus | |
2015 @cindex exiting Gnus | |
2016 | |
2017 Yes, Gnus is ex(c)iting. | |
2018 | |
2019 @table @kbd | |
2020 @item z | |
2021 @kindex z (Group) | |
2022 @findex gnus-group-suspend | |
2023 Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus, | |
2024 but it kills all buffers except the Group buffer. I'm not sure why this | |
2025 is a gain, but then who am I to judge? | |
2026 | |
2027 @item q | |
2028 @kindex q (Group) | |
2029 @findex gnus-group-exit | |
2030 Quit Gnus (@code{gnus-group-exit}). | |
2031 | |
2032 @item Q | |
2033 @kindex Q (Group) | |
2034 @findex gnus-group-quit | |
2035 Quit Gnus without saving any startup files (@code{gnus-group-quit}). | |
2036 @end table | |
2037 | |
2038 @vindex gnus-exit-gnus-hook | |
2039 @vindex gnus-suspend-gnus-hook | |
2040 @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and | |
2041 @code{gnus-exit-gnus-hook} is called when you quit Gnus, while | |
2042 @code{gnus-after-exiting-gnus-hook} is called as the final item when | |
2043 exiting Gnus. | |
2044 | |
2045 @findex gnus-unload | |
2046 @cindex unloading | |
2047 If you wish to completely unload Gnus and all its adherents, you can use | |
2048 the @code{gnus-unload} command. This command is also very handy when | |
2049 trying to customize meta-variables. | |
2050 | |
2051 Note: | |
2052 | |
2053 @quotation | |
2054 Miss Lisa Cannifax, while sitting in English class, feels her feet go | |
2055 numbly heavy and herself fall into a hazy trance as the boy sitting | |
2056 behind her drew repeated lines with his pencil across the back of her | |
2057 plastic chair. | |
2058 @end quotation | |
2059 | |
2060 | |
2061 @node Group Topics | |
2062 @section Group Topics | |
2063 @cindex topics | |
2064 | |
2065 If you read lots and lots of groups, it might be convenient to group | |
2066 them hierarchically according to topics. You put your Emacs groups over | |
2067 here, your sex groups over there, and the rest (what, two groups or so?) | |
2068 you put in some misc section that you never bother with anyway. You can | |
2069 even group the Emacs sex groups as a sub-topic to either the Emacs | |
2070 groups or the sex groups---or both! Go wild! | |
2071 | |
2072 @findex gnus-topic-mode | |
2073 @kindex t (Group) | |
2074 To get this @emph{fab} functionality you simply turn on (ooh!) the | |
2075 @code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This | |
2076 is a toggling command.) | |
2077 | |
2078 Go ahead, just try it. I'll still be here when you get back. La de | |
2079 dum... Nice tune, that... la la la... What, you're back? Yes, and now | |
2080 press @kbd{l}. There. All your groups are now listed under | |
2081 @samp{misc}. Doesn't that make you feel all warm and fuzzy? Hot and | |
2082 bothered? | |
2083 | |
2084 If you want this permanently enabled, you should add that minor mode to | |
2085 the hook for the group mode: | |
2086 | |
2087 @lisp | |
2088 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode) | |
2089 @end lisp | |
2090 | |
2091 @menu | |
2092 * Topic Variables:: How to customize the topics the Lisp Way. | |
2093 * Topic Commands:: Interactive E-Z commands. | |
2094 * Topic Topology:: A map of the world. | |
2095 @end menu | |
2096 | |
2097 | |
2098 @node Topic Variables | |
2099 @subsection Topic Variables | |
2100 @cindex topic variables | |
2101 | |
2102 Now, if you select a topic, if will fold/unfold that topic, which is | |
2103 really neat, I think. | |
2104 | |
2105 @vindex gnus-topic-line-format | |
2106 The topic lines themselves are created according to the | |
2107 @code{gnus-topic-line-format} variable. @xref{Formatting Variables}. | |
2108 Elements allowed are: | |
2109 | |
2110 @table @samp | |
2111 @item i | |
2112 Indentation. | |
2113 @item n | |
2114 Topic name. | |
2115 @item v | |
2116 Visibility. | |
2117 @item l | |
2118 Level. | |
2119 @item g | |
2120 Number of groups in the topic. | |
2121 @item a | |
2122 Number of unread articles in the topic. | |
2123 @item A | |
2124 Number of unread articles in the topic and all its subtopics. | |
2125 @end table | |
2126 | |
2127 @vindex gnus-topic-indent-level | |
2128 Each sub-topic (and the groups in the sub-topics) will be indented with | |
2129 @code{gnus-topic-indent-level} times the topic level number of spaces. | |
2130 The default is @code{2}. | |
2131 | |
2132 @vindex gnus-topic-mode-hook | |
2133 @code{gnus-topic-mode-hook} is called in topic minor mode buffers. | |
2134 | |
2135 | |
2136 @node Topic Commands | |
2137 @subsection Topic Commands | |
2138 @cindex topic commands | |
2139 | |
2140 When the topic minor mode is turned on, a new @kbd{T} submap will be | |
2141 available. In addition, a few of the standard keys change their | |
2142 definitions slightly. | |
2143 | |
2144 @table @kbd | |
2145 | |
2146 @item T n | |
2147 @kindex T n (Group) | |
2148 @findex gnus-topic-create-topic | |
2149 Prompt for a new topic name and create it | |
2150 (@code{gnus-topic-create-topic}). | |
2151 | |
2152 @item T m | |
2153 @kindex T m (Group) | |
2154 @findex gnus-topic-move-group | |
2155 Move the current group to some other topic | |
2156 (@code{gnus-topic-move-group}). This command understands the | |
2157 process/prefix convention (@pxref{Process/Prefix}). | |
2158 | |
2159 @item T c | |
2160 @kindex T c (Group) | |
2161 @findex gnus-topic-copy-group | |
2162 Copy the current group to some other topic | |
2163 (@code{gnus-topic-copy-group}). This command understands the | |
2164 process/prefix convention (@pxref{Process/Prefix}). | |
2165 | |
2166 @item T D | |
2167 @kindex T D (Group) | |
2168 @findex gnus-topic-remove-group | |
2169 Remove a group from the current topic (@code{gnus-topic-remove-group}). | |
2170 This command understands the process/prefix convention | |
2171 (@pxref{Process/Prefix}). | |
2172 | |
2173 @item T M | |
2174 @kindex T M (Group) | |
2175 @findex gnus-topic-move-matching | |
2176 Move all groups that match some regular expression to a topic | |
2177 (@code{gnus-topic-move-matching}). | |
2178 | |
2179 @item T C | |
2180 @kindex T C (Group) | |
2181 @findex gnus-topic-copy-matching | |
2182 Copy all groups that match some regular expression to a topic | |
2183 (@code{gnus-topic-copy-matching}). | |
2184 | |
2185 @item T # | |
2186 @kindex T # (Group) | |
2187 @findex gnus-topic-mark-topic | |
2188 Mark all groups in the current topic with the process mark | |
2189 (@code{gnus-topic-mark-topic}). | |
2190 | |
2191 @item T M-# | |
2192 @kindex T M-# (Group) | |
2193 @findex gnus-topic-unmark-topic | |
2194 Remove the process mark from all groups in the current topic | |
2195 (@code{gnus-topic-unmark-topic}). | |
2196 | |
2197 @item RET | |
2198 @kindex RET (Group) | |
2199 @findex gnus-topic-select-group | |
2200 @itemx SPACE | |
2201 Either select a group or fold a topic (@code{gnus-topic-select-group}). | |
2202 When you perform this command on a group, you'll enter the group, as | |
2203 usual. When done on a topic line, the topic will be folded (if it was | |
2204 visible) or unfolded (if it was folded already). So it's basically a | |
2205 toggling command on topics. In addition, if you give a numerical | |
2206 prefix, group on that level (and lower) will be displayed. | |
2207 | |
2208 @item T TAB | |
2209 @kindex T TAB (Group) | |
2210 @findex gnus-topic-indent | |
2211 ``Indent'' the current topic so that it becomes a sub-topic of the | |
2212 previous topic (@code{gnus-topic-indent}). If given a prefix, | |
2213 ``un-indent'' the topic instead. | |
2214 | |
2215 @item C-k | |
2216 @kindex C-k (Group) | |
2217 @findex gnus-topic-kill-group | |
2218 Kill a group or topic (@code{gnus-topic-kill-group}). | |
2219 | |
2220 @item C-y | |
2221 @kindex C-y (Group) | |
2222 @findex gnus-topic-yank-group | |
2223 Yank the previously killed group or topic (@code{gnus-topic-yank-group}). | |
2224 Note that all topics will be yanked before all groups. | |
2225 | |
2226 @item T r | |
2227 @kindex T r (Group) | |
2228 @findex gnus-topic-rename | |
2229 Rename a topic (@code{gnus-topic-rename}). | |
2230 | |
2231 @item T DEL | |
2232 @kindex T DEL (Group) | |
2233 @findex gnus-topic-delete | |
2234 Delete an empty topic (@code{gnus-topic-delete}). | |
2235 | |
2236 @item A T | |
2237 @kindex A T (Group) | |
2238 @findex gnus-topic-list-active | |
2239 List all groups that Gnus knows about in a topics-ified way | |
2240 (@code{gnus-topic-list-active}). | |
2241 | |
2242 @end table | |
2243 | |
2244 | |
2245 @node Topic Topology | |
2246 @subsection Topic Topology | |
2247 @cindex topic topology | |
2248 @cindex topology | |
2249 | |
2250 So, let's have a look at an example group buffer: | |
2251 | |
2252 @example | |
2253 Gnus | |
2254 Emacs -- I wuw it! | |
2255 3: comp.emacs | |
2256 2: alt.religion.emacs | |
2257 Naughty Emacs | |
2258 452: alt.sex.emacs | |
2259 0: comp.talk.emacs.recovery | |
2260 Misc | |
2261 8: comp.binaries.fractals | |
2262 13: comp.sources.unix | |
2263 @end example | |
2264 | |
2265 So, here we have one top-level topic, two topics under that, and one | |
2266 sub-topic under one of the sub-topics. (There is always just one (1) | |
2267 top-level topic). This topology can be expressed as follows: | |
2268 | |
2269 @lisp | |
2270 (("Gnus" visible) | |
2271 (("Emacs -- I wuw it!" visible) | |
2272 (("Naughty Emacs" visible))) | |
2273 (("Misc" visible))) | |
2274 @end lisp | |
2275 | |
2276 @vindex gnus-topic-topology | |
2277 This is in fact how the variable @code{gnus-topic-topology} would look | |
2278 for the display above. That variable is saved in the @file{.newsrc.eld} | |
2279 file, and shouldn't be messed with manually---unless you really want | |
2280 to. Since this variable is read from the @file{.newsrc.eld} file, | |
2281 setting it in any other startup files will have no effect. | |
2282 | |
2283 This topology shows what topics are sub-topics of what topics (right), | |
2284 and which topics are visible. Two settings are currently | |
2285 allowed---@code{visible} and @code{invisible}. | |
2286 | |
2287 | |
2288 @node Misc Group Stuff | |
2289 @section Misc Group Stuff | |
2290 | |
2291 @menu | |
2292 * Scanning New Messages:: Asking Gnus to see whether new messages have arrived. | |
2293 * Group Information:: Information and help on groups and Gnus. | |
2294 * File Commands:: Reading and writing the Gnus files. | |
2295 @end menu | |
2296 | |
2297 @table @kbd | |
2298 | |
2299 @item ^ | |
2300 @kindex ^ (Group) | |
2301 @findex gnus-group-enter-server-mode | |
2302 Enter the server buffer (@code{gnus-group-enter-server-mode}). @xref{The | |
2303 Server Buffer}. | |
2304 | |
2305 @item a | |
2306 @kindex a (Group) | |
2307 @findex gnus-group-post-news | |
2308 Post an article to a group (@code{gnus-group-post-news}). The current | |
2309 group name will be used as the default. | |
2310 | |
2311 @item m | |
2312 @kindex m (Group) | |
2313 @findex gnus-group-mail | |
2314 Mail a message somewhere (@code{gnus-group-mail}). | |
2315 | |
2316 @end table | |
2317 | |
2318 Variables for the group buffer: | |
2319 | |
2320 @table @code | |
2321 | |
2322 @item gnus-group-mode-hook | |
2323 @vindex gnus-group-mode-hook | |
2324 @code{gnus-group-mode-hook} is called after the group buffer has been | |
2325 created. | |
2326 | |
2327 @item gnus-group-prepare-hook | |
2328 @vindex gnus-group-prepare-hook | |
2329 @code{gnus-group-prepare-hook} is called after the group buffer is | |
2330 generated. It may be used to modify the buffer in some strange, | |
2331 unnatural way. | |
2332 | |
2333 @item gnus-permanently-visible-groups | |
2334 @vindex gnus-permanently-visible-groups | |
2335 Groups matching this regexp will always be listed in the group buffer, | |
2336 whether they are empty or not. | |
2337 | |
2338 @end table | |
2339 | |
2340 | |
2341 @node Scanning New Messages | |
2342 @subsection Scanning New Messages | |
2343 @cindex new messages | |
2344 @cindex scanning new news | |
2345 | |
2346 @table @kbd | |
2347 | |
2348 @item g | |
2349 @kindex g (Group) | |
2350 @findex gnus-group-get-new-news | |
2351 Check the server(s) for new articles. If the numerical prefix is used, | |
2352 this command will check only groups of level @var{arg} and lower | |
2353 (@code{gnus-group-get-new-news}). If given a non-numerical prefix, this | |
2354 command will force a total rereading of the active file(s) from the | |
2355 backend(s). | |
2356 | |
2357 @item M-g | |
2358 @kindex M-g (Group) | |
2359 @findex gnus-group-get-new-news-this-group | |
2360 @vindex gnus-goto-next-group-when-activating | |
2361 Check whether new articles have arrived in the current group | |
2362 (@code{gnus-group-get-new-news-this-group}). The | |
2363 @code{gnus-goto-next-group-when-activating} variable controls whether | |
2364 this command is to move point to the next group or not. It is @code{t} | |
2365 by default. | |
2366 | |
2367 @findex gnus-activate-all-groups | |
2368 @cindex activating groups | |
2369 @item C-c M-g | |
2370 @kindex C-c M-g (Group) | |
2371 Activate absolutely all groups (@code{gnus-activate-all-groups}). | |
2372 | |
2373 @item R | |
2374 @kindex R (Group) | |
2375 @cindex restarting | |
2376 @findex gnus-group-restart | |
2377 Restart Gnus (@code{gnus-group-restart}). | |
2378 | |
2379 @end table | |
2380 | |
2381 @vindex gnus-get-new-news-hook | |
2382 @code{gnus-get-new-news-hook} is run just before checking for new news. | |
2383 | |
2384 @vindex gnus-after-getting-new-news-hook | |
2385 @code{gnus-after-getting-new-news-hook} is run after checking for new | |
2386 news. | |
2387 | |
2388 | |
2389 @node Group Information | |
2390 @subsection Group Information | |
2391 @cindex group information | |
2392 @cindex information on groups | |
2393 | |
2394 @table @kbd | |
2395 | |
2396 @item M-f | |
2397 @kindex M-f (Group) | |
2398 @findex gnus-group-fetch-faq | |
2399 @cindex FAQ | |
2400 @cindex ange-ftp | |
2401 Try to fetch the FAQ for the current group | |
2402 (@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from | |
2403 @code{gnus-group-faq-directory}, which is usually a directory on a | |
2404 remote machine. @code{ange-ftp} will be used for fetching the file. | |
2405 | |
2406 @item D | |
2407 @kindex D (Group) | |
2408 @cindex describing groups | |
2409 @cindex group description | |
2410 @findex gnus-group-describe-group | |
2411 Describe the current group (@code{gnus-group-describe-group}). If given | |
2412 a prefix, force Gnus to re-read the description from the server. | |
2413 | |
2414 @item M-d | |
2415 @kindex M-d (Group) | |
2416 @findex gnus-group-describe-all-groups | |
2417 Describe all groups (@code{gnus-group-describe-all-groups}). If given a | |
2418 prefix, force Gnus to re-read the description file from the server. | |
2419 | |
2420 @item V | |
2421 @kindex V (Group) | |
2422 @cindex version | |
2423 @findex gnus-version | |
2424 Display current Gnus version numbers (@code{gnus-version}). | |
2425 | |
2426 @item ? | |
2427 @kindex ? (Group) | |
2428 @findex gnus-group-describe-briefly | |
2429 Give a very short help message (@code{gnus-group-describe-briefly}). | |
2430 | |
2431 @item C-c C-i | |
2432 @kindex C-c C-i (Group) | |
2433 @cindex info | |
2434 @cindex manual | |
2435 @findex gnus-info-find-node | |
2436 Go to the Gnus info node (@code{gnus-info-find-node}). | |
2437 @end table | |
2438 | |
2439 | |
2440 @node File Commands | |
2441 @subsection File Commands | |
2442 @cindex file commands | |
2443 | |
2444 @table @kbd | |
2445 | |
2446 @item r | |
2447 @kindex r (Group) | |
2448 @findex gnus-group-read-init-file | |
2449 @vindex gnus-init-file | |
2450 @cindex reading init file | |
2451 Read the init file (@code{gnus-init-file}, which defaults to | |
2452 @file{~/.gnus}) (@code{gnus-group-read-init-file}). | |
2453 | |
2454 @item s | |
2455 @kindex s (Group) | |
2456 @findex gnus-group-save-newsrc | |
2457 @cindex saving .newsrc | |
2458 Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted) | |
2459 (@code{gnus-group-save-newsrc}). If given a prefix, force saving the | |
2460 file(s) whether Gnus thinks it is necessary or not. | |
2461 | |
2462 @item Z | |
2463 @kindex Z (Group) | |
2464 @findex gnus-group-clear-dribble | |
2465 Clear the dribble buffer (@code{gnus-group-clear-dribble}). | |
2466 | |
2467 @end table | |
2468 | |
2469 | |
2470 @node The Summary Buffer | |
2471 @chapter The Summary Buffer | |
2472 @cindex summary buffer | |
2473 | |
2474 A line for each article is displayed in the summary buffer. You can | |
2475 move around, read articles, post articles and reply to articles. | |
2476 | |
2477 @menu | |
2478 * Summary Buffer Format:: Deciding how the summary buffer is to look. | |
2479 * Summary Maneuvering:: Moving around the summary buffer. | |
2480 * Choosing Articles:: Reading articles. | |
2481 * Paging the Article:: Scrolling the current article. | |
2482 * Reply Followup and Post:: Posting articles. | |
2483 * Canceling and Superseding:: ``Whoops, I shouldn't have called him that.'' | |
2484 * Marking Articles:: Marking articles as read, expirable, etc. | |
2485 * Limiting:: You can limit the summary buffer. | |
2486 * Threading:: How threads are made. | |
2487 * Sorting:: How articles and threads are sorted. | |
2488 * Asynchronous Fetching:: Gnus might be able to pre-fetch articles. | |
2489 * Article Caching:: You may store articles in a cache. | |
2490 * Persistent Articles:: Making articles expiry-resistant. | |
2491 * Article Backlog:: Having already read articles hang around. | |
2492 * Saving Articles:: Ways of customizing article saving. | |
2493 * Decoding Articles:: Gnus can treat series of (uu)encoded articles. | |
2494 * Article Treatment:: The article buffer can be mangled at will. | |
2495 * Summary Sorting:: Sorting the summary buffer in various ways. | |
2496 * Finding the Parent:: No child support? Get the parent. | |
2497 * Alternative Approaches:: Reading using non-default summaries. | |
2498 * Tree Display:: A more visual display of threads. | |
2499 * Mail Group Commands:: Some commands can only be used in mail groups. | |
2500 * Various Summary Stuff:: What didn't fit anywhere else. | |
2501 * Exiting the Summary Buffer:: Returning to the Group buffer. | |
2502 @end menu | |
2503 | |
2504 | |
2505 @node Summary Buffer Format | |
2506 @section Summary Buffer Format | |
2507 @cindex summary buffer format | |
2508 | |
2509 @menu | |
2510 * Summary Buffer Lines:: You can specify how summary lines should look. | |
2511 * Summary Buffer Mode Line:: You can say how the mode line should look. | |
2512 * Summary Highlighting:: Making the summary buffer all pretty and nice. | |
2513 @end menu | |
2514 | |
2515 @findex mail-extract-address-components | |
2516 @findex gnus-extract-address-components | |
2517 @vindex gnus-extract-address-components | |
2518 Gnus will use the value of the @code{gnus-extract-address-components} | |
2519 variable as a function for getting the name and address parts of a | |
2520 @code{From} header. Two pre-defined function exist: | |
2521 @code{gnus-extract-address-components}, which is the default, quite | |
2522 fast, and too simplistic solution; and | |
2523 @code{mail-extract-address-components}, which works very nicely, but is | |
2524 slower. The default function will return the wrong answer in 5% of the | |
2525 cases. If this is unacceptable to you, use the other function instead. | |
2526 | |
2527 @vindex gnus-summary-same-subject | |
2528 @code{gnus-summary-same-subject} is a string indicating that the current | |
2529 article has the same subject as the previous. This string will be used | |
2530 with those specs that require it. The default is @samp{}. | |
2531 | |
2532 | |
2533 @node Summary Buffer Lines | |
2534 @subsection Summary Buffer Lines | |
2535 | |
2536 @vindex gnus-summary-line-format | |
2537 You can change the format of the lines in the summary buffer by changing | |
2538 the @code{gnus-summary-line-format} variable. It works along the same | |
2539 lines a a normal @code{format} string, with some extensions. | |
2540 | |
2541 The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}. | |
2542 | |
2543 The following format specification characters are understood: | |
2544 | |
2545 @table @samp | |
2546 @item N | |
2547 Article number. | |
2548 @item S | |
2549 Subject string. | |
2550 @item s | |
2551 Subject if the article is the root, @code{gnus-summary-same-subject} | |
2552 otherwise. | |
2553 @item F | |
2554 Full @code{From} line. | |
2555 @item n | |
2556 The name (from the @code{From} header). | |
2557 @item a | |
2558 The name (from the @code{From} header). This differs from the @code{n} | |
2559 spec in that it uses @code{gnus-extract-address-components}, which is | |
2560 slower, but may be more thorough. | |
2561 @item A | |
2562 The address (from the @code{From} header). This works the same way as | |
2563 the @code{a} spec. | |
2564 @item L | |
2565 Number of lines in the article. | |
2566 @item c | |
2567 Number of characters in the article. | |
2568 @item I | |
2569 Indentation based on thread level (@pxref{Customizing Threading}). | |
2570 @item T | |
2571 Nothing if the article is a root and lots of spaces if it isn't (it | |
2572 pushes everything after it off the screen). | |
2573 @item \[ | |
2574 Opening bracket, which is normally @samp{\[}, but can also be @samp{<} | |
2575 for adopted articles. | |
2576 @item \] | |
2577 Closing bracket, which is normally @samp{\]}, but can also be @samp{>} | |
2578 for adopted articles. | |
2579 @item > | |
2580 One space for each thread level. | |
2581 @item < | |
2582 Twenty minus thread level spaces. | |
2583 @item U | |
2584 Unread. | |
2585 @item R | |
2586 Replied. | |
2587 @item i | |
2588 Score as a number. | |
2589 @item z | |
2590 @vindex gnus-summary-zcore-fuzz | |
2591 Zcore, @samp{+} if above the default level and @samp{-} if below the | |
2592 default level. If the difference between | |
2593 @code{gnus-summary-default-level} and the score is less than | |
2594 @code{gnus-summary-zcore-fuzz}, this spec will not be used. | |
2595 @item V | |
2596 Total thread score. | |
2597 @item x | |
2598 @code{Xref}. | |
2599 @item D | |
2600 @code{Date}. | |
2601 @item M | |
2602 @code{Message-ID}. | |
2603 @item r | |
2604 @code{References}. | |
2605 @item t | |
2606 Number of articles in the current sub-thread. Using this spec will slow | |
2607 down summary buffer generation somewhat. | |
2608 @item e | |
2609 A single character will be displayed if the article has any children. | |
2610 @item u | |
2611 User defined specifier. The next character in the format string should | |
2612 be a letter. @sc{gnus} will call the function | |
2613 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter | |
2614 following @samp{%u}. The function will be passed the current header as | |
2615 argument. The function should return a string, which will be inserted | |
2616 into the summary just like information from any other summary specifier. | |
2617 @end table | |
2618 | |
2619 The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs | |
2620 have to be handled with care. For reasons of efficiency, Gnus will | |
2621 compute what column these characters will end up in, and ``hard-code'' | |
2622 that. This means that it is illegal to have these specs after a | |
2623 variable-length spec. Well, you might not be arrested, but your summary | |
2624 buffer will look strange, which is bad enough. | |
2625 | |
2626 The smart choice is to have these specs as far to the left as possible. | |
2627 (Isn't that the case with everything, though? But I digress.) | |
2628 | |
2629 This restriction may disappear in later versions of Gnus. | |
2630 | |
2631 | |
2632 @node Summary Buffer Mode Line | |
2633 @subsection Summary Buffer Mode Line | |
2634 | |
2635 @vindex gnus-summary-mode-line-format | |
2636 You can also change the format of the summary mode bar. Set | |
2637 @code{gnus-summary-mode-line-format} to whatever you like. Here are the | |
2638 elements you can play with: | |
2639 | |
2640 @table @samp | |
2641 @item G | |
2642 Group name. | |
2643 @item p | |
2644 Unprefixed group name. | |
2645 @item A | |
2646 Current article number. | |
2647 @item V | |
2648 Gnus version. | |
2649 @item U | |
2650 Number of unread articles in this group. | |
2651 @item e | |
2652 Number of unselected articles in this group. | |
2653 @item Z | |
2654 A string with the number of unread and unselected articles represented | |
2655 either as @samp{<%U(+%u) more>} if there are both unread and unselected | |
2656 articles, and just as @samp{<%U more>} if there are just unread articles | |
2657 and no unselected ones. | |
2658 @item g | |
2659 Shortish group name. For instance, @samp{rec.arts.anime} will be | |
2660 shortened to @samp{r.a.anime}. | |
2661 @item S | |
2662 Subject of the current article. | |
2663 @item u | |
2664 Used-defined spec. | |
2665 @item s | |
2666 Name of the current score file. | |
2667 @item d | |
2668 Number of dormant articles. | |
2669 @item t | |
2670 Number of ticked articles. | |
2671 @item r | |
2672 Number of articles that have been marked as read in this session. | |
2673 @item E | |
2674 Number of articles expunged by the score files. | |
2675 @end table | |
2676 | |
2677 | |
2678 @node Summary Highlighting | |
2679 @subsection Summary Highlighting | |
2680 | |
2681 @table @code | |
2682 | |
2683 @item gnus-visual-mark-article-hook | |
2684 @vindex gnus-visual-mark-article-hook | |
2685 This hook is run after selecting an article. It is meant to be used for | |
2686 highlighting the article in some way. It is not run if | |
2687 @code{gnus-visual} is @code{nil}. | |
2688 | |
2689 @item gnus-summary-update-hook | |
2690 @vindex gnus-summary-update-hook | |
2691 This hook is called when a summary line is changed. It is not run if | |
2692 @code{gnus-visual} is @code{nil}. | |
2693 | |
2694 @item gnus-summary-selected-face | |
2695 @vindex gnus-summary-selected-face | |
2696 This is the face (or @dfn{font} as some people call it) that is used to | |
2697 highlight the current article in the summary buffer. | |
2698 | |
2699 @item gnus-summary-highlight | |
2700 @vindex gnus-summary-highlight | |
2701 Summary lines are highlighted according to this variable, which is a | |
2702 list where the elements are on the format @code{(FORM . FACE)}. If you | |
2703 would, for instance, like ticked articles to be italic and high-scored | |
2704 articles to be bold, you could set this variable to something like | |
2705 @lisp | |
2706 (((eq mark gnus-ticked-mark) . italic) | |
2707 ((> score default) . bold)) | |
2708 @end lisp | |
2709 As you may have guessed, if @var{FORM} returns a non-@code{nil} value, | |
2710 @var{FACE} will be applied to the line. | |
2711 @end table | |
2712 | |
2713 | |
2714 @node Summary Maneuvering | |
2715 @section Summary Maneuvering | |
2716 @cindex summary movement | |
2717 | |
2718 All the straight movement commands understand the numeric prefix and | |
2719 behave pretty much as you'd expect. | |
2720 | |
2721 None of these commands select articles. | |
2722 | |
2723 @table @kbd | |
2724 @item G M-n | |
2725 @itemx M-n | |
2726 @kindex M-n (Summary) | |
2727 @kindex G M-n (Summary) | |
2728 @findex gnus-summary-next-unread-subject | |
2729 Go to the next summary line of an unread article | |
2730 (@code{gnus-summary-next-unread-subject}). | |
2731 | |
2732 @item G M-p | |
2733 @itemx M-p | |
2734 @kindex M-p (Summary) | |
2735 @kindex G M-p (Summary) | |
2736 @findex gnus-summary-prev-unread-subject | |
2737 Go to the previous summary line of an unread article | |
2738 (@code{gnus-summary-prev-unread-subject}). | |
2739 | |
2740 @item G j | |
2741 @itemx j | |
2742 @kindex j (Summary) | |
2743 @kindex G j (Summary) | |
2744 @findex gnus-summary-goto-article | |
2745 Ask for an article number and then go that article | |
2746 (@code{gnus-summary-goto-article}). | |
2747 | |
2748 @item G g | |
2749 @kindex G g (Summary) | |
2750 @findex gnus-summary-goto-subject | |
2751 Ask for an article number and then go the summary line of that article | |
2752 (@code{gnus-summary-goto-subject}). | |
2753 @end table | |
2754 | |
2755 If Gnus asks you to press a key to confirm going to the next group, you | |
2756 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group | |
2757 buffer, searching for the next group to read without actually returning | |
2758 to the group buffer. | |
2759 | |
2760 Variables related to summary movement: | |
2761 | |
2762 @table @code | |
2763 | |
2764 @vindex gnus-auto-select-next | |
2765 @item gnus-auto-select-next | |
2766 If you are at the end of the group and issue one of the movement | |
2767 commands, Gnus will offer to go to the next group. If this variable is | |
2768 @code{t} and the next group is empty, Gnus will exit summary mode and | |
2769 return to the group buffer. If this variable is neither @code{t} nor | |
2770 @code{nil}, Gnus will select the next group, no matter whether it has | |
2771 any unread articles or not. As a special case, if this variable is | |
2772 @code{quietly}, Gnus will select the next group without asking for | |
2773 confirmation. If this variable is @code{almost-quietly}, the same will | |
2774 happen only if you are located on the last article in the group. | |
2775 Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n} | |
2776 command will go to the next group without confirmation. Also | |
2777 @pxref{Group Levels}. | |
2778 | |
2779 @item gnus-auto-select-same | |
2780 @vindex gnus-auto-select-same | |
2781 If non-@code{nil}, all the movement commands will try to go to the next | |
2782 article with the same subject as the current. This variable is not | |
2783 particularly useful if you use a threaded display. | |
2784 | |
2785 @item gnus-summary-check-current | |
2786 @vindex gnus-summary-check-current | |
2787 If non-@code{nil}, all the ``unread'' movement commands will not proceed | |
2788 to the next (or previous) article if the current article is unread. | |
2789 Instead, they will choose the current article. | |
2790 | |
2791 @item gnus-auto-center-summary | |
2792 @vindex gnus-auto-center-summary | |
2793 If non-@code{nil}, Gnus will keep the point in the summary buffer | |
2794 centered at all times. This makes things quite tidy, but if you have a | |
2795 slow network connection, or simply do not like this un-Emacsism, you can | |
2796 set this variable to @code{nil} to get the normal Emacs scrolling | |
2797 action. This will also inhibit horizontal re-centering of the summary | |
2798 buffer, which might make it more inconvenient to read extremely long | |
2799 threads. | |
2800 | |
2801 @end table | |
2802 | |
2803 | |
2804 @node Choosing Articles | |
2805 @section Choosing Articles | |
2806 @cindex selecting articles | |
2807 | |
2808 None of the following movement commands understand the numeric prefix, | |
2809 and they all select and display an article. | |
2810 | |
2811 @table @kbd | |
2812 @item SPACE | |
2813 @kindex SPACE (Summary) | |
2814 @findex gnus-summary-next-page | |
2815 Select the current article, or, if that one's read already, the next | |
2816 unread article (@code{gnus-summary-next-page}). | |
2817 | |
2818 @item G n | |
2819 @itemx n | |
2820 @kindex n (Summary) | |
2821 @kindex G n (Summary) | |
2822 @findex gnus-summary-next-unread-article | |
2823 Go to next unread article (@code{gnus-summary-next-unread-article}). | |
2824 | |
2825 @item G p | |
2826 @itemx p | |
2827 @kindex p (Summary) | |
2828 @findex gnus-summary-prev-unread-article | |
2829 Go to previous unread article (@code{gnus-summary-prev-unread-article}). | |
2830 | |
2831 @item G N | |
2832 @itemx N | |
2833 @kindex N (Summary) | |
2834 @kindex G N (Summary) | |
2835 @findex gnus-summary-next-article | |
2836 Go to the next article (@code{gnus-summary-next-article}). | |
2837 | |
2838 @item G P | |
2839 @itemx P | |
2840 @kindex P (Summary) | |
2841 @kindex G P (Summary) | |
2842 @findex gnus-summary-prev-article | |
2843 Go to the previous article (@code{gnus-summary-prev-article}). | |
2844 | |
2845 @item G C-n | |
2846 @kindex G C-n (Summary) | |
2847 @findex gnus-summary-next-same-subject | |
2848 Go to the next article with the same subject | |
2849 (@code{gnus-summary-next-same-subject}). | |
2850 | |
2851 @item G C-p | |
2852 @kindex G C-p (Summary) | |
2853 @findex gnus-summary-prev-same-subject | |
2854 Go to the previous article with the same subject | |
2855 (@code{gnus-summary-prev-same-subject}). | |
2856 | |
2857 @item G f | |
2858 @itemx . | |
2859 @kindex G f (Summary) | |
2860 @kindex . (Summary) | |
2861 @findex gnus-summary-first-unread-article | |
2862 Go to the first unread article | |
2863 (@code{gnus-summary-first-unread-article}). | |
2864 | |
2865 @item G b | |
2866 @itemx , | |
2867 @kindex G b (Summary) | |
2868 @kindex , (Summary) | |
2869 @findex gnus-summary-best-unread-article | |
2870 Go to the article with the highest score | |
2871 (@code{gnus-summary-best-unread-article}). | |
2872 | |
2873 @item G l | |
2874 @itemx l | |
2875 @kindex l (Summary) | |
2876 @kindex G l (Summary) | |
2877 @findex gnus-summary-goto-last-article | |
2878 Go to the previous article read (@code{gnus-summary-goto-last-article}). | |
2879 | |
2880 @item G p | |
2881 @kindex G p (Summary) | |
2882 @findex gnus-summary-pop-article | |
2883 Pop an article off the summary history and go to this article | |
2884 (@code{gnus-summary-pop-article}). This command differs from the | |
2885 command above in that you can pop as many previous articles off the | |
2886 history as you like. | |
2887 @end table | |
2888 | |
2889 Some variables that are relevant for moving and selecting articles: | |
2890 | |
2891 @table @code | |
2892 @item gnus-auto-extend-newsgroup | |
2893 @vindex gnus-auto-extend-newsgroup | |
2894 All the movement commands will try to go to the previous (or next) | |
2895 article, even if that article isn't displayed in the Summary buffer if | |
2896 this variable is non-@code{nil}. Gnus will then fetch the article from | |
2897 the server and display it in the article buffer. | |
2898 | |
2899 @item gnus-select-article-hook | |
2900 @vindex gnus-select-article-hook | |
2901 This hook is called whenever an article is selected. By default it | |
2902 exposes any threads hidden under the selected article. | |
2903 | |
2904 @item gnus-mark-article-hook | |
2905 @vindex gnus-mark-article-hook | |
2906 @findex gnus-summary-mark-unread-as-read | |
2907 @findex gnus-summary-mark-read-and-unread-as-read | |
2908 @findex gnus-unread-mark | |
2909 This hook is called whenever an article is selected. It is intended to | |
2910 be used for marking articles as read. The default value is | |
2911 @code{gnus-summary-mark-read-and-unread-as-read}, and will change the | |
2912 mark of almost any article you read to @code{gnus-unread-mark}. The | |
2913 only articles not affected by this function are ticked, dormant, and | |
2914 expirable articles. If you'd instead like to just have unread articles | |
2915 marked as read, you can use @code{gnus-summary-mark-unread-as-read} | |
2916 instead. It will leave marks like @code{gnus-low-score-mark}, | |
2917 @code{gnus-del-mark} (and so on) alone. | |
2918 | |
2919 @end table | |
2920 | |
2921 | |
2922 @node Paging the Article | |
2923 @section Scrolling the Article | |
2924 @cindex article scrolling | |
2925 | |
2926 @table @kbd | |
2927 | |
2928 @item SPACE | |
2929 @kindex SPACE (Summary) | |
2930 @findex gnus-summary-next-page | |
2931 Pressing @kbd{SPACE} will scroll the current article forward one page, | |
2932 or, if you have come to the end of the current article, will choose the | |
2933 next article (@code{gnus-summary-next-page}). | |
2934 | |
2935 @item DEL | |
2936 @kindex DEL (Summary) | |
2937 @findex gnus-summary-prev-page | |
2938 Scroll the current article back one page (@code{gnus-summary-prev-page}). | |
2939 | |
2940 @item RET | |
2941 @kindex RET (Summary) | |
2942 @findex gnus-summary-scroll-up | |
2943 Scroll the current article one line forward | |
2944 (@code{gnus-summary-scroll-up}). | |
2945 | |
2946 @item A g | |
2947 @itemx g | |
2948 @kindex A g (Summary) | |
2949 @kindex g (Summary) | |
2950 @findex gnus-summary-show-article | |
2951 (Re)fetch the current article (@code{gnus-summary-show-article}). If | |
2952 given a prefix, fetch the current article, but don't run any of the | |
2953 article treatment functions. This will give you a ``raw'' article, just | |
2954 the way it came from the server. | |
2955 | |
2956 @item A < | |
2957 @itemx < | |
2958 @kindex < (Summary) | |
2959 @kindex A < (Summary) | |
2960 @findex gnus-summary-beginning-of-article | |
2961 Scroll to the beginning of the article | |
2962 (@code{gnus-summary-beginning-of-article}). | |
2963 | |
2964 @item A > | |
2965 @itemx > | |
2966 @kindex > (Summary) | |
2967 @kindex A > (Summary) | |
2968 @findex gnus-summary-end-of-article | |
2969 Scroll to the end of the article (@code{gnus-summary-end-of-article}). | |
2970 | |
2971 @item A s | |
2972 @kindex A s (Summary) | |
2973 @findex gnus-summary-isearch-article | |
2974 Perform an isearch in the article buffer | |
2975 (@code{gnus-summary-isearch-article}). | |
2976 | |
2977 @end table | |
2978 | |
2979 | |
2980 @node Reply Followup and Post | |
2981 @section Reply, Followup and Post | |
2982 | |
2983 @menu | |
2984 * Summary Mail Commands:: Sending mail. | |
2985 * Summary Post Commands:: Sending news. | |
2986 @end menu | |
2987 | |
2988 | |
2989 @node Summary Mail Commands | |
2990 @subsection Summary Mail Commands | |
2991 @cindex mail | |
2992 @cindex composing mail | |
2993 | |
2994 Commands for composing a mail message: | |
2995 | |
2996 @table @kbd | |
2997 | |
2998 @item S r | |
2999 @itemx r | |
3000 @kindex S r (Summary) | |
3001 @kindex r (Summary) | |
3002 @findex gnus-summary-reply | |
3003 Mail a reply to the author of the current article | |
3004 (@code{gnus-summary-reply}). | |
3005 | |
3006 @item S R | |
3007 @itemx R | |
3008 @kindex R (Summary) | |
3009 @kindex S R (Summary) | |
3010 @findex gnus-summary-reply-with-original | |
3011 Mail a reply to the author of the current article and include the | |
3012 original message (@code{gnus-summary-reply-with-original}). This | |
3013 command uses the process/prefix convention. | |
3014 | |
3015 @item S o m | |
3016 @kindex S o m (Summary) | |
3017 @findex gnus-summary-mail-forward | |
3018 Forward the current article to some other person | |
3019 (@code{gnus-summary-mail-forward}). | |
3020 | |
3021 @item S o p | |
3022 @kindex S o p (Summary) | |
3023 @findex gnus-summary-post-forward | |
3024 Forward the current article to a newsgroup | |
3025 (@code{gnus-summary-post-forward}). | |
3026 | |
3027 @item S m | |
3028 @itemx m | |
3029 @kindex m (Summary) | |
3030 @kindex S m (Summary) | |
3031 @findex gnus-summary-mail-other-window | |
3032 Send a mail to some other person | |
3033 (@code{gnus-summary-mail-other-window}). | |
3034 | |
3035 @item S D b | |
3036 @kindex S D b (Summary) | |
3037 @findex gnus-summary-resend-bounced-mail | |
3038 @cindex bouncing mail | |
3039 If you have sent a mail, but the mail was bounced back to you for some | |
3040 reason (wrong address, transient failure), you can use this command to | |
3041 resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You | |
3042 will be popped into a mail buffer where you can edit the headers before | |
3043 sending the mail off again. If you give a prefix to this command, and | |
3044 the bounced mail is a reply to some other mail, Gnus will try to fetch | |
3045 that mail and display it for easy perusal of its headers. This might | |
3046 very well fail, though. | |
3047 | |
3048 @item S D r | |
3049 @kindex S D r (Summary) | |
3050 @findex gnus-summary-resend-message | |
3051 Not to be confused with the previous command, | |
3052 @code{gnus-summary-resend-message} will prompt you for an address to | |
3053 send the current message off to, and then send it to that place. The | |
3054 headers of the message won't be altered---but lots of headers that say | |
3055 @code{Resent-To}, @code{Resent-From} and so on will be added. This | |
3056 means that you actually send a mail to someone that has a @code{To} | |
3057 header that (probably) points to yourself. This will confuse people. | |
3058 So, natcherly you'll only do that if you're really eVIl. | |
3059 | |
3060 This command is mainly used if you have several accounts and want to | |
3061 ship a mail to a different account of yours. (If you're both | |
3062 @code{root} and @code{postmaster} and get a mail for @code{postmaster} | |
3063 to the @code{root} account, you may want to resend it to | |
3064 @code{postmaster}. Ordnung muss sein! | |
3065 | |
3066 @item S O m | |
3067 @kindex S O m (Summary) | |
3068 @findex gnus-uu-digest-mail-forward | |
3069 Digest the current series and forward the result using mail | |
3070 (@code{gnus-uu-digest-mail-forward}). This command uses the | |
3071 process/prefix convention (@pxref{Process/Prefix}). | |
3072 | |
3073 @item S O p | |
3074 @kindex S O p (Summary) | |
3075 @findex gnus-uu-digest-post-forward | |
3076 Digest the current series and forward the result to a newsgroup | |
3077 (@code{gnus-uu-digest-mail-forward}). | |
3078 @end table | |
3079 | |
3080 | |
3081 @node Summary Post Commands | |
3082 @subsection Summary Post Commands | |
3083 @cindex post | |
3084 @cindex composing news | |
3085 | |
3086 Commands for posting an article: | |
3087 | |
3088 @table @kbd | |
3089 @item S p | |
3090 @itemx a | |
3091 @kindex a (Summary) | |
3092 @kindex S p (Summary) | |
3093 @findex gnus-summary-post-news | |
3094 Post an article to the current group | |
3095 (@code{gnus-summary-post-news}). | |
3096 | |
3097 @item S f | |
3098 @itemx f | |
3099 @kindex f (Summary) | |
3100 @kindex S f (Summary) | |
3101 @findex gnus-summary-followup | |
3102 Post a followup to the current article (@code{gnus-summary-followup}). | |
3103 | |
3104 @item S F | |
3105 @itemx F | |
3106 @kindex S F (Summary) | |
3107 @kindex F (Summary) | |
3108 @findex gnus-summary-followup-with-original | |
3109 Post a followup to the current article and include the original message | |
3110 (@code{gnus-summary-followup-with-original}). This command uses the | |
3111 process/prefix convention. | |
3112 | |
3113 @item S u | |
3114 @kindex S u (Summary) | |
3115 @findex gnus-uu-post-news | |
3116 Uuencode a file, split it into parts, and post it as a series | |
3117 (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}). | |
3118 @end table | |
3119 | |
3120 | |
3121 @node Canceling and Superseding | |
3122 @section Canceling Articles | |
3123 @cindex canceling articles | |
3124 @cindex superseding articles | |
3125 | |
3126 Have you ever written something, and then decided that you really, | |
3127 really, really wish you hadn't posted that? | |
3128 | |
3129 Well, you can't cancel mail, but you can cancel posts. | |
3130 | |
3131 @findex gnus-summary-cancel-article | |
3132 @kindex C (Summary) | |
3133 Find the article you wish to cancel (you can only cancel your own | |
3134 articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S | |
3135 c} (@code{gnus-summary-cancel-article}). Your article will be | |
3136 canceled---machines all over the world will be deleting your article. | |
3137 | |
3138 Be aware, however, that not all sites honor cancels, so your article may | |
3139 live on here and there, while most sites will delete the article in | |
3140 question. | |
3141 | |
3142 If you discover that you have made some mistakes and want to do some | |
3143 corrections, you can post a @dfn{superseding} article that will replace | |
3144 your original article. | |
3145 | |
3146 @findex gnus-summary-supersede-article | |
3147 @kindex S (Summary) | |
3148 Go to the original article and press @kbd{S s} | |
3149 (@code{gnus-summary-supersede-article}). You will be put in a buffer | |
3150 where you can edit the article all you want before sending it off the | |
3151 usual way. | |
3152 | |
3153 The same goes for superseding as for canceling, only more so: Some | |
3154 sites do not honor superseding. On those sites, it will appear that you | |
3155 have posted almost the same article twice. | |
3156 | |
3157 If you have just posted the article, and change your mind right away, | |
3158 there is a trick you can use to cancel/supersede the article without | |
3159 waiting for the article to appear on your site first. You simply return | |
3160 to the post buffer (which is called @code{*post-buf*}). There you will | |
3161 find the article you just posted, with all the headers intact. Change | |
3162 the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes} | |
3163 header by substituting one of those words for @code{Message-ID}. Then | |
3164 just press @kbd{C-c C-c} to send the article as you would do normally. | |
3165 The previous article will be canceled/superseded. | |
3166 | |
3167 Just remember, kids: There is no 'c' in 'supersede'. | |
3168 | |
3169 | |
3170 @node Marking Articles | |
3171 @section Marking Articles | |
3172 @cindex article marking | |
3173 @cindex article ticking | |
3174 @cindex marks | |
3175 | |
3176 There are several marks you can set on an article. | |
3177 | |
3178 You have marks that decide the @dfn{readedness} (whoo, neato-keano | |
3179 neologism ohoy!) of the article. Alphabetic marks generally mean | |
3180 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}. | |
3181 | |
3182 In addition, you also have marks that do not affect readedness. | |
3183 | |
3184 @menu | |
3185 * Unread Articles:: Marks for unread articles. | |
3186 * Read Articles:: Marks for read articles. | |
3187 * Other Marks:: Marks that do not affect readedness. | |
3188 @end menu | |
3189 | |
3190 @ifinfo | |
3191 There's a plethora of commands for manipulating these marks: | |
3192 @end ifinfo | |
3193 | |
3194 @menu | |
3195 * Setting Marks:: How to set and remove marks. | |
3196 * Setting Process Marks:: How to mark articles for later processing. | |
3197 @end menu | |
3198 | |
3199 | |
3200 @node Unread Articles | |
3201 @subsection Unread Articles | |
3202 | |
3203 The following marks mark articles as unread, in one form or other. | |
3204 | |
3205 @vindex gnus-dormant-mark | |
3206 @vindex gnus-ticked-mark | |
3207 @table @samp | |
3208 @item ! | |
3209 @dfn{Ticked articles} are articles that will remain visible always. If | |
3210 you see an article that you find interesting, or you want to put off | |
3211 reading it, or replying to it, until sometime later, you'd typically | |
3212 tick it. However, articles can be expired, so if you want to keep an | |
3213 article forever, you'll have to save it. Ticked articles have a | |
3214 @samp{!} (@code{gnus-ticked-mark}) in the first column. | |
3215 | |
3216 @item ? | |
3217 @vindex gnus-dormant-mark | |
3218 A @dfn{dormant} article is marked with a @samp{?} | |
3219 (@code{gnus-dormant-mark}), and will only appear in the summary buffer | |
3220 if there are followups to it. | |
3221 | |
3222 @item SPACE | |
3223 @vindex gnus-unread-mark | |
3224 An @dfn{unread} article is marked with a @samp{SPACE} | |
3225 (@code{gnus-unread-mark}). These are articles that haven't been read at | |
3226 all yet. | |
3227 @end table | |
3228 | |
3229 | |
3230 @node Read Articles | |
3231 @subsection Read Articles | |
3232 @cindex expirable mark | |
3233 | |
3234 All the following marks mark articles as read. | |
3235 | |
3236 @table @samp | |
3237 | |
3238 @item r | |
3239 @vindex gnus-del-mark | |
3240 Articles that are marked as read. They have a @samp{r} | |
3241 (@code{gnus-del-mark}) in the first column. These are articles that the | |
3242 user has marked as read more or less manually. | |
3243 | |
3244 @item R | |
3245 @vindex gnus-read-mark | |
3246 Articles that are actually read are marked with @samp{R} | |
3247 (@code{gnus-read-mark}). | |
3248 | |
3249 @item O | |
3250 @vindex gnus-ancient-mark | |
3251 Articles that were marked as read in previous sessions are now | |
3252 @dfn{old} and marked with @samp{O} (@code{gnus-ancient-mark}). | |
3253 | |
3254 @item K | |
3255 @vindex gnus-killed-mark | |
3256 Marked as killed (@code{gnus-killed-mark}). | |
3257 | |
3258 @item X | |
3259 @vindex gnus-kill-file-mark | |
3260 Marked as killed by kill files (@code{gnus-kill-file-mark}). | |
3261 | |
3262 @item Y | |
3263 @vindex gnus-low-score-mark | |
3264 Marked as read by having a too low score (@code{gnus-low-score-mark}). | |
3265 | |
3266 @item C | |
3267 @vindex gnus-catchup-mark | |
3268 Marked as read by a catchup (@code{gnus-catchup-mark}). | |
3269 | |
3270 @item G | |
3271 @vindex gnus-canceled-mark | |
3272 Canceled article (@code{gnus-canceled-mark}) | |
3273 | |
3274 @item F | |
3275 @vindex gnus-souped-mark | |
3276 @sc{SOUP}ed article (@code{gnus-souped-mark}). | |
3277 | |
3278 @item Q | |
3279 @vindex gnus-sparse-mark | |
3280 Sparsely reffed article (@code{gnus-sparse-mark}). | |
3281 @end table | |
3282 | |
3283 All these marks just mean that the article is marked as read, really. | |
3284 They are interpreted differently by the adaptive scoring scheme, | |
3285 however. | |
3286 | |
3287 One more special mark, though: | |
3288 | |
3289 @table @samp | |
3290 @item E | |
3291 @vindex gnus-expirable-mark | |
3292 You can also mark articles as @dfn{expirable} (or have them marked as | |
3293 such automatically). That doesn't make much sense in normal groups, | |
3294 because a user does not control the expiring of news articles, but in | |
3295 mail groups, for instance, articles that are marked as @dfn{expirable} | |
3296 can be deleted by Gnus at any time. Expirable articles are marked with | |
3297 @samp{E} (@code{gnus-expirable-mark}). | |
3298 @end table | |
3299 | |
3300 | |
3301 @node Other Marks | |
3302 @subsection Other Marks | |
3303 @cindex process mark | |
3304 @cindex bookmarks | |
3305 | |
3306 There are some marks that have nothing to do with whether the article is | |
3307 read or not. | |
3308 | |
3309 @itemize @bullet | |
3310 | |
3311 @item | |
3312 You can set a bookmark in the current article. Say you are reading a | |
3313 long thesis on cats' urinary tracts, and have to go home for dinner | |
3314 before you've finished reading the thesis. You can then set a bookmark | |
3315 in the article, and Gnus will jump to this bookmark the next time it | |
3316 encounters the article. | |
3317 | |
3318 @item | |
3319 @vindex gnus-replied-mark | |
3320 All articles that you have replied to or made a followup to (i.e., have | |
3321 answered) will be marked with an @samp{A} in the second column | |
3322 (@code{gnus-replied-mark}). | |
3323 | |
3324 @item | |
3325 @vindex gnus-cached-mark | |
3326 Articles that are stored in the article cache will be marked with an | |
3327 @samp{*} in the second column (@code{gnus-cached-mark}). | |
3328 | |
3329 @item | |
3330 @vindex gnus-saved-mark | |
3331 Articles that are ``saved'' (in some manner or other; not necessarily | |
3332 religiously) are marked with an @samp{S} in the second column | |
3333 (@code{gnus-saved-mark}. | |
3334 | |
3335 @item | |
3336 @vindex gnus-not-empty-thread-mark | |
3337 @vindex gnus-empty-thread-mark | |
3338 It the @samp{%e} spec is used, the presence of threads or not will be | |
3339 marked with @code{gnus-not-empty-thread-mark} and | |
3340 @code{gnus-empty-thread-mark} in the third column, respectively. | |
3341 | |
3342 @item | |
3343 @vindex gnus-process-mark | |
3344 Finally we have the @dfn{process mark} (@code{gnus-process-mark}. A | |
3345 variety of commands react to the presence of the process mark. For | |
3346 instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view | |
3347 all articles that have been marked with the process mark. Articles | |
3348 marked with the process mark have a @samp{#} in the second column. | |
3349 | |
3350 @end itemize | |
3351 | |
3352 You might have noticed that most of these ``non-readedness'' marks | |
3353 appear in the second column by default. So if you have a cached, saved, | |
3354 replied article that you have process-marked, what will that look like? | |
3355 | |
3356 Nothing much. The precedence rules go as follows: process -> cache -> | |
3357 replied -> saved. So if the article is in the cache and is replied, | |
3358 you'll only see the cache mark and not the replied mark. | |
3359 | |
3360 | |
3361 @node Setting Marks | |
3362 @subsection Setting Marks | |
3363 @cindex setting marks | |
3364 | |
3365 All the marking commands understand the numeric prefix. | |
3366 | |
3367 @table @kbd | |
3368 @item M t | |
3369 @itemx ! | |
3370 @kindex ! (Summary) | |
3371 @kindex M t (Summary) | |
3372 @findex gnus-summary-tick-article-forward | |
3373 Tick the current article (@code{gnus-summary-tick-article-forward}). | |
3374 | |
3375 @item M ? | |
3376 @itemx ? | |
3377 @kindex ? (Summary) | |
3378 @kindex M ? (Summary) | |
3379 @findex gnus-summary-mark-as-dormant | |
3380 Mark the current article as dormant | |
3381 (@code{gnus-summary-mark-as-dormant}). | |
3382 | |
3383 @item M d | |
3384 @itemx d | |
3385 @kindex M d (Summary) | |
3386 @kindex d (Summary) | |
3387 @findex gnus-summary-mark-as-read-forward | |
3388 Mark the current article as read | |
3389 (@code{gnus-summary-mark-as-read-forward}). | |
3390 | |
3391 @item M k | |
3392 @itemx k | |
3393 @kindex k (Summary) | |
3394 @kindex M k (Summary) | |
3395 @findex gnus-summary-kill-same-subject-and-select | |
3396 Mark all articles that have the same subject as the current one as read, | |
3397 and then select the next unread article | |
3398 (@code{gnus-summary-kill-same-subject-and-select}). | |
3399 | |
3400 @item M K | |
3401 @itemx C-k | |
3402 @kindex M K (Summary) | |
3403 @kindex C-k (Summary) | |
3404 @findex gnus-summary-kill-same-subject | |
3405 Mark all articles that have the same subject as the current one as read | |
3406 (@code{gnus-summary-kill-same-subject}). | |
3407 | |
3408 @item M C | |
3409 @kindex M C (Summary) | |
3410 @findex gnus-summary-catchup | |
3411 Mark all unread articles in the group as read | |
3412 (@code{gnus-summary-catchup}). | |
3413 | |
3414 @item M C-c | |
3415 @kindex M C-c (Summary) | |
3416 @findex gnus-summary-catchup-all | |
3417 Mark all articles in the group as read---even the ticked and dormant | |
3418 articles (@code{gnus-summary-catchup-all}). | |
3419 | |
3420 @item M H | |
3421 @kindex M H (Summary) | |
3422 @findex gnus-summary-catchup-to-here | |
3423 Catchup the current group to point | |
3424 (@code{gnus-summary-catchup-to-here}). | |
3425 | |
3426 @item C-w | |
3427 @kindex C-w (Summary) | |
3428 @findex gnus-summary-mark-region-as-read | |
3429 Mark all articles between point and mark as read | |
3430 (@code{gnus-summary-mark-region-as-read}). | |
3431 | |
3432 @item M V k | |
3433 @kindex M V k (Summary) | |
3434 @findex gnus-summary-kill-below | |
3435 Kill all articles with scores below the default score (or below the | |
3436 numeric prefix) (@code{gnus-summary-kill-below}). | |
3437 | |
3438 @item M c | |
3439 @itemx M-u | |
3440 @kindex M c (Summary) | |
3441 @kindex M-u (Summary) | |
3442 @findex gnus-summary-clear-mark-forward | |
3443 Clear all readedness-marks from the current article | |
3444 (@code{gnus-summary-clear-mark-forward}). | |
3445 | |
3446 @item M e | |
3447 @itemx E | |
3448 @kindex M e (Summary) | |
3449 @kindex E (Summary) | |
3450 @findex gnus-summary-mark-as-expirable | |
3451 Mark the current article as expirable | |
3452 (@code{gnus-summary-mark-as-expirable}). | |
3453 | |
3454 @item M b | |
3455 @kindex M b (Summary) | |
3456 @findex gnus-summary-set-bookmark | |
3457 Set a bookmark in the current article | |
3458 (@code{gnus-summary-set-bookmark}). | |
3459 | |
3460 @item M B | |
3461 @kindex M B (Summary) | |
3462 @findex gnus-summary-remove-bookmark | |
3463 Remove the bookmark from the current article | |
3464 (@code{gnus-summary-remove-bookmark}). | |
3465 | |
3466 @item M V c | |
3467 @kindex M V c (Summary) | |
3468 @findex gnus-summary-clear-above | |
3469 Clear all marks from articles with scores over the default score (or | |
3470 over the numeric prefix) (@code{gnus-summary-clear-above}). | |
3471 | |
3472 @item M V u | |
3473 @kindex M V u (Summary) | |
3474 @findex gnus-summary-tick-above | |
3475 Tick all articles with scores over the default score (or over the | |
3476 numeric prefix) (@code{gnus-summary-tick-above}). | |
3477 | |
3478 @item M V m | |
3479 @kindex M V m (Summary) | |
3480 @findex gnus-summary-mark-above | |
3481 Prompt for a mark, and mark all articles with scores over the default | |
3482 score (or over the numeric prefix) with this mark | |
3483 (@code{gnus-summary-clear-above}). | |
3484 @end table | |
3485 | |
3486 @vindex gnus-summary-goto-unread | |
3487 The @code{gnus-summary-goto-unread} variable controls what action should | |
3488 be taken after setting a mark. If non-@code{nil}, point will move to | |
3489 the next/previous unread article. If @code{nil}, point will just move | |
3490 one line up or down. As a special case, if this variable is | |
3491 @code{never}, all the marking commands as well as other commands (like | |
3492 @kbd{SPACE}) will move to the next article, whether it is unread or not. | |
3493 The default is @code{t}. | |
3494 | |
3495 | |
3496 @node Setting Process Marks | |
3497 @subsection Setting Process Marks | |
3498 @cindex setting process marks | |
3499 | |
3500 @table @kbd | |
3501 | |
3502 @item M P p | |
3503 @itemx # | |
3504 @kindex # (Summary) | |
3505 @kindex M P p (Summary) | |
3506 @findex gnus-summary-mark-as-processable | |
3507 Mark the current article with the process mark | |
3508 (@code{gnus-summary-mark-as-processable}). | |
3509 @findex gnus-summary-unmark-as-processable | |
3510 | |
3511 @item M P u | |
3512 @itemx M-# | |
3513 @kindex M P u (Summary) | |
3514 @kindex M-# (Summary) | |
3515 Remove the process mark, if any, from the current article | |
3516 (@code{gnus-summary-unmark-as-processable}). | |
3517 | |
3518 @item M P U | |
3519 @kindex M P U (Summary) | |
3520 @findex gnus-summary-unmark-all-processable | |
3521 Remove the process mark from all articles | |
3522 (@code{gnus-summary-unmark-all-processable}). | |
3523 | |
3524 @item M P R | |
3525 @kindex M P R (Summary) | |
3526 @findex gnus-uu-mark-by-regexp | |
3527 Mark articles by a regular expression (@code{gnus-uu-mark-by-regexp}). | |
3528 | |
3529 @item M P r | |
3530 @kindex M P r (Summary) | |
3531 @findex gnus-uu-mark-region | |
3532 Mark articles in region (@code{gnus-uu-mark-region}). | |
3533 | |
3534 @item M P t | |
3535 @kindex M P t (Summary) | |
3536 @findex gnus-uu-mark-thread | |
3537 Mark all articles in the current (sub)thread | |
3538 (@code{gnus-uu-mark-thread}). | |
3539 | |
3540 @item M P T | |
3541 @kindex M P T (Summary) | |
3542 @findex gnus-uu-unmark-thread | |
3543 Unmark all articles in the current (sub)thread | |
3544 (@code{gnus-uu-unmark-thread}). | |
3545 | |
3546 @item M P v | |
3547 @kindex M P v (Summary) | |
3548 @findex gnus-uu-mark-over | |
3549 Mark all articles that have a score above the prefix argument | |
3550 (@code{gnus-uu-mark-over}). | |
3551 | |
3552 @item M P s | |
3553 @kindex M P s (Summary) | |
3554 @findex gnus-uu-mark-series | |
3555 Mark all articles in the current series (@code{gnus-uu-mark-series}). | |
3556 | |
3557 @item M P S | |
3558 @kindex M P S (Summary) | |
3559 @findex gnus-uu-mark-sparse | |
3560 Mark all series that have already had some articles marked | |
3561 (@code{gnus-uu-mark-sparse}). | |
3562 | |
3563 @item M P a | |
3564 @kindex M P a (Summary) | |
3565 @findex gnus-uu-mark-all | |
3566 Mark all articles in series order (@code{gnus-uu-mark-series}). | |
3567 | |
3568 @item M P b | |
3569 @kindex M P b (Summary) | |
3570 @findex gnus-uu-mark-buffer | |
3571 Mark all articles in the buffer in the order they appear | |
3572 (@code{gnus-uu-mark-buffer}). | |
3573 @end table | |
3574 | |
3575 | |
3576 @node Limiting | |
3577 @section Limiting | |
3578 @cindex limiting | |
3579 | |
3580 It can be convenient to limit the summary buffer to just show some | |
3581 subset of the articles currently in the group. The effect most limit | |
3582 commands have is to remove a few (or many) articles from the summary | |
3583 buffer. | |
3584 | |
3585 @table @kbd | |
3586 | |
3587 @item / / | |
3588 @itemx / s | |
3589 @kindex / / (Summary) | |
3590 @findex gnus-summary-limit-to-subject | |
3591 Limit the summary buffer to articles that match some subject | |
3592 (@code{gnus-summary-limit-to-subject}). | |
3593 | |
3594 @item / a | |
3595 @kindex / a (Summary) | |
3596 @findex gnus-summary-limit-to-author | |
3597 Limit the summary buffer to articles that match some author | |
3598 (@code{gnus-summary-limit-to-author}). | |
3599 | |
3600 @item / u | |
3601 @itemx x | |
3602 @kindex / u (Summary) | |
3603 @kindex x (Summary) | |
3604 @findex gnus-summary-limit-to-unread | |
3605 Limit the summary buffer to articles that are not marked as read | |
3606 (@code{gnus-summary-limit-to-unread}). If given a prefix, limit the | |
3607 buffer to articles that are strictly unread. This means that ticked and | |
3608 dormant articles will also be excluded. | |
3609 | |
3610 @item / m | |
3611 @kindex / m (Summary) | |
3612 @findex gnus-summary-limit-to-marks | |
3613 Ask for a mark and then limit to all articles that have not been marked | |
3614 with that mark (@code{gnus-summary-limit-to-marks}). | |
3615 | |
3616 @item / n | |
3617 @kindex / n (Summary) | |
3618 @findex gnus-summary-limit-to-articles | |
3619 Limit the summary buffer to the current article | |
3620 (@code{gnus-summary-limit-to-articles}). Uses the process/prefix | |
3621 convention (@pxref{Process/Prefix}). | |
3622 | |
3623 @item / w | |
3624 @kindex / w (Summary) | |
3625 @findex gnus-summary-pop-limit | |
3626 Pop the previous limit off the stack and restore it | |
3627 (@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off | |
3628 the stack. | |
3629 | |
3630 @item / v | |
3631 @kindex / v (Summary) | |
3632 @findex gnus-summary-limit-to-score | |
3633 Limit the summary buffer to articles that have a score at or above some | |
3634 score (@code{gnus-summary-limit-to-score}). | |
3635 | |
3636 @item / E | |
3637 @itemx M S | |
3638 @kindex M S (Summary) | |
3639 @kindex / E (Summary) | |
3640 @findex gnus-summary-limit-include-expunged | |
3641 Display all expunged articles | |
3642 (@code{gnus-summary-limit-include-expunged}). | |
3643 | |
3644 @item / D | |
3645 @kindex / D (Summary) | |
3646 @findex gnus-summary-limit-include-dormant | |
3647 Display all dormant articles (@code{gnus-summary-limit-include-dormant}). | |
3648 | |
3649 @item / d | |
3650 @kindex / d (Summary) | |
3651 @findex gnus-summary-limit-exclude-dormant | |
3652 Hide all dormant articles (@code{gnus-summary-limit-exclude-dormant}). | |
3653 | |
3654 @item / c | |
3655 @kindex / c (Summary) | |
3656 @findex gnus-summary-limit-exclude-childless-dormant | |
3657 Hide all dormant articles that have no children | |
3658 (@code{gnus-summary-limit-exclude-childless-dormant}). | |
3659 | |
3660 @item / C | |
3661 @kindex / C (Summary) | |
3662 @findex gnus-summary-limit-mark-excluded-as-read | |
3663 Mark all excluded unread articles as read | |
3664 (@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix, | |
3665 also mark excluded ticked and dormant articles as read. | |
3666 | |
3667 @end table | |
3668 | |
3669 | |
3670 @node Threading | |
3671 @section Threading | |
3672 @cindex threading | |
3673 @cindex article threading | |
3674 | |
3675 Gnus threads articles by default. @dfn{To thread} is to put replies to | |
3676 articles directly after the articles they reply to---in a hierarchical | |
3677 fashion. | |
3678 | |
3679 @menu | |
3680 * Customizing Threading:: Variables you can change to affect the threading. | |
3681 * Thread Commands:: Thread based commands in the summary buffer. | |
3682 @end menu | |
3683 | |
3684 | |
3685 @node Customizing Threading | |
3686 @subsection Customizing Threading | |
3687 @cindex customizing threading | |
3688 @cindex < | |
3689 @cindex > | |
3690 | |
3691 @table @code | |
3692 | |
3693 @item gnus-show-threads | |
3694 @vindex gnus-show-threads | |
3695 If this variable is @code{nil}, no threading will be done, and all of | |
3696 the rest of the variables here will have no effect. Turning threading | |
3697 off will speed group selection up a bit, but it is sure to make reading | |
3698 slower and more awkward. | |
3699 | |
3700 @item gnus-fetch-old-headers | |
3701 @vindex gnus-fetch-old-headers | |
3702 If non-@code{nil}, Gnus will attempt to build old threads by fetching | |
3703 more old headers---headers to articles that are marked as read. If you | |
3704 would like to display as few summary lines as possible, but still | |
3705 connect as many loose threads as possible, you should set this variable | |
3706 to @code{some} or a number. If you set it to a number, no more than | |
3707 that number of extra old headers will be fetched. In either case, | |
3708 fetching old headers only works if the backend you are using carries | |
3709 overview files---this would normally be @code{nntp}, @code{nnspool} and | |
3710 @code{nnml}. Also remember that if the root of the thread has been | |
3711 expired by the server, there's not much Gnus can do about that. | |
3712 | |
3713 @item gnus-build-sparse-threads | |
3714 @vindex gnus-build-sparse-threads | |
3715 Fetching old headers can be slow. A low-rent similar effect can be | |
3716 gotten by setting this variable to @code{some}. Gnus will then look at | |
3717 the complete @code{References} headers of all articles and try to string | |
3718 articles that belong in the same thread together. This will leave | |
3719 @dfn{gaps} in the threading display where Gnus guesses that an article | |
3720 is missing from the thread. (These gaps appear like normal summary | |
3721 lines. If you select a gap, Gnus will try to fetch the article in | |
3722 question.) If this variable is @code{t}, Gnus will display all these | |
3723 ``gaps'' without regard for whether they are useful for completing the | |
3724 thread or not. Finally, if this variable is @code{more}, Gnus won't cut | |
3725 off sparse leaf nodes that don't lead anywhere. This variable is | |
3726 @code{nil} by default. | |
3727 | |
3728 @item gnus-summary-gather-subject-limit | |
3729 @vindex gnus-summary-gather-subject-limit | |
3730 Loose threads are gathered by comparing subjects of articles. If this | |
3731 variable is @code{nil}, Gnus requires an exact match between the | |
3732 subjects of the loose threads before gathering them into one big | |
3733 super-thread. This might be too strict a requirement, what with the | |
3734 presence of stupid newsreaders that chop off long subjects lines. If | |
3735 you think so, set this variable to, say, 20 to require that only the | |
3736 first 20 characters of the subjects have to match. If you set this | |
3737 variable to a really low number, you'll find that Gnus will gather | |
3738 everything in sight into one thread, which isn't very helpful. | |
3739 | |
3740 @cindex fuzzy article gathering | |
3741 If you set this variable to the special value @code{fuzzy}, Gnus will | |
3742 use a fuzzy string comparison algorithm on the subjects. | |
3743 | |
3744 @item gnus-simplify-subject-fuzzy-regexp | |
3745 @vindex gnus-simplify-subject-fuzzy-regexp | |
3746 This can either be a regular expression or list of regular expressions | |
3747 that match strings that will be removed from subjects if fuzzy subject | |
3748 simplification is used. | |
3749 | |
3750 @item gnus-simplify-ignored-prefixes | |
3751 @vindex gnus-simplify-ignored-prefixes | |
3752 If you set @code{gnus-summary-gather-subject-limit} to something as low | |
3753 as 10, you might consider setting this variable to something sensible: | |
3754 | |
3755 @c Written by Michael Ernst <mernst@cs.rice.edu> | |
3756 @lisp | |
3757 (setq gnus-simplify-ignored-prefixes | |
3758 (concat | |
3759 "\\`\\[?\\(" | |
3760 (mapconcat 'identity | |
3761 '("looking" | |
3762 "wanted" "followup" "summary\\( of\\)?" | |
3763 "help" "query" "problem" "question" | |
3764 "answer" "reference" "announce" | |
3765 "How can I" "How to" "Comparison of" | |
3766 ;; ... | |
3767 ) | |
3768 "\\|") | |
3769 "\\)\\s *\\(" | |
3770 (mapconcat 'identity | |
3771 '("for" "for reference" "with" "about") | |
3772 "\\|") | |
3773 "\\)?\\]?:?[ \t]*")) | |
3774 @end lisp | |
3775 | |
3776 All words that match this regexp will be removed before comparing two | |
3777 subjects. | |
3778 | |
3779 @item gnus-summary-gather-exclude-subject | |
3780 @vindex gnus-summary-gather-exclude-subject | |
3781 Since loose thread gathering is done on subjects only, that might lead | |
3782 to many false hits, especially with certain common subjects like | |
3783 @samp{} and @samp{(none)}. To make the situation slightly better, | |
3784 you can use the regexp @code{gnus-summary-gather-exclude-subject} to say | |
3785 what subjects should be excluded from the gathering process. The | |
3786 default is @samp{^ *$\\|^(none)$}. | |
3787 | |
3788 @item gnus-summary-thread-gathering-function | |
3789 @vindex gnus-summary-thread-gathering-function | |
3790 Gnus gathers threads by looking at @code{Subject} headers. This means | |
3791 that totally unrelated articles may end up in the same ``thread'', which | |
3792 is confusing. An alternate approach is to look at all the | |
3793 @code{Message-ID}s in all the @code{References} headers to find matches. | |
3794 This will ensure that no gathered threads ever includes unrelated | |
3795 articles, but it's also means that people who have posted with broken | |
3796 newsreaders won't be gathered properly. The choice is yours---plague or | |
3797 cholera: | |
3798 | |
3799 @table @code | |
3800 @item gnus-gather-threads-by-subject | |
3801 @findex gnus-gather-threads-by-subject | |
3802 This function is the default gathering function and looks at | |
3803 @code{Subject}s exclusively. | |
3804 | |
3805 @item gnus-gather-threads-by-references | |
3806 @findex gnus-gather-threads-by-references | |
3807 This function looks at @code{References} headers exclusively. | |
3808 @end table | |
3809 | |
3810 If you want to test gathering by @code{References}, you could say | |
3811 something like: | |
3812 | |
3813 @lisp | |
3814 (setq gnus-summary-thread-gathering-function | |
3815 'gnus-gather-threads-by-references) | |
3816 @end lisp | |
3817 | |
3818 @item gnus-summary-make-false-root | |
3819 @vindex gnus-summary-make-false-root | |
3820 If non-@code{nil}, Gnus will gather all loose subtrees into one big tree | |
3821 and create a dummy root at the top. (Wait a minute. Root at the top? | |
3822 Yup.) Loose subtrees occur when the real root has expired, or you've | |
3823 read or killed the root in a previous session. | |
3824 | |
3825 When there is no real root of a thread, Gnus will have to fudge | |
3826 something. This variable says what fudging method Gnus should use. | |
3827 There are four possible values: | |
3828 | |
3829 @cindex adopting articles | |
3830 | |
3831 @table @code | |
3832 | |
3833 @item adopt | |
3834 Gnus will make the first of the orphaned articles the parent. This | |
3835 parent will adopt all the other articles. The adopted articles will be | |
3836 marked as such by pointy brackets (@samp{<>}) instead of the standard | |
3837 square brackets (@samp{[]}). This is the default method. | |
3838 | |
3839 @item dummy | |
3840 @vindex gnus-summary-dummy-line-format | |
3841 Gnus will create a dummy summary line that will pretend to be the | |
3842 parent. This dummy line does not correspond to any real article, so | |
3843 selecting it will just select the first real article after the dummy | |
3844 article. @code{gnus-summary-dummy-line-format} is used to specify the | |
3845 format of the dummy roots. It accepts only one format spec: @samp{S}, | |
3846 which is the subject of the article. @xref{Formatting Variables}. | |
3847 | |
3848 @item empty | |
3849 Gnus won't actually make any article the parent, but simply leave the | |
3850 subject field of all orphans except the first empty. (Actually, it will | |
3851 use @code{gnus-summary-same-subject} as the subject (@pxref{Summary | |
3852 Buffer Format}).) | |
3853 | |
3854 @item none | |
3855 Don't make any article parent at all. Just gather the threads and | |
3856 display them after one another. | |
3857 | |
3858 @item nil | |
3859 Don't gather loose threads. | |
3860 @end table | |
3861 | |
3862 @item gnus-thread-hide-subtree | |
3863 @vindex gnus-thread-hide-subtree | |
3864 If non-@code{nil}, all threads will be hidden when the summary buffer is | |
3865 generated. | |
3866 | |
3867 @item gnus-thread-hide-killed | |
3868 @vindex gnus-thread-hide-killed | |
3869 if you kill a thread and this variable is non-@code{nil}, the subtree | |
3870 will be hidden. | |
3871 | |
3872 @item gnus-thread-ignore-subject | |
3873 @vindex gnus-thread-ignore-subject | |
3874 Sometimes somebody changes the subject in the middle of a thread. If | |
3875 this variable is non-@code{nil}, the subject change is ignored. If it | |
3876 is @code{nil}, which is the default, a change in the subject will result | |
3877 in a new thread. | |
3878 | |
3879 @item gnus-thread-indent-level | |
3880 @vindex gnus-thread-indent-level | |
3881 This is a number that says how much each sub-thread should be indented. | |
3882 The default is @code{4}. | |
3883 @end table | |
3884 | |
3885 | |
3886 @node Thread Commands | |
3887 @subsection Thread Commands | |
3888 @cindex thread commands | |
3889 | |
3890 @table @kbd | |
3891 | |
3892 @item T k | |
3893 @itemx M-C-k | |
3894 @kindex T k (Summary) | |
3895 @kindex M-C-k (Summary) | |
3896 @findex gnus-summary-kill-thread | |
3897 Mark all articles in the current sub-thread as read | |
3898 (@code{gnus-summary-kill-thread}). If the prefix argument is positive, | |
3899 remove all marks instead. If the prefix argument is negative, tick | |
3900 articles instead. | |
3901 | |
3902 @item T l | |
3903 @itemx M-C-l | |
3904 @kindex T l (Summary) | |
3905 @kindex M-C-l (Summary) | |
3906 @findex gnus-summary-lower-thread | |
3907 Lower the score of the current thread | |
3908 (@code{gnus-summary-lower-thread}). | |
3909 | |
3910 @item T i | |
3911 @kindex T i (Summary) | |
3912 @findex gnus-summary-raise-thread | |
3913 Increase the score of the current thread | |
3914 (@code{gnus-summary-raise-thread}). | |
3915 | |
3916 @item T # | |
3917 @kindex T # (Summary) | |
3918 @findex gnus-uu-mark-thread | |
3919 Set the process mark on the current thread | |
3920 (@code{gnus-uu-mark-thread}). | |
3921 | |
3922 @item T M-# | |
3923 @kindex T M-# (Summary) | |
3924 @findex gnus-uu-unmark-thread | |
3925 Remove the process mark from the current thread | |
3926 (@code{gnus-uu-unmark-thread}). | |
3927 | |
3928 @item T T | |
3929 @kindex T T (Summary) | |
3930 @findex gnus-summary-toggle-threads | |
3931 Toggle threading (@code{gnus-summary-toggle-threads}). | |
3932 | |
3933 @item T s | |
3934 @kindex T s (Summary) | |
3935 @findex gnus-summary-show-thread | |
3936 Expose the thread hidden under the current article, if any | |
3937 (@code{gnus-summary-show-thread}). | |
3938 | |
3939 @item T h | |
3940 @kindex T h (Summary) | |
3941 @findex gnus-summary-hide-thread | |
3942 Hide the current (sub)thread (@code{gnus-summary-hide-thread}). | |
3943 | |
3944 @item T S | |
3945 @kindex T S (Summary) | |
3946 @findex gnus-summary-show-all-threads | |
3947 Expose all hidden threads (@code{gnus-summary-show-all-threads}). | |
3948 | |
3949 @item T H | |
3950 @kindex T H (Summary) | |
3951 @findex gnus-summary-hide-all-threads | |
3952 Hide all threads (@code{gnus-summary-hide-all-threads}). | |
3953 | |
3954 @item T t | |
3955 @kindex T t (Summary) | |
3956 @findex gnus-summary-rethread-current | |
3957 Re-thread the thread the current article is part of | |
3958 (@code{gnus-summary-rethread-current}). This works even when the | |
3959 summary buffer is otherwise unthreaded. | |
3960 | |
3961 @item T ^ | |
3962 @kindex T ^ (Summary) | |
3963 @findex gnus-summary-reparent-thread | |
3964 Make the current article the child of the marked (or previous) article | |
3965 (@code{gnus-summary-reparent-thread}. | |
3966 | |
3967 @end table | |
3968 | |
3969 The following commands are thread movement commands. They all | |
3970 understand the numeric prefix. | |
3971 | |
3972 @table @kbd | |
3973 | |
3974 @item T n | |
3975 @kindex T n (Summary) | |
3976 @findex gnus-summary-next-thread | |
3977 Go to the next thread (@code{gnus-summary-next-thread}). | |
3978 | |
3979 @item T p | |
3980 @kindex T p (Summary) | |
3981 @findex gnus-summary-prev-thread | |
3982 Go to the previous thread (@code{gnus-summary-prev-thread}). | |
3983 | |
3984 @item T d | |
3985 @kindex T d (Summary) | |
3986 @findex gnus-summary-down-thread | |
3987 Descend the thread (@code{gnus-summary-down-thread}). | |
3988 | |
3989 @item T u | |
3990 @kindex T u (Summary) | |
3991 @findex gnus-summary-up-thread | |
3992 Ascend the thread (@code{gnus-summary-up-thread}). | |
3993 | |
3994 @item T o | |
3995 @kindex T o (Summary) | |
3996 @findex gnus-summary-top-thread | |
3997 Go to the top of the thread (@code{gnus-summary-top-thread}). | |
3998 @end table | |
3999 | |
4000 @vindex gnus-thread-operation-ignore-subject | |
4001 If you ignore subject while threading, you'll naturally end up with | |
4002 threads that have several different subjects in them. If you then issue | |
4003 a command like `T k' (@code{gnus-summary-kill-thread}) you might not | |
4004 wish to kill the entire thread, but just those parts of the thread that | |
4005 have the same subject as the current article. If you like this idea, | |
4006 you can fiddle with @code{gnus-thread-operation-ignore-subject}. If is | |
4007 is non-@code{nil} (which it is by default), subjects will be ignored | |
4008 when doing thread commands. If this variable is @code{nil}, articles in | |
4009 the same thread with different subjects will not be included in the | |
4010 operation in question. If this variable is @code{fuzzy}, only articles | |
4011 that have subjects that are fuzzily equal will be included. | |
4012 | |
4013 | |
4014 @node Sorting | |
4015 @section Sorting | |
4016 | |
4017 @findex gnus-thread-sort-by-total-score | |
4018 @findex gnus-thread-sort-by-date | |
4019 @findex gnus-thread-sort-by-score | |
4020 @findex gnus-thread-sort-by-subject | |
4021 @findex gnus-thread-sort-by-author | |
4022 @findex gnus-thread-sort-by-number | |
4023 @vindex gnus-thread-sort-functions | |
4024 If you are using a threaded summary display, you can sort the threads by | |
4025 setting @code{gnus-thread-sort-functions}, which is a list of functions. | |
4026 By default, sorting is done on article numbers. Ready-made sorting | |
4027 predicate functions include @code{gnus-thread-sort-by-number}, | |
4028 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject}, | |
4029 @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and | |
4030 @code{gnus-thread-sort-by-total-score}. | |
4031 | |
4032 Each function takes two threads and return non-@code{nil} if the first | |
4033 thread should be sorted before the other. Note that sorting really is | |
4034 normally done by looking only at the roots of each thread. If you use | |
4035 more than one function, the primary sort key should be the last function | |
4036 in the list. You should probably always include | |
4037 @code{gnus-thread-sort-by-number} in the list of sorting | |
4038 functions---preferably first. This will ensure that threads that are | |
4039 equal with respect to the other sort criteria will be displayed in | |
4040 ascending article order. | |
4041 | |
4042 If you would like to sort by score, then by subject, and finally by | |
4043 number, you could do something like: | |
4044 | |
4045 @lisp | |
4046 (setq gnus-thread-sort-functions | |
4047 '(gnus-thread-sort-by-number | |
4048 gnus-thread-sort-by-subject | |
4049 gnus-thread-sort-by-score)) | |
4050 @end lisp | |
4051 | |
4052 The threads that have highest score will be displayed first in the | |
4053 summary buffer. When threads have the same score, they will be sorted | |
4054 alphabetically. The threads that have the same score and the same | |
4055 subject will be sorted by number, which is (normally) the sequence in | |
4056 which the articles arrived. | |
4057 | |
4058 If you want to sort by score and then reverse arrival order, you could | |
4059 say something like: | |
4060 | |
4061 @lisp | |
4062 (setq gnus-thread-sort-functions | |
4063 '((lambda (t1 t2) | |
4064 (not (gnus-thread-sort-by-number t1 t2))) | |
4065 gnus-thread-sort-by-score)) | |
4066 @end lisp | |
4067 | |
4068 @vindex gnus-thread-score-function | |
4069 The function in the @code{gnus-thread-score-function} variable (default | |
4070 @code{+}) is used for calculating the total score of a thread. Useful | |
4071 functions might be @code{max}, @code{min}, or squared means, or whatever | |
4072 tickles your fancy. | |
4073 | |
4074 @findex gnus-article-sort-functions | |
4075 @findex gnus-article-sort-by-date | |
4076 @findex gnus-article-sort-by-score | |
4077 @findex gnus-article-sort-by-subject | |
4078 @findex gnus-article-sort-by-author | |
4079 @findex gnus-article-sort-by-number | |
4080 If you are using an unthreaded display for some strange reason or other, | |
4081 you have to fiddle with the @code{gnus-article-sort-functions} variable. | |
4082 It is very similar to the @code{gnus-thread-sort-functions}, except that | |
4083 is uses slightly different functions for article comparison. Available | |
4084 sorting predicate functions are @code{gnus-article-sort-by-number}, | |
4085 @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject}, | |
4086 @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}. | |
4087 | |
4088 If you want to sort an unthreaded summary display by subject, you could | |
4089 say something like: | |
4090 | |
4091 @lisp | |
4092 (setq gnus-article-sort-functions | |
4093 '(gnus-article-sort-by-number | |
4094 gnus-article-sort-by-subject)) | |
4095 @end lisp | |
4096 | |
4097 | |
4098 | |
4099 @node Asynchronous Fetching | |
4100 @section Asynchronous Article Fetching | |
4101 @cindex asynchronous article fetching | |
4102 | |
4103 If you read your news from an @sc{nntp} server that's far away, the | |
4104 network latencies may make reading articles a chore. You have to wait | |
4105 for a while after pressing @kbd{n} to go to the next article before the | |
4106 article appears. Why can't Gnus just go ahead and fetch the article | |
4107 while you are reading the previous one? Why not, indeed. | |
4108 | |
4109 First, some caveats. There are some pitfalls to using asynchronous | |
4110 article fetching, especially the way Gnus does it. | |
4111 | |
4112 Let's say you are reading article 1, which is short, and article 2 is | |
4113 quite long, and you are not interested in reading that. Gnus does not | |
4114 know this, so it goes ahead and fetches article 2. You decide to read | |
4115 article 3, but since Gnus is in the process of fetching article 2, the | |
4116 connection is blocked. | |
4117 | |
4118 To avoid these situations, Gnus will open two (count 'em two) | |
4119 connections to the server. Some people may think this isn't a very nice | |
4120 thing to do, but I don't see any real alternatives. Setting up that | |
4121 extra connection takes some time, so Gnus startup will be slower. | |
4122 | |
4123 Gnus will fetch more articles than you will read. This will mean that | |
4124 the link between your machine and the @sc{nntp} server will become more | |
4125 loaded than if you didn't use article pre-fetch. The server itself will | |
4126 also become more loaded---both with the extra article requests, and the | |
4127 extra connection. | |
4128 | |
4129 Ok, so now you know that you shouldn't really use this thing... unless | |
4130 you really want to. | |
4131 | |
4132 @vindex gnus-asynchronous | |
4133 Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should | |
4134 happen automatically. | |
4135 | |
4136 @vindex nntp-async-number | |
4137 You can control how many articles that are to be pre-fetched by setting | |
4138 @code{nntp-async-number}. This is five by default, which means that when | |
4139 you read an article in the group, @code{nntp} will pre-fetch the next | |
4140 five articles. If this variable is @code{t}, @code{nntp} will pre-fetch | |
4141 all the articles that it can without bound. If it is @code{nil}, no | |
4142 pre-fetching will be made. | |
4143 | |
4144 @vindex gnus-asynchronous-article-function | |
4145 You may wish to create some sort of scheme for choosing which articles | |
4146 that @code{nntp} should consider as candidates for pre-fetching. For | |
4147 instance, you may wish to pre-fetch all articles with high scores, and | |
4148 not pre-fetch low-scored articles. You can do that by setting the | |
4149 @code{gnus-asynchronous-article-function}, which will be called with an | |
4150 alist where the keys are the article numbers. Your function should | |
4151 return an alist where the articles you are not interested in have been | |
4152 removed. You could also do sorting on article score and the like. | |
4153 | |
4154 | |
4155 @node Article Caching | |
4156 @section Article Caching | |
4157 @cindex article caching | |
4158 @cindex caching | |
4159 | |
4160 If you have an @emph{extremely} slow @sc{nntp} connection, you may | |
4161 consider turning article caching on. Each article will then be stored | |
4162 locally under your home directory. As you may surmise, this could | |
4163 potentially use @emph{huge} amounts of disk space, as well as eat up all | |
4164 your inodes so fast it will make your head swim. In vodka. | |
4165 | |
4166 Used carefully, though, it could be just an easier way to save articles. | |
4167 | |
4168 @vindex gnus-use-long-file-name | |
4169 @vindex gnus-cache-directory | |
4170 @vindex gnus-use-cache | |
4171 To turn caching on, set @code{gnus-use-cache} to @code{t}. By default, | |
4172 all articles that are ticked or marked as dormant will then be copied | |
4173 over to your local cache (@code{gnus-cache-directory}). Whether this | |
4174 cache is flat or hierarchal is controlled by the | |
4175 @code{gnus-use-long-file-name} variable, as usual. | |
4176 | |
4177 When re-select a ticked or dormant article, it will be fetched from the | |
4178 cache instead of from the server. As articles in your cache will never | |
4179 expire, this might serve as a method of saving articles while still | |
4180 keeping them where they belong. Just mark all articles you want to save | |
4181 as dormant, and don't worry. | |
4182 | |
4183 When an article is marked as read, is it removed from the cache. | |
4184 | |
4185 @vindex gnus-cache-remove-articles | |
4186 @vindex gnus-cache-enter-articles | |
4187 The entering/removal of articles from the cache is controlled by the | |
4188 @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles} | |
4189 variables. Both are lists of symbols. The first is @code{(ticked | |
4190 dormant)} by default, meaning that ticked and dormant articles will be | |
4191 put in the cache. The latter is @code{(read)} by default, meaning that | |
4192 articles that are marked as read are removed from the cache. Possibly | |
4193 symbols in these two lists are @code{ticked}, @code{dormant}, | |
4194 @code{unread} and @code{read}. | |
4195 | |
4196 @findex gnus-jog-cache | |
4197 So where does the massive article-fetching and storing come into the | |
4198 picture? The @code{gnus-jog-cache} command will go through all | |
4199 subscribed newsgroups, request all unread articles, and store them in | |
4200 the cache. You should only ever, ever ever ever, use this command if 1) | |
4201 your connection to the @sc{nntp} server is really, really, really slow | |
4202 and 2) you have a really, really, really huge disk. Seriously. | |
4203 | |
4204 @vindex gnus-uncacheable-groups | |
4205 It is likely that you do not want caching on some groups. For instance, | |
4206 if your @code{nnml} mail is located under your home directory, it makes no | |
4207 sense to cache it somewhere else under your home directory. Unless you | |
4208 feel that it's neat to use twice as much space. To limit the caching, | |
4209 you could set the @code{gnus-uncacheable-groups} regexp to | |
4210 @samp{^nnml}, for instance. This variable is @code{nil} by | |
4211 default. | |
4212 | |
4213 @findex gnus-cache-generate-nov-databases | |
4214 @findex gnus-cache-generate-active | |
4215 @vindex gnus-cache-active-file | |
4216 The cache stores information on what articles it contains in its active | |
4217 file (@code{gnus-cache-active-file}). If this file (or any other parts | |
4218 of the cache) becomes all messed up for some reason or other, Gnus | |
4219 offers two functions that will try to set things right. @kbd{M-x | |
4220 gnus-cache-generate-nov-databases} will (re)build all the @sc{nov} | |
4221 files, and @kbd{gnus-cache-generate-active} will (re)generate the active | |
4222 file. | |
4223 | |
4224 | |
4225 @node Persistent Articles | |
4226 @section Persistent Articles | |
4227 @cindex persistent articles | |
4228 | |
4229 Closely related to article caching, we have @dfn{persistent articles}. | |
4230 In fact, it's just a different way of looking at caching, and much more | |
4231 useful in my opinion. | |
4232 | |
4233 Say you're reading a newsgroup, and you happen on to some valuable gem | |
4234 that you want to keep and treasure forever. You'd normally just save it | |
4235 (using one of the many saving commands) in some file. The problem with | |
4236 that is that it's just, well, yucky. Ideally you'd prefer just having | |
4237 the article remain in the group where you found it forever; untouched by | |
4238 the expiry going on at the news server. | |
4239 | |
4240 This is what a @dfn{persistent article} is---an article that just won't | |
4241 be deleted. It's implemented using the normal cache functions, but | |
4242 you use two explicit commands for managing persistent articles: | |
4243 | |
4244 @table @kbd | |
4245 | |
4246 @item * | |
4247 @kindex * (Summary) | |
4248 @findex gnus-cache-enter-article | |
4249 Make the current article persistent (@code{gnus-cache-enter-article}). | |
4250 | |
4251 @item M-* | |
4252 @kindex M-* (Summary) | |
4253 @findex gnus-cache-remove-article | |
4254 Remove the current article from the persistent articles | |
4255 (@code{gnus-cache-remove-article}). This will normally delete the | |
4256 article. | |
4257 @end table | |
4258 | |
4259 Both these commands understand the process/prefix convention. | |
4260 | |
4261 To avoid having all ticked articles (and stuff) entered into the cache, | |
4262 you should set @code{gnus-use-cache} to @code{passive} if you're just | |
4263 interested in persistent articles: | |
4264 | |
4265 @lisp | |
4266 (setq gnus-use-cache 'passive) | |
4267 @end lisp | |
4268 | |
4269 | |
4270 @node Article Backlog | |
4271 @section Article Backlog | |
4272 @cindex backlog | |
4273 @cindex article backlog | |
4274 | |
4275 If you have a slow connection, but the idea of using caching seems | |
4276 unappealing to you (and it is, really), you can help the situation some | |
4277 by switching on the @dfn{backlog}. This is where Gnus will buffer | |
4278 already read articles so that it doesn't have to re-fetch articles | |
4279 you've already read. This only helps if you are in the habit of | |
4280 re-selecting articles you've recently read, of course. If you never do | |
4281 that, turning the backlog on will slow Gnus down a little bit, and | |
4282 increase memory usage some. | |
4283 | |
4284 @vindex gnus-keep-backlog | |
4285 If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store | |
4286 at most @var{n} old articles in a buffer for later re-fetching. If this | |
4287 variable is non-@code{nil} and is not a number, Gnus will store | |
4288 @emph{all} read articles, which means that your Emacs will grow without | |
4289 bound before exploding and taking your machine down with you. I put | |
4290 that in there just to keep y'all on your toes. | |
4291 | |
4292 This variable is @code{nil} by default. | |
4293 | |
4294 | |
4295 @node Saving Articles | |
4296 @section Saving Articles | |
4297 @cindex saving articles | |
4298 | |
4299 Gnus can save articles in a number of ways. Below is the documentation | |
4300 for saving articles in a fairly straight-forward fashion (i.e., little | |
4301 processing of the article is done before it is saved). For a different | |
4302 approach (uudecoding, unsharing) you should use @code{gnus-uu} | |
4303 (@pxref{Decoding Articles}). | |
4304 | |
4305 @vindex gnus-save-all-headers | |
4306 If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete | |
4307 unwanted headers before saving the article. | |
4308 | |
4309 @vindex gnus-saved-headers | |
4310 If the preceding variable is @code{nil}, all headers that match the | |
4311 @code{gnus-saved-headers} regexp will be kept, while the rest will be | |
4312 deleted before saving. | |
4313 | |
4314 @table @kbd | |
4315 | |
4316 @item O o | |
4317 @itemx o | |
4318 @kindex O o (Summary) | |
4319 @kindex o (Summary) | |
4320 @findex gnus-summary-save-article | |
4321 Save the current article using the default article saver | |
4322 (@code{gnus-summary-save-article}). | |
4323 | |
4324 @item O m | |
4325 @kindex O m (Summary) | |
4326 @findex gnus-summary-save-article-mail | |
4327 Save the current article in mail format | |
4328 (@code{gnus-summary-save-article-mail}). | |
4329 | |
4330 @item O r | |
4331 @kindex O r (Summary) | |
4332 @findex gnus-summary-save-article-rmail | |
4333 Save the current article in rmail format | |
4334 (@code{gnus-summary-save-article-rmail}). | |
4335 | |
4336 @item O f | |
4337 @kindex O f (Summary) | |
4338 @findex gnus-summary-save-article-file | |
4339 Save the current article in plain file format | |
4340 (@code{gnus-summary-save-article-file}). | |
4341 | |
4342 @item O b | |
4343 @kindex O b (Summary) | |
4344 @findex gnus-summary-save-article-body-file | |
4345 Save the current article body in plain file format | |
4346 (@code{gnus-summary-save-article-body-file}). | |
4347 | |
4348 @item O h | |
4349 @kindex O h (Summary) | |
4350 @findex gnus-summary-save-article-folder | |
4351 Save the current article in mh folder format | |
4352 (@code{gnus-summary-save-article-folder}). | |
4353 | |
4354 @item O v | |
4355 @kindex O v (Summary) | |
4356 @findex gnus-summary-save-article-vm | |
4357 Save the current article in a VM folder | |
4358 (@code{gnus-summary-save-article-vm}). | |
4359 | |
4360 @item O p | |
4361 @kindex O p (Summary) | |
4362 @findex gnus-summary-pipe-output | |
4363 Save the current article in a pipe. Uhm, like, what I mean is---Pipe | |
4364 the current article to a process (@code{gnus-summary-pipe-output}). | |
4365 @end table | |
4366 | |
4367 @vindex gnus-prompt-before-saving | |
4368 All these commands use the process/prefix convention | |
4369 (@pxref{Process/Prefix}). If you save bunches of articles using these | |
4370 functions, you might get tired of being prompted for files to save each | |
4371 and every article in. The prompting action is controlled by | |
4372 the @code{gnus-prompt-before-saving} variable, which is @code{always} by | |
4373 default, giving you that excessive prompting action you know and | |
4374 loathe. If you set this variable to @code{t} instead, you'll be prompted | |
4375 just once for each series of articles you save. If you like to really | |
4376 have Gnus do all your thinking for you, you can even set this variable | |
4377 to @code{nil}, which means that you will never be prompted for files to | |
4378 save articles in. Gnus will simply save all the articles in the default | |
4379 files. | |
4380 | |
4381 | |
4382 @vindex gnus-default-article-saver | |
4383 You can customize the @code{gnus-default-article-saver} variable to make | |
4384 Gnus do what you want it to. You can use any of the four ready-made | |
4385 functions below, or you can create your own. | |
4386 | |
4387 @table @code | |
4388 | |
4389 @item gnus-summary-save-in-rmail | |
4390 @findex gnus-summary-save-in-rmail | |
4391 @vindex gnus-rmail-save-name | |
4392 @findex gnus-plain-save-name | |
4393 This is the default format, @dfn{babyl}. Uses the function in the | |
4394 @code{gnus-rmail-save-name} variable to get a file name to save the | |
4395 article in. The default is @code{gnus-plain-save-name}. | |
4396 | |
4397 @item gnus-summary-save-in-mail | |
4398 @findex gnus-summary-save-in-mail | |
4399 @vindex gnus-mail-save-name | |
4400 Save in a Unix mail (mbox) file. Uses the function in the | |
4401 @code{gnus-mail-save-name} variable to get a file name to save the | |
4402 article in. The default is @code{gnus-plain-save-name}. | |
4403 | |
4404 @item gnus-summary-save-in-file | |
4405 @findex gnus-summary-save-in-file | |
4406 @vindex gnus-file-save-name | |
4407 @findex gnus-numeric-save-name | |
4408 Append the article straight to an ordinary file. Uses the function in | |
4409 the @code{gnus-file-save-name} variable to get a file name to save the | |
4410 article in. The default is @code{gnus-numeric-save-name}. | |
4411 | |
4412 @item gnus-summary-save-body-in-file | |
4413 @findex gnus-summary-save-body-in-file | |
4414 Append the article body to an ordinary file. Uses the function in the | |
4415 @code{gnus-file-save-name} variable to get a file name to save the | |
4416 article in. The default is @code{gnus-numeric-save-name}. | |
4417 | |
4418 @item gnus-summary-save-in-folder | |
4419 @findex gnus-summary-save-in-folder | |
4420 @findex gnus-folder-save-name | |
4421 @findex gnus-Folder-save-name | |
4422 @vindex gnus-folder-save-name | |
4423 @cindex rcvstore | |
4424 @cindex MH folders | |
4425 Save the article to an MH folder using @code{rcvstore} from the MH | |
4426 library. Uses the function in the @code{gnus-folder-save-name} variable | |
4427 to get a file name to save the article in. The default is | |
4428 @code{gnus-folder-save-name}, but you can also use | |
4429 @code{gnus-Folder-save-name}. The former creates capitalized names, and | |
4430 the latter does not. | |
4431 | |
4432 @item gnus-summary-save-in-vm | |
4433 @findex gnus-summary-save-in-vm | |
4434 Save the article in a VM folder. You have to have the VM mail | |
4435 reader to use this setting. | |
4436 @end table | |
4437 | |
4438 @vindex gnus-article-save-directory | |
4439 All of these functions, except for the last one, will save the article | |
4440 in the @code{gnus-article-save-directory}, which is initialized from the | |
4441 @code{SAVEDIR} environment variable. This is @file{~/News/} by | |
4442 default. | |
4443 | |
4444 As you can see above, the functions use different functions to find a | |
4445 suitable name of a file to save the article in. Below is a list of | |
4446 available functions that generate names: | |
4447 | |
4448 @table @code | |
4449 | |
4450 @item gnus-Numeric-save-name | |
4451 @findex gnus-Numeric-save-name | |
4452 Generates file names that look like @file{~/News/Alt.andrea-dworkin/45}. | |
4453 | |
4454 @item gnus-numeric-save-name | |
4455 @findex gnus-numeric-save-name | |
4456 Generates file names that look like @file{~/News/alt.andrea-dworkin/45}. | |
4457 | |
4458 @item gnus-Plain-save-name | |
4459 @findex gnus-Plain-save-name | |
4460 Generates file names that look like @file{~/News/Alt.andrea-dworkin}. | |
4461 | |
4462 @item gnus-plain-save-name | |
4463 @findex gnus-plain-save-name | |
4464 Generates file names that look like @file{~/News/alt.andrea-dworkin}. | |
4465 @end table | |
4466 | |
4467 @vindex gnus-split-methods | |
4468 You can have Gnus suggest where to save articles by plonking a regexp into | |
4469 the @code{gnus-split-methods} alist. For instance, if you would like to | |
4470 save articles related to Gnus in the file @file{gnus-stuff}, and articles | |
4471 related to VM in @code{vm-stuff}, you could set this variable to something | |
4472 like: | |
4473 | |
4474 @lisp | |
4475 (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff") | |
4476 ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff") | |
4477 (my-choosing-function "../other-dir/my-stuff") | |
4478 ((equal gnus-newsgroup-name "mail.misc") "mail-stuff")) | |
4479 @end lisp | |
4480 | |
4481 We see that this is a list where each element is a list that has two | |
4482 elements---the @dfn{match} and the @dfn{file}. The match can either be | |
4483 a string (in which case it is used as a regexp to match on the article | |
4484 head); it can be a symbol (which will be called as a function with the | |
4485 group name as a parameter); or it can be a list (which will be | |
4486 @code{eval}ed). If any of these actions have a non-@code{nil} result, | |
4487 the @dfn{file} will be used as a default prompt. In addition, the | |
4488 result of the operation itself will be used if the function or form | |
4489 called returns a string or a list of strings. | |
4490 | |
4491 You basically end up with a list of file names that might be used when | |
4492 saving the current article. (All ``matches'' will be used.) You will | |
4493 then be prompted for what you really want to use as a name, with file | |
4494 name completion over the results from applying this variable. | |
4495 | |
4496 This variable is @code{((gnus-article-archive-name))} by default, which | |
4497 means that Gnus will look at the articles it saves for an | |
4498 @code{Archive-name} line and use that as a suggestion for the file | |
4499 name. | |
4500 | |
4501 @vindex gnus-use-long-file-name | |
4502 Finally, you have the @code{gnus-use-long-file-name} variable. If it is | |
4503 @code{nil}, all the preceding functions will replace all periods | |
4504 (@samp{.}) in the group names with slashes (@samp{/})---which means that | |
4505 the functions will generate hierarchies of directories instead of having | |
4506 all the files in the toplevel directory | |
4507 (@file{~/News/alt/andrea-dworkin} instead of | |
4508 @file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default | |
4509 on most systems. However, for historical reasons, this is @code{nil} on | |
4510 Xenix and usg-unix-v machines by default. | |
4511 | |
4512 This function also affects kill and score file names. If this variable | |
4513 is a list, and the list contains the element @code{not-score}, long file | |
4514 names will not be used for score files, if it contains the element | |
4515 @code{not-save}, long file names will not be used for saving, and if it | |
4516 contains the element @code{not-kill}, long file names will not be used | |
4517 for kill files. | |
4518 | |
4519 If you'd like to save articles in a hierarchy that looks something like | |
4520 a spool, you could | |
4521 | |
4522 @lisp | |
4523 (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy | |
4524 (setq gnus-default-article-save 'gnus-summary-save-in-file) ; no encoding | |
4525 @end lisp | |
4526 | |
4527 Then just save with @kbd{o}. You'd then read this hierarchy with | |
4528 ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and | |
4529 the toplevel directory as the argument (@file{~/News/}). Then just walk | |
4530 around to the groups/directories with @code{nneething}. | |
4531 | |
4532 | |
4533 @node Decoding Articles | |
4534 @section Decoding Articles | |
4535 @cindex decoding articles | |
4536 | |
4537 Sometime users post articles (or series of articles) that have been | |
4538 encoded in some way or other. Gnus can decode them for you. | |
4539 | |
4540 @menu | |
4541 * Uuencoded Articles:: Uudecode articles. | |
4542 * Shared Articles:: Unshar articles. | |
4543 * PostScript Files:: Split PostScript. | |
4544 * Decoding Variables:: Variables for a happy decoding. | |
4545 * Viewing Files:: You want to look at the result of the decoding? | |
4546 @end menu | |
4547 | |
4548 All these functions use the process/prefix convention | |
4549 (@pxref{Process/Prefix}) for finding out what articles to work on, with | |
4550 the extension that a ``single article'' means ``a single series''. Gnus | |
4551 can find out by itself what articles belong to a series, decode all the | |
4552 articles and unpack/view/save the resulting file(s). | |
4553 | |
4554 Gnus guesses what articles are in the series according to the following | |
4555 simplish rule: The subjects must be (nearly) identical, except for the | |
4556 last two numbers of the line. (Spaces are largely ignored, however.) | |
4557 | |
4558 For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus | |
4559 will find all the articles that match the regexp @samp{^cat.gif | |
4560 ([0-9]+/[0-9]+).*$}. | |
4561 | |
4562 Subjects that are nonstandard, like @samp{cat.gif (2/3) Part 6 of a | |
4563 series}, will not be properly recognized by any of the automatic viewing | |
4564 commands, and you have to mark the articles manually with @kbd{#}. | |
4565 | |
4566 | |
4567 @node Uuencoded Articles | |
4568 @subsection Uuencoded Articles | |
4569 @cindex uudecode | |
4570 @cindex uuencoded articles | |
4571 | |
4572 @table @kbd | |
4573 | |
4574 @item X u | |
4575 @kindex X u (Summary) | |
4576 @findex gnus-uu-decode-uu | |
4577 Uudecodes the current series (@code{gnus-uu-decode-uu}). | |
4578 | |
4579 @item X U | |
4580 @kindex X U (Summary) | |
4581 @findex gnus-uu-decode-uu-and-save | |
4582 Uudecodes and saves the current series | |
4583 (@code{gnus-uu-decode-uu-and-save}). | |
4584 | |
4585 @item X v u | |
4586 @kindex X v u (Summary) | |
4587 @findex gnus-uu-decode-uu-view | |
4588 Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}). | |
4589 | |
4590 @item X v U | |
4591 @kindex X v U (Summary) | |
4592 @findex gnus-uu-decode-uu-and-save-view | |
4593 Uudecodes, views and saves the current series | |
4594 (@code{gnus-uu-decode-uu-and-save-view}). | |
4595 @end table | |
4596 | |
4597 Remember that these all react to the presence of articles marked with | |
4598 the process mark. If, for instance, you'd like to decode and save an | |
4599 entire newsgroup, you'd typically do @kbd{M P a} | |
4600 (@code{gnus-uu-mark-all}) and then @kbd{X U} | |
4601 (@code{gnus-uu-decode-uu-and-save}). | |
4602 | |
4603 All this is very much different from how @code{gnus-uu} worked with | |
4604 @sc{gnus 4.1}, where you had explicit keystrokes for everything under | |
4605 the sun. This version of @code{gnus-uu} generally assumes that you mark | |
4606 articles in some way (@pxref{Setting Process Marks}) and then press | |
4607 @kbd{X u}. | |
4608 | |
4609 @vindex gnus-uu-notify-files | |
4610 Note: When trying to decode articles that have names matching | |
4611 @code{gnus-uu-notify-files}, which is hard-coded to | |
4612 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will | |
4613 automatically post an article on @samp{comp.unix.wizards} saying that | |
4614 you have just viewed the file in question. This feature can't be turned | |
4615 off. | |
4616 | |
4617 | |
4618 @node Shared Articles | |
4619 @subsection Shared Articles | |
4620 @cindex unshar | |
4621 @cindex shared articles | |
4622 | |
4623 @table @kbd | |
4624 | |
4625 @item X s | |
4626 @kindex X s (Summary) | |
4627 @findex gnus-uu-decode-unshar | |
4628 Unshars the current series (@code{gnus-uu-decode-unshar}). | |
4629 | |
4630 @item X S | |
4631 @kindex X S (Summary) | |
4632 @findex gnus-uu-decode-unshar-and-save | |
4633 Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}). | |
4634 | |
4635 @item X v s | |
4636 @kindex X v s (Summary) | |
4637 @findex gnus-uu-decode-unshar-view | |
4638 Unshars and views the current series (@code{gnus-uu-decode-unshar-view}). | |
4639 | |
4640 @item X v S | |
4641 @kindex X v S (Summary) | |
4642 @findex gnus-uu-decode-unshar-and-save-view | |
4643 Unshars, views and saves the current series | |
4644 (@code{gnus-uu-decode-unshar-and-save-view}). | |
4645 @end table | |
4646 | |
4647 | |
4648 @node PostScript Files | |
4649 @subsection PostScript Files | |
4650 @cindex PostScript | |
4651 | |
4652 @table @kbd | |
4653 | |
4654 @item X p | |
4655 @kindex X p (Summary) | |
4656 @findex gnus-uu-decode-postscript | |
4657 Unpack the current PostScript series (@code{gnus-uu-decode-postscript}). | |
4658 | |
4659 @item X P | |
4660 @kindex X P (Summary) | |
4661 @findex gnus-uu-decode-postscript-and-save | |
4662 Unpack and save the current PostScript series | |
4663 (@code{gnus-uu-decode-postscript-and-save}). | |
4664 | |
4665 @item X v p | |
4666 @kindex X v p (Summary) | |
4667 @findex gnus-uu-decode-postscript-view | |
4668 View the current PostScript series | |
4669 (@code{gnus-uu-decode-postscript-view}). | |
4670 | |
4671 @item X v P | |
4672 @kindex X v P (Summary) | |
4673 @findex gnus-uu-decode-postscript-and-save-view | |
4674 View and save the current PostScript series | |
4675 (@code{gnus-uu-decode-postscript-and-save-view}). | |
4676 @end table | |
4677 | |
4678 | |
4679 @node Decoding Variables | |
4680 @subsection Decoding Variables | |
4681 | |
4682 Adjective, not verb. | |
4683 | |
4684 @menu | |
4685 * Rule Variables:: Variables that say how a file is to be viewed. | |
4686 * Other Decode Variables:: Other decode variables. | |
4687 * Uuencoding and Posting:: Variables for customizing uuencoding. | |
4688 @end menu | |
4689 | |
4690 | |
4691 @node Rule Variables | |
4692 @subsubsection Rule Variables | |
4693 @cindex rule variables | |
4694 | |
4695 Gnus uses @dfn{rule variables} to decide how to view a file. All these | |
4696 variables are on the form | |
4697 | |
4698 @lisp | |
4699 (list '(regexp1 command2) | |
4700 '(regexp2 command2) | |
4701 ...) | |
4702 @end lisp | |
4703 | |
4704 @table @code | |
4705 | |
4706 @item gnus-uu-user-view-rules | |
4707 @vindex gnus-uu-user-view-rules | |
4708 @cindex sox | |
4709 This variable is consulted first when viewing files. If you wish to use, | |
4710 for instance, @code{sox} to convert an @samp{.au} sound file, you could | |
4711 say something like: | |
4712 @lisp | |
4713 (setq gnus-uu-user-view-rules | |
4714 (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\"))) | |
4715 @end lisp | |
4716 | |
4717 @item gnus-uu-user-view-rules-end | |
4718 @vindex gnus-uu-user-view-rules-end | |
4719 This variable is consulted if Gnus couldn't make any matches from the | |
4720 user and default view rules. | |
4721 | |
4722 @item gnus-uu-user-archive-rules | |
4723 @vindex gnus-uu-user-archive-rules | |
4724 This variable can be used to say what commands should be used to unpack | |
4725 archives. | |
4726 @end table | |
4727 | |
4728 | |
4729 @node Other Decode Variables | |
4730 @subsubsection Other Decode Variables | |
4731 | |
4732 @table @code | |
4733 @vindex gnus-uu-grabbed-file-functions | |
4734 | |
4735 @item gnus-uu-grabbed-file-functions | |
4736 All functions in this list will be called right each file has been | |
4737 successfully decoded---so that you can move or view files right away, | |
4738 and don't have to wait for all files to be decoded before you can do | |
4739 anything. Ready-made functions you can put in this list are: | |
4740 | |
4741 @table @code | |
4742 | |
4743 @item gnus-uu-grab-view | |
4744 @findex gnus-uu-grab-view | |
4745 View the file. | |
4746 | |
4747 @item gnus-uu-grab-move | |
4748 @findex gnus-uu-grab-move | |
4749 Move the file (if you're using a saving function.) | |
4750 @end table | |
4751 | |
4752 @item gnus-uu-ignore-files-by-name | |
4753 @vindex gnus-uu-ignore-files-by-name | |
4754 Files with name matching this regular expression won't be viewed. | |
4755 | |
4756 @item gnus-uu-ignore-files-by-type | |
4757 @vindex gnus-uu-ignore-files-by-type | |
4758 Files with a @sc{mime} type matching this variable won't be viewed. | |
4759 Note that Gnus tries to guess what type the file is based on the name. | |
4760 @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly | |
4761 kludgey. | |
4762 | |
4763 @item gnus-uu-tmp-dir | |
4764 @vindex gnus-uu-tmp-dir | |
4765 Where @code{gnus-uu} does its work. | |
4766 | |
4767 @item gnus-uu-do-not-unpack-archives | |
4768 @vindex gnus-uu-do-not-unpack-archives | |
4769 Non-@code{nil} means that @code{gnus-uu} won't peek inside archives | |
4770 looking for files to display. | |
4771 | |
4772 @item gnus-uu-view-and-save | |
4773 @vindex gnus-uu-view-and-save | |
4774 Non-@code{nil} means that the user will always be asked to save a file | |
4775 after viewing it. | |
4776 | |
4777 @item gnus-uu-ignore-default-view-rules | |
4778 @vindex gnus-uu-ignore-default-view-rules | |
4779 Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing | |
4780 rules. | |
4781 | |
4782 @item gnus-uu-ignore-default-archive-rules | |
4783 @vindex gnus-uu-ignore-default-archive-rules | |
4784 Non-@code{nil} means that @code{gnus-uu} will ignore the default archive | |
4785 unpacking commands. | |
4786 | |
4787 @item gnus-uu-kill-carriage-return | |
4788 @vindex gnus-uu-kill-carriage-return | |
4789 Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns | |
4790 from articles. | |
4791 | |
4792 @item gnus-uu-unmark-articles-not-decoded | |
4793 @vindex gnus-uu-unmark-articles-not-decoded | |
4794 Non-@code{nil} means that @code{gnus-uu} will mark articles that were | |
4795 unsuccessfully decoded as unread. | |
4796 | |
4797 @item gnus-uu-correct-stripped-uucode | |
4798 @vindex gnus-uu-correct-stripped-uucode | |
4799 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix | |
4800 uuencoded files that have had trailing spaces deleted. | |
4801 | |
4802 @item gnus-uu-view-with-metamail | |
4803 @vindex gnus-uu-view-with-metamail | |
4804 @cindex metamail | |
4805 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing | |
4806 commands defined by the rule variables and just fudge a @sc{mime} | |
4807 content type based on the file name. The result will be fed to | |
4808 @code{metamail} for viewing. | |
4809 | |
4810 @item gnus-uu-save-in-digest | |
4811 @vindex gnus-uu-save-in-digest | |
4812 Non-@code{nil} means that @code{gnus-uu}, when asked to save without | |
4813 decoding, will save in digests. If this variable is @code{nil}, | |
4814 @code{gnus-uu} will just save everything in a file without any | |
4815 embellishments. The digesting almost conforms to RFC1153---no easy way | |
4816 to specify any meaningful volume and issue numbers were found, so I | |
4817 simply dropped them. | |
4818 | |
4819 @end table | |
4820 | |
4821 | |
4822 @node Uuencoding and Posting | |
4823 @subsubsection Uuencoding and Posting | |
4824 | |
4825 @table @code | |
4826 | |
4827 @item gnus-uu-post-include-before-composing | |
4828 @vindex gnus-uu-post-include-before-composing | |
4829 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode | |
4830 before you compose the article. If this variable is @code{t}, you can | |
4831 either include an encoded file with @kbd{C-c C-i} or have one included | |
4832 for you when you post the article. | |
4833 | |
4834 @item gnus-uu-post-length | |
4835 @vindex gnus-uu-post-length | |
4836 Maximum length of an article. The encoded file will be split into how | |
4837 many articles it takes to post the entire file. | |
4838 | |
4839 @item gnus-uu-post-threaded | |
4840 @vindex gnus-uu-post-threaded | |
4841 Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a | |
4842 thread. This may not be smart, as no other decoder I have seen are able | |
4843 to follow threads when collecting uuencoded articles. (Well, I have | |
4844 seen one package that does that---@code{gnus-uu}, but somehow, I don't | |
4845 think that counts...) Default is @code{nil}. | |
4846 | |
4847 @item gnus-uu-post-separate-description | |
4848 @vindex gnus-uu-post-separate-description | |
4849 Non-@code{nil} means that the description will be posted in a separate | |
4850 article. The first article will typically be numbered (0/x). If this | |
4851 variable is @code{nil}, the description the user enters will be included | |
4852 at the beginning of the first article, which will be numbered (1/x). | |
4853 Default is @code{t}. | |
4854 | |
4855 @end table | |
4856 | |
4857 | |
4858 @node Viewing Files | |
4859 @subsection Viewing Files | |
4860 @cindex viewing files | |
4861 @cindex pseudo-articles | |
4862 | |
4863 After decoding, if the file is some sort of archive, Gnus will attempt | |
4864 to unpack the archive and see if any of the files in the archive can be | |
4865 viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz} | |
4866 containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will | |
4867 uncompress and de-tar the main file, and then view the two pictures. | |
4868 This unpacking process is recursive, so if the archive contains archives | |
4869 of archives, it'll all be unpacked. | |
4870 | |
4871 Finally, Gnus will normally insert a @dfn{pseudo-article} for each | |
4872 extracted file into the summary buffer. If you go to these | |
4873 ``articles'', you will be prompted for a command to run (usually Gnus | |
4874 will make a suggestion), and then the command will be run. | |
4875 | |
4876 @vindex gnus-view-pseudo-asynchronously | |
4877 If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait | |
4878 until the viewing is done before proceeding. | |
4879 | |
4880 @vindex gnus-view-pseudos | |
4881 If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert | |
4882 the pseudo-articles into the summary buffer, but view them | |
4883 immediately. If this variable is @code{not-confirm}, the user won't even | |
4884 be asked for a confirmation before viewing is done. | |
4885 | |
4886 @vindex gnus-view-pseudos-separately | |
4887 If @code{gnus-view-pseudos-separately} is non-@code{nil}, one | |
4888 pseudo-article will be created for each file to be viewed. If | |
4889 @code{nil}, all files that use the same viewing command will be given as | |
4890 a list of parameters to that command. | |
4891 | |
4892 @vindex gnus-insert-pseudo-articles | |
4893 If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert | |
4894 pseudo-articles when decoding. It is @code{t} by default. | |
4895 | |
4896 So; there you are, reading your @emph{pseudo-articles} in your | |
4897 @emph{virtual newsgroup} from the @emph{virtual server}; and you think: | |
4898 Why isn't anything real anymore? How did we get here? | |
4899 | |
4900 | |
4901 @node Article Treatment | |
4902 @section Article Treatment | |
4903 | |
4904 Reading through this huge manual, you may have quite forgotten that the | |
4905 object of newsreaders are to actually, like, read what people have | |
4906 written. Reading articles. Unfortunately, people are quite bad at | |
4907 writing, so there are tons of functions and variables to make reading | |
4908 these articles easier. | |
4909 | |
4910 @menu | |
4911 * Article Highlighting:: You want to make the article look like fruit salad. | |
4912 * Article Hiding:: You also want to make certain info go away. | |
4913 * Article Washing:: Lots of way-neat functions to make life better. | |
4914 * Article Buttons:: Click on URLs, Message-IDs, addresses and the like. | |
4915 * Article Date:: Grumble, UT! | |
4916 @end menu | |
4917 | |
4918 | |
4919 @node Article Highlighting | |
4920 @subsection Article Highlighting | |
4921 @cindex highlight | |
4922 | |
4923 Not only do you want your article buffer to look like fruit salad, but | |
4924 you want it to look like technicolor fruit salad. | |
4925 | |
4926 @table @kbd | |
4927 | |
4928 @item W H a | |
4929 @kindex W H a (Summary) | |
4930 @findex gnus-article-highlight | |
4931 Highlight the current article (@code{gnus-article-highlight}). | |
4932 | |
4933 @item W H h | |
4934 @kindex W H h (Summary) | |
4935 @findex gnus-article-highlight-headers | |
4936 @vindex gnus-header-face-alist | |
4937 Highlight the headers (@code{gnus-article-highlight-headers}). The | |
4938 highlighting will be done according to the @code{gnus-header-face-alist} | |
4939 variable, which is a list where each element has the form @var{(regexp | |
4940 name content)}. @var{regexp} is a regular expression for matching the | |
4941 header, @var{name} is the face used for highlighting the header name and | |
4942 @var{content} is the face for highlighting the header value. The first | |
4943 match made will be used. Note that @var{regexp} shouldn't have @samp{^} | |
4944 prepended---Gnus will add one. | |
4945 | |
4946 @item W H c | |
4947 @kindex W H c (Summary) | |
4948 @findex gnus-article-highlight-citation | |
4949 Highlight cited text (@code{gnus-article-highlight-citation}). | |
4950 | |
4951 Some variables to customize the citation highlights: | |
4952 | |
4953 @table @code | |
4954 @vindex gnus-cite-parse-max-size | |
4955 | |
4956 @item gnus-cite-parse-max-size | |
4957 If the article size if bigger than this variable (which is 25000 by | |
4958 default), no citation highlighting will be performed. | |
4959 | |
4960 @item gnus-cite-prefix-regexp | |
4961 @vindex gnus-cite-prefix-regexp | |
4962 Regexp matching the longest possible citation prefix on a line. | |
4963 | |
4964 @item gnus-cite-max-prefix | |
4965 @vindex gnus-cite-max-prefix | |
4966 Maximum possible length for a citation prefix (default 20). | |
4967 | |
4968 @item gnus-cite-face-list | |
4969 @vindex gnus-cite-face-list | |
4970 List of faces used for highlighting citations. When there are citations | |
4971 from multiple articles in the same message, Gnus will try to give each | |
4972 citation from each article its own face. This should make it easier to | |
4973 see who wrote what. | |
4974 | |
4975 @item gnus-supercite-regexp | |
4976 @vindex gnus-supercite-regexp | |
4977 Regexp matching normal Supercite attribution lines. | |
4978 | |
4979 @item gnus-supercite-secondary-regexp | |
4980 @vindex gnus-supercite-secondary-regexp | |
4981 Regexp matching mangled Supercite attribution lines. | |
4982 | |
4983 @item gnus-cite-minimum-match-count | |
4984 @vindex gnus-cite-minimum-match-count | |
4985 Minimum number of identical prefixes we have to see before we believe | |
4986 that it's a citation. | |
4987 | |
4988 @item gnus-cite-attribution-prefix | |
4989 @vindex gnus-cite-attribution-prefix | |
4990 Regexp matching the beginning of an attribution line. | |
4991 | |
4992 @item gnus-cite-attribution-suffix | |
4993 @vindex gnus-cite-attribution-suffix | |
4994 Regexp matching the end of an attribution line. | |
4995 | |
4996 @item gnus-cite-attribution-face | |
4997 @vindex gnus-cite-attribution-face | |
4998 Face used for attribution lines. It is merged with the face for the | |
4999 cited text belonging to the attribution. | |
5000 | |
5001 @end table | |
5002 | |
5003 | |
5004 @item W H s | |
5005 @kindex W H s (Summary) | |
5006 @vindex gnus-signature-separator | |
5007 @vindex gnus-signature-face | |
5008 @findex gnus-article-highlight-signature | |
5009 Highlight the signature (@code{gnus-article-highlight-signature}). | |
5010 Everything after @code{gnus-signature-separator} in an article will be | |
5011 considered a signature and will be highlighted with | |
5012 @code{gnus-signature-face}, which is @code{italic} by default. | |
5013 | |
5014 @end table | |
5015 | |
5016 | |
5017 @node Article Hiding | |
5018 @subsection Article Hiding | |
5019 @cindex article hiding | |
5020 | |
5021 Or rather, hiding certain things in each article. There usually is much | |
5022 too much cruft in most articles. | |
5023 | |
5024 @table @kbd | |
5025 | |
5026 @item W W a | |
5027 @kindex W W a (Summary) | |
5028 @findex gnus-article-hide | |
5029 Do maximum hiding on the summary buffer (@kbd{gnus-article-hide}). | |
5030 | |
5031 @item W W h | |
5032 @kindex W W h (Summary) | |
5033 @findex gnus-article-hide-headers | |
5034 Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding | |
5035 Headers}. | |
5036 | |
5037 @item W W b | |
5038 @kindex W W b (Summary) | |
5039 @findex gnus-article-hide-boring-headers | |
5040 Hide headers that aren't particularly interesting | |
5041 (@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}. | |
5042 | |
5043 @item W W s | |
5044 @kindex W W s (Summary) | |
5045 @findex gnus-article-hide-signature | |
5046 Hide signature (@code{gnus-article-hide-signature}). | |
5047 | |
5048 @item W W p | |
5049 @kindex W W p (Summary) | |
5050 @findex gnus-article-hide-pgp | |
5051 Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). | |
5052 | |
5053 @item W W c | |
5054 @kindex W W c (Summary) | |
5055 @findex gnus-article-hide-citation | |
5056 Hide citation (@code{gnus-article-hide-citation}). Some variables for | |
5057 customizing the hiding: | |
5058 | |
5059 @table @code | |
5060 | |
5061 @item gnus-cite-hide-percentage | |
5062 @vindex gnus-cite-hide-percentage | |
5063 If the cited text is of a bigger percentage than this variable (default | |
5064 50), hide the cited text. | |
5065 | |
5066 @item gnus-cite-hide-absolute | |
5067 @vindex gnus-cite-hide-absolute | |
5068 The cited text must be have at least this length (default 10) before it | |
5069 is hidden. | |
5070 | |
5071 @item gnus-cited-text-button-line-format | |
5072 @vindex gnus-cited-text-button-line-format | |
5073 Gnus adds buttons show where the cited text has been hidden, and to | |
5074 allow toggle hiding the text. The format of the variable is specified | |
5075 by this format-like variable. These specs are legal: | |
5076 | |
5077 @table @samp | |
5078 @item b | |
5079 Start point of the hidden text. | |
5080 @item e | |
5081 End point of the hidden text. | |
5082 @item l | |
5083 Length of the hidden text. | |
5084 @end table | |
5085 | |
5086 @item gnus-cited-lines-visible | |
5087 @vindex gnus-cited-lines-visible | |
5088 The number of lines at the beginning of the cited text to leave shown. | |
5089 | |
5090 @end table | |
5091 | |
5092 @item W W C | |
5093 @kindex W W C (Summary) | |
5094 @findex gnus-article-hide-citation-in-followups | |
5095 Hide cited text in articles that aren't roots | |
5096 (@code{gnus-article-hide-citation-in-followups}). This isn't very | |
5097 useful as an interactive command, but might be a handy function to stick | |
5098 in @code{gnus-article-display-hook} (@pxref{Customizing Articles}). | |
5099 | |
5100 @end table | |
5101 | |
5102 All these ``hiding'' commands are toggles, but if you give a negative | |
5103 prefix to these commands, they will show what they have previously | |
5104 hidden. If you give a positive prefix, they will always hide. | |
5105 | |
5106 Also @pxref{Article Highlighting} for further variables for | |
5107 citation customization. | |
5108 | |
5109 @vindex gnus-signature-limit | |
5110 @code{gnus-signature-limit} provides a limit to what is considered a | |
5111 signature. If it is a number, no signature may not be longer (in | |
5112 characters) than that number. If it is a function, the function will be | |
5113 called without any parameters, and if it returns @code{nil}, there is no | |
5114 signature in the buffer. If it is a string, it will be used as a | |
5115 regexp. If it matches, the text in question is not a signature. | |
5116 | |
5117 | |
5118 @node Article Washing | |
5119 @subsection Article Washing | |
5120 @cindex washing | |
5121 @cindex article washing | |
5122 | |
5123 We call this ``article washing'' for a really good reason. Namely, the | |
5124 @kbd{A} key was taken, so we had to use the @kbd{W} key instead. | |
5125 | |
5126 @dfn{Washing} is defined by us as ``changing something from something to | |
5127 something else'', but normally results in something looking better. | |
5128 Cleaner, perhaps. | |
5129 | |
5130 @table @kbd | |
5131 | |
5132 @item W l | |
5133 @kindex W l (Summary) | |
5134 @findex gnus-summary-stop-page-breaking | |
5135 Remove page breaks from the current article | |
5136 (@code{gnus-summary-stop-page-breaking}). | |
5137 | |
5138 @item W r | |
5139 @kindex W r (Summary) | |
5140 @findex gnus-summary-caesar-message | |
5141 Do a Caesar rotate (rot13) on the article buffer | |
5142 (@code{gnus-summary-caesar-message}). | |
5143 | |
5144 @item W t | |
5145 @kindex W t (Summary) | |
5146 @findex gnus-summary-toggle-header | |
5147 Toggle whether to display all headers in the article buffer | |
5148 (@code{gnus-summary-toggle-header}). | |
5149 | |
5150 @item W v | |
5151 @kindex W v (Summary) | |
5152 @findex gnus-summary-verbose-header | |
5153 Toggle whether to display all headers in the article buffer permanently | |
5154 (@code{gnus-summary-verbose-header}). | |
5155 | |
5156 @item W m | |
5157 @kindex W m (Summary) | |
5158 @findex gnus-summary-toggle-mime | |
5159 Toggle whether to run the article through @sc{mime} before displaying | |
5160 (@code{gnus-summary-toggle-mime}). | |
5161 | |
5162 @item W o | |
5163 @kindex W o (Summary) | |
5164 @findex gnus-article-treat-overstrike | |
5165 Treat overstrike (@code{gnus-article-treat-overstrike}). | |
5166 | |
5167 @item W w | |
5168 @kindex W w (Summary) | |
5169 @findex gnus-article-fill-cited-article | |
5170 Do word wrap (@code{gnus-article-fill-cited-article}). | |
5171 | |
5172 @item W c | |
5173 @kindex W c (Summary) | |
5174 @findex gnus-article-remove-cr | |
5175 Remove CR (@code{gnus-article-remove-cr}). | |
5176 | |
5177 @item W L | |
5178 @kindex W L (Summary) | |
5179 @findex gnus-article-remove-trailing-blank-lines | |
5180 Remove all blank lines at the end of the article | |
5181 (@code{gnus-article-remove-trailing-blank-lines}). | |
5182 | |
5183 @item W q | |
5184 @kindex W q (Summary) | |
5185 @findex gnus-article-de-quoted-unreadable | |
5186 Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}). | |
5187 | |
5188 @item W f | |
5189 @kindex W f (Summary) | |
5190 @cindex x-face | |
5191 @findex gnus-article-display-x-face | |
5192 @findex gnus-article-x-face-command | |
5193 @vindex gnus-article-x-face-command | |
5194 @vindex gnus-article-x-face-too-ugly | |
5195 Look for and display any X-Face headers | |
5196 (@code{gnus-article-display-x-face}). The command executed by this | |
5197 function is given by the @code{gnus-article-x-face-command} variable. If | |
5198 this variable is a string, this string will be executed in a sub-shell. | |
5199 If it is a function, this function will be called with the face as the | |
5200 argument. If the @code{gnus-article-x-face-too-ugly} (which is a regexp) | |
5201 matches the @code{From} header, the face will not be shown. The default | |
5202 action under Emacs is to fork off an @code{xv} to view the face; under | |
5203 XEmacs the default action is to display the face before the @code{From} | |
5204 header. (It's nicer if XEmacs has been compiled with X-Face support -- | |
5205 that will make display somewhat faster. If there's no native X-Face | |
5206 support, Gnus will try to convert the @code{X-Face} header using | |
5207 external programs from the @code{pbmplus} package and friends.) If you | |
5208 want to have this function in the display hook, it should probably come | |
5209 last. | |
5210 | |
5211 @item W b | |
5212 @kindex W b (Summary) | |
5213 @findex gnus-article-add-buttons | |
5214 Add clickable buttons to the article (@code{gnus-article-add-buttons}). | |
5215 | |
5216 @item W B | |
5217 @kindex W B (Summary) | |
5218 @findex gnus-article-add-buttons-to-head | |
5219 Add clickable buttons to the article headers | |
5220 (@code{gnus-article-add-buttons-to-head}). | |
5221 | |
5222 @end table | |
5223 | |
5224 | |
5225 @node Article Buttons | |
5226 @subsection Article Buttons | |
5227 @cindex buttons | |
5228 | |
5229 People often include references to other stuff in articles, and it would | |
5230 be nice if Gnus could just fetch whatever it is that people talk about | |
5231 with the minimum of fuzz. | |
5232 | |
5233 Gnus adds @dfn{buttons} to certain standard references by default: | |
5234 Well-formed URLs, mail addresses and Message-IDs. This is controlled by | |
5235 two variables, one that handles article bodies and one that handles | |
5236 article heads: | |
5237 | |
5238 @table @code | |
5239 | |
5240 @item gnus-button-alist | |
5241 @vindex gnus-button-alist | |
5242 This is an alist where each entry has this form: | |
5243 | |
5244 @lisp | |
5245 (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) | |
5246 @end lisp | |
5247 | |
5248 @table @var | |
5249 | |
5250 @item regexp | |
5251 All text that match this regular expression will be considered an | |
5252 external reference. Here's a typical regexp that match embedded URLs: | |
5253 @samp{<URL:\\([^\n\r>]*\\)>}. | |
5254 | |
5255 @item button-par | |
5256 Gnus has to know which parts of the match is to be highlighted. This is | |
5257 a number that says what sub-expression of the regexp that is to be | |
5258 highlighted. If you want it all highlighted, you use @code{0} here. | |
5259 | |
5260 @item use-p | |
5261 This form will be @code{eval}ed, and if the result is non-@code{nil}, | |
5262 this is considered a match. This is useful if you want extra sifting to | |
5263 avoid false matches. | |
5264 | |
5265 @item function | |
5266 This function will be called when you click on this button. | |
5267 | |
5268 @item data-par | |
5269 As with @var{button-par}, this is a sub-expression number, but this one | |
5270 says which part of the match is to be sent as data to @var{function}. | |
5271 | |
5272 @end table | |
5273 | |
5274 So the full entry for buttonizing URLs is then | |
5275 | |
5276 @lisp | |
5277 ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1) | |
5278 @end lisp | |
5279 | |
5280 @item gnus-header-button-alist | |
5281 @vindex gnus-header-button-alist | |
5282 This is just like the other alist, except that it is applied to the | |
5283 article head only, and that each entry has an additional element that is | |
5284 used to say what headers to apply the buttonize coding to: | |
5285 | |
5286 @lisp | |
5287 (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) | |
5288 @end lisp | |
5289 | |
5290 @var{header} is a regular expression. | |
5291 | |
5292 @item gnus-button-url-regexp | |
5293 @vindex gnus-button-url-regexp | |
5294 A regular expression that matches embedded URLs. It is used in the | |
5295 default values of the variables above. | |
5296 | |
5297 @item gnus-article-button-face | |
5298 @vindex gnus-article-button-face | |
5299 Face used on bottons. | |
5300 | |
5301 @item gnus-article-mouse-face | |
5302 @vindex gnus-article-mouse-face | |
5303 Face is used when the mouse cursor is over a button. | |
5304 | |
5305 @end table | |
5306 | |
5307 | |
5308 @node Article Date | |
5309 @subsection Article Date | |
5310 | |
5311 The date is most likely generated in some obscure timezone you've never | |
5312 heard of, so it's quite nice to be able to find out what the time was | |
5313 when the article was sent. | |
5314 | |
5315 @table @kbd | |
5316 | |
5317 @item W T u | |
5318 @kindex W T u (Summary) | |
5319 @findex gnus-article-date-ut | |
5320 Display the date in UT (aka. GMT, aka ZULU) | |
5321 (@code{gnus-article-date-ut}). | |
5322 | |
5323 @item W T l | |
5324 @kindex W T l (Summary) | |
5325 @findex gnus-article-date-local | |
5326 Display the date in the local timezone (@code{gnus-article-date-local}). | |
5327 | |
5328 @item W T e | |
5329 @kindex W T e (Summary) | |
5330 @findex gnus-article-date-lapsed | |
5331 Say how much time has (e)lapsed between the article was posted and now | |
5332 (@code{gnus-article-date-lapsed}). | |
5333 | |
5334 @item W T o | |
5335 @kindex W T o (Summary) | |
5336 @findex gnus-article-date-original | |
5337 Display the original date (@code{gnus-article-date-original}). This can | |
5338 be useful if you normally use some other conversion function and is | |
5339 worried that it might be doing something totally wrong. Say, claiming | |
5340 that the article was posted in 1854. Although something like that is | |
5341 @emph{totally} impossible. Don't you trust me? *titter* | |
5342 | |
5343 @end table | |
5344 | |
5345 | |
5346 @node Summary Sorting | |
5347 @section Summary Sorting | |
5348 @cindex summary sorting | |
5349 | |
5350 You can have the summary buffer sorted in various ways, even though I | |
5351 can't really see why you'd want that. | |
5352 | |
5353 @table @kbd | |
5354 | |
5355 @item C-c C-s C-n | |
5356 @kindex C-c C-s C-n (Summary) | |
5357 @findex gnus-summary-sort-by-number | |
5358 Sort by article number (@code{gnus-summary-sort-by-number}). | |
5359 | |
5360 @item C-c C-s C-a | |
5361 @kindex C-c C-s C-a (Summary) | |
5362 @findex gnus-summary-sort-by-author | |
5363 Sort by author (@code{gnus-summary-sort-by-author}). | |
5364 | |
5365 @item C-c C-s C-s | |
5366 @kindex C-c C-s C-s (Summary) | |
5367 @findex gnus-summary-sort-by-subject | |
5368 Sort by subject (@code{gnus-summary-sort-by-subject}). | |
5369 | |
5370 @item C-c C-s C-d | |
5371 @kindex C-c C-s C-d (Summary) | |
5372 @findex gnus-summary-sort-by-date | |
5373 Sort by date (@code{gnus-summary-sort-by-date}). | |
5374 | |
5375 @item C-c C-s C-i | |
5376 @kindex C-c C-s C-i (Summary) | |
5377 @findex gnus-summary-sort-by-score | |
5378 Sort by score (@code{gnus-summary-sort-by-score}). | |
5379 @end table | |
5380 | |
5381 These functions will work both when you use threading and when you don't | |
5382 use threading. In the latter case, all summary lines will be sorted, | |
5383 line by line. In the former case, sorting will be done on a | |
5384 root-by-root basis, which might not be what you were looking for. To | |
5385 toggle whether to use threading, type @kbd{T T} (@pxref{Thread | |
5386 Commands}). | |
5387 | |
5388 | |
5389 @node Finding the Parent | |
5390 @section Finding the Parent | |
5391 @cindex parent articles | |
5392 @cindex referring articles | |
5393 | |
5394 @findex gnus-summary-refer-parent-article | |
5395 @kindex ^ (Summary) | |
5396 If you'd like to read the parent of the current article, and it is not | |
5397 displayed in the summary buffer, you might still be able to. That is, | |
5398 if the current group is fetched by @sc{nntp}, the parent hasn't expired | |
5399 and the @code{References} in the current article are not mangled, you | |
5400 can just press @kbd{^} or @kbd{A r} | |
5401 (@code{gnus-summary-refer-parent-article}). If everything goes well, | |
5402 you'll get the parent. If the parent is already displayed in the | |
5403 summary buffer, point will just move to this article. | |
5404 | |
5405 @findex gnus-summary-refer-references | |
5406 @kindex A R (Summary) | |
5407 You can have Gnus fetch all articles mentioned in the @code{References} | |
5408 header of the article by pushing @kbd{A R} | |
5409 (@code{gnus-summary-refer-references}). | |
5410 | |
5411 @findex gnus-summary-refer-article | |
5412 @kindex M-^ (Summary) | |
5413 You can also ask the @sc{nntp} server for an arbitrary article, no | |
5414 matter what group it belongs to. @kbd{M-^} | |
5415 (@code{gnus-summary-refer-article}) will ask you for a | |
5416 @code{Message-ID}, which is one of those long thingies that look | |
5417 something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You have to get | |
5418 it all exactly right. No fuzzy searches, I'm afraid. | |
5419 | |
5420 @vindex gnus-refer-article-method | |
5421 If the group you are reading is located on a backend that does not | |
5422 support fetching by @code{Message-ID} very well (like @code{nnspool}), | |
5423 you can set @code{gnus-refer-article-method} to an @sc{nntp} method. It | |
5424 would, perhaps, be best if the @sc{nntp} server you consult is the same | |
5425 as the one that keeps the spool you are reading from updated, but that's | |
5426 not really necessary. | |
5427 | |
5428 Most of the mail backends support fetching by @code{Message-ID}, but do | |
5429 not do a particularly excellent job of it. That is, @code{nnmbox} and | |
5430 @code{nnbabyl} are able to locate articles from any groups, while | |
5431 @code{nnml} and @code{nnfolder} are only able to locate articles that | |
5432 have been posted to the current group. (Anything else would be too time | |
5433 consuming.) @code{nnmh} does not support this at all. | |
5434 | |
5435 | |
5436 @node Alternative Approaches | |
5437 @section Alternative Approaches | |
5438 | |
5439 Different people like to read news using different methods. This being | |
5440 Gnus, we offer a small selection of minor modes for the summary buffers. | |
5441 | |
5442 @menu | |
5443 * Pick and Read:: First mark articles and then read them. | |
5444 * Binary Groups:: Auto-decode all articles. | |
5445 @end menu | |
5446 | |
5447 | |
5448 @node Pick and Read | |
5449 @subsection Pick and Read | |
5450 @cindex pick and read | |
5451 | |
5452 Some newsreaders (like @code{nn} and, uhm, @code{nn}) use a two-phased | |
5453 reading interface. The user first marks the articles she wants to read | |
5454 from a summary buffer. Then she starts reading the articles with just | |
5455 an article buffer displayed. | |
5456 | |
5457 @findex gnus-pick-mode | |
5458 @kindex M-x gnus-pick-mode | |
5459 Gnus provides a summary buffer minor mode that allows | |
5460 this---@code{gnus-pick-mode}. This basically means that a few process | |
5461 mark commands become one-keystroke commands to allow easy marking, and | |
5462 it makes one additional command for switching to the summary buffer | |
5463 available. | |
5464 | |
5465 Here are the available keystrokes when using pick mode: | |
5466 | |
5467 @table @kbd | |
5468 @item SPACE | |
5469 @kindex SPACE (Pick) | |
5470 @findex gnus-summary-mark-as-processable | |
5471 Pick the article (@code{gnus-summary-mark-as-processable}). | |
5472 | |
5473 @item u | |
5474 @kindex u (Pick) | |
5475 @findex gnus-summary-unmark-as-processable | |
5476 Unpick the article (@code{gnus-summary-unmark-as-processable}). | |
5477 | |
5478 @item U | |
5479 @kindex U (Pick) | |
5480 @findex gnus-summary-unmark-all-processable | |
5481 Unpick all articles (@code{gnus-summary-unmark-all-processable}). | |
5482 | |
5483 @item t | |
5484 @kindex t (Pick) | |
5485 @findex gnus-uu-mark-thread | |
5486 Pick the thread (@code{gnus-uu-mark-thread}). | |
5487 | |
5488 @item T | |
5489 @kindex T (Pick) | |
5490 @findex gnus-uu-unmark-thread | |
5491 Unpick the thread (@code{gnus-uu-unmark-thread}). | |
5492 | |
5493 @item r | |
5494 @kindex r (Pick) | |
5495 @findex gnus-uu-mark-region | |
5496 Pick the region (@code{gnus-uu-mark-region}). | |
5497 | |
5498 @item R | |
5499 @kindex R (Pick) | |
5500 @findex gnus-uu-unmark-region | |
5501 Unpick the region (@code{gnus-uu-unmark-region}). | |
5502 | |
5503 @item e | |
5504 @kindex e (Pick) | |
5505 @findex gnus-uu-mark-by-regexp | |
5506 Pick articles that match a regexp (@code{gnus-uu-mark-by-regexp}). | |
5507 | |
5508 @item E | |
5509 @kindex E (Pick) | |
5510 @findex gnus-uu-unmark-by-regexp | |
5511 Unpick articles that match a regexp (@code{gnus-uu-unmark-by-regexp}). | |
5512 | |
5513 @item b | |
5514 @kindex b (Pick) | |
5515 @findex gnus-uu-mark-buffer | |
5516 Pick the buffer (@code{gnus-uu-mark-buffer}). | |
5517 | |
5518 @item B | |
5519 @kindex B (Pick) | |
5520 @findex gnus-uu-unmark-buffer | |
5521 Unpick the buffer (@code{gnus-uu-unmark-buffer}). | |
5522 | |
5523 @item RET | |
5524 @kindex RET (Pick) | |
5525 @findex gnus-pick-start-reading | |
5526 @vindex gnus-pick-display-summary | |
5527 Start reading the picked articles (@code{gnus-pick-start-reading}). If | |
5528 given a prefix, mark all unpicked articles as read first. If | |
5529 @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer | |
5530 will still be visible when you are reading. | |
5531 | |
5532 @end table | |
5533 | |
5534 If this sounds like a good idea to you, you could say: | |
5535 | |
5536 @lisp | |
5537 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode) | |
5538 @end lisp | |
5539 | |
5540 @vindex gnus-pick-mode-hook | |
5541 @code{gnus-pick-mode-hook} is run in pick minor mode buffers. | |
5542 | |
5543 | |
5544 @node Binary Groups | |
5545 @subsection Binary Groups | |
5546 @cindex binary groups | |
5547 | |
5548 @findex gnus-binary-mode | |
5549 @kindex M-x gnus-binary-mode | |
5550 If you spend much time in binary groups, you may grow tired of hitting | |
5551 @kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode} | |
5552 is a minor mode for summary buffers that makes all ordinary Gnus article | |
5553 selection functions uudecode series of articles and display the result | |
5554 instead of just displaying the articles the normal way. | |
5555 | |
5556 @kindex g (Binary) | |
5557 @findex gnus-binary-show-article | |
5558 In fact, the only way to see the actual articles if you have turned this | |
5559 mode on is the @kbd{g} command (@code{gnus-binary-show-article}). | |
5560 | |
5561 @vindex gnus-binary-mode-hook | |
5562 @code{gnus-binary-mode-hook} is called in binary minor mode buffers. | |
5563 | |
5564 | |
5565 @node Tree Display | |
5566 @section Tree Display | |
5567 @cindex trees | |
5568 | |
5569 @vindex gnus-use-trees | |
5570 If you don't like the normal Gnus summary display, you might try setting | |
5571 @code{gnus-use-trees} to @code{t}. This will create (by default) an | |
5572 additional @dfn{tree buffer}. You can execute all summary mode commands | |
5573 in the tree buffer. | |
5574 | |
5575 There are a few variables to customize the tree display, of course: | |
5576 | |
5577 @table @code | |
5578 @item gnus-tree-mode-hook | |
5579 @vindex gnus-tree-mode-hook | |
5580 A hook called in all tree mode buffers. | |
5581 | |
5582 @item gnus-tree-mode-line-format | |
5583 @vindex gnus-tree-mode-line-format | |
5584 A format string for the mode bar in the tree mode buffers. The default | |
5585 is @samp{Gnus: %%b [%A] %Z}. For a list of legal specs, @pxref{Summary | |
5586 Buffer Mode Line}. | |
5587 | |
5588 @item gnus-selected-tree-face | |
5589 @vindex gnus-selected-tree-face | |
5590 Face used for highlighting the selected article in the tree buffer. The | |
5591 default is @code{modeline}. | |
5592 | |
5593 @item gnus-tree-line-format | |
5594 @vindex gnus-tree-line-format | |
5595 A format string for the tree nodes. The name is a bit of a misnomer, | |
5596 though---it doesn't define a line, but just the node. The default value | |
5597 is @samp{%(%[%3,3n%]%)}, which displays the first three characters of | |
5598 the name of the poster. It is vital that all nodes are of the same | |
5599 length, so you @emph{must} use @samp{%4,4n}-like specifiers. | |
5600 | |
5601 Legal specs are: | |
5602 | |
5603 @table @samp | |
5604 @item n | |
5605 The name of the poster. | |
5606 @item f | |
5607 The @code{From} header. | |
5608 @item N | |
5609 The number of the article. | |
5610 @item [ | |
5611 The opening bracket. | |
5612 @item ] | |
5613 The closing bracket. | |
5614 @item s | |
5615 The subject. | |
5616 @end table | |
5617 | |
5618 @xref{Formatting Variables}. | |
5619 | |
5620 Variables related to the display are: | |
5621 | |
5622 @table @code | |
5623 @item gnus-tree-brackets | |
5624 @vindex gnus-tree-brackets | |
5625 This is used for differentiating between ``real'' articles and | |
5626 ``sparse'' articles. The format is @var{((real-open . real-close) | |
5627 (sparse-open . sparse-close) (dummy-open . dummy-close))}, and the | |
5628 default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}))}. | |
5629 | |
5630 @item gnus-tree-parent-child-edges | |
5631 @vindex gnus-tree-parent-child-edges | |
5632 This is a list that contains the characters used for connecting parent | |
5633 nodes to their children. The default is @code{(?- ?\\ ?|)}. | |
5634 | |
5635 @end table | |
5636 | |
5637 @item gnus-tree-minimize-window | |
5638 @vindex gnus-tree-minimize-window | |
5639 If this variable is non-@code{nil}, Gnus will try to keep the tree | |
5640 buffer as small as possible to allow more room for the other Gnus | |
5641 windows. If this variable is a number, the tree buffer will never be | |
5642 higher than that number. The default is @code{t}. | |
5643 | |
5644 @item gnus-generate-tree-function | |
5645 @vindex gnus-generate-tree-function | |
5646 @findex gnus-generate-horizontal-tree | |
5647 @findex gnus-generate-vertical-tree | |
5648 The function that actually generates the thread tree. Two predefined | |
5649 functions are available: @code{gnus-generate-horizontal-tree} and | |
5650 @code{gnus-generate-vertical-tree} (which is the default). | |
5651 | |
5652 @end table | |
5653 | |
5654 Here's and example from a horizontal tree buffer: | |
5655 | |
5656 @example | |
5657 @{***@}-(***)-[odd]-[Gun] | |
5658 | \[Jan] | |
5659 | \[odd]-[Eri] | |
5660 | \(***)-[Eri] | |
5661 | \[odd]-[Paa] | |
5662 \[Bjo] | |
5663 \[Gun] | |
5664 \[Gun]-[Jor] | |
5665 @end example | |
5666 | |
5667 Here's the same thread displayed in a vertical tree buffer: | |
5668 | |
5669 @example | |
5670 @{***@} | |
5671 |--------------------------\-----\-----\ | |
5672 (***) [Bjo] [Gun] [Gun] | |
5673 |--\-----\-----\ | | |
5674 [odd] [Jan] [odd] (***) [Jor] | |
5675 | | |--\ | |
5676 [Gun] [Eri] [Eri] [odd] | |
5677 | | |
5678 [Paa] | |
5679 @end example | |
5680 | |
5681 | |
5682 @node Mail Group Commands | |
5683 @section Mail Group Commands | |
5684 @cindex mail group commands | |
5685 | |
5686 Some commands only make sense in mail groups. If these commands are | |
5687 illegal in the current group, they will raise a hell and let you know. | |
5688 | |
5689 All these commands (except the expiry and edit commands) use the | |
5690 process/prefix convention (@pxref{Process/Prefix}). | |
5691 | |
5692 @table @kbd | |
5693 | |
5694 @item B e | |
5695 @kindex B e (Summary) | |
5696 @findex gnus-summary-expire-articles | |
5697 Expire all expirable articles in the group | |
5698 (@code{gnus-summary-expire-articles}). | |
5699 | |
5700 @item B M-C-e | |
5701 @kindex B M-C-e (Summary) | |
5702 @findex gnus-summary-expire-articles-now | |
5703 Expunge all the expirable articles in the group | |
5704 (@code{gnus-summary-expire-articles-now}). This means that @strong{all} | |
5705 articles that are eligible for expiry in the current group will | |
5706 disappear forever into that big @file{/dev/null} in the sky. | |
5707 | |
5708 @item B DEL | |
5709 @kindex B DEL (Summary) | |
5710 @findex gnus-summary-delete-article | |
5711 Delete the mail article. This is ``delete'' as in ``delete it from your | |
5712 disk forever and ever, never to return again.'' Use with caution. | |
5713 (@code{gnus-summary-delete-article}). | |
5714 | |
5715 @item B m | |
5716 @kindex B m (Summary) | |
5717 @cindex move mail | |
5718 @findex gnus-summary-move-article | |
5719 Move the article from one mail group to another | |
5720 (@code{gnus-summary-move-article}). | |
5721 | |
5722 @item B c | |
5723 @kindex B c (Summary) | |
5724 @cindex copy mail | |
5725 @findex gnus-summary-copy-article | |
5726 Copy the article from one group (mail group or not) to a mail group | |
5727 (@code{gnus-summary-copy-article}). | |
5728 | |
5729 @item B C | |
5730 @kindex B C (Summary) | |
5731 @cindex crosspost mail | |
5732 @findex gnus-summary-crosspost-article | |
5733 Crosspost the current article to some other group | |
5734 (@code{gnus-summary-crosspost-article}). This will create a new copy of | |
5735 the article in the other group, and the Xref headers of the article will | |
5736 be properly updated. | |
5737 | |
5738 @item B i | |
5739 @kindex B i (Summary) | |
5740 @findex gnus-summary-import-article | |
5741 Import an arbitrary file into the current mail newsgroup | |
5742 (@code{gnus-summary-import-article}). You will be prompted for a file | |
5743 name, a @code{From} header and a @code{Subject} header. | |
5744 | |
5745 @item B r | |
5746 @kindex B r (Summary) | |
5747 @findex gnus-summary-respool-article | |
5748 Respool the mail article (@code{gnus-summary-move-article}). | |
5749 | |
5750 @item B w | |
5751 @itemx e | |
5752 @kindex B w (Summary) | |
5753 @kindex e (Summary) | |
5754 @findex gnus-summary-edit-article | |
5755 @kindex C-c C-c (Article) | |
5756 Edit the current article (@code{gnus-summary-edit-article}). To finish | |
5757 editing and make the changes permanent, type @kbd{C-c C-c} | |
5758 (@kbd{gnus-summary-edit-article-done}). | |
5759 | |
5760 @item B q | |
5761 @kindex B q (Summary) | |
5762 @findex gnus-summary-respool-query | |
5763 If you want to re-spool an article, you might be curious as to what group | |
5764 the article will end up in before you do the re-spooling. This command | |
5765 will tell you (@code{gnus-summary-respool-query}). | |
5766 @end table | |
5767 | |
5768 @vindex gnus-move-split-methods | |
5769 @cindex moving articles | |
5770 If you move (or copy) articles regularly, you might wish to have Gnus | |
5771 suggest where to put the articles. @code{gnus-move-split-methods} is a | |
5772 variable that uses the same syntax as @code{gnus-split-methods} | |
5773 (@pxref{Saving Articles}). You may customize that variable to create | |
5774 suggestions you find reasonable. | |
5775 | |
5776 | |
5777 @node Various Summary Stuff | |
5778 @section Various Summary Stuff | |
5779 | |
5780 @menu | |
5781 * Summary Group Information:: Information oriented commands. | |
5782 * Searching for Articles:: Multiple article commands. | |
5783 * Really Various Summary Commands:: Those pesky non-conformant commands. | |
5784 @end menu | |
5785 | |
5786 @table @code | |
5787 @vindex gnus-summary-mode-hook | |
5788 @item gnus-summary-mode-hook | |
5789 This hook is called when creating a summary mode buffer. | |
5790 | |
5791 @vindex gnus-summary-generate-hook | |
5792 @item gnus-summary-generate-hook | |
5793 This is called as the last thing before doing the threading and the | |
5794 generation of the summary buffer. It's quite convenient for customizing | |
5795 the threading variables based on what data the newsgroup has. This hook | |
5796 is called from the summary buffer after most summary buffer variables | |
5797 has been set. | |
5798 | |
5799 @vindex gnus-summary-prepare-hook | |
5800 @item gnus-summary-prepare-hook | |
5801 Is is called after the summary buffer has been generated. You might use | |
5802 it to, for instance, highlight lines or modify the look of the buffer in | |
5803 some other ungodly manner. I don't care. | |
5804 | |
5805 @end table | |
5806 | |
5807 | |
5808 @node Summary Group Information | |
5809 @subsection Summary Group Information | |
5810 | |
5811 @table @kbd | |
5812 | |
5813 @item H f | |
5814 @kindex H f (Summary) | |
5815 @findex gnus-summary-fetch-faq | |
5816 @vindex gnus-group-faq-directory | |
5817 Try to fetch the FAQ (list of frequently asked questions) for the | |
5818 current group (@code{gnus-summary-fetch-faq}). Gnus will try to get the | |
5819 FAQ from @code{gnus-group-faq-directory}, which is usually a directory | |
5820 on a remote machine. This variable can also be a list of directories. | |
5821 In that case, giving a prefix to this command will allow you to choose | |
5822 between the various sites. @code{ange-ftp} probably will be used for | |
5823 fetching the file. | |
5824 | |
5825 @item H d | |
5826 @kindex H d (Summary) | |
5827 @findex gnus-summary-describe-group | |
5828 Give a brief description of the current group | |
5829 (@code{gnus-summary-describe-group}). If given a prefix, force | |
5830 rereading the description from the server. | |
5831 | |
5832 @item H h | |
5833 @kindex H h (Summary) | |
5834 @findex gnus-summary-describe-briefly | |
5835 Give a very brief description of the most important summary keystrokes | |
5836 (@code{gnus-summary-describe-briefly}). | |
5837 | |
5838 @item H i | |
5839 @kindex H i (Summary) | |
5840 @findex gnus-info-find-node | |
5841 Go to the Gnus info node (@code{gnus-info-find-node}). | |
5842 @end table | |
5843 | |
5844 | |
5845 @node Searching for Articles | |
5846 @subsection Searching for Articles | |
5847 | |
5848 @table @kbd | |
5849 | |
5850 @item M-s | |
5851 @kindex M-s (Summary) | |
5852 @findex gnus-summary-search-article-forward | |
5853 Search through all subsequent articles for a regexp | |
5854 (@code{gnus-summary-search-article-forward}). | |
5855 | |
5856 @item M-r | |
5857 @kindex M-r (Summary) | |
5858 @findex gnus-summary-search-article-backward | |
5859 Search through all previous articles for a regexp | |
5860 (@code{gnus-summary-search-article-backward}). | |
5861 | |
5862 @item & | |
5863 @kindex & (Summary) | |
5864 @findex gnus-summary-execute-command | |
5865 This command will prompt you for a header field, a regular expression to | |
5866 match on this field, and a command to be executed if the match is made | |
5867 (@code{gnus-summary-execute-command}). | |
5868 | |
5869 @item M-& | |
5870 @kindex M-& (Summary) | |
5871 @findex gnus-summary-universal-argument | |
5872 Perform any operation on all articles that have been marked with | |
5873 the process mark (@code{gnus-summary-universal-argument}). | |
5874 @end table | |
5875 | |
5876 | |
5877 @node Really Various Summary Commands | |
5878 @subsection Really Various Summary Commands | |
5879 | |
5880 @table @kbd | |
5881 | |
5882 @item A D | |
5883 @kindex A D (Summary) | |
5884 @findex gnus-summary-enter-digest-group | |
5885 If the current article is a collection of other articles (for instance, | |
5886 a digest), you might use this command to enter a group based on the that | |
5887 article (@code{gnus-summary-enter-digest-group}). Gnus will try to | |
5888 guess what article type is currently displayed unless you give a prefix | |
5889 to this command, which forces a ``digest'' interpretation. Basically, | |
5890 whenever you see a message that is a collection of other messages on | |
5891 some format, you @kbd{A D} and read these messages in a more convenient | |
5892 fashion. | |
5893 | |
5894 @item C-t | |
5895 @kindex C-t (Summary) | |
5896 @findex gnus-summary-toggle-truncation | |
5897 Toggle truncation of summary lines (@code{gnus-summary-toggle-truncation}). | |
5898 | |
5899 @item = | |
5900 @kindex = (Summary) | |
5901 @findex gnus-summary-expand-window | |
5902 Expand the summary buffer window (@code{gnus-summary-expand-window}). | |
5903 If given a prefix, force an @code{article} window configuration. | |
5904 @end table | |
5905 | |
5906 | |
5907 @node Exiting the Summary Buffer | |
5908 @section Exiting the Summary Buffer | |
5909 @cindex summary exit | |
5910 @cindex exiting groups | |
5911 | |
5912 Exiting from the summary buffer will normally update all info on the | |
5913 group and return you to the group buffer. | |
5914 | |
5915 @table @kbd | |
5916 | |
5917 @item Z Z | |
5918 @itemx q | |
5919 @kindex Z Z (Summary) | |
5920 @kindex q (Summary) | |
5921 @findex gnus-summary-exit | |
5922 @vindex gnus-summary-exit-hook | |
5923 @vindex gnus-summary-prepare-exit-hook | |
5924 Exit the current group and update all information on the group | |
5925 (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is | |
5926 called before doing much of the exiting, and calls | |
5927 @code{gnus-summary-expire-articles} by default. | |
5928 @code{gnus-summary-exit-hook} is called after finishing the exiting | |
5929 process. | |
5930 | |
5931 @item Z E | |
5932 @itemx Q | |
5933 @kindex Z E (Summary) | |
5934 @kindex Q (Summary) | |
5935 @findex gnus-summary-exit-no-update | |
5936 Exit the current group without updating any information on the group | |
5937 (@code{gnus-summary-exit-no-update}). | |
5938 | |
5939 @item Z c | |
5940 @itemx c | |
5941 @kindex Z c (Summary) | |
5942 @kindex c (Summary) | |
5943 @findex gnus-summary-catchup-and-exit | |
5944 Mark all unticked articles in the group as read and then exit | |
5945 (@code{gnus-summary-catchup-and-exit}). | |
5946 | |
5947 @item Z C | |
5948 @kindex Z C (Summary) | |
5949 @findex gnus-summary-catchup-all-and-exit | |
5950 Mark all articles, even the ticked ones, as read and then exit | |
5951 (@code{gnus-summary-catchup-all-and-exit}). | |
5952 | |
5953 @item Z n | |
5954 @kindex Z n (Summary) | |
5955 @findex gnus-summary-catchup-and-goto-next-group | |
5956 Mark all articles as read and go to the next group | |
5957 (@code{gnus-summary-catchup-and-goto-next-group}). | |
5958 | |
5959 @item Z R | |
5960 @kindex Z R (Summary) | |
5961 @findex gnus-summary-reselect-current-group | |
5962 Exit this group, and then enter it again | |
5963 (@code{gnus-summary-reselect-current-group}). If given a prefix, select | |
5964 all articles, both read and unread. | |
5965 | |
5966 @item Z G | |
5967 @itemx M-g | |
5968 @kindex Z G (Summary) | |
5969 @kindex M-g (Summary) | |
5970 @findex gnus-summary-rescan-group | |
5971 Exit the group, check for new articles in the group, and select the | |
5972 group (@code{gnus-summary-rescan-group}). If given a prefix, select all | |
5973 articles, both read and unread. | |
5974 | |
5975 @item Z N | |
5976 @kindex Z N (Summary) | |
5977 @findex gnus-summary-next-group | |
5978 Exit the group and go to the next group | |
5979 (@code{gnus-summary-next-group}). | |
5980 | |
5981 @item Z P | |
5982 @kindex Z P (Summary) | |
5983 @findex gnus-summary-prev-group | |
5984 Exit the group and go to the previous group | |
5985 (@code{gnus-summary-prev-group}). | |
5986 @end table | |
5987 | |
5988 @vindex gnus-exit-group-hook | |
5989 @code{gnus-exit-group-hook} is called when you exit the current | |
5990 group. | |
5991 | |
5992 @findex gnus-summary-wake-up-the-dead | |
5993 @findex gnus-dead-summary-mode | |
5994 @vindex gnus-kill-summary-on-exit | |
5995 If you're in the habit of exiting groups, and then changing your mind | |
5996 about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}. | |
5997 If you do that, Gnus won't kill the summary buffer when you exit it. | |
5998 (Quelle surprise!) Instead it will change the name of the buffer to | |
5999 something like @samp{*Dead Summary ... *} and install a minor mode | |
6000 called @code{gnus-dead-summary-mode}. Now, if you switch back to this | |
6001 buffer, you'll find that all keys are mapped to a function called | |
6002 @code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead | |
6003 summary buffer will result in a live, normal summary buffer. | |
6004 | |
6005 There will never be more than one dead summary buffer at any one time. | |
6006 | |
6007 @vindex gnus-use-cross-reference | |
6008 The data on the current group will be updated (which articles you have | |
6009 read, which articles you have replied to, etc.) when you exit the | |
6010 summary buffer. If the @code{gnus-use-cross-reference} variable is | |
6011 @code{t} (which is the default), articles that are cross-referenced to | |
6012 this group and are marked as read, will also be marked as read in the | |
6013 other subscribed groups they were cross-posted to. If this variable is | |
6014 neither @code{nil} nor @code{t}, the article will be marked as read in | |
6015 both subscribed and unsubscribed groups. | |
6016 | |
6017 @cindex velveeta | |
6018 @cindex spamming | |
6019 Marking cross-posted articles as read ensures that you'll never have to | |
6020 read the same article more than once. Unless, of course, somebody has | |
6021 posted it to several groups separately. Posting the same article to | |
6022 several groups (not cross-posting) is called @dfn{spamming}, and you are | |
6023 by law required to send nasty-grams to anyone who perpetrates such a | |
6024 heinous crime. | |
6025 | |
6026 Remember: Cross-posting is kinda ok, but posting the same article | |
6027 separately to several groups is not. Massive cross-posting (aka. | |
6028 @dfn{velveeta}) is to be avoided. | |
6029 | |
6030 @cindex cross-posting | |
6031 @cindex Xref | |
6032 @cindex @sc{nov} | |
6033 One thing that may cause Gnus to not do the cross-posting thing | |
6034 correctly is if you use an @sc{nntp} server that supports @sc{xover} | |
6035 (which is very nice, because it speeds things up considerably) which | |
6036 does not include the @code{Xref} header in its @sc{nov} lines. This is | |
6037 Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing | |
6038 even with @sc{xover} by registering the @code{Xref} lines of all | |
6039 articles you actually read, but if you kill the articles, or just mark | |
6040 them as read without reading them, Gnus will not get a chance to snoop | |
6041 the @code{Xref} lines out of these articles, and will be unable to use | |
6042 the cross reference mechanism. | |
6043 | |
6044 @cindex LIST overview.fmt | |
6045 @cindex overview.fmt | |
6046 To check whether your @sc{nntp} server includes the @code{Xref} header | |
6047 in its overview files, try @samp{telnet your.nntp.server nntp}, | |
6048 @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST | |
6049 overview.fmt}. This may not work, but if it does, and the last line you | |
6050 get does not read @samp{Xref:full}, then you should shout and whine at | |
6051 your news admin until she includes the @code{Xref} header in the | |
6052 overview files. | |
6053 | |
6054 @vindex gnus-nov-is-evil | |
6055 If you want Gnus to get the @code{Xref}s right all the time, you have to | |
6056 set @code{gnus-nov-is-evil} to @code{t}, which slows things down | |
6057 considerably. | |
6058 | |
6059 C'est la vie. | |
6060 | |
6061 | |
6062 @node The Article Buffer | |
6063 @chapter The Article Buffer | |
6064 @cindex article buffer | |
6065 | |
6066 The articles are displayed in the article buffer, of which there is only | |
6067 one. All the summary buffers share the same article buffer unless you | |
6068 tell Gnus otherwise. | |
6069 | |
6070 @menu | |
6071 * Hiding Headers:: Deciding what headers should be displayed. | |
6072 * Using MIME:: Pushing articles through @sc{mime} before reading them. | |
6073 * Customizing Articles:: Tailoring the look of the articles. | |
6074 * Article Keymap:: Keystrokes available in the article buffer | |
6075 * Misc Article:: Other stuff. | |
6076 @end menu | |
6077 | |
6078 | |
6079 @node Hiding Headers | |
6080 @section Hiding Headers | |
6081 @cindex hiding headers | |
6082 @cindex deleting headers | |
6083 | |
6084 The top section of each article is the @dfn{head}. (The rest is the | |
6085 @dfn{body}, but you may have guessed that already.) | |
6086 | |
6087 @vindex gnus-show-all-headers | |
6088 There is a lot of useful information in the head: the name of the person | |
6089 who wrote the article, the date it was written and the subject of the | |
6090 article. That's well and nice, but there's also lots of information | |
6091 most people do not want to see---what systems the article has passed | |
6092 through before reaching you, the @code{Message-ID}, the | |
6093 @code{References}, etc. ad nauseum---and you'll probably want to get rid | |
6094 of some of those lines. If you want to keep all those lines in the | |
6095 article buffer, you can set @code{gnus-show-all-headers} to @code{t}. | |
6096 | |
6097 Gnus provides you with two variables for sifting headers: | |
6098 | |
6099 @table @code | |
6100 | |
6101 @item gnus-visible-headers | |
6102 @vindex gnus-visible-headers | |
6103 If this variable is non-@code{nil}, it should be a regular expression | |
6104 that says what headers you wish to keep in the article buffer. All | |
6105 headers that do not match this variable will be hidden. | |
6106 | |
6107 For instance, if you only want to see the name of the person who wrote | |
6108 the article and the subject, you'd say: | |
6109 | |
6110 @lisp | |
6111 (setq gnus-visible-headers "^From:\\|^Subject:") | |
6112 @end lisp | |
6113 | |
6114 This variable can also be a list of regexps to match headers that are to | |
6115 remain visible. | |
6116 | |
6117 @item gnus-ignored-headers | |
6118 @vindex gnus-ignored-headers | |
6119 This variable is the reverse of @code{gnus-visible-headers}. If this | |
6120 variable is set (and @code{gnus-visible-headers} is @code{nil}), it | |
6121 should be a regular expression that matches all lines that you want to | |
6122 hide. All lines that do not match this variable will remain visible. | |
6123 | |
6124 For instance, if you just want to get rid of the @code{References} line | |
6125 and the @code{Xref} line, you might say: | |
6126 | |
6127 @lisp | |
6128 (setq gnus-ignored-headers "^References:\\|^Xref:") | |
6129 @end lisp | |
6130 | |
6131 This variable can also be a list of regexps to match headers that are to | |
6132 be removed. | |
6133 | |
6134 Note that if @code{gnus-visible-headers} is non-@code{nil}, this | |
6135 variable will have no effect. | |
6136 | |
6137 @end table | |
6138 | |
6139 @vindex gnus-sorted-header-list | |
6140 Gnus can also sort the headers for you. (It does this by default.) You | |
6141 can control the sorting by setting the @code{gnus-sorted-header-list} | |
6142 variable. It is a list of regular expressions that says in what order | |
6143 the headers are to be displayed. | |
6144 | |
6145 For instance, if you want the name of the author of the article first, | |
6146 and then the subject, you might say something like: | |
6147 | |
6148 @lisp | |
6149 (setq gnus-sorted-header-list '("^From:" "^Subject:")) | |
6150 @end lisp | |
6151 | |
6152 Any headers that are to remain visible, but are not listed in this | |
6153 variable, will be displayed in random order after all the headers that | |
6154 are listed in this variable. | |
6155 | |
6156 @findex gnus-article-hide-boring-headers | |
6157 @vindex gnus-article-display-hook | |
6158 @vindex gnus-boring-article-headers | |
6159 You can hide further boring headers by entering | |
6160 @code{gnus-article-hide-boring-headers} into | |
6161 @code{gnus-article-display-hook}. What this function does depends on | |
6162 the @code{gnus-boring-article-headers} variable. It's a list, but this | |
6163 list doesn't actually contain header names. Instead is lists various | |
6164 @dfn{boring conditions} that Gnus can check and remove from sight. | |
6165 | |
6166 These conditions are: | |
6167 @table @code | |
6168 @item empty | |
6169 Remove all empty headers. | |
6170 @item newsgroups | |
6171 Remove the @code{Newsgroups} header if it only contains the current group | |
6172 name. | |
6173 @item followup-to | |
6174 Remove the @code{Followup-To} header if it is identical to the | |
6175 @code{Newsgroups} header. | |
6176 @item reply-to | |
6177 Remove the @code{Reply-To} header if it lists the same address as the | |
6178 @code{From} header. | |
6179 @item date | |
6180 Remove the @code{Date} header if the article is less than three days | |
6181 old. | |
6182 @end table | |
6183 | |
6184 To include the four first elements, you could say something like; | |
6185 | |
6186 @lisp | |
6187 (setq gnus-boring-article-headers | |
6188 '(empty newsgroups followup-to reply-to)) | |
6189 @end lisp | |
6190 | |
6191 This is also the default value for this variable. | |
6192 | |
6193 | |
6194 @node Using MIME | |
6195 @section Using @sc{mime} | |
6196 @cindex @sc{mime} | |
6197 | |
6198 Mime is a standard for waving your hands through the air, aimlessly, | |
6199 while people stand around yawning. | |
6200 | |
6201 @sc{mime}, however, is a standard for encoding your articles, aimlessly, | |
6202 while all newsreaders die of fear. | |
6203 | |
6204 @sc{mime} may specify what character set the article uses, the encoding | |
6205 of the characters, and it also makes it possible to embed pictures and | |
6206 other naughty stuff in innocent-looking articles. | |
6207 | |
6208 @vindex gnus-show-mime | |
6209 @vindex gnus-show-mime-method | |
6210 @vindex gnus-strict-mime | |
6211 @findex metamail-buffer | |
6212 Gnus handles @sc{mime} by shoving the articles through | |
6213 @code{gnus-show-mime-method}, which is @code{metamail-buffer} by | |
6214 default. Set @code{gnus-show-mime} to @code{t} if you want to use | |
6215 @sc{mime} all the time. However, if @code{gnus-strict-mime} is | |
6216 non-@code{nil}, the @sc{mime} method will only be used if there are | |
6217 @sc{mime} headers in the article. | |
6218 | |
6219 It might be best to just use the toggling functions from the summary | |
6220 buffer to avoid getting nasty surprises. (For instance, you enter the | |
6221 group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has | |
6222 decoded the sound file in the article and some horrible sing-a-long song | |
6223 comes streaming out out your speakers, and you can't find the volume | |
6224 button, because there isn't one, and people are starting to look at you, | |
6225 and you try to stop the program, but you can't, and you can't find the | |
6226 program to control the volume, and everybody else in the room suddenly | |
6227 decides to look at you disdainfully, and you'll feel rather stupid.) | |
6228 | |
6229 Any similarity to real events and people is purely coincidental. Ahem. | |
6230 | |
6231 | |
6232 @node Customizing Articles | |
6233 @section Customizing Articles | |
6234 @cindex article customization | |
6235 | |
6236 @vindex gnus-article-display-hook | |
6237 The @code{gnus-article-display-hook} is called after the article has | |
6238 been inserted into the article buffer. It is meant to handle all | |
6239 treatment of the article before it is displayed. | |
6240 | |
6241 @findex gnus-article-maybe-highlight | |
6242 By default it contains @code{gnus-article-hide-headers}, | |
6243 @code{gnus-article-treat-overstrike}, and | |
6244 @code{gnus-article-maybe-highlight}, but there are thousands, nay | |
6245 millions, of functions you can put in this hook. For an overview of | |
6246 functions @pxref{Article Highlighting}, @pxref{Article Hiding}, | |
6247 @pxref{Article Washing}, @pxref{Article Buttons} and @pxref{Article | |
6248 Date}. | |
6249 | |
6250 You can, of course, write your own functions. The functions are called | |
6251 from the article buffer, and you can do anything you like, pretty much. | |
6252 There is no information that you have to keep in the buffer---you can | |
6253 change everything. However, you shouldn't delete any headers. Instead | |
6254 make them invisible if you want to make them go away. | |
6255 | |
6256 | |
6257 @node Article Keymap | |
6258 @section Article Keymap | |
6259 | |
6260 Most of the keystrokes in the summary buffer can also be used in the | |
6261 article buffer. They should behave as if you typed them in the summary | |
6262 buffer, which means that you don't actually have to have a summary | |
6263 buffer displayed while reading. You can do it all from the article | |
6264 buffer. | |
6265 | |
6266 A few additional keystrokes are available: | |
6267 | |
6268 @table @kbd | |
6269 | |
6270 @item SPACE | |
6271 @kindex SPACE (Article) | |
6272 @findex gnus-article-next-page | |
6273 Scroll forwards one page (@code{gnus-article-next-page}). | |
6274 | |
6275 @item DEL | |
6276 @kindex DEL (Article) | |
6277 @findex gnus-article-prev-page | |
6278 Scroll backwards one page (@code{gnus-article-prev-page}). | |
6279 | |
6280 @item C-c ^ | |
6281 @kindex C-c ^ (Article) | |
6282 @findex gnus-article-refer-article | |
6283 If point is in the neighborhood of a @code{Message-ID} and you press | |
6284 @kbd{r}, Gnus will try to get that article from the server | |
6285 (@code{gnus-article-refer-article}). | |
6286 | |
6287 @item C-c C-m | |
6288 @kindex C-c C-m (Article) | |
6289 @findex gnus-article-mail | |
6290 Send a reply to the address near point (@code{gnus-article-mail}). If | |
6291 given a prefix, include the mail. | |
6292 | |
6293 @item s | |
6294 @kindex s (Article) | |
6295 @findex gnus-article-show-summary | |
6296 Reconfigure the buffers so that the summary buffer becomes visible | |
6297 (@code{gnus-article-show-summary}). | |
6298 | |
6299 @item ? | |
6300 @kindex ? (Article) | |
6301 @findex gnus-article-describe-briefly | |
6302 Give a very brief description of the available keystrokes | |
6303 (@code{gnus-article-describe-briefly}). | |
6304 | |
6305 @item TAB | |
6306 @kindex TAB (Article) | |
6307 @findex gnus-article-next-button | |
6308 Go to the next button, if any (@code{gnus-article-next-button}. This | |
6309 only makes sense if you have buttonizing turned on. | |
6310 | |
6311 @item M-TAB | |
6312 @kindex M-TAB (Article) | |
6313 @findex gnus-article-prev-button | |
6314 Go to the previous button, if any (@code{gnus-article-prev-button}. | |
6315 | |
6316 @end table | |
6317 | |
6318 | |
6319 @node Misc Article | |
6320 @section Misc Article | |
6321 | |
6322 @table @code | |
6323 | |
6324 @item gnus-single-article-buffer | |
6325 @vindex gnus-single-article-buffer | |
6326 If non-@code{nil}, use the same article buffer for all the groups. | |
6327 (This is the default.) If @code{nil}, each group will have its own | |
6328 article buffer. | |
6329 | |
6330 @vindex gnus-article-prepare-hook | |
6331 @item gnus-article-prepare-hook | |
6332 This hook is called right after the article has been inserted into the | |
6333 article buffer. It is mainly intended for functions that do something | |
6334 depending on the contents; it should probably not be used for changing | |
6335 the contents of the article buffer. | |
6336 | |
6337 @vindex gnus-article-display-hook | |
6338 @item gnus-article-display-hook | |
6339 This hook is called as the last thing when displaying an article, and is | |
6340 intended for modifying the contents of the buffer, doing highlights, | |
6341 hiding headers, and the like. | |
6342 | |
6343 @item gnus-article-mode-hook | |
6344 @vindex gnus-article-mode-hook | |
6345 Hook called in article mode buffers. | |
6346 | |
6347 @vindex gnus-article-mode-line-format | |
6348 @item gnus-article-mode-line-format | |
6349 This variable is a format string along the same lines as | |
6350 @code{gnus-summary-mode-line-format}. It accepts exactly the same | |
6351 format specifications as that variable. | |
6352 @vindex gnus-break-pages | |
6353 | |
6354 @item gnus-break-pages | |
6355 Controls whether @dfn{page breaking} is to take place. If this variable | |
6356 is non-@code{nil}, the articles will be divided into pages whenever a | |
6357 page delimiter appears in the article. If this variable is @code{nil}, | |
6358 paging will not be done. | |
6359 | |
6360 @item gnus-page-delimiter | |
6361 @vindex gnus-page-delimiter | |
6362 This is the delimiter mentioned above. By default, it is @samp{^L} | |
6363 (form linefeed). | |
6364 @end table | |
6365 | |
6366 | |
6367 @node Composing Messages | |
6368 @chapter Composing Messages | |
6369 @cindex reply | |
6370 @cindex followup | |
6371 @cindex post | |
6372 | |
6373 @kindex C-c C-c (Post) | |
6374 All commands for posting and mailing will put you in a message buffer | |
6375 where you can edit the article all you like, before you send the article | |
6376 by pressing @kbd{C-c C-c}. @xref{Top, , Top, message, The Message | |
6377 Manual}. If you are in a foreign news group, and you wish to post the | |
6378 article using the foreign server, you can give a prefix to @kbd{C-c C-c} | |
6379 to make Gnus try to post using the foreign server. | |
6380 | |
6381 @menu | |
6382 * Mail:: Mailing and replying. | |
6383 * Post:: Posting and following up. | |
6384 * Posting Server:: What server should you post via? | |
6385 * Mail and Post:: Mailing and posting at the same time. | |
6386 * Archived Messages:: Where Gnus stores the messages you've sent. | |
6387 @c * Posting Styles:: An easier way to configure some key elements. | |
6388 @c * Drafts:: Postponing messages and rejected messages. | |
6389 @c * Rejected Articles:: What happens if the server doesn't like your article? | |
6390 @end menu | |
6391 | |
6392 Also see @pxref{Canceling and Superseding} for information on how to | |
6393 remove articles you shouldn't have posted. | |
6394 | |
6395 | |
6396 @node Mail | |
6397 @section Mail | |
6398 | |
6399 Variables for customizing outgoing mail: | |
6400 | |
6401 @table @code | |
6402 @item gnus-uu-digest-headers | |
6403 @vindex gnus-uu-digest-headers | |
6404 List of regexps to match headers included in digested messages. The | |
6405 headers will be included in the sequence they are matched. | |
6406 | |
6407 @end table | |
6408 | |
6409 | |
6410 @node Post | |
6411 @section Post | |
6412 | |
6413 Variables for composing news articles: | |
6414 | |
6415 @table @code | |
6416 @item gnus-sent-message-ids-file | |
6417 @vindex gnus-sent-message-ids-file | |
6418 Gnus will keep a @code{Message-ID} history file of all the mails it has | |
6419 sent. If it discovers that it has already sent a mail, it will ask the | |
6420 user whether to re-send the mail. (This is primarily useful when | |
6421 dealing with @sc{soup} packets and the like where one is apt to sent the | |
6422 same packet multiple times.) This variable says what the name of this | |
6423 history file is. It is @file{~/News/Sent-Message-IDs} by default. Set | |
6424 this variable to @code{nil} if you don't want Gnus to keep a history | |
6425 file. | |
6426 | |
6427 @item gnus-sent-message-ids-length | |
6428 @vindex gnus-sent-message-ids-length | |
6429 This variable says how many @code{Message-ID}s to keep in the history | |
6430 file. It is 1000 by default. | |
6431 | |
6432 @end table | |
6433 | |
6434 | |
6435 @node Posting Server | |
6436 @section Posting Server | |
6437 | |
6438 When you press those magical @kbd{C-c C-c} keys to ship off your latest | |
6439 (extremely intelligent, of course) article, where does it go? | |
6440 | |
6441 Thank you for asking. I hate you. | |
6442 | |
6443 @vindex gnus-post-method | |
6444 | |
6445 It can be quite complicated. Normally, Gnus will use the same native | |
6446 server. However. If your native server doesn't allow posting, just | |
6447 reading, you probably want to use some other server to post your | |
6448 (extremely intelligent and fabulously interesting) articles. You can | |
6449 then set the @code{gnus-post-method} to some other method: | |
6450 | |
6451 @lisp | |
6452 (setq gnus-post-method '(nnspool "")) | |
6453 @end lisp | |
6454 | |
6455 Now, if you've done this, and then this server rejects your article, or | |
6456 this server is down, what do you do then? To override this variable you | |
6457 can use a non-zero prefix to the @kbd{C-c C-c} command to force using | |
6458 the ``current'' server for posting. | |
6459 | |
6460 If you give a zero prefix (i. e., @kbd{C-u 0 C-c C-c}) to that command, | |
6461 Gnus will prompt you for what method to use for posting. | |
6462 | |
6463 You can also set @code{gnus-post-method} to a list of select methods. | |
6464 If that's the case, Gnus will always prompt you for what method to use | |
6465 for posting. | |
6466 | |
6467 | |
6468 @node Mail and Post | |
6469 @section Mail and Post | |
6470 | |
6471 Here's a list of variables that are relevant to both mailing and | |
6472 posting: | |
6473 | |
6474 @table @code | |
6475 @item gnus-mailing-list-groups | |
6476 @findex gnus-mailing-list-groups | |
6477 @cindex mailing lists | |
6478 | |
6479 If your news server offers groups that are really mailing lists that are | |
6480 gatewayed to the @sc{nntp} server, you can read those groups without | |
6481 problems, but you can't post/followup to them without some difficulty. | |
6482 One solution is to add a @code{to-address} to the group parameters | |
6483 (@pxref{Group Parameters}). An easier thing to do is set the | |
6484 @code{gnus-mailing-list-groups} to a regexp that match the groups that | |
6485 really are mailing lists. Then, at least, followups to the mailing | |
6486 lists will work most of the time. Posting to these groups (@kbd{a}) is | |
6487 still a pain, though. | |
6488 | |
6489 @end table | |
6490 | |
6491 You may want to do spell-checking on messages that you send out. Or, if | |
6492 you don't want to spell-check by hand, you could add automatic | |
6493 spell-checking via the @code{ispell} package: | |
6494 | |
6495 @cindex ispell | |
6496 @findex ispell-message | |
6497 @lisp | |
6498 (add-hook 'message-send-hook 'ispell-message) | |
6499 @end lisp | |
6500 | |
6501 | |
6502 @node Archived Messages | |
6503 @section Archived Messages | |
6504 @cindex archived messages | |
6505 @cindex sent messages | |
6506 | |
6507 Gnus provides a few different methods for storing the mail you send. | |
6508 The default method is to use the @dfn{archive virtual server} to store | |
6509 the mail. If you want to disable this completely, you should set | |
6510 @code{gnus-message-archive-group} to @code{nil}. | |
6511 | |
6512 @vindex gnus-message-archive-method | |
6513 @code{gnus-message-archive-method} says what virtual server Gnus is to | |
6514 use to store sent messages. It is @code{(nnfolder "archive" | |
6515 (nnfolder-directory "~/Mail/archive/"))} by default, but you can use any | |
6516 mail select method (@code{nnml}, @code{nnmbox}, etc.). However, | |
6517 @code{nnfolder} is a quite likeable select method for doing this sort of | |
6518 thing. If you don't like the default directory chosen, you could say | |
6519 something like: | |
6520 | |
6521 @lisp | |
6522 (setq gnus-message-archive-method | |
6523 '(nnfolder "archive" | |
6524 (nnfolder-inhibit-expiry t) | |
6525 (nnfolder-active-file "~/News/sent-mail/active") | |
6526 (nnfolder-directory "~/News/sent-mail/"))) | |
6527 @end lisp | |
6528 | |
6529 @vindex gnus-message-archive-group | |
6530 @cindex Gcc | |
6531 Gnus will insert @code{Gcc} headers in all outgoing messages that point | |
6532 to one or more group(s) on that server. Which group to use is | |
6533 determined by the @code{gnus-message-archive-group} variable. | |
6534 | |
6535 This variable can be: | |
6536 | |
6537 @itemize @bullet | |
6538 @item a string | |
6539 Messages will be saved in that group. | |
6540 @item a list of strings | |
6541 Messages will be saved in all those groups. | |
6542 @item an alist of regexps, functions and forms | |
6543 When a key ``matches'', the result is used. | |
6544 @end itemize | |
6545 | |
6546 Let's illustrate: | |
6547 | |
6548 Just saving to a single group called @samp{MisK}: | |
6549 @lisp | |
6550 (setq gnus-message-archive-group "MisK") | |
6551 @end lisp | |
6552 | |
6553 Saving to two groups, @samp{MisK} and @samp{safe}: | |
6554 @lisp | |
6555 (setq gnus-message-archive-group '("MisK" "safe")) | |
6556 @end lisp | |
6557 | |
6558 Save to different groups based on what group you are in: | |
6559 @lisp | |
6560 (setq gnus-message-archive-group | |
6561 '(("^alt" "sent-to-alt") | |
6562 ("mail" "sent-to-mail") | |
6563 (".*" "sent-to-misc"))) | |
6564 @end lisp | |
6565 | |
6566 More complex stuff: | |
6567 @lisp | |
6568 (setq gnus-message-archive-group | |
6569 '((if (message-news-p) | |
6570 "misc-news" | |
6571 "misc-mail"))) | |
6572 @end lisp | |
6573 | |
6574 This is the default. | |
6575 | |
6576 How about storing all news messages in one file, but storing all mail | |
6577 messages in one file per month: | |
6578 | |
6579 @lisp | |
6580 (setq gnus-message-archive-group | |
6581 '((if (message-news-p) | |
6582 "misc-news" | |
6583 (concat "mail." (format-time-string | |
6584 "%Y-%m" (current-time)))))) | |
6585 @end lisp | |
6586 | |
6587 Now, when you send a message off, it will be stored in the appropriate | |
6588 group. (If you want to disable storing for just one particular message, | |
6589 you can just remove the @code{Gcc} header that has been inserted.) The | |
6590 archive group will appear in the group buffer the next time you start | |
6591 Gnus, or the next time you press @kbd{F} in the group buffer. You can | |
6592 enter it and read the articles in it just like you'd read any other | |
6593 group. If the group gets really big and annoying, you can simply rename | |
6594 if (using @kbd{G r} in the group buffer) to something nice -- | |
6595 @samp{misc-mail-september-1995}, or whatever. New messages will | |
6596 continue to be stored in the old (now empty) group. | |
6597 | |
6598 That's the default method of archiving sent mail. Gnus also offers two | |
6599 other variables for the people who don't like the default method. In | |
6600 that case you should set @code{gnus-message-archive-group} to | |
6601 @code{nil}; this will disable archiving. | |
6602 | |
6603 XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to | |
6604 use a different value for @code{gnus-message-archive-group} there. | |
6605 | |
6606 | |
6607 @table @code | |
6608 @item gnus-outgoing-message-group | |
6609 @vindex gnus-outgoing-message-group | |
6610 All outgoing messages will be put in this group. If you want to store | |
6611 all your outgoing mail and articles in the group @samp{nnml:archive}, | |
6612 you set this variable to that value. This variable can also be a list of | |
6613 group names. | |
6614 | |
6615 If you want to have greater control over what group to put each | |
6616 message in, you can set this variable to a function that checks the | |
6617 current newsgroup name and then returns a suitable group name (or list | |
6618 of names). | |
6619 @end table | |
6620 | |
6621 | |
6622 @c @node Posting Styles | |
6623 @c @section Posting Styles | |
6624 @c @cindex posting styles | |
6625 @c @cindex styles | |
6626 @c | |
6627 @c All them variables, they make my head swim. | |
6628 @c | |
6629 @c So what if you want a different @code{Organization} and signature based | |
6630 @c on what groups you post to? And you post both from your home machine | |
6631 @c and your work machine, and you want different @code{From} lines, and so | |
6632 @c on? | |
6633 @c | |
6634 @c @vindex gnus-posting-styles | |
6635 @c One way to do stuff like that is to write clever hooks that change the | |
6636 @c variables you need to have changed. That's a bit boring, so somebody | |
6637 @c came up with the bright idea of letting the user specify these things in | |
6638 @c a handy alist. Here's an example of a @code{gnus-posting-styles} | |
6639 @c variable: | |
6640 @c | |
6641 @c @lisp | |
6642 @c ((".*" | |
6643 @c (signature . "Peace and happiness") | |
6644 @c (organization . "What me?")) | |
6645 @c ("^comp" | |
6646 @c (signature . "Death to everybody")) | |
6647 @c ("comp.emacs.i-love-it" | |
6648 @c (organization . "Emacs is it"))) | |
6649 @c @end lisp | |
6650 @c | |
6651 @c As you might surmise from this example, this alist consists of several | |
6652 @c @dfn{styles}. Each style will be applicable if the first element | |
6653 @c ``matches'', in some form or other. The entire alist will be iterated | |
6654 @c over, from the beginning towards the end, and each match will be | |
6655 @c applied, which means that attributes in later styles that match override | |
6656 @c the same attributes in earlier matching styles. So | |
6657 @c @samp{comp.programming.literate} will have the @samp{Death to everybody} | |
6658 @c signature and the @samp{What me?} @code{Organization} header. | |
6659 @c | |
6660 @c The first element in each style is called the @code{match}. If it's a | |
6661 @c string, then Gnus will try to regexp match it against the group name. | |
6662 @c If it's a function symbol, that function will be called with no | |
6663 @c arguments. If it's a variable symbol, then the variable will be | |
6664 @c referenced. If it's a list, then that list will be @code{eval}ed. In | |
6665 @c any case, if this returns a non-@code{nil} value, then the style is said | |
6666 @c to @dfn{match}. | |
6667 @c | |
6668 @c Each style may contain a arbitrary amount of @dfn{attributes}. Each | |
6669 @c attribute consists of a @var{(name . value)} pair. The attribute name | |
6670 @c can be one of @code{signature}, @code{organization} or @code{from}. The | |
6671 @c attribute name can also be a string. In that case, this will be used as | |
6672 @c a header name, and the value will be inserted in the headers of the | |
6673 @c article. | |
6674 @c | |
6675 @c The attribute value can be a string (used verbatim), a function (the | |
6676 @c return value will be used), a variable (its value will be used) or a | |
6677 @c list (it will be @code{eval}ed and the return value will be used). | |
6678 @c | |
6679 @c So here's a new example: | |
6680 @c | |
6681 @c @lisp | |
6682 @c (setq gnus-posting-styles | |
6683 @c '((".*" | |
6684 @c (signature . "~/.signature") | |
6685 @c (from . "user@@foo (user)") | |
6686 @c ("X-Home-Page" . (getenv "WWW_HOME")) | |
6687 @c (organization . "People's Front Against MWM")) | |
6688 @c ("^rec.humor" | |
6689 @c (signature . my-funny-signature-randomizer)) | |
6690 @c ((equal (system-name) "gnarly") | |
6691 @c (signature . my-quote-randomizer)) | |
6692 @c (posting-from-work-p | |
6693 @c (signature . "~/.work-signature") | |
6694 @c (from . "user@@bar.foo (user)") | |
6695 @c (organization . "Important Work, Inc")) | |
6696 @c ("^nn.+:" | |
6697 @c (signature . "~/.mail-signature")))) | |
6698 @c @end lisp | |
6699 | |
6700 @c @node Drafts | |
6701 @c @section Drafts | |
6702 @c @cindex drafts | |
6703 @c | |
6704 @c If you are writing a message (mail or news) and suddenly remember that | |
6705 @c you have a steak in the oven (or some pesto in the food processor, you | |
6706 @c craazy vegetarians), you'll probably wish there was a method to save the | |
6707 @c message you are writing so that you can continue editing it some other | |
6708 @c day, and send it when you feel its finished. | |
6709 @c | |
6710 @c Well, don't worry about it. Whenever you start composing a message of | |
6711 @c some sort using the Gnus mail and post commands, the buffer you get will | |
6712 @c automatically associate to an article in a special @dfn{draft} group. | |
6713 @c If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the | |
6714 @c article will be saved there. (Auto-save files also go to the draft | |
6715 @c group.) | |
6716 @c | |
6717 @c @cindex nndraft | |
6718 @c @vindex gnus-draft-group-directory | |
6719 @c The draft group is a special group (which is implemented as an | |
6720 @c @code{nndraft} group, if you absolutely have to know) called | |
6721 @c @samp{nndraft:drafts}. The variable @code{gnus-draft-group-directory} | |
6722 @c controls both the name of the group and the location---the leaf element | |
6723 @c in the path will be used as the name of the group. What makes this | |
6724 @c group special is that you can't tick any articles in it or mark any | |
6725 @c articles as read---all articles in the group are permanently unread. | |
6726 @c | |
6727 @c If the group doesn't exist, it will be created and you'll be subscribed | |
6728 @c to it. | |
6729 @c | |
6730 @c @findex gnus-dissociate-buffer-from-draft | |
6731 @c @kindex C-c M-d (Mail) | |
6732 @c @kindex C-c M-d (Post) | |
6733 @c @findex gnus-associate-buffer-with-draft | |
6734 @c @kindex C-c C-d (Mail) | |
6735 @c @kindex C-c C-d (Post) | |
6736 @c If you're writing some super-secret message that you later want to | |
6737 @c encode with PGP before sending, you may wish to turn the auto-saving | |
6738 @c (and association with the draft group) off. You never know who might be | |
6739 @c interested in reading all your extremely valuable and terribly horrible | |
6740 @c and interesting secrets. The @kbd{C-c M-d} | |
6741 @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you. | |
6742 @c If you change your mind and want to turn the auto-saving back on again, | |
6743 @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that. | |
6744 @c | |
6745 @c @vindex gnus-use-draft | |
6746 @c To leave association with the draft group off by default, set | |
6747 @c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default. | |
6748 @c | |
6749 @c @findex gnus-summary-send-draft | |
6750 @c @kindex S D c (Summary) | |
6751 @c When you want to continue editing the article, you simply enter the | |
6752 @c draft group and push @kbd{S D c} (@code{gnus-summary-send-draft}) to do | |
6753 @c that. You will be placed in a buffer where you left off. | |
6754 @c | |
6755 @c Rejected articles will also be put in this draft group (@pxref{Rejected | |
6756 @c Articles}). | |
6757 @c | |
6758 @c @findex gnus-summary-send-all-drafts | |
6759 @c If you have lots of rejected messages you want to post (or mail) without | |
6760 @c doing further editing, you can use the @kbd{S D a} command | |
6761 @c (@code{gnus-summary-send-all-drafts}). This command understands the | |
6762 @c process/prefix convention (@pxref{Process/Prefix}). | |
6763 @c | |
6764 @c | |
6765 @c @node Rejected Articles | |
6766 @c @section Rejected Articles | |
6767 @c @cindex rejected articles | |
6768 @c | |
6769 @c Sometimes a news server will reject an article. Perhaps the server | |
6770 @c doesn't like your face. Perhaps it just feels miserable. Perhaps | |
6771 @c @emph{there be demons}. Perhaps you have included too much cited text. | |
6772 @c Perhaps the disk is full. Perhaps the server is down. | |
6773 @c | |
6774 @c These situations are, of course, totally beyond the control of Gnus. | |
6775 @c (Gnus, of course, loves the way you look, always feels great, has angels | |
6776 @c fluttering around inside of it, doesn't care about how much cited text | |
6777 @c you include, never runs full and never goes down.) So Gnus saves these | |
6778 @c articles until some later time when the server feels better. | |
6779 @c | |
6780 @c The rejected articles will automatically be put in a special draft group | |
6781 @c (@pxref{Drafts}). When the server comes back up again, you'd then | |
6782 @c typically enter that group and send all the articles off. | |
6783 @c | |
6784 | |
6785 @node Select Methods | |
6786 @chapter Select Methods | |
6787 @cindex foreign groups | |
6788 @cindex select methods | |
6789 | |
6790 A @dfn{foreign group} is a group that is not read by the usual (or | |
6791 default) means. It could be, for instance, a group from a different | |
6792 @sc{nntp} server, it could be a virtual group, or it could be your own | |
6793 personal mail group. | |
6794 | |
6795 A foreign group (or any group, really) is specified by a @dfn{name} and | |
6796 a @dfn{select method}. To take the latter first, a select method is a | |
6797 list where the first element says what backend to use (eg. @code{nntp}, | |
6798 @code{nnspool}, @code{nnml}) and the second element is the @dfn{server | |
6799 name}. There may be additional elements in the select method, where the | |
6800 value may have special meaning for the backend in question. | |
6801 | |
6802 One could say that a select method defines a @dfn{virtual server}---so | |
6803 we do just that (@pxref{The Server Buffer}). | |
6804 | |
6805 The @dfn{name} of the group is the name the backend will recognize the | |
6806 group as. | |
6807 | |
6808 For instance, the group @samp{soc.motss} on the @sc{nntp} server | |
6809 @samp{some.where.edu} will have the name @samp{soc.motss} and select | |
6810 method @code{(nntp "some.where.edu")}. Gnus will call this group, in | |
6811 all circumstances, @samp{nntp+some.where.edu:soc.motss}, even though the | |
6812 @code{nntp} backend just knows this group as @samp{soc.motss}. | |
6813 | |
6814 The different methods all have their peculiarities, of course. | |
6815 | |
6816 @menu | |
6817 * The Server Buffer:: Making and editing virtual servers. | |
6818 * Getting News:: Reading USENET news with Gnus. | |
6819 * Getting Mail:: Reading your personal mail with Gnus. | |
6820 * Other Sources:: Reading directories, files, SOUP packets. | |
6821 * Combined Groups:: Combining groups into one group. | |
6822 @end menu | |
6823 | |
6824 | |
6825 @node The Server Buffer | |
6826 @section The Server Buffer | |
6827 | |
6828 Traditionally, a @dfn{server} is a machine or a piece of software that | |
6829 one connects to, and then requests information from. Gnus does not | |
6830 connect directly to any real servers, but does all transactions through | |
6831 one backend or other. But that's just putting one layer more between | |
6832 the actual media and Gnus, so we might just as well say that each | |
6833 backend represents a virtual server. | |
6834 | |
6835 For instance, the @code{nntp} backend may be used to connect to several | |
6836 different actual @sc{nntp} servers, or, perhaps, to many different ports | |
6837 on the same actual @sc{nntp} server. You tell Gnus which backend to | |
6838 use, and what parameters to set by specifying a @dfn{select method}. | |
6839 | |
6840 These select methods specifications can sometimes become quite | |
6841 complicated---say, for instance, that you want to read from the | |
6842 @sc{nntp} server @samp{news.funet.fi} on port number @code{13}, which | |
6843 hangs if queried for @sc{nov} headers and has a buggy select. Ahem. | |
6844 Anyways, if you had to specify that for each group that used this | |
6845 server, that would be too much work, so Gnus offers a way of naming | |
6846 select methods, which is what you do in the server buffer. | |
6847 | |
6848 To enter the server buffer, user the @kbd{^} | |
6849 (@code{gnus-group-enter-server-mode}) command in the group buffer. | |
6850 | |
6851 @menu | |
6852 * Server Buffer Format:: You can customize the look of this buffer. | |
6853 * Server Commands:: Commands to manipulate servers. | |
6854 * Example Methods:: Examples server specifications. | |
6855 * Creating a Virtual Server:: An example session. | |
6856 * Servers and Methods:: You can use server names as select methods. | |
6857 * Unavailable Servers:: Some servers you try to contact may be down. | |
6858 @end menu | |
6859 | |
6860 @vindex gnus-server-mode-hook | |
6861 @code{gnus-server-mode-hook} is run when creating the server buffer. | |
6862 | |
6863 | |
6864 @node Server Buffer Format | |
6865 @subsection Server Buffer Format | |
6866 @cindex server buffer format | |
6867 | |
6868 @vindex gnus-server-line-format | |
6869 You can change the look of the server buffer lines by changing the | |
6870 @code{gnus-server-line-format} variable. This is a @code{format}-like | |
6871 variable, with some simple extensions: | |
6872 | |
6873 @table @samp | |
6874 | |
6875 @item h | |
6876 How the news is fetched---the backend name. | |
6877 | |
6878 @item n | |
6879 The name of this server. | |
6880 | |
6881 @item w | |
6882 Where the news is to be fetched from---the address. | |
6883 | |
6884 @item s | |
6885 The opened/closed/denied status of the server. | |
6886 @end table | |
6887 | |
6888 @vindex gnus-server-mode-line-format | |
6889 The mode line can also be customized by using the | |
6890 @code{gnus-server-mode-line-format} variable. The following specs are | |
6891 understood: | |
6892 | |
6893 @table @samp | |
6894 @item S | |
6895 Server name. | |
6896 | |
6897 @item M | |
6898 Server method. | |
6899 @end table | |
6900 | |
6901 Also @pxref{Formatting Variables}. | |
6902 | |
6903 | |
6904 @node Server Commands | |
6905 @subsection Server Commands | |
6906 @cindex server commands | |
6907 | |
6908 @table @kbd | |
6909 | |
6910 @item a | |
6911 @kindex a (Server) | |
6912 @findex gnus-server-add-server | |
6913 Add a new server (@code{gnus-server-add-server}). | |
6914 | |
6915 @item e | |
6916 @kindex e (Server) | |
6917 @findex gnus-server-edit-server | |
6918 Edit a server (@code{gnus-server-edit-server}). | |
6919 | |
6920 @item SPACE | |
6921 @kindex SPACE (Server) | |
6922 @findex gnus-server-read-server | |
6923 Browse the current server (@code{gnus-server-read-server}). | |
6924 | |
6925 @item q | |
6926 @kindex q (Server) | |
6927 @findex gnus-server-exit | |
6928 Return to the group buffer (@code{gnus-server-exit}). | |
6929 | |
6930 @item k | |
6931 @kindex k (Server) | |
6932 @findex gnus-server-kill-server | |
6933 Kill the current server (@code{gnus-server-kill-server}). | |
6934 | |
6935 @item y | |
6936 @kindex y (Server) | |
6937 @findex gnus-server-yank-server | |
6938 Yank the previously killed server (@code{gnus-server-yank-server}). | |
6939 | |
6940 @item c | |
6941 @kindex c (Server) | |
6942 @findex gnus-server-copy-server | |
6943 Copy the current server (@code{gnus-server-copy-server}). | |
6944 | |
6945 @item l | |
6946 @kindex l (Server) | |
6947 @findex gnus-server-list-servers | |
6948 List all servers (@code{gnus-server-list-servers}). | |
6949 | |
6950 @end table | |
6951 | |
6952 | |
6953 @node Example Methods | |
6954 @subsection Example Methods | |
6955 | |
6956 Most select methods are pretty simple and self-explanatory: | |
6957 | |
6958 @lisp | |
6959 (nntp "news.funet.fi") | |
6960 @end lisp | |
6961 | |
6962 Reading directly from the spool is even simpler: | |
6963 | |
6964 @lisp | |
6965 (nnspool "") | |
6966 @end lisp | |
6967 | |
6968 As you can see, the first element in a select method is the name of the | |
6969 backend, and the second is the @dfn{address}, or @dfn{name}, if you | |
6970 will. | |
6971 | |
6972 After these two elements, there may be a arbitrary number of | |
6973 @var{(variable form)} pairs. | |
6974 | |
6975 To go back to the first example---imagine that you want to read from | |
6976 port @code{15} from that machine. This is what the select method should | |
6977 look like then: | |
6978 | |
6979 @lisp | |
6980 (nntp "news.funet.fi" (nntp-port-number 15)) | |
6981 @end lisp | |
6982 | |
6983 You should read the documentation to each backend to find out what | |
6984 variables are relevant, but here's an @code{nnmh} example. | |
6985 | |
6986 @code{nnmh} is a mail backend that reads a spool-like structure. Say | |
6987 you have two structures that you wish to access: One is your private | |
6988 mail spool, and the other is a public one. Here's the possible spec for | |
6989 you private mail: | |
6990 | |
6991 @lisp | |
6992 (nnmh "private" (nnmh-directory "~/private/mail/")) | |
6993 @end lisp | |
6994 | |
6995 (This server is then called @samp{private}, but you may have guessed | |
6996 that.) | |
6997 | |
6998 Here's the method for a public spool: | |
6999 | |
7000 @lisp | |
7001 (nnmh "public" | |
7002 (nnmh-directory "/usr/information/spool/") | |
7003 (nnmh-get-new-mail nil)) | |
7004 @end lisp | |
7005 | |
7006 | |
7007 @node Creating a Virtual Server | |
7008 @subsection Creating a Virtual Server | |
7009 | |
7010 If you're saving lots of articles in the cache by using persistent | |
7011 articles, you may want to create a virtual server to read the cache. | |
7012 | |
7013 First you need to add a new server. The @kbd{a} command does that. It | |
7014 would probably be best to use @code{nnspool} to read the cache. You | |
7015 could also use @code{nnml} or @code{nnmh}, though. | |
7016 | |
7017 Type @kbd{a nnspool RET cache RET}. | |
7018 | |
7019 You should now have a brand new @code{nnspool} virtual server called | |
7020 @samp{cache}. You now need to edit it to have the right definitions. | |
7021 Type @kbd{e} to edit the server. You'll be entered into a buffer that | |
7022 will contain the following: | |
7023 | |
7024 @lisp | |
7025 (nnspool "cache") | |
7026 @end lisp | |
7027 | |
7028 Change that to: | |
7029 | |
7030 @lisp | |
7031 (nnspool "cache" | |
7032 (nnspool-spool-directory "~/News/cache/") | |
7033 (nnspool-nov-directory "~/News/cache/") | |
7034 (nnspool-active-file "~/News/cache/active")) | |
7035 @end lisp | |
7036 | |
7037 Type @kbd{C-c C-c} to return to the server buffer. If you now press | |
7038 @kbd{RET} over this virtual server, you should be entered into a browse | |
7039 buffer, and you should be able to enter any of the groups displayed. | |
7040 | |
7041 | |
7042 @node Servers and Methods | |
7043 @subsection Servers and Methods | |
7044 | |
7045 Wherever you would normally use a select method | |
7046 (eg. @code{gnus-secondary-select-method}, in the group select method, | |
7047 when browsing a foreign server) you can use a virtual server name | |
7048 instead. This could potentially save lots of typing. And it's nice all | |
7049 over. | |
7050 | |
7051 | |
7052 @node Unavailable Servers | |
7053 @subsection Unavailable Servers | |
7054 | |
7055 If a server seems to be unreachable, Gnus will mark that server as | |
7056 @code{denied}. That means that any subsequent attempt to make contact | |
7057 with that server will just be ignored. ``It can't be opened,'' Gnus | |
7058 will tell you, without making the least effort to see whether that is | |
7059 actually the case or not. | |
7060 | |
7061 That might seem quite naughty, but it does make sense most of the time. | |
7062 Let's say you have 10 groups subscribed to the server | |
7063 @samp{nepholococcygia.com}. This server is located somewhere quite far | |
7064 away from you, the machine is quite, so it takes 1 minute just to find | |
7065 out that it refuses connection from you today. If Gnus were to attempt | |
7066 to do that 10 times, you'd be quite annoyed, so Gnus won't attempt to do | |
7067 that. Once it has gotten a single ``connection refused'', it will | |
7068 regard that server as ``down''. | |
7069 | |
7070 So, what happens if the machine was only feeling unwell temporarily? | |
7071 How do you test to see whether the machine has come up again? | |
7072 | |
7073 You jump to the server buffer (@pxref{The Server Buffer}) and poke it | |
7074 with the following commands: | |
7075 | |
7076 @table @kbd | |
7077 | |
7078 @item O | |
7079 @kindex O (Server) | |
7080 @findex gnus-server-open-server | |
7081 Try to establish connection to the server on the current line | |
7082 (@code{gnus-server-open-server}). | |
7083 | |
7084 @item C | |
7085 @kindex C (Server) | |
7086 @findex gnus-server-close-server | |
7087 Close the connection (if any) to the server | |
7088 (@code{gnus-server-close-server}). | |
7089 | |
7090 @item D | |
7091 @kindex D (Server) | |
7092 @findex gnus-server-deny-server | |
7093 Mark the current server as unreachable | |
7094 (@code{gnus-server-deny-server}). | |
7095 | |
7096 @item R | |
7097 @kindex R (Server) | |
7098 @findex gnus-server-remove-denials | |
7099 Remove all marks to whether Gnus was denied connection from all servers | |
7100 (@code{gnus-server-remove-denials}). | |
7101 | |
7102 @end table | |
7103 | |
7104 | |
7105 @node Getting News | |
7106 @section Getting News | |
7107 @cindex reading news | |
7108 @cindex news backends | |
7109 | |
7110 A newsreader is normally used for reading news. Gnus currently provides | |
7111 only two methods of getting news -- it can read from an @sc{nntp} | |
7112 server, or it can read from a local spool. | |
7113 | |
7114 @menu | |
7115 * NNTP:: Reading news from an @sc{nntp} server. | |
7116 * News Spool:: Reading news from the local spool. | |
7117 @end menu | |
7118 | |
7119 | |
7120 @node NNTP | |
7121 @subsection @sc{nntp} | |
7122 @cindex nntp | |
7123 | |
7124 Subscribing to a foreign group from an @sc{nntp} server is rather easy. | |
7125 You just specify @code{nntp} as method and the address of the @sc{nntp} | |
7126 server as the, uhm, address. | |
7127 | |
7128 If the @sc{nntp} server is located at a non-standard port, setting the | |
7129 third element of the select method to this port number should allow you | |
7130 to connect to the right port. You'll have to edit the group info for | |
7131 that (@pxref{Foreign Groups}). | |
7132 | |
7133 The name of the foreign group can be the same as a native group. In | |
7134 fact, you can subscribe to the same group from as many different servers | |
7135 you feel like. There will be no name collisions. | |
7136 | |
7137 The following variables can be used to create a virtual @code{nntp} | |
7138 server: | |
7139 | |
7140 @table @code | |
7141 | |
7142 @item nntp-server-opened-hook | |
7143 @vindex nntp-server-opened-hook | |
7144 @cindex @sc{mode reader} | |
7145 @cindex authinfo | |
7146 @cindex authentification | |
7147 @cindex nntp authentification | |
7148 @findex nntp-send-authinfo | |
7149 @findex nntp-send-mode-reader | |
7150 @code{nntp-server-opened-hook} is run after a connection has been made. | |
7151 It can be used to send commands to the @sc{nntp} server after it has | |
7152 been contacted. By default is sends the command @code{MODE READER} to | |
7153 the server with the @code{nntp-send-mode-reader} function. Another | |
7154 popular function is @code{nntp-send-authinfo}, which will prompt you for | |
7155 an @sc{nntp} password and stuff. | |
7156 | |
7157 @item nntp-server-action-alist | |
7158 @vindex nntp-server-action-alist | |
7159 This is an list of regexps to match on server types and actions to be | |
7160 taken when matches are made. For instance, if you want Gnus to beep | |
7161 every time you connect to innd, you could say something like: | |
7162 | |
7163 @lisp | |
7164 (setq nntp-server-action-alist | |
7165 '(("innd" (ding)))) | |
7166 @end lisp | |
7167 | |
7168 You probably don't want to do that, though. | |
7169 | |
7170 The default value is | |
7171 | |
7172 @lisp | |
7173 '(("nntpd 1\\.5\\.11t" | |
7174 (remove-hook 'nntp-server-opened-hook nntp-send-mode-reader))) | |
7175 @end lisp | |
7176 | |
7177 This ensures that Gnus doesn't send the @code{MODE READER} command to | |
7178 nntpd 1.5.11t, since that command chokes that server, I've been told. | |
7179 | |
7180 @item nntp-maximum-request | |
7181 @vindex nntp-maximum-request | |
7182 If the @sc{nntp} server doesn't support @sc{nov} headers, this backend | |
7183 will collect headers by sending a series of @code{head} commands. To | |
7184 speed things up, the backend sends lots of these commands without | |
7185 waiting for reply, and then reads all the replies. This is controlled | |
7186 by the @code{nntp-maximum-request} variable, and is 400 by default. If | |
7187 your network is buggy, you should set this to 1. | |
7188 | |
7189 @item nntp-connection-timeout | |
7190 @vindex nntp-connection-timeout | |
7191 If you have lots of foreign @code{nntp} groups that you connect to | |
7192 regularly, you're sure to have problems with @sc{nntp} servers not | |
7193 responding properly, or being too loaded to reply within reasonable | |
7194 time. This is can lead to awkward problems, which can be helped | |
7195 somewhat by setting @code{nntp-connection-timeout}. This is an integer | |
7196 that says how many seconds the @code{nntp} backend should wait for a | |
7197 connection before giving up. If it is @code{nil}, which is the default, | |
7198 no timeouts are done. | |
7199 | |
7200 @item nntp-command-timeout | |
7201 @vindex nntp-command-timeout | |
7202 @cindex PPP connections | |
7203 @cindex dynamic IP addresses | |
7204 If you're running Gnus on a machine that has a dynamically assigned | |
7205 address, Gnus may become confused. If the address of your machine | |
7206 changes after connecting to the @sc{nntp} server, Gnus will simply sit | |
7207 waiting forever for replies from the server. To help with this | |
7208 unfortunate problem, you can set this command to a number. Gnus will | |
7209 then, if it sits waiting longer than that number of seconds for a reply | |
7210 from the server, shut down the connection, start a new one, and resend | |
7211 the command. This should hopefully be transparent to the user. A | |
7212 likely number is 30 seconds. | |
7213 | |
7214 @item nntp-retry-on-break | |
7215 @vindex nntp-retry-on-break | |
7216 If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus | |
7217 hangs. This will have much the same effect as the command timeout | |
7218 described above. | |
7219 | |
7220 @item nntp-server-hook | |
7221 @vindex nntp-server-hook | |
7222 This hook is run as the last step when connecting to an @sc{nntp} | |
7223 server. | |
7224 | |
7225 @findex nntp-open-rlogin | |
7226 @findex nntp-open-network-stream | |
7227 @item nntp-open-server-function | |
7228 @vindex nntp-open-server-function | |
7229 This function is used to connect to the remote system. Two pre-made | |
7230 functions are @code{nntp-open-network-stream}, which is the default, and | |
7231 simply connects to some port or other on the remote system. The other | |
7232 is @code{nntp-open-rlogin}, which does an rlogin on the remote system, | |
7233 and then does a telnet to the @sc{nntp} server available there. | |
7234 | |
7235 @item nntp-rlogin-parameters | |
7236 @vindex nntp-rlogin-parameters | |
7237 If you use @code{nntp-open-rlogin} as the | |
7238 @code{nntp-open-server-function}, this list will be used as the | |
7239 parameter list given to @code{rsh}. | |
7240 | |
7241 @item nntp-end-of-line | |
7242 @vindex nntp-end-of-line | |
7243 String to use as end-of-line markers when talking to the @sc{nntp} | |
7244 server. This is @samp{\r\n} by default, but should be @samp{\n} when | |
7245 using @code{rlogin} to talk to the server. | |
7246 | |
7247 @item nntp-rlogin-user-name | |
7248 @vindex nntp-rlogin-user-name | |
7249 User name on the remote system when using the @code{rlogin} connect | |
7250 function. | |
7251 | |
7252 @item nntp-address | |
7253 @vindex nntp-address | |
7254 The address of the remote system running the @sc{nntp} server. | |
7255 | |
7256 @item nntp-port-number | |
7257 @vindex nntp-port-number | |
7258 Port number to connect to when using the @code{nntp-open-network-stream} | |
7259 connect function. | |
7260 | |
7261 @item nntp-buggy-select | |
7262 @vindex nntp-buggy-select | |
7263 Set this to non-@code{nil} if your select routine is buggy. | |
7264 | |
7265 @item nntp-nov-is-evil | |
7266 @vindex nntp-nov-is-evil | |
7267 If the @sc{nntp} server does not support @sc{nov}, you could set this | |
7268 variable to @code{t}, but @code{nntp} usually checks whether @sc{nov} | |
7269 can be used automatically. | |
7270 | |
7271 @item nntp-xover-commands | |
7272 @vindex nntp-xover-commands | |
7273 @cindex nov | |
7274 @cindex XOVER | |
7275 List of strings that are used as commands to fetch @sc{nov} lines from a | |
7276 server. The default value of this variable is @code{("XOVER" | |
7277 "XOVERVIEW")}. | |
7278 | |
7279 @item nntp-nov-gap | |
7280 @vindex nntp-nov-gap | |
7281 @code{nntp} normally sends just one big request for @sc{nov} lines to | |
7282 the server. The server responds with one huge list of lines. However, | |
7283 if you have read articles 2-5000 in the group, and only want to read | |
7284 article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov} | |
7285 lines that you do not want, and will not use. This variable says how | |
7286 big a gap between two consecutive articles is allowed to be before the | |
7287 @code{XOVER} request is split into several request. Note that if your | |
7288 network is fast, setting this variable to a really small number means | |
7289 that fetching will probably be slower. If this variable is @code{nil}, | |
7290 @code{nntp} will never split requests. | |
7291 | |
7292 @item nntp-prepare-server-hook | |
7293 @vindex nntp-prepare-server-hook | |
7294 A hook run before attempting to connect to an @sc{nntp} server. | |
7295 | |
7296 @item nntp-async-number | |
7297 @vindex nntp-async-number | |
7298 How many articles should be pre-fetched when in asynchronous mode. If | |
7299 this variable is @code{t}, @code{nntp} will pre-fetch all the articles | |
7300 that it can without bound. If it is @code{nil}, no pre-fetching will be | |
7301 made. | |
7302 | |
7303 @item nntp-warn-about-losing-connection | |
7304 @vindex nntp-warn-about-losing-connection | |
7305 If this variable is non-@code{nil}, some noise will be made when a | |
7306 server closes connection. | |
7307 | |
7308 @end table | |
7309 | |
7310 | |
7311 @node News Spool | |
7312 @subsection News Spool | |
7313 @cindex nnspool | |
7314 @cindex news spool | |
7315 | |
7316 Subscribing to a foreign group from the local spool is extremely easy, | |
7317 and might be useful, for instance, to speed up reading groups like | |
7318 @samp{alt.binaries.pictures.furniture}. | |
7319 | |
7320 Anyways, you just specify @code{nnspool} as the method and @samp{} (or | |
7321 anything else) as the address. | |
7322 | |
7323 If you have access to a local spool, you should probably use that as the | |
7324 native select method (@pxref{Finding the News}). It is normally faster | |
7325 than using an @code{nntp} select method, but might not be. It depends. | |
7326 You just have to try to find out what's best at your site. | |
7327 | |
7328 @table @code | |
7329 | |
7330 @item nnspool-inews-program | |
7331 @vindex nnspool-inews-program | |
7332 Program used to post an article. | |
7333 | |
7334 @item nnspool-inews-switches | |
7335 @vindex nnspool-inews-switches | |
7336 Parameters given to the inews program when posting an article. | |
7337 | |
7338 @item nnspool-spool-directory | |
7339 @vindex nnspool-spool-directory | |
7340 Where @code{nnspool} looks for the articles. This is normally | |
7341 @file{/usr/spool/news/}. | |
7342 | |
7343 @item nnspool-nov-directory | |
7344 @vindex nnspool-nov-directory | |
7345 Where @code{nnspool} will look for @sc{nov} files. This is normally | |
7346 @file{/usr/spool/news/over.view/}. | |
7347 | |
7348 @item nnspool-lib-dir | |
7349 @vindex nnspool-lib-dir | |
7350 Where the news lib dir is (@file{/usr/lib/news/} by default). | |
7351 | |
7352 @item nnspool-active-file | |
7353 @vindex nnspool-active-file | |
7354 The path of the active file. | |
7355 | |
7356 @item nnspool-newsgroups-file | |
7357 @vindex nnspool-newsgroups-file | |
7358 The path of the group descriptions file. | |
7359 | |
7360 @item nnspool-history-file | |
7361 @vindex nnspool-history-file | |
7362 The path of the news history file. | |
7363 | |
7364 @item nnspool-active-times-file | |
7365 @vindex nnspool-active-times-file | |
7366 The path of the active date file. | |
7367 | |
7368 @item nnspool-nov-is-evil | |
7369 @vindex nnspool-nov-is-evil | |
7370 If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files | |
7371 that it finds. | |
7372 | |
7373 @item nnspool-sift-nov-with-sed | |
7374 @vindex nnspool-sift-nov-with-sed | |
7375 @cindex sed | |
7376 If non-@code{nil}, which is the default, use @code{sed} to get the | |
7377 relevant portion from the overview file. If nil, @code{nnspool} will | |
7378 load the entire file into a buffer and process it there. | |
7379 | |
7380 @end table | |
7381 | |
7382 | |
7383 @node Getting Mail | |
7384 @section Getting Mail | |
7385 @cindex reading mail | |
7386 @cindex mail | |
7387 | |
7388 Reading mail with a newsreader---isn't that just plain WeIrD? But of | |
7389 course. | |
7390 | |
7391 @menu | |
7392 * Getting Started Reading Mail:: A simple cookbook example. | |
7393 * Splitting Mail:: How to create mail groups. | |
7394 * Mail Backend Variables:: Variables for customizing mail handling. | |
7395 * Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail. | |
7396 * Mail and Procmail:: Reading mail groups that procmail create. | |
7397 * Incorporating Old Mail:: What about the old mail you have? | |
7398 * Expiring Mail:: Getting rid of unwanted mail. | |
7399 * Duplicates:: Dealing with duplicated mail. | |
7400 * Not Reading Mail:: Using mail backends for reading other files. | |
7401 * Choosing a Mail Backend:: Gnus can read a variety of mail formats. | |
7402 @end menu | |
7403 | |
7404 | |
7405 @node Getting Started Reading Mail | |
7406 @subsection Getting Started Reading Mail | |
7407 | |
7408 It's quite easy to use Gnus to read your new mail. You just plonk the | |
7409 mail backend of your choice into @code{gnus-secondary-select-methods}, | |
7410 and things will happen automatically. | |
7411 | |
7412 For instance, if you want to use @code{nnml} (which is a one file per | |
7413 mail backend), you could put the following in your @file{.gnus} file: | |
7414 | |
7415 @lisp | |
7416 (setq gnus-secondary-select-methods | |
7417 '((nnml "private"))) | |
7418 @end lisp | |
7419 | |
7420 Now, the next time you start Gnus, this backend will be queried for new | |
7421 articles, and it will move all the messages in your spool file to its | |
7422 directory, which is @code{~/Mail/} by default. The new group that will | |
7423 be created (@samp{mail.misc}) will be subscribed, and you can read it | |
7424 like any other group. | |
7425 | |
7426 You will probably want to split the mail into several groups, though: | |
7427 | |
7428 @lisp | |
7429 (setq nnmail-split-methods | |
7430 '(("junk" "^From:.*Lars Ingebrigtsen") | |
7431 ("crazy" "^Subject:.*die\\|^Organization:.*flabby") | |
7432 ("other" ""))) | |
7433 @end lisp | |
7434 | |
7435 This will result in three new mail groups being created: | |
7436 @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the | |
7437 mail that doesn't fit into the first two groups will be placed in the | |
7438 latter group. | |
7439 | |
7440 This should be sufficient for reading mail with Gnus. You might want to | |
7441 give the other sections in this part of the manual a perusal, though, | |
7442 especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}. | |
7443 | |
7444 | |
7445 @node Splitting Mail | |
7446 @subsection Splitting Mail | |
7447 @cindex splitting mail | |
7448 @cindex mail splitting | |
7449 | |
7450 @vindex nnmail-split-methods | |
7451 The @code{nnmail-split-methods} variable says how the incoming mail is | |
7452 to be split into groups. | |
7453 | |
7454 @lisp | |
7455 (setq nnmail-split-methods | |
7456 '(("mail.junk" "^From:.*Lars Ingebrigtsen") | |
7457 ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby") | |
7458 ("mail.other" ""))) | |
7459 @end lisp | |
7460 | |
7461 This variable is a list of lists, where the first element of each of | |
7462 these lists is the name of the mail group (they do not have to be called | |
7463 something beginning with @samp{mail}, by the way), and the second | |
7464 element is a regular expression used on the header of each mail to | |
7465 determine if it belongs in this mail group. | |
7466 | |
7467 The second element can also be a function. In that case, it will be | |
7468 called narrowed to the headers with the first element of the rule as the | |
7469 argument. It should return a non-@code{nil} value if it thinks that the | |
7470 mail belongs in that group. | |
7471 | |
7472 The last of these groups should always be a general one, and the regular | |
7473 expression should @emph{always} be @samp{} so that it matches any | |
7474 mails that haven't been matched by any of the other regexps. | |
7475 | |
7476 If you like to tinker with this yourself, you can set this variable to a | |
7477 function of your choice. This function will be called without any | |
7478 arguments in a buffer narrowed to the headers of an incoming mail | |
7479 message. The function should return a list of groups names that it | |
7480 thinks should carry this mail message. | |
7481 | |
7482 Note that the mail backends are free to maul the poor, innocent | |
7483 incoming headers all they want to. They all add @code{Lines} headers; | |
7484 some add @code{X-Gnus-Group} headers; most rename the Unix mbox | |
7485 @code{From<SPACE>} line to something else. | |
7486 | |
7487 @vindex nnmail-crosspost | |
7488 The mail backends all support cross-posting. If several regexps match, | |
7489 the mail will be ``cross-posted'' to all those groups. | |
7490 @code{nnmail-crosspost} says whether to use this mechanism or not. Note | |
7491 that no articles are crossposted to the general (@samp{}) group. | |
7492 | |
7493 @vindex nnmail-crosspost-link-function | |
7494 @cindex crosspost | |
7495 @cindex links | |
7496 @code{nnmh} and @code{nnml} makes crossposts by creating hard links to | |
7497 the crossposted articles. However, not all files systems support hard | |
7498 links. If that's the case for you, set | |
7499 @code{nnmail-crosspost-link-function} to @code{copy-file}. (This | |
7500 variable is @code{add-name-to-file} by default.) | |
7501 | |
7502 Gnus gives you all the opportunity you could possibly want for shooting | |
7503 yourself in the foot. Let's say you create a group that will contain | |
7504 all the mail you get from your boss. And then you accidentally | |
7505 unsubscribe from the group. Gnus will still put all the mail from your | |
7506 boss in the unsubscribed group, and so, when your boss mails you ``Have | |
7507 that report ready by Monday or you're fired!'', you'll never see it and, | |
7508 come Tuesday, you'll still believe that you're gainfully employed while | |
7509 you really should be out collecting empty bottles to save up for next | |
7510 month's rent money. | |
7511 | |
7512 | |
7513 @node Mail Backend Variables | |
7514 @subsection Mail Backend Variables | |
7515 | |
7516 These variables are (for the most part) pertinent to all the various | |
7517 mail backends. | |
7518 | |
7519 @table @code | |
7520 @vindex nnmail-read-incoming-hook | |
7521 @item nnmail-read-incoming-hook | |
7522 The mail backends all call this hook after reading new mail. You can | |
7523 use this hook to notify any mail watch programs, if you want to. | |
7524 | |
7525 @vindex nnmail-spool-file | |
7526 @item nnmail-spool-file | |
7527 @cindex POP mail | |
7528 @cindex MAILHOST | |
7529 @cindex movemail | |
7530 @vindex nnmail-pop-password | |
7531 @vindex nnmail-pop-password-required | |
7532 The backends will look for new mail in this file. If this variable is | |
7533 @code{nil}, the mail backends will never attempt to fetch mail by | |
7534 themselves. If you are using a POP mail server and your name is | |
7535 @samp{larsi}, you should set this variable to @samp{po:larsi}. If | |
7536 your name is not @samp{larsi}, you should probably modify that | |
7537 slightly, but you may have guessed that already, you smart & handsome | |
7538 devil! You can also set this variable to @code{pop}, and Gnus will try | |
7539 to figure out the POP mail string by itself. In any case, Gnus will | |
7540 call @code{movemail} which will contact the POP server named in the | |
7541 @code{MAILHOST} environment variable. If the POP server needs a | |
7542 password, you can either set @code{nnmail-pop-password-required} to | |
7543 @code{t} and be prompted for the password, or set | |
7544 @code{nnmail-pop-password} to the password itself. | |
7545 | |
7546 When you use a mail backend, Gnus will slurp all your mail from your | |
7547 inbox and plonk it down in your home directory. Gnus doesn't move any | |
7548 mail if you're not using a mail backend---you have to do a lot of magic | |
7549 invocations first. At the time when you have finished drawing the | |
7550 pentagram, lightened the candles, and sacrificed the goat, you really | |
7551 shouldn't be too surprised when Gnus moves your mail. | |
7552 | |
7553 @vindex nnmail-use-procmail | |
7554 @vindex nnmail-procmail-suffix | |
7555 @item nnmail-use-procmail | |
7556 If non-@code{nil}, the mail backends will look in | |
7557 @code{nnmail-procmail-directory} for incoming mail. All the files in | |
7558 that directory that have names ending in @code{nnmail-procmail-suffix} | |
7559 will be considered incoming mailboxes, and will be searched for new | |
7560 mail. | |
7561 | |
7562 @vindex nnmail-crash-box | |
7563 @item nnmail-crash-box | |
7564 When the mail backends read a spool file, it is first moved to this | |
7565 file, which is @file{~/.gnus-crash-box} by default. If this file | |
7566 already exists, it will always be read (and incorporated) before any | |
7567 other spool files. | |
7568 | |
7569 @vindex nnmail-prepare-incoming-hook | |
7570 @item nnmail-prepare-incoming-hook | |
7571 This is run in a buffer that holds all the new incoming mail, and can be | |
7572 used for, well, anything, really. | |
7573 | |
7574 @vindex nnmail-pre-get-new-mail-hook | |
7575 @vindex nnmail-post-get-new-mail-hook | |
7576 @item nnmail-pre-get-new-mail-hook | |
7577 @itemx nnmail-post-get-new-mail-hook | |
7578 These are two useful hooks executed when treating new incoming | |
7579 mail---@code{nnmail-pre-get-new-mail-hook} (is called just before | |
7580 starting to handle the new mail) and | |
7581 @code{nnmail-post-get-new-mail-hook} (is called when the mail handling | |
7582 is done). Here's and example of using these two hooks to change the | |
7583 default file modes the new mail files get: | |
7584 | |
7585 @lisp | |
7586 (add-hook 'gnus-pre-get-new-mail-hook | |
7587 (lambda () (set-default-file-modes 511))) | |
7588 | |
7589 (add-hook 'gnus-post-get-new-mail-hook | |
7590 (lambda () (set-default-file-modes 551))) | |
7591 @end lisp | |
7592 | |
7593 @item nnmail-tmp-directory | |
7594 @vindex nnmail-tmp-directory | |
7595 This variable says where to move the incoming mail to while processing | |
7596 it. This is usually done in the same directory that the mail backend | |
7597 inhabits (i.e., @file{~/Mail/}), but if this variable is non-@code{nil}, | |
7598 it will be used instead. | |
7599 | |
7600 @item nnmail-movemail-program | |
7601 @vindex nnmail-movemail-program | |
7602 This program is executed to move mail from the user's inbox to her home | |
7603 directory. The default is @samp{movemail}. | |
7604 | |
7605 @item nnmail-delete-incoming | |
7606 @vindex nnmail-delete-incoming | |
7607 @cindex incoming mail files | |
7608 @cindex deleting incoming files | |
7609 If non-@code{nil}, the mail backends will delete the temporary incoming | |
7610 file after splitting mail into the proper groups. This is @code{nil} by | |
7611 default for reasons of security. | |
7612 | |
7613 @item nnmail-use-long-file-names | |
7614 @vindex nnmail-use-long-file-names | |
7615 If non-@code{nil}, the mail backends will use long file and directory | |
7616 names. Groups like @samp{mail.misc} will end up in directories like | |
7617 @file{mail.misc/}. If it is @code{nil}, the same group will end up in | |
7618 @file{mail/misc/}. | |
7619 | |
7620 @item nnmail-delete-file-function | |
7621 @vindex nnmail-delete-file-function | |
7622 @findex delete-file | |
7623 Function called to delete files. It is @code{delete-file} by default. | |
7624 | |
7625 @end table | |
7626 | |
7627 | |
7628 @node Fancy Mail Splitting | |
7629 @subsection Fancy Mail Splitting | |
7630 @cindex mail splitting | |
7631 @cindex fancy mail splitting | |
7632 | |
7633 @vindex nnmail-split-fancy | |
7634 @findex nnmail-split-fancy | |
7635 If the rather simple, standard method for specifying how to split mail | |
7636 doesn't allow you to do what you want, you can set | |
7637 @code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can | |
7638 play with the @code{nnmail-split-fancy} variable. | |
7639 | |
7640 Let's look at an example value of this variable first: | |
7641 | |
7642 @lisp | |
7643 ;; Messages from the mailer daemon are not crossposted to any of | |
7644 ;; the ordinary groups. Warnings are put in a separate group | |
7645 ;; from real errors. | |
7646 (| ("from" mail (| ("subject" "warn.*" "mail.warning") | |
7647 "mail.misc")) | |
7648 ;; Non-error messages are crossposted to all relevant | |
7649 ;; groups, but we don't crosspost between the group for the | |
7650 ;; (ding) list and the group for other (ding) related mail. | |
7651 (& (| (any "ding@@ifi\\.uio\\.no" "ding.list") | |
7652 ("subject" "ding" "ding.misc")) | |
7653 ;; Other mailing lists... | |
7654 (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") | |
7655 (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") | |
7656 ;; People... | |
7657 (any "larsi@@ifi\\.uio\\.no" "people.Lars Magne Ingebrigtsen")) | |
7658 ;; Unmatched mail goes to the catch all group. | |
7659 "misc.misc"))") | |
7660 @end lisp | |
7661 | |
7662 This variable has the format of a @dfn{split}. A split is a (possibly) | |
7663 recursive structure where each split may contain other splits. Here are | |
7664 the four possible split syntaxes: | |
7665 | |
7666 @table @dfn | |
7667 | |
7668 @item GROUP | |
7669 If the split is a string, that will be taken as a group name. | |
7670 | |
7671 @item (FIELD VALUE SPLIT) | |
7672 If the split is a list, and the first element is a string, then that | |
7673 means that if header FIELD (a regexp) contains VALUE (also a regexp), | |
7674 then store the message as specified by SPLIT. | |
7675 | |
7676 @item (| SPLIT...) | |
7677 If the split is a list, and the first element is @code{|} (vertical | |
7678 bar), then process each SPLIT until one of them matches. A SPLIT is | |
7679 said to match if it will cause the mail message to be stored in one or | |
7680 more groups. | |
7681 | |
7682 @item (& SPLIT...) | |
7683 If the split is a list, and the first element is @code{&}, then process | |
7684 all SPLITs in the list. | |
7685 @end table | |
7686 | |
7687 In these splits, FIELD must match a complete field name. VALUE must | |
7688 match a complete word according to the fundamental mode syntax table. | |
7689 You can use @code{.*} in the regexps to match partial field names or | |
7690 words. | |
7691 | |
7692 @vindex nnmail-split-abbrev-alist | |
7693 FIELD and VALUE can also be lisp symbols, in that case they are expanded | |
7694 as specified by the variable @code{nnmail-split-abbrev-alist}. This is | |
7695 an alist of cons cells, where the car of the cells contains the key, and | |
7696 the cdr contains a string. | |
7697 | |
7698 @vindex nnmail-split-fancy-syntax-table | |
7699 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect | |
7700 when all this splitting is performed. | |
7701 | |
7702 | |
7703 @node Mail and Procmail | |
7704 @subsection Mail and Procmail | |
7705 @cindex procmail | |
7706 | |
7707 @cindex slocal | |
7708 @cindex elm | |
7709 Many people use @code{procmail} (or some other mail filter program or | |
7710 external delivery agent---@code{slocal}, @code{elm}, etc) to split | |
7711 incoming mail into groups. If you do that, you should set | |
7712 @code{nnmail-spool-file} to @code{procmail} to ensure that the mail | |
7713 backends never ever try to fetch mail by themselves. | |
7714 | |
7715 This also means that you probably don't want to set | |
7716 @code{nnmail-split-methods} either, which has some, perhaps, unexpected | |
7717 side effects. | |
7718 | |
7719 When a mail backend is queried for what groups it carries, it replies | |
7720 with the contents of that variable, along with any groups it has figured | |
7721 out that it carries by other means. None of the backends (except | |
7722 @code{nnmh}) actually go out to the disk and check what groups actually | |
7723 exist. (It's not trivial to distinguish between what the user thinks is | |
7724 a basis for a newsgroup and what is just a plain old file or directory.) | |
7725 | |
7726 This means that you have to tell Gnus (and the backends) what groups | |
7727 exist by hand. | |
7728 | |
7729 Let's take the @code{nnmh} backend as an example. | |
7730 | |
7731 The folders are located in @code{nnmh-directory}, say, @file{~/Mail/}. | |
7732 There are three folders, @file{foo}, @file{bar} and @file{mail.baz}. | |
7733 | |
7734 Go to the group buffer and type @kbd{G m}. When prompted, answer | |
7735 @samp{foo} for the name and @samp{nnmh} for the method. Repeat | |
7736 twice for the two other groups, @samp{bar} and @samp{mail.baz}. Be sure | |
7737 to include all your mail groups. | |
7738 | |
7739 That's it. You are now set to read your mail. An active file for this | |
7740 method will be created automatically. | |
7741 | |
7742 @vindex nnmail-procmail-suffix | |
7743 @vindex nnmail-procmail-directory | |
7744 If you use @code{nnfolder} or any other backend that store more than a | |
7745 single article in each file, you should never have procmail add mails to | |
7746 the file that Gnus sees. Instead, procmail should put all incoming mail | |
7747 in @code{nnmail-procmail-directory}. To arrive at the file name to put | |
7748 the incoming mail in, append @code{nnmail-procmail-suffix} to the group | |
7749 name. The mail backends will read the mail from these files. | |
7750 | |
7751 @vindex nnmail-resplit-incoming | |
7752 When Gnus reads a file called @file{mail.misc.spool}, this mail will be | |
7753 put in the @code{mail.misc}, as one would expect. However, if you want | |
7754 Gnus to split the mail the normal way, you could set | |
7755 @code{nnmail-resplit-incoming} to @code{t}. | |
7756 | |
7757 @vindex nnmail-keep-last-article | |
7758 If you use @code{procmail} to split things directory into an @code{nnmh} | |
7759 directory (which you shouldn't do), you should set | |
7760 @code{nnmail-keep-last-article} to non-@code{nil} to prevent Gnus from | |
7761 ever expiring the final article in a mail newsgroup. This is quite, | |
7762 quite important. | |
7763 | |
7764 | |
7765 @node Incorporating Old Mail | |
7766 @subsection Incorporating Old Mail | |
7767 | |
7768 Most people have lots of old mail stored in various file formats. If | |
7769 you have set up Gnus to read mail using one of the spiffy Gnus mail | |
7770 backends, you'll probably wish to have that old mail incorporated into | |
7771 your mail groups. | |
7772 | |
7773 Doing so can be quite easy. | |
7774 | |
7775 To take an example: You're reading mail using @code{nnml} | |
7776 (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a | |
7777 satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox | |
7778 file filled with important, but old, mail. You want to move it into | |
7779 your @code{nnml} groups. | |
7780 | |
7781 Here's how: | |
7782 | |
7783 @enumerate | |
7784 @item | |
7785 Go to the group buffer. | |
7786 | |
7787 @item | |
7788 Type `G f' and give the path of the mbox file when prompted to create an | |
7789 @code{nndoc} group from the mbox file (@pxref{Foreign Groups}). | |
7790 | |
7791 @item | |
7792 Type `SPACE' to enter the newly created group. | |
7793 | |
7794 @item | |
7795 Type `M P b' to process-mark all articles in this group (@pxref{Setting | |
7796 Process Marks}). | |
7797 | |
7798 @item | |
7799 Type `B r' to respool all the process-marked articles, and answer | |
7800 @samp{nnml} when prompted (@pxref{Mail Group Commands}). | |
7801 @end enumerate | |
7802 | |
7803 All the mail messages in the mbox file will now also be spread out over | |
7804 all your @code{nnml} groups. Try entering them and check whether things | |
7805 have gone without a glitch. If things look ok, you may consider | |
7806 deleting the mbox file, but I wouldn't do that unless I was absolutely | |
7807 sure that all the mail has ended up where it should be. | |
7808 | |
7809 Respooling is also a handy thing to do if you're switching from one mail | |
7810 backend to another. Just respool all the mail in the old mail groups | |
7811 using the new mail backend. | |
7812 | |
7813 | |
7814 @node Expiring Mail | |
7815 @subsection Expiring Mail | |
7816 @cindex article expiry | |
7817 | |
7818 Traditional mail readers have a tendency to remove mail articles when | |
7819 you mark them as read, in some way. Gnus takes a fundamentally | |
7820 different approach to mail reading. | |
7821 | |
7822 Gnus basically considers mail just to be news that has been received in | |
7823 a rather peculiar manner. It does not think that it has the power to | |
7824 actually change the mail, or delete any mail messages. If you enter a | |
7825 mail group, and mark articles as ``read'', or kill them in some other | |
7826 fashion, the mail articles will still exist on the system. I repeat: | |
7827 Gnus will not delete your old, read mail. Unless you ask it to, of | |
7828 course. | |
7829 | |
7830 To make Gnus get rid of your unwanted mail, you have to mark the | |
7831 articles as @dfn{expirable}. This does not mean that the articles will | |
7832 disappear right away, however. In general, a mail article will be | |
7833 deleted from your system if, 1) it is marked as expirable, AND 2) it is | |
7834 more than one week old. If you do not mark an article as expirable, it | |
7835 will remain on your system until hell freezes over. This bears | |
7836 repeating one more time, with some spurious capitalizations: IF you do | |
7837 NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES. | |
7838 | |
7839 @vindex gnus-auto-expirable-newsgroups | |
7840 You do not have to mark articles as expirable by hand. Groups that | |
7841 match the regular expression @code{gnus-auto-expirable-newsgroups} will | |
7842 have all articles that you read marked as expirable automatically. All | |
7843 articles that are marked as expirable have an @samp{E} in the first | |
7844 column in the summary buffer. | |
7845 | |
7846 Let's say you subscribe to a couple of mailing lists, and you want the | |
7847 articles you have read to disappear after a while: | |
7848 | |
7849 @lisp | |
7850 (setq gnus-auto-expirable-newsgroups | |
7851 "mail.nonsense-list\\|mail.nice-list") | |
7852 @end lisp | |
7853 | |
7854 Another way to have auto-expiry happen is to have the element | |
7855 @code{auto-expire} in the group parameters of the group. | |
7856 | |
7857 @vindex nnmail-expiry-wait | |
7858 The @code{nnmail-expiry-wait} variable supplies the default time an | |
7859 expirable article has to live. The default is seven days. | |
7860 | |
7861 Gnus also supplies a function that lets you fine-tune how long articles | |
7862 are to live, based on what group they are in. Let's say you want to | |
7863 have one month expiry period in the @samp{mail.private} group, a one day | |
7864 expiry period in the @samp{mail.junk} group, and a six day expiry period | |
7865 everywhere else: | |
7866 | |
7867 @vindex nnmail-expiry-wait-function | |
7868 @lisp | |
7869 (setq nnmail-expiry-wait-function | |
7870 (lambda (group) | |
7871 (cond ((string= group "mail.private") | |
7872 31) | |
7873 ((string= group "mail.junk") | |
7874 1) | |
7875 ((string= group "important") | |
7876 'never) | |
7877 (t | |
7878 6)))) | |
7879 @end lisp | |
7880 | |
7881 The group names that this function is fed are ``unadorned'' group | |
7882 names---no @samp{nnml:} prefixes and the like. | |
7883 | |
7884 The @code{nnmail-expiry-wait} variable and | |
7885 @code{nnmail-expiry-wait-function} function can be either a number (not | |
7886 necessarily an integer) or the symbols @code{immediate} or | |
7887 @code{never}. | |
7888 | |
7889 You can also use the @code{expiry-wait} group parameter to selectively | |
7890 change the expiry period (@pxref{Group Parameters}). | |
7891 | |
7892 @vindex nnmail-keep-last-article | |
7893 If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never | |
7894 expire the final article in a mail newsgroup. This is to make life | |
7895 easier for procmail users. | |
7896 | |
7897 @vindex gnus-total-expirable-newsgroups | |
7898 By the way, that line up there about Gnus never expiring non-expirable | |
7899 articles is a lie. If you put @code{total-expire} in the group | |
7900 parameters, articles will not be marked as expirable, but all read | |
7901 articles will be put through the expiry process. Use with extreme | |
7902 caution. Even more dangerous is the | |
7903 @code{gnus-total-expirable-newsgroups} variable. All groups that match | |
7904 this regexp will have all read articles put through the expiry process, | |
7905 which means that @emph{all} old mail articles in the groups in question | |
7906 will be deleted after a while. Use with extreme caution, and don't come | |
7907 crying to me when you discover that the regexp you used matched the | |
7908 wrong group and all your important mail has disappeared. Be a | |
7909 @emph{man}! Or a @emph{woman}! Whatever you feel more comfortable | |
7910 with! So there! | |
7911 | |
7912 | |
7913 @node Duplicates | |
7914 @subsection Duplicates | |
7915 | |
7916 @vindex nnmail-treat-duplicates | |
7917 @vindex nnmail-message-id-cache-length | |
7918 @vindex nnmail-message-id-cache-file | |
7919 @cindex duplicate mails | |
7920 If you are a member of a couple of mailing list, you will sometime | |
7921 receive two copies of the same mail. This can be quite annoying, so | |
7922 @code{nnmail} checks for and treats any duplicates it might find. To do | |
7923 this, it keeps a cache of old @code{Message-ID}s - | |
7924 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by | |
7925 default. The approximate maximum number of @code{Message-ID}s stored | |
7926 there is controlled by the @code{nnmail-message-id-cache-length} | |
7927 variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be | |
7928 stored.) If all this sounds scary to you, you can set | |
7929 @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by | |
7930 default), and @code{nnmail} won't delete duplicate mails. Instead it | |
7931 will generate a brand new @code{Message-ID} for the mail and insert a | |
7932 warning into the head of the mail saying that it thinks that this is a | |
7933 duplicate of a different message. | |
7934 | |
7935 This variable can also be a function. If that's the case, the function | |
7936 will be called from a buffer narrowed to the message in question with | |
7937 the @code{Message-ID} as a parameter. The function must return either | |
7938 @code{nil}, @code{warn}, or @code{delete}. | |
7939 | |
7940 You can turn this feature off completely by setting the variable to | |
7941 @code{nil}. | |
7942 | |
7943 If you want all the duplicate mails to be put into a special | |
7944 @dfn{duplicates} group, you could do that using the normal mail split | |
7945 methods: | |
7946 | |
7947 @lisp | |
7948 (setq nnmail-split-fancy | |
7949 '(| ;; Messages duplicates go to a separate group. | |
7950 ("gnus-warning" "duplication of message" "duplicate") | |
7951 ;; Message from daemons, postmaster, and the like to another. | |
7952 (any mail "mail.misc") | |
7953 ;; Other rules. | |
7954 [ ... ] )) | |
7955 @end lisp | |
7956 | |
7957 Or something like: | |
7958 @lisp | |
7959 (setq nnmail-split-methods | |
7960 '(("duplicates" "^Gnus-Warning:") | |
7961 ;; Other rules. | |
7962 [...])) | |
7963 @end lisp | |
7964 | |
7965 Here's a neat feature: If you know that the recipient reads her mail | |
7966 with Gnus, and that she has @code{nnmail-treat-duplicates} set to | |
7967 @code{delete}, you can send her as many insults as you like, just by | |
7968 using a @code{Message-ID} of a mail that you know that she's already | |
7969 received. Think of all the fun! She'll never see any of it! Whee! | |
7970 | |
7971 | |
7972 @node Not Reading Mail | |
7973 @subsection Not Reading Mail | |
7974 | |
7975 If you start using any of the mail backends, they have the annoying | |
7976 habit of assuming that you want to read mail with them. This might not | |
7977 be unreasonable, but it might not be what you want. | |
7978 | |
7979 If you set @code{nnmail-spool-file} to @code{nil}, none of the backends | |
7980 will ever attempt to read incoming mail, which should help. | |
7981 | |
7982 @vindex nnbabyl-get-new-mail | |
7983 @vindex nnmbox-get-new-mail | |
7984 @vindex nnml-get-new-mail | |
7985 @vindex nnmh-get-new-mail | |
7986 @vindex nnfolder-get-new-mail | |
7987 This might be too much, if, for instance, you are reading mail quite | |
7988 happily with @code{nnml} and just want to peek at some old @sc{rmail} | |
7989 file you have stashed away with @code{nnbabyl}. All backends have | |
7990 variables called backend-@code{get-new-mail}. If you want to disable | |
7991 the @code{nnbabyl} mail reading, you edit the virtual server for the | |
7992 group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}. | |
7993 | |
7994 All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook} | |
7995 narrowed to the article to be saved before saving it when reading | |
7996 incoming mail. | |
7997 | |
7998 | |
7999 @node Choosing a Mail Backend | |
8000 @subsection Choosing a Mail Backend | |
8001 | |
8002 Gnus will read the mail spool when you activate a mail group. The mail | |
8003 file is first copied to your home directory. What happens after that | |
8004 depends on what format you want to store your mail in. | |
8005 | |
8006 @menu | |
8007 * Unix Mail Box:: Using the (quite) standard Un*x mbox. | |
8008 * Rmail Babyl:: Emacs programs use the rmail babyl format. | |
8009 * Mail Spool:: Store your mail in a private spool? | |
8010 * MH Spool:: An mhspool-like backend. | |
8011 * Mail Folders:: Having one file for each group. | |
8012 @end menu | |
8013 | |
8014 | |
8015 @node Unix Mail Box | |
8016 @subsubsection Unix Mail Box | |
8017 @cindex nnmbox | |
8018 @cindex unix mail box | |
8019 | |
8020 @vindex nnmbox-active-file | |
8021 @vindex nnmbox-mbox-file | |
8022 The @dfn{nnmbox} backend will use the standard Un*x mbox file to store | |
8023 mail. @code{nnmbox} will add extra headers to each mail article to say | |
8024 which group it belongs in. | |
8025 | |
8026 Virtual server settings: | |
8027 | |
8028 @table @code | |
8029 @item nnmbox-mbox-file | |
8030 @vindex nnmbox-mbox-file | |
8031 The name of the mail box in the user's home directory. | |
8032 | |
8033 @item nnmbox-active-file | |
8034 @vindex nnmbox-active-file | |
8035 The name of the active file for the mail box. | |
8036 | |
8037 @item nnmbox-get-new-mail | |
8038 @vindex nnmbox-get-new-mail | |
8039 If non-@code{nil}, @code{nnmbox} will read incoming mail and split it | |
8040 into groups. | |
8041 @end table | |
8042 | |
8043 | |
8044 @node Rmail Babyl | |
8045 @subsubsection Rmail Babyl | |
8046 @cindex nnbabyl | |
8047 @cindex rmail mbox | |
8048 | |
8049 @vindex nnbabyl-active-file | |
8050 @vindex nnbabyl-mbox-file | |
8051 The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail | |
8052 mbox}) to store mail. @code{nnbabyl} will add extra headers to each mail | |
8053 article to say which group it belongs in. | |
8054 | |
8055 Virtual server settings: | |
8056 | |
8057 @table @code | |
8058 @item nnbabyl-mbox-file | |
8059 @vindex nnbabyl-mbox-file | |
8060 The name of the rmail mbox file. | |
8061 | |
8062 @item nnbabyl-active-file | |
8063 @vindex nnbabyl-active-file | |
8064 The name of the active file for the rmail box. | |
8065 | |
8066 @item nnbabyl-get-new-mail | |
8067 @vindex nnbabyl-get-new-mail | |
8068 If non-@code{nil}, @code{nnbabyl} will read incoming mail. | |
8069 @end table | |
8070 | |
8071 | |
8072 @node Mail Spool | |
8073 @subsubsection Mail Spool | |
8074 @cindex nnml | |
8075 @cindex mail @sc{nov} spool | |
8076 | |
8077 The @dfn{nnml} spool mail format isn't compatible with any other known | |
8078 format. It should be used with some caution. | |
8079 | |
8080 @vindex nnml-directory | |
8081 If you use this backend, Gnus will split all incoming mail into files; | |
8082 one file for each mail, and put the articles into the correct | |
8083 directories under the directory specified by the @code{nnml-directory} | |
8084 variable. The default value is @file{~/Mail/}. | |
8085 | |
8086 You do not have to create any directories beforehand; Gnus will take | |
8087 care of all that. | |
8088 | |
8089 If you have a strict limit as to how many files you are allowed to store | |
8090 in your account, you should not use this backend. As each mail gets its | |
8091 own file, you might very well occupy thousands of inodes within a few | |
8092 weeks. If this is no problem for you, and it isn't a problem for you | |
8093 having your friendly systems administrator walking around, madly, | |
8094 shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should | |
8095 know that this is probably the fastest format to use. You do not have | |
8096 to trudge through a big mbox file just to read your new mail. | |
8097 | |
8098 @code{nnml} is probably the slowest backend when it comes to article | |
8099 splitting. It has to create lots of files, and it also generates | |
8100 @sc{nov} databases for the incoming mails. This makes is the fastest | |
8101 backend when it comes to reading mail. | |
8102 | |
8103 Virtual server settings: | |
8104 | |
8105 @table @code | |
8106 @item nnml-directory | |
8107 @vindex nnml-directory | |
8108 All @code{nnml} directories will be placed under this directory. | |
8109 | |
8110 @item nnml-active-file | |
8111 @vindex nnml-active-file | |
8112 The active file for the @code{nnml} server. | |
8113 | |
8114 @item nnml-newsgroups-file | |
8115 @vindex nnml-newsgroups-file | |
8116 The @code{nnml} group descriptions file. @xref{Newsgroups File | |
8117 Format}. | |
8118 | |
8119 @item nnml-get-new-mail | |
8120 @vindex nnml-get-new-mail | |
8121 If non-@code{nil}, @code{nnml} will read incoming mail. | |
8122 | |
8123 @item nnml-nov-is-evil | |
8124 @vindex nnml-nov-is-evil | |
8125 If non-@code{nil}, this backend will ignore any @sc{nov} files. | |
8126 | |
8127 @item nnml-nov-file-name | |
8128 @vindex nnml-nov-file-name | |
8129 The name of the @sc{nov} files. The default is @file{.overview}. | |
8130 | |
8131 @item nnml-prepare-save-mail-hook | |
8132 @vindex nnml-prepare-save-mail-hook | |
8133 Hook run narrowed to an article before saving. | |
8134 | |
8135 @end table | |
8136 | |
8137 @findex nnml-generate-nov-databases | |
8138 If your @code{nnml} groups and @sc{nov} files get totally out of whack, | |
8139 you can do a complete update by typing @kbd{M-x | |
8140 nnml-generate-nov-databases}. This command will trawl through the | |
8141 entire @code{nnml} hierarchy, looking at each and every article, so it | |
8142 might take a while to complete. | |
8143 | |
8144 | |
8145 @node MH Spool | |
8146 @subsubsection MH Spool | |
8147 @cindex nnmh | |
8148 @cindex mh-e mail spool | |
8149 | |
8150 @code{nnmh} is just like @code{nnml}, except that is doesn't generate | |
8151 @sc{nov} databases and it doesn't keep an active file. This makes | |
8152 @code{nnmh} a @emph{much} slower backend than @code{nnml}, but it also | |
8153 makes it easier to write procmail scripts for. | |
8154 | |
8155 Virtual server settings: | |
8156 | |
8157 @table @code | |
8158 @item nnmh-directory | |
8159 @vindex nnmh-directory | |
8160 All @code{nnmh} directories will be located under this directory. | |
8161 | |
8162 @item nnmh-get-new-mail | |
8163 @vindex nnmh-get-new-mail | |
8164 If non-@code{nil}, @code{nnmh} will read incoming mail. | |
8165 | |
8166 @item nnmh-be-safe | |
8167 @vindex nnmh-be-safe | |
8168 If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make | |
8169 sure that the articles in the folder are actually what Gnus thinks they | |
8170 are. It will check date stamps and stat everything in sight, so | |
8171 setting this to @code{t} will mean a serious slow-down. If you never | |
8172 use anything but Gnus to read the @code{nnmh} articles, you do not have | |
8173 to set this variable to @code{t}. | |
8174 @end table | |
8175 | |
8176 | |
8177 @node Mail Folders | |
8178 @subsubsection Mail Folders | |
8179 @cindex nnfolder | |
8180 @cindex mbox folders | |
8181 @cindex mail folders | |
8182 | |
8183 @code{nnfolder} is a backend for storing each mail group in a separate | |
8184 file. Each file is in the standard Un*x mbox format. @code{nnfolder} | |
8185 will add extra headers to keep track of article numbers and arrival | |
8186 dates. | |
8187 | |
8188 Virtual server settings: | |
8189 | |
8190 @table @code | |
8191 @item nnfolder-directory | |
8192 @vindex nnfolder-directory | |
8193 All the @code{nnfolder} mail boxes will be stored under this directory. | |
8194 | |
8195 @item nnfolder-active-file | |
8196 @vindex nnfolder-active-file | |
8197 The name of the active file. | |
8198 | |
8199 @item nnfolder-newsgroups-file | |
8200 @vindex nnfolder-newsgroups-file | |
8201 The name of the group descriptions file. @xref{Newsgroups File Format}. | |
8202 | |
8203 @item nnfolder-get-new-mail | |
8204 @vindex nnfolder-get-new-mail | |
8205 If non-@code{nil}, @code{nnfolder} will read incoming mail. | |
8206 @end table | |
8207 | |
8208 @findex nnfolder-generate-active-file | |
8209 @kindex M-x nnfolder-generate-active-file | |
8210 If you have lots of @code{nnfolder}-like files you'd like to read with | |
8211 @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file} | |
8212 command to make @code{nnfolder} aware of all likely files in | |
8213 @code{nnfolder-directory}. | |
8214 | |
8215 | |
8216 @node Other Sources | |
8217 @section Other Sources | |
8218 | |
8219 Gnus can do more than just read news or mail. The methods described | |
8220 below allow Gnus to view directories and files as if they were | |
8221 newsgroups. | |
8222 | |
8223 @menu | |
8224 * Directory Groups:: You can read a directory as if it was a newsgroup. | |
8225 * Anything Groups:: Dired? Who needs dired? | |
8226 * Document Groups:: Single files can be the basis of a group. | |
8227 * SOUP:: Reading @sc{SOUP} packets ``offline''. | |
8228 @end menu | |
8229 | |
8230 | |
8231 @node Directory Groups | |
8232 @subsection Directory Groups | |
8233 @cindex nndir | |
8234 @cindex directory groups | |
8235 | |
8236 If you have a directory that has lots of articles in separate files in | |
8237 it, you might treat it as a newsgroup. The files have to have numerical | |
8238 names, of course. | |
8239 | |
8240 This might be an opportune moment to mention @code{ange-ftp}, that most | |
8241 wonderful of all wonderful Emacs packages. When I wrote @code{nndir}, I | |
8242 didn't think much about it---a backend to read directories. Big deal. | |
8243 | |
8244 @code{ange-ftp} changes that picture dramatically. For instance, if you | |
8245 enter @file{"/ftp.hpc.uh.edu:/pub/emacs/ding-list/"} as the the | |
8246 directory name, ange-ftp will actually allow you to read this directory | |
8247 over at @samp{sina} as a newsgroup. Distributed news ahoy! | |
8248 | |
8249 @code{nndir} will use @sc{nov} files if they are present. | |
8250 | |
8251 @code{nndir} is a ``read-only'' backend---you can't delete or expire | |
8252 articles with this method. You can use @code{nnmh} or @code{nnml} for | |
8253 whatever you use @code{nndir} for, so you could switch to any of those | |
8254 methods if you feel the need to have a non-read-only @code{nndir}. | |
8255 | |
8256 | |
8257 @node Anything Groups | |
8258 @subsection Anything Groups | |
8259 @cindex nneething | |
8260 | |
8261 From the @code{nndir} backend (which reads a single spool-like | |
8262 directory), it's just a hop and a skip to @code{nneething}, which | |
8263 pretends that any arbitrary directory is a newsgroup. Strange, but | |
8264 true. | |
8265 | |
8266 When @code{nneething} is presented with a directory, it will scan this | |
8267 directory and assign article numbers to each file. When you enter such | |
8268 a group, @code{nneething} must create ``headers'' that Gnus can use. | |
8269 After all, Gnus is a newsreader, in case you're | |
8270 forgetting. @code{nneething} does this in a two-step process. First, it | |
8271 snoops each file in question. If the file looks like an article (i.e., | |
8272 the first few lines look like headers), it will use this as the head. | |
8273 If this is just some arbitrary file without a head (eg. a C source | |
8274 file), @code{nneething} will cobble up a header out of thin air. It | |
8275 will use file ownership, name and date and do whatever it can with these | |
8276 elements. | |
8277 | |
8278 All this should happen automatically for you, and you will be presented | |
8279 with something that looks very much like a newsgroup. Totally like a | |
8280 newsgroup, to be precise. If you select an article, it will be displayed | |
8281 in the article buffer, just as usual. | |
8282 | |
8283 If you select a line that represents a directory, Gnus will pop you into | |
8284 a new summary buffer for this @code{nneething} group. And so on. You can | |
8285 traverse the entire disk this way, if you feel like, but remember that | |
8286 Gnus is not dired, really, and does not intend to be, either. | |
8287 | |
8288 There are two overall modes to this action---ephemeral or solid. When | |
8289 doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus | |
8290 will not store information on what files you have read, and what files | |
8291 are new, and so on. If you create a solid @code{nneething} group the | |
8292 normal way with @kbd{G m}, Gnus will store a mapping table between | |
8293 article numbers and file names, and you can treat this group like any | |
8294 other groups. When you activate a solid @code{nneething} group, you will | |
8295 be told how many unread articles it contains, etc., etc. | |
8296 | |
8297 Some variables: | |
8298 | |
8299 @table @code | |
8300 @item nneething-map-file-directory | |
8301 @vindex nneething-map-file-directory | |
8302 All the mapping files for solid @code{nneething} groups will be stored | |
8303 in this directory, which defaults to @file{~/.nneething/}. | |
8304 | |
8305 @item nneething-exclude-files | |
8306 @vindex nneething-exclude-files | |
8307 All files that match this regexp will be ignored. Nice to use to exclude | |
8308 auto-save files and the like, which is what it does by default. | |
8309 | |
8310 @item nneething-map-file | |
8311 @vindex nneething-map-file | |
8312 Name of the map files. | |
8313 @end table | |
8314 | |
8315 | |
8316 @node Document Groups | |
8317 @subsection Document Groups | |
8318 @cindex nndoc | |
8319 @cindex documentation group | |
8320 @cindex help group | |
8321 | |
8322 @code{nndoc} is a cute little thing that will let you read a single file | |
8323 as a newsgroup. Several files types are supported: | |
8324 | |
8325 @table @code | |
8326 @cindex babyl | |
8327 @cindex rmail mbox | |
8328 | |
8329 @item babyl | |
8330 The babyl (rmail) mail box. | |
8331 @cindex mbox | |
8332 @cindex Unix mbox | |
8333 | |
8334 @item mbox | |
8335 The standard Unix mbox file. | |
8336 | |
8337 @cindex MMDF mail box | |
8338 @item mmdf | |
8339 The MMDF mail box format. | |
8340 | |
8341 @item news | |
8342 Several news articles appended into a file. | |
8343 | |
8344 @item rnews | |
8345 @cindex rnews batch files | |
8346 The rnews batch transport format. | |
8347 @cindex forwarded messages | |
8348 | |
8349 @item forward | |
8350 Forwarded articles. | |
8351 | |
8352 @item mime-digest | |
8353 @cindex digest | |
8354 @cindex MIME digest | |
8355 @cindex 1153 digest | |
8356 @cindex RFC 1153 digest | |
8357 @cindex RFC 341 digest | |
8358 MIME (RFC 1341) digest format. | |
8359 | |
8360 @item standard-digest | |
8361 The standard (RFC 1153) digest format. | |
8362 | |
8363 @item slack-digest | |
8364 Non-standard digest format---matches most things, but does it badly. | |
8365 @end table | |
8366 | |
8367 You can also use the special ``file type'' @code{guess}, which means | |
8368 that @code{nndoc} will try to guess what file type it is looking at. | |
8369 @code{digest} means that @code{nndoc} should guess what digest type the | |
8370 file is. | |
8371 | |
8372 @code{nndoc} will not try to change the file or insert any extra headers into | |
8373 it---it will simply, like, let you use the file as the basis for a | |
8374 group. And that's it. | |
8375 | |
8376 If you have some old archived articles that you want to insert into your | |
8377 new & spiffy Gnus mail backend, @code{nndoc} can probably help you with | |
8378 that. Say you have an old @file{RMAIL} file with mail that you now want | |
8379 to split into your new @code{nnml} groups. You look at that file using | |
8380 @code{nndoc}, set the process mark on all the articles in the buffer | |
8381 (@kbd{M P b}, for instance), and then re-spool (@kbd{B r}) using | |
8382 @code{nnml}. If all goes well, all the mail in the @file{RMAIL} file is | |
8383 now also stored in lots of @code{nnml} directories, and you can delete | |
8384 that pesky @file{RMAIL} file. If you have the guts! | |
8385 | |
8386 Virtual server variables: | |
8387 | |
8388 @table @code | |
8389 @item nndoc-article-type | |
8390 @vindex nndoc-article-type | |
8391 This should be one of @code{mbox}, @code{babyl}, @code{digest}, | |
8392 @code{mmdf}, @code{forward}, @code{news}, @code{rnews}, | |
8393 @code{mime-digest}, @code{clari-briefs}, or @code{guess}. | |
8394 | |
8395 @item nndoc-post-type | |
8396 @vindex nndoc-post-type | |
8397 This variable says whether Gnus is to consider the group a news group or | |
8398 a mail group. There are two legal values: @code{mail} (the default) | |
8399 and @code{news}. | |
8400 @end table | |
8401 | |
8402 | |
8403 @node SOUP | |
8404 @subsection SOUP | |
8405 @cindex SOUP | |
8406 @cindex offline | |
8407 | |
8408 In the PC world people often talk about ``offline'' newsreaders. These | |
8409 are thingies that are combined reader/news transport monstrosities. | |
8410 With built-in modem programs. Yecchh! | |
8411 | |
8412 Of course, us Unix Weenie types of human beans use things like | |
8413 @code{uucp} and, like, @code{nntpd} and set up proper news and mail | |
8414 transport things like Ghod intended. And then we just use normal | |
8415 newsreaders. | |
8416 | |
8417 However, it can sometimes be convenient to do something a that's a bit | |
8418 easier on the brain if you have a very slow modem, and you're not really | |
8419 that interested in doing things properly. | |
8420 | |
8421 A file format called @sc{soup} has been developed for transporting news | |
8422 and mail from servers to home machines and back again. It can be a bit | |
8423 fiddly. | |
8424 | |
8425 @enumerate | |
8426 | |
8427 @item | |
8428 You log in on the server and create a @sc{soup} packet. You can either | |
8429 use a dedicated @sc{soup} thingie, or you can use Gnus to create the | |
8430 packet with the @kbd{O s} command. | |
8431 | |
8432 @item | |
8433 You transfer the packet home. Rail, boat, car or modem will do fine. | |
8434 | |
8435 @item | |
8436 You put the packet in your home directory. | |
8437 | |
8438 @item | |
8439 You fire up Gnus using the @code{nnsoup} backend as the native server. | |
8440 | |
8441 @item | |
8442 You read articles and mail and answer and followup to the things you | |
8443 want. | |
8444 | |
8445 @item | |
8446 You do the @kbd{G s r} command to pack these replies into a @sc{soup} | |
8447 packet. | |
8448 | |
8449 @item | |
8450 You transfer this packet to the server. | |
8451 | |
8452 @item | |
8453 You use Gnus to mail this packet out with the @kbd{G s s} command. | |
8454 | |
8455 @item | |
8456 You then repeat until you die. | |
8457 | |
8458 @end enumerate | |
8459 | |
8460 So you basically have a bipartite system---you use @code{nnsoup} for | |
8461 reading and Gnus for packing/sending these @sc{soup} packets. | |
8462 | |
8463 @menu | |
8464 * SOUP Commands:: Commands for creating and sending @sc{soup} packets | |
8465 * SOUP Groups:: A backend for reading @sc{soup} packets. | |
8466 * SOUP Replies:: How to enable @code{nnsoup} to take over mail and news. | |
8467 @end menu | |
8468 | |
8469 | |
8470 @node SOUP Commands | |
8471 @subsubsection SOUP Commands | |
8472 | |
8473 @table @kbd | |
8474 @item G s b | |
8475 @kindex G s b (Group) | |
8476 @findex gnus-group-brew-soup | |
8477 Pack all unread articles in the current group | |
8478 (@code{gnus-group-brew-soup}). This command understands the | |
8479 process/prefix convention. | |
8480 | |
8481 @item G s w | |
8482 @kindex G s w (Group) | |
8483 @findex gnus-soup-save-areas | |
8484 Save all data files (@code{gnus-soup-save-areas}). | |
8485 | |
8486 @item G s s | |
8487 @kindex G s s (Group) | |
8488 @findex gnus-soup-send-replies | |
8489 Send all replies from the replies packet | |
8490 (@code{gnus-soup-send-replies}). | |
8491 | |
8492 @item G s p | |
8493 @kindex G s p (Group) | |
8494 @findex gnus-soup-pack-packet | |
8495 Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}). | |
8496 | |
8497 @item G s r | |
8498 @kindex G s r (Group) | |
8499 @findex nnsoup-pack-replies | |
8500 Pack all replies into a replies packet (@code{nnsoup-pack-replies}). | |
8501 | |
8502 @item O s | |
8503 @kindex O s (Summary) | |
8504 @findex gnus-soup-add-article | |
8505 This summary-mode command adds the current article to a @sc{soup} packet | |
8506 (@code{gnus-soup-add-article}). It understands the process/prefix | |
8507 convention. | |
8508 | |
8509 @end table | |
8510 | |
8511 | |
8512 There are a few variables to customize where Gnus will put all these | |
8513 thingies: | |
8514 | |
8515 @table @code | |
8516 | |
8517 @item gnus-soup-directory | |
8518 @vindex gnus-soup-directory | |
8519 Directory where Gnus will save intermediate files while composing | |
8520 @sc{soup} packets. The default is @file{~/SoupBrew/}. | |
8521 | |
8522 @item gnus-soup-replies-directory | |
8523 @vindex gnus-soup-replies-directory | |
8524 This is what Gnus will use as a temporary directory while sending our | |
8525 reply packets. The default is @file{~/SoupBrew/SoupReplies/}. | |
8526 | |
8527 @item gnus-soup-prefix-file | |
8528 @vindex gnus-soup-prefix-file | |
8529 Name of the file where Gnus stores the last used prefix. The default is | |
8530 @samp{gnus-prefix}. | |
8531 | |
8532 @item gnus-soup-packer | |
8533 @vindex gnus-soup-packer | |
8534 A format string command for packing a @sc{soup} packet. The default is | |
8535 @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}. | |
8536 | |
8537 @item gnus-soup-unpacker | |
8538 @vindex gnus-soup-unpacker | |
8539 Format string command for unpacking a @sc{soup} packet. The default is | |
8540 @samp{gunzip -c %s | tar xvf -}. | |
8541 | |
8542 @item gnus-soup-packet-directory | |
8543 @vindex gnus-soup-packet-directory | |
8544 Where Gnus will look for reply packets. The default is @file{~/}. | |
8545 | |
8546 @item gnus-soup-packet-regexp | |
8547 @vindex gnus-soup-packet-regexp | |
8548 Regular expression matching @sc{soup} reply packets in | |
8549 @code{gnus-soup-packet-directory}. | |
8550 | |
8551 @end table | |
8552 | |
8553 | |
8554 @node SOUP Groups | |
8555 @subsubsection @sc{soup} Groups | |
8556 @cindex nnsoup | |
8557 | |
8558 @code{nnsoup} is the backend for reading @sc{soup} packets. It will | |
8559 read incoming packets, unpack them, and put them in a directory where | |
8560 you can read them at leisure. | |
8561 | |
8562 These are the variables you can use to customize its behavior: | |
8563 | |
8564 @table @code | |
8565 | |
8566 @item nnsoup-tmp-directory | |
8567 @vindex nnsoup-tmp-directory | |
8568 When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this | |
8569 directory. (@file{/tmp/} by default.) | |
8570 | |
8571 @item nnsoup-directory | |
8572 @vindex nnsoup-directory | |
8573 @code{nnsoup} then moves each message and index file to this directory. | |
8574 The default is @file{~/SOUP/}. | |
8575 | |
8576 @item nnsoup-replies-directory | |
8577 @vindex nnsoup-replies-directory | |
8578 All replies will stored in this directory before being packed into a | |
8579 reply packet. The default is @file{~/SOUP/replies/"}. | |
8580 | |
8581 @item nnsoup-replies-format-type | |
8582 @vindex nnsoup-replies-format-type | |
8583 The @sc{soup} format of the replies packets. The default is @samp{?n} | |
8584 (rnews), and I don't think you should touch that variable. I probably | |
8585 shouldn't even have documented it. Drats! Too late! | |
8586 | |
8587 @item nnsoup-replies-index-type | |
8588 @vindex nnsoup-replies-index-type | |
8589 The index type of the replies packet. The is @samp{?n}, which means | |
8590 ``none''. Don't fiddle with this one either! | |
8591 | |
8592 @item nnsoup-active-file | |
8593 @vindex nnsoup-active-file | |
8594 Where @code{nnsoup} stores lots of information. This is not an ``active | |
8595 file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose | |
8596 this file or mess it up in any way, you're dead. The default is | |
8597 @file{~/SOUP/active}. | |
8598 | |
8599 @item nnsoup-packer | |
8600 @vindex nnsoup-packer | |
8601 Format string command for packing a reply @sc{soup} packet. The default | |
8602 is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}. | |
8603 | |
8604 @item nnsoup-unpacker | |
8605 @vindex nnsoup-unpacker | |
8606 Format string command for unpacking incoming @sc{soup} packets. The | |
8607 default is @samp{gunzip -c %s | tar xvf -}. | |
8608 | |
8609 @item nnsoup-packet-directory | |
8610 @vindex nnsoup-packet-directory | |
8611 Where @code{nnsoup} will look for incoming packets. The default is | |
8612 @file{~/}. | |
8613 | |
8614 @item nnsoup-packet-regexp | |
8615 @vindex nnsoup-packet-regexp | |
8616 Regular expression matching incoming @sc{soup} packets. The default is | |
8617 @samp{Soupout}. | |
8618 | |
8619 @end table | |
8620 | |
8621 | |
8622 @node SOUP Replies | |
8623 @subsubsection SOUP Replies | |
8624 | |
8625 Just using @code{nnsoup} won't mean that your postings and mailings end | |
8626 up in @sc{soup} reply packets automagically. You have to work a bit | |
8627 more for that to happen. | |
8628 | |
8629 @findex nnsoup-set-variables | |
8630 The @code{nnsoup-set-variables} command will set the appropriate | |
8631 variables to ensure that all your followups and replies end up in the | |
8632 @sc{soup} system. | |
8633 | |
8634 In specific, this is what it does: | |
8635 | |
8636 @lisp | |
8637 (setq gnus-inews-article-function 'nnsoup-request-post) | |
8638 (setq send-mail-function 'nnsoup-request-mail) | |
8639 @end lisp | |
8640 | |
8641 And that's it, really. If you only want news to go into the @sc{soup} | |
8642 system you just use the first line. If you only want mail to be | |
8643 @sc{soup}ed you use the second. | |
8644 | |
8645 | |
8646 @node Combined Groups | |
8647 @section Combined Groups | |
8648 | |
8649 Gnus allows combining a mixture of all the other group types into bigger | |
8650 groups. | |
8651 | |
8652 @menu | |
8653 * Virtual Groups:: Combining articles from many groups. | |
8654 * Kibozed Groups:: Looking through parts of the newsfeed for articles. | |
8655 @end menu | |
8656 | |
8657 | |
8658 @node Virtual Groups | |
8659 @subsection Virtual Groups | |
8660 @cindex nnvirtual | |
8661 @cindex virtual groups | |
8662 | |
8663 An @dfn{nnvirtual group} is really nothing more than a collection of | |
8664 other groups. | |
8665 | |
8666 For instance, if you are tired of reading many small group, you can | |
8667 put them all in one big group, and then grow tired of reading one | |
8668 big, unwieldy group. The joys of computing! | |
8669 | |
8670 You specify @code{nnvirtual} as the method. The address should be a | |
8671 regexp to match component groups. | |
8672 | |
8673 All marks in the virtual group will stick to the articles in the | |
8674 component groups. So if you tick an article in a virtual group, the | |
8675 article will also be ticked in the component group from whence it came. | |
8676 (And vice versa---marks from the component groups will also be shown in | |
8677 the virtual group.) | |
8678 | |
8679 Here's an example @code{nnvirtual} method that collects all Andrea Dworkin | |
8680 newsgroups into one, big, happy newsgroup: | |
8681 | |
8682 @lisp | |
8683 (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*") | |
8684 @end lisp | |
8685 | |
8686 The component groups can be native or foreign; everything should work | |
8687 smoothly, but if your computer explodes, it was probably my fault. | |
8688 | |
8689 Collecting the same group from several servers might actually be a good | |
8690 idea if users have set the Distribution header to limit distribution. | |
8691 If you would like to read @samp{soc.motss} both from a server in Japan | |
8692 and a server in Norway, you could use the following as the group regexp: | |
8693 | |
8694 @example | |
8695 "^nntp+some.server.jp:soc.motss$\\|^nntp+some.server.no:soc.motss$" | |
8696 @end example | |
8697 | |
8698 This should work kinda smoothly---all articles from both groups should | |
8699 end up in this one, and there should be no duplicates. Threading (and | |
8700 the rest) will still work as usual, but there might be problems with the | |
8701 sequence of articles. Sorting on date might be an option here | |
8702 (@pxref{Selecting a Group}. | |
8703 | |
8704 One limitation, however---all groups that are included in a virtual | |
8705 group has to be alive (i.e., subscribed or unsubscribed). Killed or | |
8706 zombie groups can't be component groups for @code{nnvirtual} groups. | |
8707 | |
8708 @vindex nnvirtual-always-rescan | |
8709 If the @code{nnvirtual-always-rescan} is non-@code{nil}, | |
8710 @code{nnvirtual} will always scan groups for unread articles when | |
8711 entering a virtual group. If this variable is @code{nil} (which is the | |
8712 default) and you read articles in a component group after the virtual | |
8713 group has been activated, the read articles from the component group | |
8714 will show up when you enter the virtual group. You'll also see this | |
8715 effect if you have two virtual groups that contain the same component | |
8716 group. If that's the case, you should set this variable to @code{t}. | |
8717 Or you can just tap @code{M-g} on the virtual group every time before | |
8718 you enter it---it'll have much the same effect. | |
8719 | |
8720 | |
8721 @node Kibozed Groups | |
8722 @subsection Kibozed Groups | |
8723 @cindex nnkiboze | |
8724 @cindex kibozing | |
8725 | |
8726 @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of) | |
8727 the news feed''. @code{nnkiboze} is a backend that will do this for | |
8728 you. Oh joy! Now you can grind any @sc{nntp} server down to a halt | |
8729 with useless requests! Oh happiness! | |
8730 | |
8731 The address field of the @code{nnkiboze} method is, as with | |
8732 @code{nnvirtual}, a regexp to match groups to be ``included'' in the | |
8733 @code{nnkiboze} group. There most similarities between @code{nnkiboze} | |
8734 and @code{nnvirtual} ends. | |
8735 | |
8736 In addition to this regexp detailing component groups, an @code{nnkiboze} group | |
8737 must have a score file to say what articles that are to be included in | |
8738 the group (@pxref{Scoring}). | |
8739 | |
8740 @kindex M-x nnkiboze-generate-groups | |
8741 @findex nnkiboze-generate-groups | |
8742 You must run @kbd{M-x nnkiboze-generate-groups} after creating the | |
8743 @code{nnkiboze} groups you want to have. This command will take time. Lots of | |
8744 time. Oodles and oodles of time. Gnus has to fetch the headers from | |
8745 all the articles in all the components groups and run them through the | |
8746 scoring process to determine if there are any articles in the groups | |
8747 that are to be part of the @code{nnkiboze} groups. | |
8748 | |
8749 Please limit the number of component groups by using restrictive | |
8750 regexps. Otherwise your sysadmin may become annoyed with you, and the | |
8751 @sc{nntp} site may throw you off and never let you back in again. | |
8752 Stranger things have happened. | |
8753 | |
8754 @code{nnkiboze} component groups do not have to be alive---they can be dead, | |
8755 and they can be foreign. No restrictions. | |
8756 | |
8757 @vindex nnkiboze-directory | |
8758 The generation of an @code{nnkiboze} group means writing two files in | |
8759 @code{nnkiboze-directory}, which is @file{~/News/} by default. One | |
8760 contains the @sc{nov} header lines for all the articles in the group, | |
8761 and the other is an additional @file{.newsrc} file to store information | |
8762 on what groups that have been searched through to find component | |
8763 articles. | |
8764 | |
8765 Articles that are marked as read in the @code{nnkiboze} group will have their | |
8766 @sc{nov} lines removed from the @sc{nov} file. | |
8767 | |
8768 | |
8769 @node Scoring | |
8770 @chapter Scoring | |
8771 @cindex scoring | |
8772 | |
8773 Other people use @dfn{kill files}, but we here at Gnus Towers like | |
8774 scoring better than killing, so we'd rather switch than fight. They do | |
8775 something completely different as well, so sit up straight and pay | |
8776 attention! | |
8777 | |
8778 @vindex gnus-summary-mark-below | |
8779 All articles have a default score (@code{gnus-summary-default-score}), | |
8780 which is 0 by default. This score may be raised or lowered either | |
8781 interactively or by score files. Articles that have a score lower than | |
8782 @code{gnus-summary-mark-below} are marked as read. | |
8783 | |
8784 Gnus will read any @dfn{score files} that apply to the current group | |
8785 before generating the summary buffer. | |
8786 | |
8787 There are several commands in the summary buffer that insert score | |
8788 entries based on the current article. You can, for instance, ask Gnus to | |
8789 lower or increase the score of all articles with a certain subject. | |
8790 | |
8791 There are two sorts of scoring entries: Permanent and temporary. | |
8792 Temporary score entries are self-expiring entries. Any entries that are | |
8793 temporary and have not been used for, say, a week, will be removed | |
8794 silently to help keep the sizes of the score files down. | |
8795 | |
8796 @menu | |
8797 * Summary Score Commands:: Adding score entries for the current group. | |
8798 * Group Score Commands:: General score commands. | |
8799 * Score Variables:: Customize your scoring. (My, what terminology). | |
8800 * Score File Format:: What a score file may contain. | |
8801 * Score File Editing:: You can edit score files by hand as well. | |
8802 * Adaptive Scoring:: Big Sister Gnus *knows* what you read. | |
8803 * Followups To Yourself:: Having Gnus notice when people answer you. | |
8804 * Scoring Tips:: How to score effectively. | |
8805 * Reverse Scoring:: That problem child of old is not problem. | |
8806 * Global Score Files:: Earth-spanning, ear-splitting score files. | |
8807 * Kill Files:: They are still here, but they can be ignored. | |
8808 * GroupLens:: Getting predictions on what you like to read. | |
8809 @end menu | |
8810 | |
8811 | |
8812 @node Summary Score Commands | |
8813 @section Summary Score Commands | |
8814 @cindex score commands | |
8815 | |
8816 The score commands that alter score entries do not actually modify real | |
8817 score files. That would be too inefficient. Gnus maintains a cache of | |
8818 previously loaded score files, one of which is considered the | |
8819 @dfn{current score file alist}. The score commands simply insert | |
8820 entries into this list, and upon group exit, this list is saved. | |
8821 | |
8822 The current score file is by default the group's local score file, even | |
8823 if no such score file actually exists. To insert score commands into | |
8824 some other score file (eg. @file{all.SCORE}), you must first make this | |
8825 score file the current one. | |
8826 | |
8827 General score commands that don't actually change the score file: | |
8828 | |
8829 @table @kbd | |
8830 | |
8831 @item V s | |
8832 @kindex V s (Summary) | |
8833 @findex gnus-summary-set-score | |
8834 Set the score of the current article (@code{gnus-summary-set-score}). | |
8835 | |
8836 @item V S | |
8837 @kindex V S (Summary) | |
8838 @findex gnus-summary-current-score | |
8839 Display the score of the current article | |
8840 (@code{gnus-summary-current-score}). | |
8841 | |
8842 @item V t | |
8843 @kindex V t (Summary) | |
8844 @findex gnus-score-find-trace | |
8845 Display all score rules that have been used on the current article | |
8846 (@code{gnus-score-find-trace}). | |
8847 | |
8848 @item V R | |
8849 @cindex V R (Summary) | |
8850 @findex gnus-summary-rescore | |
8851 Run the current summary through the scoring process | |
8852 (@code{gnus-summary-rescore}). This might be useful if you're playing | |
8853 around with your score files behind Gnus' back and want to see the | |
8854 effect you're having. | |
8855 | |
8856 @item V a | |
8857 @kindex V a (Summary) | |
8858 @findex gnus-summary-score-entry | |
8859 Add a new score entry, and allow specifying all elements | |
8860 (@code{gnus-summary-score-entry}). | |
8861 | |
8862 @item V c | |
8863 @kindex V c (Summary) | |
8864 @findex gnus-score-change-score-file | |
8865 Make a different score file the current | |
8866 (@code{gnus-score-change-score-file}). | |
8867 | |
8868 @item V e | |
8869 @kindex V e (Summary) | |
8870 @findex gnus-score-edit-current-scores | |
8871 Edit the current score file (@code{gnus-score-edit-current-scores}). | |
8872 You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score | |
8873 File Editing}). | |
8874 | |
8875 @item V f | |
8876 @kindex V f (Summary) | |
8877 @findex gnus-score-edit-file | |
8878 Edit a score file and make this score file the current one | |
8879 (@code{gnus-score-edit-file}). | |
8880 | |
8881 @item V F | |
8882 @kindex V F (Summary) | |
8883 @findex gnus-score-flush-cache | |
8884 Flush the score cahe (@code{gnus-score-flush-cache}). This is useful | |
8885 after editing score files. | |
8886 | |
8887 @item V C | |
8888 @kindex V C (Summary) | |
8889 @findex gnus-score-customize | |
8890 Customize a score file in a visually pleasing manner | |
8891 (@code{gnus-score-customize}). | |
8892 | |
8893 @item I C-i | |
8894 @kindex I C-i (Summary) | |
8895 @findex gnus-summary-raise-score | |
8896 Increase the score of the current article | |
8897 (@code{gnus-summary-raise-score}). | |
8898 | |
8899 @item L C-l | |
8900 @kindex L C-l (Summary) | |
8901 @findex gnus-summary-lower-score | |
8902 Lower the score of the current article | |
8903 (@code{gnus-summary-lower-score}). | |
8904 @end table | |
8905 | |
8906 The rest of these commands modify the local score file. | |
8907 | |
8908 @table @kbd | |
8909 | |
8910 @item V m | |
8911 @kindex V m (Summary) | |
8912 @findex gnus-score-set-mark-below | |
8913 Prompt for a score, and mark all articles with a score below this as | |
8914 read (@code{gnus-score-set-mark-below}). | |
8915 | |
8916 @item V E | |
8917 @kindex V E (Summary) | |
8918 @findex gnus-score-set-expunge-below | |
8919 Expunge all articles with a score below the default score (or the | |
8920 numeric prefix) (@code{gnus-score-set-expunge-below}). | |
8921 @end table | |
8922 | |
8923 The keystrokes for actually making score entries follow a very regular | |
8924 pattern, so there's no need to list all the commands. (Hundreds of | |
8925 them.) | |
8926 | |
8927 @enumerate | |
8928 @item | |
8929 The first key is either @kbd{I} (upper case i) for increasing the score | |
8930 or @kbd{L} for lowering the score. | |
8931 @item | |
8932 The second key says what header you want to score on. The following | |
8933 keys are available: | |
8934 @table @kbd | |
8935 | |
8936 @item a | |
8937 Score on the author name. | |
8938 | |
8939 @item s | |
8940 Score on the subject line. | |
8941 | |
8942 @item x | |
8943 Score on the Xref line---i.e., the cross-posting line. | |
8944 | |
8945 @item t | |
8946 Score on thread---the References line. | |
8947 | |
8948 @item d | |
8949 Score on the date. | |
8950 | |
8951 @item l | |
8952 Score on the number of lines. | |
8953 | |
8954 @item i | |
8955 Score on the Message-ID. | |
8956 | |
8957 @item f | |
8958 Score on followups. | |
8959 | |
8960 @item b | |
8961 Score on the body. | |
8962 | |
8963 @item h | |
8964 Score on the head. | |
8965 @end table | |
8966 | |
8967 @item | |
8968 The third key is the match type. Which match types are legal depends on | |
8969 what headers you are scoring on. | |
8970 | |
8971 @table @code | |
8972 | |
8973 @item strings | |
8974 | |
8975 @table @kbd | |
8976 | |
8977 @item e | |
8978 Exact matching. | |
8979 | |
8980 @item s | |
8981 Substring matching. | |
8982 | |
8983 @item f | |
8984 Fuzzy matching. | |
8985 | |
8986 @item r | |
8987 Regexp matching | |
8988 @end table | |
8989 | |
8990 @item date | |
8991 @table @kbd | |
8992 | |
8993 @item b | |
8994 Before date. | |
8995 | |
8996 @item a | |
8997 At date. | |
8998 | |
8999 @item n | |
9000 This date. | |
9001 @end table | |
9002 | |
9003 @item number | |
9004 @table @kbd | |
9005 | |
9006 @item < | |
9007 Less than number. | |
9008 | |
9009 @item = | |
9010 Equal to number. | |
9011 | |
9012 @item > | |
9013 Greater than number. | |
9014 @end table | |
9015 @end table | |
9016 | |
9017 @item | |
9018 The fourth and final key says whether this is a temporary (i.e., expiring) | |
9019 score entry, or a permanent (i.e., non-expiring) score entry, or whether | |
9020 it is to be done immediately, without adding to the score file. | |
9021 @table @kbd | |
9022 | |
9023 @item t | |
9024 Temporary score entry. | |
9025 | |
9026 @item p | |
9027 Permanent score entry. | |
9028 | |
9029 @item i | |
9030 Immediately scoring. | |
9031 @end table | |
9032 | |
9033 @end enumerate | |
9034 | |
9035 So, let's say you want to increase the score on the current author with | |
9036 exact matching permanently: @kbd{I a e p}. If you want to lower the | |
9037 score based on the subject line, using substring matching, and make a | |
9038 temporary score entry: @kbd{L s s t}. Pretty easy. | |
9039 | |
9040 To make things a bit more complicated, there are shortcuts. If you use | |
9041 a capital letter on either the second or third keys, Gnus will use | |
9042 defaults for the remaining one or two keystrokes. The defaults are | |
9043 ``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s | |
9044 t}, and @kbd{I a R} is the same as @kbd{I a r t}. | |
9045 | |
9046 @vindex gnus-score-mimic-keymap | |
9047 The @code{gnus-score-mimic-keymap} says whether these commands will | |
9048 pretend they are keymaps or not. | |
9049 | |
9050 | |
9051 @node Group Score Commands | |
9052 @section Group Score Commands | |
9053 @cindex group score commands | |
9054 | |
9055 There aren't many of these as yet, I'm afraid. | |
9056 | |
9057 @table @kbd | |
9058 | |
9059 @item W f | |
9060 @kindex W f (Group) | |
9061 @findex gnus-score-flush-cache | |
9062 Gnus maintains a cache of score alists to avoid having to reload them | |
9063 all the time. This command will flush the cache | |
9064 (@code{gnus-score-flush-cache}). | |
9065 | |
9066 @end table | |
9067 | |
9068 | |
9069 @node Score Variables | |
9070 @section Score Variables | |
9071 @cindex score variables | |
9072 | |
9073 @table @code | |
9074 | |
9075 @item gnus-use-scoring | |
9076 @vindex gnus-use-scoring | |
9077 If @code{nil}, Gnus will not check for score files, and will not, in | |
9078 general, do any score-related work. This is @code{t} by default. | |
9079 | |
9080 @item gnus-kill-killed | |
9081 @vindex gnus-kill-killed | |
9082 If this variable is @code{nil}, Gnus will never apply score files to | |
9083 articles that have already been through the kill process. While this | |
9084 may save you lots of time, it also means that if you apply a kill file | |
9085 to a group, and then change the kill file and want to run it over you | |
9086 group again to kill more articles, it won't work. You have to set this | |
9087 variable to @code{t} to do that. (It is @code{t} by default.) | |
9088 | |
9089 @item gnus-kill-files-directory | |
9090 @vindex gnus-kill-files-directory | |
9091 All kill and score files will be stored in this directory, which is | |
9092 initialized from the @code{SAVEDIR} environment variable by default. | |
9093 This is @file{~/News/} by default. | |
9094 | |
9095 @item gnus-score-file-suffix | |
9096 @vindex gnus-score-file-suffix | |
9097 Suffix to add to the group name to arrive at the score file name | |
9098 (@samp{SCORE} by default.) | |
9099 | |
9100 @item gnus-score-uncacheable-files | |
9101 @vindex gnus-score-uncacheable-files | |
9102 @cindex score cache | |
9103 All score files are normally cached to avoid excessive re-loading of | |
9104 score files. However, if this might make you Emacs grow big and | |
9105 bloated, so this regexp can be used to weed out score files that are | |
9106 unlikely to be needed again. It would be a bad idea to deny caching of | |
9107 @file{all.SCORE}, while it might be a good idea to not cache | |
9108 @file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this | |
9109 variable is @samp{ADAPT$} by default, so no adaptive score files will | |
9110 be cached. | |
9111 | |
9112 @item gnus-save-score | |
9113 @vindex gnus-save-score | |
9114 If you have really complicated score files, and do lots of batch | |
9115 scoring, then you might set this variable to @code{t}. This will make | |
9116 Gnus save the scores into the @file{.newsrc.eld} file. | |
9117 | |
9118 @item gnus-score-interactive-default-score | |
9119 @vindex gnus-score-interactive-default-score | |
9120 Score used by all the interactive raise/lower commands to raise/lower | |
9121 score with. Default is 1000, which may seem excessive, but this is to | |
9122 ensure that the adaptive scoring scheme gets enough room to play with. | |
9123 We don't want the small changes from the adaptive scoring to overwrite | |
9124 manually entered data. | |
9125 | |
9126 @item gnus-summary-default-score | |
9127 @vindex gnus-summary-default-score | |
9128 Default score of an article, which is 0 by default. | |
9129 | |
9130 @item gnus-score-over-mark | |
9131 @vindex gnus-score-over-mark | |
9132 Mark (in the third column) used for articles with a score over the | |
9133 default. Default is @samp{+}. | |
9134 | |
9135 @item gnus-score-below-mark | |
9136 @vindex gnus-score-below-mark | |
9137 Mark (in the third column) used for articles with a score below the | |
9138 default. Default is @samp{-}. | |
9139 | |
9140 @item gnus-score-find-score-files-function | |
9141 @vindex gnus-score-find-score-files-function | |
9142 Function used to find score files for the current group. This function | |
9143 is called with the name of the group as the argument. | |
9144 | |
9145 Predefined functions available are: | |
9146 @table @code | |
9147 | |
9148 @item gnus-score-find-single | |
9149 @findex gnus-score-find-single | |
9150 Only apply the group's own score file. | |
9151 | |
9152 @item gnus-score-find-bnews | |
9153 @findex gnus-score-find-bnews | |
9154 Apply all score files that match, using bnews syntax. This is the | |
9155 default. For instance, if the current group is @samp{gnu.emacs.gnus}, | |
9156 @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and | |
9157 @file{gnu.all.SCORE} would all apply. In short, the instances of | |
9158 @samp{all} in the score file names are translated into @samp{.*}, and | |
9159 then a regexp match is done. | |
9160 | |
9161 This means that if you have some score entries that you want to apply to | |
9162 all groups, then you put those entries in the @file{all.SCORE} file. | |
9163 | |
9164 @item gnus-score-find-hierarchical | |
9165 @findex gnus-score-find-hierarchical | |
9166 Apply all score files from all the parent groups. This means that you | |
9167 can't have score files like @file{all.SCORE} or @file{all.emacs.SCORE}, | |
9168 but you can have @file{SCORE}, @file{comp.SCORE} and | |
9169 @file{comp.emacs.SCORE}. | |
9170 | |
9171 @end table | |
9172 This variable can also be a list of functions. In that case, all these | |
9173 functions will be called, and all the returned lists of score files will | |
9174 be applied. These functions can also return lists of score alists | |
9175 directly. In that case, the functions that return these non-file score | |
9176 alists should probably be placed before the ``real'' score file | |
9177 functions, to ensure that the last score file returned is the local | |
9178 score file. Phu. | |
9179 | |
9180 @item gnus-score-expiry-days | |
9181 @vindex gnus-score-expiry-days | |
9182 This variable says how many days should pass before an unused score file | |
9183 entry is expired. If this variable is @code{nil}, no score file entries | |
9184 are expired. It's 7 by default. | |
9185 | |
9186 @item gnus-update-score-entry-dates | |
9187 @vindex gnus-update-score-entry-dates | |
9188 If this variable is non-@code{nil}, matching score entries will have | |
9189 their dates updated. (This is how Gnus controls expiry---all | |
9190 non-matching entries will become too old while matching entries will | |
9191 stay fresh and young.) However, if you set this variable to @code{nil}, | |
9192 even matching entries will grow old and will have to face that oh-so | |
9193 grim reaper. | |
9194 | |
9195 @item gnus-score-after-write-file-function | |
9196 @vindex gnus-score-after-write-file-function | |
9197 Function called with the name of the score file just written. | |
9198 | |
9199 @end table | |
9200 | |
9201 | |
9202 @node Score File Format | |
9203 @section Score File Format | |
9204 @cindex score file format | |
9205 | |
9206 A score file is an @code{emacs-lisp} file that normally contains just a | |
9207 single form. Casual users are not expected to edit these files; | |
9208 everything can be changed from the summary buffer. | |
9209 | |
9210 Anyway, if you'd like to dig into it yourself, here's an example: | |
9211 | |
9212 @lisp | |
9213 (("from" | |
9214 ("Lars Ingebrigtsen" -10000) | |
9215 ("Per Abrahamsen") | |
9216 ("larsi\\|lmi" -50000 nil R)) | |
9217 ("subject" | |
9218 ("Ding is Badd" nil 728373)) | |
9219 ("xref" | |
9220 ("alt.politics" -1000 728372 s)) | |
9221 ("lines" | |
9222 (2 -100 nil <)) | |
9223 (mark 0) | |
9224 (expunge -1000) | |
9225 (mark-and-expunge -10) | |
9226 (read-only nil) | |
9227 (orphan -10) | |
9228 (adapt t) | |
9229 (files "/hom/larsi/News/gnu.SCORE") | |
9230 (exclude-files "all.SCORE") | |
9231 (local (gnus-newsgroup-auto-expire t) | |
9232 (gnus-summary-make-false-root 'empty)) | |
9233 (eval (ding))) | |
9234 @end lisp | |
9235 | |
9236 This example demonstrates absolutely everything about a score file. | |
9237 | |
9238 Even though this looks much like lisp code, nothing here is actually | |
9239 @code{eval}ed. The lisp reader is used to read this form, though, so it | |
9240 has to be legal syntactically, if not semantically. | |
9241 | |
9242 Six keys are supported by this alist: | |
9243 | |
9244 @table @code | |
9245 | |
9246 @item STRING | |
9247 If the key is a string, it is the name of the header to perform the | |
9248 match on. Scoring can only be performed on these eight headers: | |
9249 @code{From}, @code{Subject}, @code{References}, @code{Message-ID}, | |
9250 @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to | |
9251 these headers, there are three strings to tell Gnus to fetch the entire | |
9252 article and do the match on larger parts of the article: @code{Body} | |
9253 will perform the match on the body of the article, @code{Head} will | |
9254 perform the match on the head of the article, and @code{All} will | |
9255 perform the match on the entire article. Note that using any of these | |
9256 last three keys will slow down group entry @emph{considerably}. The | |
9257 final ``header'' you can score on is @code{Followup}. These score | |
9258 entries will result in new score entries being added for all follow-ups | |
9259 to articles that matches these score entries. | |
9260 | |
9261 Following this key is a arbitrary number of score entries, where each | |
9262 score entry has one to four elements. | |
9263 @enumerate | |
9264 | |
9265 @item | |
9266 The first element is the @dfn{match element}. On most headers this will | |
9267 be a string, but on the Lines and Chars headers, this must be an | |
9268 integer. | |
9269 | |
9270 @item | |
9271 If the second element is present, it should be a number---the @dfn{score | |
9272 element}. This number should be an integer in the neginf to posinf | |
9273 interval. This number is added to the score of the article if the match | |
9274 is successful. If this element is not present, the | |
9275 @code{gnus-score-interactive-default-score} number will be used | |
9276 instead. This is 1000 by default. | |
9277 | |
9278 @item | |
9279 If the third element is present, it should be a number---the @dfn{date | |
9280 element}. This date says when the last time this score entry matched, | |
9281 which provides a mechanism for expiring the score entries. It this | |
9282 element is not present, the score entry is permanent. The date is | |
9283 represented by the number of days since December 31, 1 ce. | |
9284 | |
9285 @item | |
9286 If the fourth element is present, it should be a symbol---the @dfn{type | |
9287 element}. This element specifies what function should be used to see | |
9288 whether this score entry matches the article. What match types that can | |
9289 be used depends on what header you wish to perform the match on. | |
9290 @table @dfn | |
9291 | |
9292 @item From, Subject, References, Xref, Message-ID | |
9293 For most header types, there are the @code{r} and @code{R} (regexp) as | |
9294 well as @code{s} and @code{S} (substring) types and @code{e} and | |
9295 @code{E} (exact match) types. If this element is not present, Gnus will | |
9296 assume that substring matching should be used. @code{R} and @code{S} | |
9297 differ from the other two in that the matches will be done in a | |
9298 case-sensitive manner. All these one-letter types are really just | |
9299 abbreviations for the @code{regexp}, @code{string} and @code{exact} | |
9300 types, which you can use instead, if you feel like. | |
9301 | |
9302 @item Lines, Chars | |
9303 These two headers use different match types: @code{<}, @code{>}, | |
9304 @code{=}, @code{>=} and @code{<=}. | |
9305 | |
9306 @item Date | |
9307 For the Date header we have three match types: @code{before}, @code{at} | |
9308 and @code{after}. I can't really imagine this ever being useful, but, | |
9309 like, it would feel kinda silly not to provide this function. Just in | |
9310 case. You never know. Better safe than sorry. Once burnt, twice shy. | |
9311 Don't judge a book by its cover. Never not have sex on a first date. | |
9312 | |
9313 @item Head, Body, All | |
9314 These three match keys use the same match types as the @code{From} (etc) | |
9315 header uses. | |
9316 | |
9317 @item Followup | |
9318 This match key will add a score entry on all articles that followup to | |
9319 some author. Uses the same match types as the @code{From} header uses. | |
9320 | |
9321 @item Thread | |
9322 This match key will add a score entry on all articles that are part of | |
9323 a thread. Uses the same match types as the @code{References} header | |
9324 uses. | |
9325 @end table | |
9326 @end enumerate | |
9327 | |
9328 @item mark | |
9329 The value of this entry should be a number. Any articles with a score | |
9330 lower than this number will be marked as read. | |
9331 | |
9332 @item expunge | |
9333 The value of this entry should be a number. Any articles with a score | |
9334 lower than this number will be removed from the summary buffer. | |
9335 | |
9336 @item mark-and-expunge | |
9337 The value of this entry should be a number. Any articles with a score | |
9338 lower than this number will be marked as read and removed from the | |
9339 summary buffer. | |
9340 | |
9341 @item thread-mark-and-expunge | |
9342 The value of this entry should be a number. All articles that belong to | |
9343 a thread that has a total score below this number will be marked as read | |
9344 and removed from the summary buffer. @code{gnus-thread-score-function} | |
9345 says how to compute the total score for a thread. | |
9346 | |
9347 @item files | |
9348 The value of this entry should be any number of file names. These files | |
9349 are assumed to be score files as well, and will be loaded the same way | |
9350 this one was. | |
9351 | |
9352 @item exclude-files | |
9353 The clue of this entry should be any number of files. This files will | |
9354 not be loaded, even though they would normally be so, for some reason or | |
9355 other. | |
9356 | |
9357 @item eval | |
9358 The value of this entry will be @code{eval}el. This element will be | |
9359 ignored when handling global score files. | |
9360 | |
9361 @item read-only | |
9362 Read-only score files will not be updated or saved. Global score files | |
9363 should feature this atom (@pxref{Global Score Files}). | |
9364 | |
9365 @item orphan | |
9366 The value of this entry should be a number. Articles that do not have | |
9367 parents will get this number added to their scores. Imagine you follow | |
9368 some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you | |
9369 will only follow a few of the threads, also want to see any new threads. | |
9370 | |
9371 You can do this with the following two score file entries: | |
9372 | |
9373 @example | |
9374 (orphan -500) | |
9375 (mark-and-expunge -100) | |
9376 @end example | |
9377 | |
9378 When you enter the group the first time, you will only see the new | |
9379 threads. You then raise the score of the threads that you find | |
9380 interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the | |
9381 rest. Next time you enter the group, you will see new articles in the | |
9382 interesting threads, plus any new threads. | |
9383 | |
9384 I.e. -- the orphan score atom is for high-volume groups where there | |
9385 exist a few interesting threads which can't be found automatically by | |
9386 ordinary scoring rules. | |
9387 | |
9388 @item adapt | |
9389 This entry controls the adaptive scoring. If it is @code{t}, the | |
9390 default adaptive scoring rules will be used. If it is @code{ignore}, no | |
9391 adaptive scoring will be performed on this group. If it is a list, this | |
9392 list will be used as the adaptive scoring rules. If it isn't present, | |
9393 or is something other than @code{t} or @code{ignore}, the default | |
9394 adaptive scoring rules will be used. If you want to use adaptive | |
9395 scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to | |
9396 @code{t}, and insert an @code{(adapt ignore)} in the groups where you do | |
9397 not want adaptive scoring. If you only want adaptive scoring in a few | |
9398 groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and | |
9399 insert @code{(adapt t)} in the score files of the groups where you want | |
9400 it. | |
9401 | |
9402 @item adapt-file | |
9403 All adaptive score entries will go to the file named by this entry. It | |
9404 will also be applied when entering the group. This atom might be handy | |
9405 if you want to adapt on several groups at once, using the same adaptive | |
9406 file for a number of groups. | |
9407 | |
9408 @item local | |
9409 @cindex local variables | |
9410 The value of this entry should be a list of @code{(VAR VALUE)} pairs. | |
9411 Each @var{var} will be made buffer-local to the current summary buffer, | |
9412 and set to the value specified. This is a convenient, if somewhat | |
9413 strange, way of setting variables in some groups if you don't like hooks | |
9414 much. | |
9415 @end table | |
9416 | |
9417 | |
9418 @node Score File Editing | |
9419 @section Score File Editing | |
9420 | |
9421 You normally enter all scoring commands from the summary buffer, but you | |
9422 might feel the urge to edit them by hand as well, so we've supplied you | |
9423 with a mode for that. | |
9424 | |
9425 It's simply a slightly customized @code{emacs-lisp} mode, with these | |
9426 additional commands: | |
9427 | |
9428 @table @kbd | |
9429 | |
9430 @item C-c C-c | |
9431 @kindex C-c C-c (Score) | |
9432 @findex gnus-score-edit-done | |
9433 Save the changes you have made and return to the summary buffer | |
9434 (@code{gnus-score-edit-done}). | |
9435 | |
9436 @item C-c C-d | |
9437 @kindex C-c C-d (Score) | |
9438 @findex gnus-score-edit-insert-date | |
9439 Insert the current date in numerical format | |
9440 (@code{gnus-score-edit-insert-date}). This is really the day number, if | |
9441 you were wondering. | |
9442 | |
9443 @item C-c C-p | |
9444 @kindex C-c C-p (Score) | |
9445 @findex gnus-score-pretty-print | |
9446 The adaptive score files are saved in an unformatted fashion. If you | |
9447 intend to read one of these files, you want to @dfn{pretty print} it | |
9448 first. This command (@code{gnus-score-pretty-print}) does that for | |
9449 you. | |
9450 | |
9451 @end table | |
9452 | |
9453 Type @kbd{M-x gnus-score-mode} to use this mode. | |
9454 | |
9455 @vindex gnus-score-mode-hook | |
9456 @code{gnus-score-menu-hook} is run in score mode buffers. | |
9457 | |
9458 In the summary buffer you can use commands like @kbd{V f} and @kbd{V | |
9459 e} to begin editing score files. | |
9460 | |
9461 | |
9462 @node Adaptive Scoring | |
9463 @section Adaptive Scoring | |
9464 @cindex adaptive scoring | |
9465 | |
9466 If all this scoring is getting you down, Gnus has a way of making it all | |
9467 happen automatically---as if by magic. Or rather, as if by artificial | |
9468 stupidity, to be precise. | |
9469 | |
9470 @vindex gnus-use-adaptive-scoring | |
9471 When you read an article, or mark an article as read, or kill an | |
9472 article, you leave marks behind. On exit from the group, Gnus can sniff | |
9473 these marks and add score elements depending on what marks it finds. | |
9474 You turn on this ability by setting @code{gnus-use-adaptive-scoring} to | |
9475 @code{t}. | |
9476 | |
9477 @vindex gnus-default-adaptive-score-alist | |
9478 To give you complete control over the scoring process, you can customize | |
9479 the @code{gnus-default-adaptive-score-alist} variable. For instance, it | |
9480 might look something like this: | |
9481 | |
9482 @lisp | |
9483 (defvar gnus-default-adaptive-score-alist | |
9484 '((gnus-unread-mark) | |
9485 (gnus-ticked-mark (from 4)) | |
9486 (gnus-dormant-mark (from 5)) | |
9487 (gnus-del-mark (from -4) (subject -1)) | |
9488 (gnus-read-mark (from 4) (subject 2)) | |
9489 (gnus-expirable-mark (from -1) (subject -1)) | |
9490 (gnus-killed-mark (from -1) (subject -3)) | |
9491 (gnus-kill-file-mark) | |
9492 (gnus-ancient-mark) | |
9493 (gnus-low-score-mark) | |
9494 (gnus-catchup-mark (from -1) (subject -1)))) | |
9495 @end lisp | |
9496 | |
9497 As you see, each element in this alist has a mark as a key (either a | |
9498 variable name or a ``real'' mark---a character). Following this key is | |
9499 a arbitrary number of header/score pairs. If there are no header/score | |
9500 pairs following the key, no adaptive scoring will be done on articles | |
9501 that have that key as the article mark. For instance, articles with | |
9502 @code{gnus-unread-mark} in the example above will not get adaptive score | |
9503 entries. | |
9504 | |
9505 Each article can have only one mark, so just a single of these rules | |
9506 will be applied to each article. | |
9507 | |
9508 To take @code{gnus-del-mark} as an example---this alist says that all | |
9509 articles that have that mark (i.e., are marked with @samp{D}) will have a | |
9510 score entry added to lower based on the @code{From} header by -4, and | |
9511 lowered by @code{Subject} by -1. Change this to fit your prejudices. | |
9512 | |
9513 If you have marked 10 articles with the same subject with | |
9514 @code{gnus-del-mark}, the rule for that mark will be applied ten times. | |
9515 That means that that subject will get a score of ten times -1, which | |
9516 should be, unless I'm much mistaken, -10. | |
9517 | |
9518 The headers you can score on are @code{from}, @code{subject}, | |
9519 @code{message-id}, @code{references}, @code{xref}, @code{lines}, | |
9520 @code{chars} and @code{date}. In addition, you can score on | |
9521 @code{followup}, which will create an adaptive score entry that matches | |
9522 on the @code{References} header using the @code{Message-ID} of the | |
9523 current article, thereby matching the following thread. | |
9524 | |
9525 You can also score on @code{thread}, which will try to score all | |
9526 articles that appear in a thread. @code{thread} matches uses a | |
9527 @code{Message-ID} to match on the @code{References} header of the | |
9528 article. If the match is made, the @code{Message-ID} of the article is | |
9529 added to the @code{thread} rule. (Think about it. I'd recommend two | |
9530 aspirins afterwards.) | |
9531 | |
9532 If you use this scheme, you should set the score file atom @code{mark} | |
9533 to something small---like -300, perhaps, to avoid having small random | |
9534 changes result in articles getting marked as read. | |
9535 | |
9536 After using adaptive scoring for a week or so, Gnus should start to | |
9537 become properly trained and enhance the authors you like best, and kill | |
9538 the authors you like least, without you having to say so explicitly. | |
9539 | |
9540 You can control what groups the adaptive scoring is to be performed on | |
9541 by using the score files (@pxref{Score File Format}). This will also | |
9542 let you use different rules in different groups. | |
9543 | |
9544 @vindex gnus-adaptive-file-suffix | |
9545 The adaptive score entries will be put into a file where the name is the | |
9546 group name with @code{gnus-adaptive-file-suffix} appended. The default | |
9547 is @samp{ADAPT}. | |
9548 | |
9549 @vindex gnus-score-exact-adapt-limit | |
9550 When doing adaptive scoring, substring or fuzzy matching would probably | |
9551 give you the best results in most cases. However, if the header one | |
9552 matches is short, the possibility for false positives is great, so if | |
9553 the length of the match is less than | |
9554 @code{gnus-score-exact-adapt-limit}, exact matching will be used. If | |
9555 this variable is @code{nil}, exact matching will always be used to avoid | |
9556 this problem. | |
9557 | |
9558 | |
9559 @node Followups To Yourself | |
9560 @section Followups To Yourself | |
9561 | |
9562 Gnus offers two commands for picking out the @code{Message-ID} header in | |
9563 the current buffer. Gnus will then add a score rule that scores using | |
9564 this @code{Message-ID} on the @code{References} header of other | |
9565 articles. This will, in effect, increase the score of all articles that | |
9566 respond to the article in the current buffer. Quite useful if you want | |
9567 to easily note when people answer what you've said. | |
9568 | |
9569 @table @code | |
9570 | |
9571 @item gnus-score-followup-article | |
9572 @findex gnus-score-followup-article | |
9573 This will add a score to articles that directly follow up your own | |
9574 article. | |
9575 | |
9576 @item gnus-score-followup-thread | |
9577 @findex gnus-score-followup-thread | |
9578 This will add a score to all articles that appear in a thread ``below'' | |
9579 your own article. | |
9580 @end table | |
9581 | |
9582 @vindex gnus-inews-article-hook | |
9583 These two functions are both primarily meant to be used in hooks like | |
9584 @code{gnus-inews-article-hook}. | |
9585 | |
9586 | |
9587 @node Scoring Tips | |
9588 @section Scoring Tips | |
9589 @cindex scoring tips | |
9590 | |
9591 @table @dfn | |
9592 | |
9593 @item Crossposts | |
9594 @cindex crossposts | |
9595 @cindex scoring crossposts | |
9596 If you want to lower the score of crossposts, the line to match on is | |
9597 the @code{Xref} header. | |
9598 @lisp | |
9599 ("xref" (" talk.politics.misc:" -1000)) | |
9600 @end lisp | |
9601 | |
9602 @item Multiple crossposts | |
9603 If you want to lower the score of articles that have been crossposted to | |
9604 more than, say, 3 groups: | |
9605 @lisp | |
9606 ("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r)) | |
9607 @end lisp | |
9608 | |
9609 @item Matching on the body | |
9610 This is generally not a very good idea---it takes a very long time. | |
9611 Gnus actually has to fetch each individual article from the server. But | |
9612 you might want to anyway, I guess. Even though there are three match | |
9613 keys (@code{Head}, @code{Body} and @code{All}), you should choose one | |
9614 and stick with it in each score file. If you use any two, each article | |
9615 will be fetched @emph{twice}. If you want to match a bit on the | |
9616 @code{Head} and a bit on the @code{Body}, just use @code{All} for all | |
9617 the matches. | |
9618 | |
9619 @item Marking as read | |
9620 You will probably want to mark articles that has a score below a certain | |
9621 number as read. This is most easily achieved by putting the following | |
9622 in your @file{all.SCORE} file: | |
9623 @lisp | |
9624 ((mark -100)) | |
9625 @end lisp | |
9626 You may also consider doing something similar with @code{expunge}. | |
9627 | |
9628 @item Negated character classes | |
9629 If you say stuff like @code{[^abcd]*}, you may get unexpected results. | |
9630 That will match newlines, which might lead to, well, The Unknown. Say | |
9631 @code{[^abcd\n]*} instead. | |
9632 @end table | |
9633 | |
9634 | |
9635 @node Reverse Scoring | |
9636 @section Reverse Scoring | |
9637 @cindex reverse scoring | |
9638 | |
9639 If you want to keep just articles that have @samp{Sex with Emacs} in the | |
9640 subject header, and expunge all other articles, you could put something | |
9641 like this in your score file: | |
9642 | |
9643 @lisp | |
9644 (("subject" | |
9645 ("Sex with Emacs" 2)) | |
9646 (mark 1) | |
9647 (expunge 1)) | |
9648 @end lisp | |
9649 | |
9650 So, you raise all articles that match @samp{Sex with Emacs} and mark the | |
9651 rest as read, and expunge them to boot. | |
9652 | |
9653 | |
9654 @node Global Score Files | |
9655 @section Global Score Files | |
9656 @cindex global score files | |
9657 | |
9658 Sure, other newsreaders have ``global kill files''. These are usually | |
9659 nothing more than a single kill file that applies to all groups, stored | |
9660 in the user's home directory. Bah! Puny, weak newsreaders! | |
9661 | |
9662 What I'm talking about here are Global Score Files. Score files from | |
9663 all over the world, from users everywhere, uniting all nations in one | |
9664 big, happy score file union! Ange-score! New and untested! | |
9665 | |
9666 @vindex gnus-global-score-files | |
9667 All you have to do to use other people's score files is to set the | |
9668 @code{gnus-global-score-files} variable. One entry for each score file, | |
9669 or each score file directory. Gnus will decide by itself what score | |
9670 files are applicable to which group. | |
9671 | |
9672 Say you want to use all score files in the | |
9673 @file{/ftp@@ftp.some-where:/pub/score} directory and the single score | |
9674 file @file{/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE}: | |
9675 | |
9676 @lisp | |
9677 (setq gnus-global-score-files | |
9678 '("/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE" | |
9679 "/ftp@@ftp.some-where:/pub/score/")) | |
9680 @end lisp | |
9681 | |
9682 @findex gnus-score-search-global-directories | |
9683 Simple, eh? Directory names must end with a @samp{/}. These | |
9684 directories are typically scanned only once during each Gnus session. | |
9685 If you feel the need to manually re-scan the remote directories, you can | |
9686 use the @code{gnus-score-search-global-directories} command. | |
9687 | |
9688 Note that, at present, using this option will slow down group entry | |
9689 somewhat. (That is---a lot.) | |
9690 | |
9691 If you want to start maintaining score files for other people to use, | |
9692 just put your score file up for anonymous ftp and announce it to the | |
9693 world. Become a retro-moderator! Participate in the retro-moderator | |
9694 wars sure to ensue, where retro-moderators battle it out for the | |
9695 sympathy of the people, luring them to use their score files on false | |
9696 premises! Yay! The net is saved! | |
9697 | |
9698 Here are some tips for the would-be retro-moderator, off the top of my | |
9699 head: | |
9700 | |
9701 @itemize @bullet | |
9702 | |
9703 @item | |
9704 Articles that are heavily crossposted are probably junk. | |
9705 @item | |
9706 To lower a single inappropriate article, lower by @code{Message-ID}. | |
9707 @item | |
9708 Particularly brilliant authors can be raised on a permanent basis. | |
9709 @item | |
9710 Authors that repeatedly post off-charter for the group can safely be | |
9711 lowered out of existence. | |
9712 @item | |
9713 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest | |
9714 articles completely. | |
9715 | |
9716 @item | |
9717 Use expiring score entries to keep the size of the file down. You | |
9718 should probably have a long expiry period, though, as some sites keep | |
9719 old articles for a long time. | |
9720 @end itemize | |
9721 | |
9722 ... I wonder whether other newsreaders will support global score files | |
9723 in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue | |
9724 Wave, xrn and 1stReader are bound to implement scoring. Should we start | |
9725 holding our breath yet? | |
9726 | |
9727 | |
9728 @node Kill Files | |
9729 @section Kill Files | |
9730 @cindex kill files | |
9731 | |
9732 Gnus still supports those pesky old kill files. In fact, the kill file | |
9733 entries can now be expiring, which is something I wrote before Daniel | |
9734 Quinlan thought of doing score files, so I've left the code in there. | |
9735 | |
9736 In short, kill processing is a lot slower (and I do mean @emph{a lot}) | |
9737 than score processing, so it might be a good idea to rewrite your kill | |
9738 files into score files. | |
9739 | |
9740 Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any | |
9741 forms into this file, which means that you can use kill files as some | |
9742 sort of primitive hook function to be run on group entry, even though | |
9743 that isn't a very good idea. | |
9744 | |
9745 XCNormal kill files look like this: | |
9746 | |
9747 @lisp | |
9748 (gnus-kill "From" "Lars Ingebrigtsen") | |
9749 (gnus-kill "Subject" "ding") | |
9750 (gnus-expunge "X") | |
9751 @end lisp | |
9752 | |
9753 This will mark every article written by me as read, and remove them from | |
9754 the summary buffer. Very useful, you'll agree. | |
9755 | |
9756 Other programs use a totally different kill file syntax. If Gnus | |
9757 encounters what looks like a @code{rn} kill file, it will take a stab at | |
9758 interpreting it. | |
9759 | |
9760 Two summary functions for editing a GNUS kill file: | |
9761 | |
9762 @table @kbd | |
9763 | |
9764 @item M-k | |
9765 @kindex M-k (Summary) | |
9766 @findex gnus-summary-edit-local-kill | |
9767 Edit this group's kill file (@code{gnus-summary-edit-local-kill}). | |
9768 | |
9769 @item M-K | |
9770 @kindex M-K (Summary) | |
9771 @findex gnus-summary-edit-global-kill | |
9772 Edit the general kill file (@code{gnus-summary-edit-global-kill}). | |
9773 @end table | |
9774 | |
9775 Two group mode functions for editing the kill files: | |
9776 | |
9777 @table @kbd | |
9778 | |
9779 @item M-k | |
9780 @kindex M-k (Group) | |
9781 @findex gnus-group-edit-local-kill | |
9782 Edit this group's kill file (@code{gnus-group-edit-local-kill}). | |
9783 | |
9784 @item M-K | |
9785 @kindex M-K (Group) | |
9786 @findex gnus-group-edit-global-kill | |
9787 Edit the general kill file (@code{gnus-group-edit-global-kill}). | |
9788 @end table | |
9789 | |
9790 Kill file variables: | |
9791 | |
9792 @table @code | |
9793 @item gnus-kill-file-name | |
9794 @vindex gnus-kill-file-name | |
9795 A kill file for the group @samp{soc.motss} is normally called | |
9796 @file{soc.motss.KILL}. The suffix appended to the group name to get | |
9797 this file name is detailed by the @code{gnus-kill-file-name} variable. | |
9798 The ``global'' kill file (not in the score file sense of ``global'', of | |
9799 course) is called just @file{KILL}. | |
9800 | |
9801 @vindex gnus-kill-save-kill-file | |
9802 @item gnus-kill-save-kill-file | |
9803 If this variable is non-@code{nil}, Gnus will save the | |
9804 kill file after processing, which is necessary if you use expiring | |
9805 kills. | |
9806 | |
9807 @item gnus-apply-kill-hook | |
9808 @vindex gnus-apply-kill-hook | |
9809 @findex gnus-apply-kill-file-unless-scored | |
9810 @findex gnus-apply-kill-file | |
9811 A hook called to apply kill files to a group. It is | |
9812 @code{(gnus-apply-kill-file)} by default. If you want to ignore the | |
9813 kill file if you have a score file for the same group, you can set this | |
9814 hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want | |
9815 kill files to be processed, you should set this variable to @code{nil}. | |
9816 | |
9817 @item gnus-kill-file-mode-hook | |
9818 @vindex gnus-kill-file-mode-hook | |
9819 A hook called in kill-file mode buffers. | |
9820 | |
9821 @end table | |
9822 | |
9823 | |
9824 @node GroupLens | |
9825 @section GroupLens | |
9826 @cindex GroupLens | |
9827 | |
9828 GroupLens is a collaborative filtering system that helps you work | |
9829 together with other people to find the quality news articles out of the | |
9830 huge volume of news articles generated every day. | |
9831 | |
9832 To accomplish this the GroupLens system combines your opinions about | |
9833 articles you have already read with the opinions of others who have done | |
9834 likewise and gives you a personalized prediction for each unread news | |
9835 article. Think of GroupLens as a matchmaker. GroupLens watches how you | |
9836 rate articles, and finds other people that rate articles the same way. | |
9837 Once it has found for you some people you agree with it tells you, in | |
9838 the form of a prediction, what they thought of the article. You can use | |
9839 this prediction to help you decide whether or not you want to read the | |
9840 article. | |
9841 | |
9842 @menu | |
9843 * Using GroupLens:: How to make Gnus use GroupLens. | |
9844 * Rating Articles:: Letting GroupLens know how you rate articles. | |
9845 * Displaying Predictions:: Displaying predictions given by GroupLens. | |
9846 * GroupLens Variables:: Customizing GroupLens. | |
9847 @end menu | |
9848 | |
9849 | |
9850 @node Using GroupLens | |
9851 @subsection Using GroupLens | |
9852 | |
9853 To use GroupLens you must register a pseudonym with your local Better | |
9854 Bit Bureau (BBB). At the moment the only better bit in town is at | |
9855 @samp{http://www.cs.umn.edu/Research/GroupLens/bbb.html}. | |
9856 | |
9857 Once you have registered you'll need to set a couple of variables. | |
9858 | |
9859 @table @code | |
9860 | |
9861 @item gnus-use-grouplens | |
9862 @vindex gnus-use-grouplens | |
9863 Setting this variable to a non-@code{nil} value will make Gnus hook into | |
9864 all the relevant GroupLens functions. | |
9865 | |
9866 @item grouplens-pseudonym | |
9867 @vindex grouplens-pseudonym | |
9868 This variable should be set to the pseudonum you got when registering | |
9869 with the Better Bit Bureau. | |
9870 | |
9871 @item grouplens-newsgroups | |
9872 @vindex grouplens-newsgroups | |
9873 A list of groups that you want to get GroupLens predictions for. | |
9874 | |
9875 @end table | |
9876 | |
9877 Thats the minimum of what you need to get up and running with GroupLens. | |
9878 Once you've registered, GroupLens will start giving you scores for | |
9879 articles based on the average of what other people think. But, to get | |
9880 the real benefit of GroupLens you need to start rating articles | |
9881 yourself. Then the scores GroupLens gives you will be personalized for | |
9882 you, based on how the people you usually agree with have already rated. | |
9883 | |
9884 | |
9885 @node Rating Articles | |
9886 @subsection Rating Articles | |
9887 | |
9888 In GroupLens, an article is rated on a scale from 1 to 5, inclusive. | |
9889 Where 1 means something like this article is a waste of bandwidth and 5 | |
9890 means that the article was really good. The basic question to ask | |
9891 yourself is, "on a scale from 1 to 5 would I like to see more articles | |
9892 like this one?" | |
9893 | |
9894 There are four ways to enter a rating for an article in GroupLens. | |
9895 | |
9896 @table @kbd | |
9897 | |
9898 @item r | |
9899 @kindex r (GroupLens) | |
9900 @findex bbb-summary-rate-article | |
9901 This function will prompt you for a rating on a scale of one to five. | |
9902 | |
9903 @item k | |
9904 @kindex k (GroupLens) | |
9905 @findex grouplens-score-thread | |
9906 This function will prompt you for a rating, and rate all the articles in | |
9907 the thread. This is really useful for some of those long running giant | |
9908 threads in rec.humor. | |
9909 | |
9910 @end table | |
9911 | |
9912 The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be | |
9913 the score of the article you're reading. | |
9914 | |
9915 @table @kbd | |
9916 | |
9917 @item 1-5 n | |
9918 @kindex n (GroupLens) | |
9919 @findex grouplens-next-unread-article | |
9920 Rate the article and go to the next unread article. | |
9921 | |
9922 @item 1-5 , | |
9923 @kindex , (GroupLens) | |
9924 @findex grouplens-best-unread-article | |
9925 Rate the article and go to the next unread article with the highest score. | |
9926 | |
9927 @end table | |
9928 | |
9929 If you want to give the current article a score of 4 and then go to the | |
9930 next article, just type @kbd{4 n}. | |
9931 | |
9932 | |
9933 @node Displaying Predictions | |
9934 @subsection Displaying Predictions | |
9935 | |
9936 GroupLens makes a prediction for you about how much you will like a | |
9937 news article. The predictions from GroupLens are on a scale from 1 to | |
9938 5, where 1 is the worst and 5 is the best. You can use the predictions | |
9939 from GroupLens in one of three ways controlled by the variable | |
9940 @code{gnus-grouplens-override-scoring}. | |
9941 | |
9942 @vindex gnus-grouplens-override-scoring | |
9943 There are three ways to display predictions in grouplens. You may | |
9944 choose to have the GroupLens scores contribute to, or override the | |
9945 regular gnus scoring mechanism. override is the default; however, some | |
9946 people prefer to see the Gnus scores plus the grouplens scores. To get | |
9947 the separate scoring behavior you need to set | |
9948 @code{gnus-grouplens-override-scoring} to @code{'separate}. To have the | |
9949 GroupLens predictions combined with the grouplens scores set it to | |
9950 @code{'override} and to combine the scores set | |
9951 @code{gnus-grouplens-override-scoring} to @code{'combine}. When you use | |
9952 the combine option you will also want to set the values for | |
9953 @code{grouplens-prediction-offset} and | |
9954 @code{grouplens-score-scale-factor}. | |
9955 | |
9956 @vindex grouplens-prediction-display | |
9957 In either case, GroupLens gives you a few choices for how you would like | |
9958 to see your predictions displayed. The display of predictions is | |
9959 controlled by the @code{grouplens-prediction-display} variable. | |
9960 | |
9961 The following are legal values for that variable. | |
9962 | |
9963 @table @code | |
9964 @item prediction-spot | |
9965 The higher the prediction, the further to the right an @samp{*} is | |
9966 displayed. | |
9967 | |
9968 @item confidence-interval | |
9969 A numeric confidence interval. | |
9970 | |
9971 @item prediction-bar | |
9972 The higher the prediction, the longer the bar. | |
9973 | |
9974 @item confidence-bar | |
9975 Numerical confidence. | |
9976 | |
9977 @item confidence-spot | |
9978 The spot gets bigger with more confidence. | |
9979 | |
9980 @item prediction-num | |
9981 Plain-old numeric value. | |
9982 | |
9983 @item confidence-plus-minus | |
9984 Prediction +/i confidence. | |
9985 | |
9986 @end table | |
9987 | |
9988 | |
9989 @node GroupLens Variables | |
9990 @subsection GroupLens Variables | |
9991 | |
9992 @table @code | |
9993 | |
9994 @item gnus-summary-grouplens-line-format | |
9995 The summary line format used in summary buffers that are GroupLens | |
9996 enhanced. It accepts the same specs as the normal summary line format | |
9997 (@pxref{Summary Buffer Lines}). The default is | |
9998 @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%) %s\n}. | |
9999 | |
10000 @item grouplens-bbb-host | |
10001 Host running the bbbd server. The default is | |
10002 @samp{grouplens.cs.umn.edu}. | |
10003 | |
10004 @item grouplens-bbb-port | |
10005 Port of the host running the bbbd server. The default is 9000. | |
10006 | |
10007 @item grouplens-score-offset | |
10008 Offset the prediction by this value. In other words, subtract the | |
10009 prediction value by this number to arrive at the effective score. The | |
10010 default is 0. | |
10011 | |
10012 @item grouplens-score-scale-factor | |
10013 This variable allows the user to magnify the effect of GroupLens scores. | |
10014 The scale factor is applied after the offset. The default is 1. | |
10015 | |
10016 @end table | |
10017 | |
10018 | |
10019 | |
10020 @node Various | |
10021 @chapter Various | |
10022 | |
10023 @menu | |
10024 * Process/Prefix:: A convention used by many treatment commands. | |
10025 * Interactive:: Making Gnus ask you many questions. | |
10026 * Formatting Variables:: You can specify what buffers should look like. | |
10027 * Windows Configuration:: Configuring the Gnus buffer windows. | |
10028 * Compilation:: How to speed Gnus up. | |
10029 * Mode Lines:: Displaying information in the mode lines. | |
10030 * Highlighting and Menus:: Making buffers look all nice and cozy. | |
10031 * Buttons:: Get tendonitis in ten easy steps! | |
10032 * Daemons:: Gnus can do things behind your back. | |
10033 * NoCeM:: How to avoid spam and other fatty foods. | |
10034 * Picons:: How to display pictures of what your reading. | |
10035 * Various Various:: Things that are really various. | |
10036 @end menu | |
10037 | |
10038 | |
10039 @node Process/Prefix | |
10040 @section Process/Prefix | |
10041 @cindex process/prefix convention | |
10042 | |
10043 Many functions, among them functions for moving, decoding and saving | |
10044 articles, use what is known as the @dfn{Process/Prefix convention}. | |
10045 | |
10046 This is a method for figuring out what articles that the user wants the | |
10047 command to be performed on. | |
10048 | |
10049 It goes like this: | |
10050 | |
10051 If the numeric prefix is N, perform the operation on the next N | |
10052 articles, starting with the current one. If the numeric prefix is | |
10053 negative, perform the operation on the previous N articles, starting | |
10054 with the current one. | |
10055 | |
10056 @vindex transient-mark-mode | |
10057 If @code{transient-mark-mode} in non-@code{nil} and the region is | |
10058 active, all articles in the region will be worked upon. | |
10059 | |
10060 If there is no numeric prefix, but some articles are marked with the | |
10061 process mark, perform the operation on the articles that are marked with | |
10062 the process mark. | |
10063 | |
10064 If there is neither a numeric prefix nor any articles marked with the | |
10065 process mark, just perform the operation on the current article. | |
10066 | |
10067 Quite simple, really, but it needs to be made clear so that surprises | |
10068 are avoided. | |
10069 | |
10070 @vindex gnus-summary-goto-unread | |
10071 One thing that seems to shock & horrify lots of people is that, for | |
10072 instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}. | |
10073 Since each @kbd{d} (which marks the current article as read) by default | |
10074 goes to the next unread article after marking, this means that @kbd{3 d} | |
10075 will mark the next three unread articles as read, no matter what the | |
10076 summary buffer looks like. Set @code{gnus-summary-goto-unread} to | |
10077 @code{nil} for a more straightforward action. | |
10078 | |
10079 | |
10080 @node Interactive | |
10081 @section Interactive | |
10082 @cindex interaction | |
10083 | |
10084 @table @code | |
10085 | |
10086 @item gnus-novice-user | |
10087 @vindex gnus-novice-user | |
10088 If this variable is non-@code{nil}, you are either a newcomer to the | |
10089 World of Usenet, or you are very cautious, which is a nice thing to be, | |
10090 really. You will be given questions of the type ``Are you sure you want | |
10091 to do this?'' before doing anything dangerous. This is @code{t} by | |
10092 default. | |
10093 | |
10094 @item gnus-expert-user | |
10095 @vindex gnus-expert-user | |
10096 If this variable is non-@code{nil}, you will never ever be asked any | |
10097 questions by Gnus. It will simply assume you know what you're doing, no | |
10098 matter how strange. | |
10099 | |
10100 @item gnus-interactive-catchup | |
10101 @vindex gnus-interactive-catchup | |
10102 Require confirmation before catching up a group if non-@code{nil}. It | |
10103 is @code{t} by default. | |
10104 | |
10105 @item gnus-interactive-exit | |
10106 @vindex gnus-interactive-exit | |
10107 Require confirmation before exiting Gnus. This variable is @code{t} by | |
10108 default. | |
10109 @end table | |
10110 | |
10111 | |
10112 @node Formatting Variables | |
10113 @section Formatting Variables | |
10114 @cindex formatting variables | |
10115 | |
10116 Throughout this manual you've probably noticed lots of variables that | |
10117 are called things like @code{gnus-group-line-format} and | |
10118 @code{gnus-summary-mode-line-format}. These control how Gnus is to | |
10119 output lines in the various buffers. There's quite a lot of them. | |
10120 Fortunately, they all use the same syntax, so there's not that much to | |
10121 be annoyed by. | |
10122 | |
10123 Here's an example format spec (from the group buffer): @samp{%M%S%5y: | |
10124 %(%g%)\n}. We see that it is indeed extremely ugly, and that there are | |
10125 lots of percentages everywhere. | |
10126 | |
10127 Each @samp{%} element will be replaced by some string or other when the | |
10128 buffer in question is generated. @samp{%5y} means ``insert the @samp{y} | |
10129 spec, and pad with spaces to get a 5-character field''. Just like a | |
10130 normal format spec, almost. | |
10131 | |
10132 You can also say @samp{%6,4y}, which means that the field will never be | |
10133 more than 6 characters wide and never less than 4 characters wide. | |
10134 | |
10135 There are also specs for highlighting, and these are shared by all the | |
10136 format variables. Text inside the @samp{%(} and @samp{%)} specifiers | |
10137 will get the special @code{mouse-face} property set, which means that it | |
10138 will be highlighted (with @code{gnus-mouse-face}) when you put the mouse | |
10139 pointer over it. | |
10140 | |
10141 Text inside the @samp{%[} and @samp{%]} specifiers will have their | |
10142 normal faces set using @code{gnus-face-0}, which is @code{bold} by | |
10143 default. If you say @samp{%1[} instead, you'll get @code{gnus-face-1} | |
10144 instead, and so on. Create as many faces as you wish. The same goes | |
10145 for the @code{mouse-face} specs---you can say @samp{%3(hello%)} to have | |
10146 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}. | |
10147 | |
10148 Here's an alternative recipe for the group buffer: | |
10149 | |
10150 @lisp | |
10151 ;; Create three face types. | |
10152 (setq gnus-face-1 'bold) | |
10153 (setq gnus-face-3 'italic) | |
10154 | |
10155 ;; We want the article count to be in | |
10156 ;; a bold and green face. So we create | |
10157 ;; a new face called `my-green-bold'. | |
10158 (copy-face 'bold 'my-green-bold) | |
10159 ;; Set the color. | |
10160 (set-face-foreground 'my-green-bold "ForestGreen") | |
10161 (setq gnus-face-2 'my-green-bold) | |
10162 | |
10163 ;; Set the new & fancy format. | |
10164 (setq gnus-group-line-format | |
10165 "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n") | |
10166 @end lisp | |
10167 | |
10168 I'm sure you'll be able to use this scheme to create totally unreadable | |
10169 and extremely vulgar displays. Have fun! | |
10170 | |
10171 Currently Gnus uses the following formatting variables: | |
10172 @code{gnus-group-line-format}, @code{gnus-summary-line-format}, | |
10173 @code{gnus-server-line-format}, @code{gnus-topic-line-format}, | |
10174 @code{gnus-group-mode-line-format}, | |
10175 @code{gnus-summary-mode-line-format}, | |
10176 @code{gnus-article-mode-line-format}, | |
10177 @code{gnus-server-mode-line-format}. | |
10178 | |
10179 Note that the @samp{%(} specs (and friends) do not make any sense on the | |
10180 mode-line variables. | |
10181 | |
10182 All these format variables can also be arbitrary elisp forms. In that | |
10183 case, they will be @code{eval}ed to insert the required lines. | |
10184 | |
10185 @kindex M-x gnus-update-format | |
10186 @findex gnus-update-format | |
10187 Gnus includes a command to help you while creating your own format | |
10188 specs. @kbd{M-x gnus-update-format} will @code{eval} the current form, | |
10189 update the spec in question and pop you to a buffer where you can | |
10190 examine the resulting lisp code to be run to generate the line. | |
10191 | |
10192 | |
10193 @node Windows Configuration | |
10194 @section Windows Configuration | |
10195 @cindex windows configuration | |
10196 | |
10197 No, there's nothing here about X, so be quiet. | |
10198 | |
10199 @vindex gnus-use-full-window | |
10200 If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all | |
10201 other windows and occupy the entire Emacs screen by itself. It is | |
10202 @code{t} by default. | |
10203 | |
10204 @vindex gnus-buffer-configuration | |
10205 @code{gnus-buffer-configuration} describes how much space each Gnus | |
10206 buffer should be given. Here's an excerpt of this variable: | |
10207 | |
10208 @lisp | |
10209 ((group (vertical 1.0 (group 1.0 point) | |
10210 (if gnus-carpal (group-carpal 4)))) | |
10211 (article (vertical 1.0 (summary 0.25 point) | |
10212 (article 1.0)))) | |
10213 @end lisp | |
10214 | |
10215 This is an alist. The @dfn{key} is a symbol that names some action or | |
10216 other. For instance, when displaying the group buffer, the window | |
10217 configuration function will use @code{group} as the key. A full list of | |
10218 possible names is listed below. | |
10219 | |
10220 The @dfn{value} (i. e., the @dfn{split}) says how much space each buffer | |
10221 should occupy. To take the @code{article} split as an example - | |
10222 | |
10223 @lisp | |
10224 (article (vertical 1.0 (summary 0.25 point) | |
10225 (article 1.0))) | |
10226 @end lisp | |
10227 | |
10228 This @dfn{split} says that the summary buffer should occupy 25% of upper | |
10229 half of the screen, and that it is placed over the article buffer. As | |
10230 you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all | |
10231 reaching for that calculator there). However, the special number | |
10232 @code{1.0} is used to signal that this buffer should soak up all the | |
10233 rest of the space available after the rest of the buffers have taken | |
10234 whatever they need. There should be only one buffer with the @code{1.0} | |
10235 size spec per split. | |
10236 | |
10237 Point will be put in the buffer that has the optional third element | |
10238 @code{point}. | |
10239 | |
10240 Here's a more complicated example: | |
10241 | |
10242 @lisp | |
10243 (article (vertical 1.0 (group 4) | |
10244 (summary 0.25 point) | |
10245 (if gnus-carpal (summary-carpal 4)) | |
10246 (article 1.0))) | |
10247 @end lisp | |
10248 | |
10249 If the size spec is an integer instead of a floating point number, | |
10250 then that number will be used to say how many lines a buffer should | |
10251 occupy, not a percentage. | |
10252 | |
10253 If the @dfn{split} looks like something that can be @code{eval}ed (to be | |
10254 precise---if the @code{car} of the split is a function or a subr), this | |
10255 split will be @code{eval}ed. If the result is non-@code{nil}, it will | |
10256 be used as a split. This means that there will be three buffers if | |
10257 @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal} | |
10258 is non-@code{nil}. | |
10259 | |
10260 Not complicated enough for you? Well, try this on for size: | |
10261 | |
10262 @lisp | |
10263 (article (horizontal 1.0 | |
10264 (vertical 0.5 | |
10265 (group 1.0) | |
10266 (gnus-carpal 4)) | |
10267 (vertical 1.0 | |
10268 (summary 0.25 point) | |
10269 (summary-carpal 4) | |
10270 (article 1.0)))) | |
10271 @end lisp | |
10272 | |
10273 Whoops. Two buffers with the mystery 100% tag. And what's that | |
10274 @code{horizontal} thingie? | |
10275 | |
10276 If the first element in one of the split is @code{horizontal}, Gnus will | |
10277 split the window horizontally, giving you two windows side-by-side. | |
10278 Inside each of these strips you may carry on all you like in the normal | |
10279 fashion. The number following @code{horizontal} says what percentage of | |
10280 the screen is to be given to this strip. | |
10281 | |
10282 For each split, there @emph{must} be one element that has the 100% tag. | |
10283 The splitting is never accurate, and this buffer will eat any leftover | |
10284 lines from the splits. | |
10285 | |
10286 To be slightly more formal, here's a definition of what a legal split | |
10287 may look like: | |
10288 | |
10289 @example | |
10290 split = frame | horizontal | vertical | buffer | form | |
10291 frame = "(frame " size *split ")" | |
10292 horizontal = "(horizontal " size *split ")" | |
10293 vertical = "(vertical " size *split ")" | |
10294 buffer = "(" buffer-name " " size *[ "point" ] ")" | |
10295 size = number | frame-params | |
10296 buffer-name = group | article | summary ... | |
10297 @end example | |
10298 | |
10299 The limitations are that the @code{frame} split can only appear as the | |
10300 top-level split. @var{form} should be an Emacs Lisp form that should | |
10301 return a valid split. We see that each split is fully recursive, and | |
10302 may contain any number of @code{vertical} and @code{horizontal} splits. | |
10303 | |
10304 @vindex gnus-window-min-width | |
10305 @vindex gnus-window-min-height | |
10306 @cindex window height | |
10307 @cindex window width | |
10308 Finding the right sizes can be a bit complicated. No window may be less | |
10309 than @code{gnus-window-min-height} (default 2) characters high, and all | |
10310 windows must be at least @code{gnus-window-min-width} (default 1) | |
10311 characters wide. Gnus will try to enforce this before applying the | |
10312 splits. If you want to use the normal Emacs window width/height limit, | |
10313 you can just set these two variables to @code{nil}. | |
10314 | |
10315 If you're not familiar with Emacs terminology, @code{horizontal} and | |
10316 @code{vertical} splits may work the opposite way of what you'd expect. | |
10317 Windows inside a @code{horizontal} split are shown side-by-side, and | |
10318 windows within a @code{vertical} split are shown above each other. | |
10319 | |
10320 @findex gnus-configure-frame | |
10321 If you want to experiment with window placement, a good tip is to call | |
10322 @code{gnus-configure-frame} directly with a split. This is the function | |
10323 that does all the real work when splitting buffers. Below is a pretty | |
10324 nonsensical configuration with 5 windows; two for the group buffer and | |
10325 three for the article buffer. (I said it was nonsensical.) If you | |
10326 @code{eval} the statement below, you can get an idea of how that would | |
10327 look straight away, without going through the normal Gnus channels. | |
10328 Play with it until you're satisfied, and then use | |
10329 @code{gnus-add-configuration} to add your new creation to the buffer | |
10330 configuration list. | |
10331 | |
10332 @lisp | |
10333 (gnus-configure-frame | |
10334 '(horizontal 1.0 | |
10335 (vertical 10 | |
10336 (group 1.0) | |
10337 (article 0.3 point)) | |
10338 (vertical 1.0 | |
10339 (article 1.0) | |
10340 (horizontal 4 | |
10341 (group 1.0) | |
10342 (article 10))))) | |
10343 @end lisp | |
10344 | |
10345 You might want to have several frames as well. No prob---just use the | |
10346 @code{frame} split: | |
10347 | |
10348 @lisp | |
10349 (gnus-configure-frame | |
10350 '(frame 1.0 | |
10351 (vertical 1.0 | |
10352 (summary 0.25 point) | |
10353 (article 1.0)) | |
10354 (vertical ((height . 5) (width . 15) | |
10355 (user-position . t) | |
10356 (left . -1) (top . 1)) | |
10357 (picon 1.0)))) | |
10358 | |
10359 @end lisp | |
10360 | |
10361 This split will result in the familiar summary/article window | |
10362 configuration in the first (or ``main'') frame, while a small additional | |
10363 frame will be created where picons will be shown. As you can see, | |
10364 instead of the normal @code{1.0} top-level spec, each additional split | |
10365 should have a frame parameter alist as the size spec. | |
10366 @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp | |
10367 Reference Manual}. | |
10368 | |
10369 Here's a list of all possible keys for | |
10370 @code{gnus-buffer-configuration}: | |
10371 | |
10372 @code{group}, @code{summary}, @code{article}, @code{server}, | |
10373 @code{browse}, @code{group-mail}, @code{summary-mail}, | |
10374 @code{summary-reply}, @code{info}, @code{summary-faq}, | |
10375 @code{edit-group}, @code{edit-server}, @code{reply}, @code{reply-yank}, | |
10376 @code{followup}, @code{followup-yank}, @code{edit-score}. | |
10377 | |
10378 @findex gnus-add-configuration | |
10379 Since the @code{gnus-buffer-configuration} variable is so long and | |
10380 complicated, there's a function you can use to ease changing the config | |
10381 of a single setting: @code{gnus-add-configuration}. If, for instance, | |
10382 you want to change the @code{article} setting, you could say: | |
10383 | |
10384 @lisp | |
10385 (gnus-add-configuration | |
10386 '(article (vertical 1.0 | |
10387 (group 4) | |
10388 (summary .25 point) | |
10389 (article 1.0)))) | |
10390 @end lisp | |
10391 | |
10392 You'd typically stick these @code{gnus-add-configuration} calls in your | |
10393 @file{.gnus} file or in some startup hook -- they should be run after | |
10394 Gnus has been loaded. | |
10395 | |
10396 | |
10397 @node Compilation | |
10398 @section Compilation | |
10399 @cindex compilation | |
10400 @cindex byte-compilation | |
10401 | |
10402 @findex gnus-compile | |
10403 | |
10404 Remember all those line format specification variables? | |
10405 @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so | |
10406 on. Now, Gnus will of course heed whatever these variables are, but, | |
10407 unfortunately, changing them will mean a quite significant slow-down. | |
10408 (The default values of these variables have byte-compiled functions | |
10409 associated with them, while the user-generated versions do not, of | |
10410 course.) | |
10411 | |
10412 To help with this, you can run @kbd{M-x gnus-compile} after you've | |
10413 fiddled around with the variables and feel that you're (kind of) | |
10414 satisfied. This will result in the new specs being byte-compiled, and | |
10415 you'll get top speed again. | |
10416 | |
10417 | |
10418 @node Mode Lines | |
10419 @section Mode Lines | |
10420 @cindex mode lines | |
10421 | |
10422 @vindex gnus-updated-mode-lines | |
10423 @code{gnus-updated-mode-lines} says what buffers should keep their mode | |
10424 lines updated. It is a list of symbols. Supported symbols include | |
10425 @code{group}, @code{article}, @code{summary}, @code{server}, | |
10426 @code{browse}, and @code{tree}. If the corresponding symbol is present, | |
10427 Gnus will keep that mode line updated with information that may be | |
10428 pertinent. If this variable is @code{nil}, screen refresh may be | |
10429 quicker. | |
10430 | |
10431 @cindex display-time | |
10432 | |
10433 @vindex gnus-mode-non-string-length | |
10434 By default, Gnus displays information on the current article in the mode | |
10435 lines of the summary and article buffers. The information Gnus wishes | |
10436 to display (eg. the subject of the article) is often longer than the | |
10437 mode lines, and therefore have to be cut off at some point. The | |
10438 @code{gnus-mode-non-string-length} variable says how long the other | |
10439 elements on the line is (i.e., the non-info part). If you put | |
10440 additional elements on the mode line (eg. a clock), you should modify | |
10441 this variable: | |
10442 | |
10443 @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it> | |
10444 @lisp | |
10445 (add-hook 'display-time-hook | |
10446 (lambda () (setq gnus-mode-non-string-length | |
10447 (+ 21 | |
10448 (if line-number-mode 5 0) | |
10449 (if column-number-mode 4 0) | |
10450 (length display-time-string))))) | |
10451 @end lisp | |
10452 | |
10453 If this variable is @code{nil} (which is the default), the mode line | |
10454 strings won't be chopped off, and they won't be padded either. | |
10455 | |
10456 | |
10457 @node Highlighting and Menus | |
10458 @section Highlighting and Menus | |
10459 @cindex visual | |
10460 @cindex highlighting | |
10461 @cindex menus | |
10462 | |
10463 @vindex gnus-visual | |
10464 The @code{gnus-visual} variable controls most of the prettifying Gnus | |
10465 aspects. If @code{nil}, Gnus won't attempt to create menus or use fancy | |
10466 colors or fonts. This will also inhibit loading the @file{gnus-vis.el} | |
10467 file. | |
10468 | |
10469 This variable can be a list of visual properties that are enabled. The | |
10470 following elements are legal, and are all included by default: | |
10471 | |
10472 @table @code | |
10473 @item group-highlight | |
10474 Do highlights in the group buffer. | |
10475 @item summary-highlight | |
10476 Do highlights in the summary buffer. | |
10477 @item article-highlight | |
10478 Do highlights in the article buffer. | |
10479 @item highlight | |
10480 Turn on highlighting in all buffers. | |
10481 @item group-menu | |
10482 Create menus in the group buffer. | |
10483 @item summary-menu | |
10484 Create menus in the summary buffers. | |
10485 @item article-menu | |
10486 Create menus in the article buffer. | |
10487 @item browse-menu | |
10488 Create menus in the browse buffer. | |
10489 @item server-menu | |
10490 Create menus in the server buffer. | |
10491 @item score-menu | |
10492 Create menus in the score buffers. | |
10493 @item menu | |
10494 Create menus in all buffers. | |
10495 @end table | |
10496 | |
10497 So if you only want highlighting in the article buffer and menus in all | |
10498 buffers, you could say something like: | |
10499 | |
10500 @lisp | |
10501 (setq gnus-visual '(article-highlight menu)) | |
10502 @end lisp | |
10503 | |
10504 If you want only highlighting and no menus whatsoever, you'd say: | |
10505 | |
10506 @lisp | |
10507 (setq gnus-visual '(highlight)) | |
10508 @end lisp | |
10509 | |
10510 If @code{gnus-visual} is @code{t}, highlighting and menus will be used | |
10511 in all Gnus buffers. | |
10512 | |
10513 Other general variables that influence the look of all buffers include: | |
10514 | |
10515 @table @code | |
10516 @item gnus-mouse-face | |
10517 @vindex gnus-mouse-face | |
10518 This is the face (i.e., font) used for mouse highlighting in Gnus. No | |
10519 mouse highlights will be done if @code{gnus-visual} is @code{nil}. | |
10520 | |
10521 @item gnus-display-type | |
10522 @vindex gnus-display-type | |
10523 This variable is symbol indicating the display type Emacs is running | |
10524 under. The symbol should be one of @code{color}, @code{grayscale} or | |
10525 @code{mono}. If Gnus guesses this display attribute wrongly, either set | |
10526 this variable in your @file{~/.emacs} or set the resource | |
10527 @code{Emacs.displayType} in your @file{~/.Xdefaults}. | |
10528 | |
10529 @item gnus-background-mode | |
10530 @vindex gnus-background-mode | |
10531 This is a symbol indicating the Emacs background brightness. The symbol | |
10532 should be one of @code{light} or @code{dark}. If Gnus guesses this | |
10533 frame attribute wrongly, either set this variable in your @file{~/.emacs} or | |
10534 set the resource @code{Emacs.backgroundMode} in your @file{~/.Xdefaults}. | |
10535 `gnus-display-type'. | |
10536 @end table | |
10537 | |
10538 There are hooks associated with the creation of all the different menus: | |
10539 | |
10540 @table @code | |
10541 | |
10542 @item gnus-article-menu-hook | |
10543 @vindex gnus-article-menu-hook | |
10544 Hook called after creating the article mode menu. | |
10545 | |
10546 @item gnus-group-menu-hook | |
10547 @vindex gnus-group-menu-hook | |
10548 Hook called after creating the group mode menu. | |
10549 | |
10550 @item gnus-summary-menu-hook | |
10551 @vindex gnus-summary-menu-hook | |
10552 Hook called after creating the summary mode menu. | |
10553 | |
10554 @item gnus-server-menu-hook | |
10555 @vindex gnus-server-menu-hook | |
10556 Hook called after creating the server mode menu. | |
10557 | |
10558 @item gnus-browse-menu-hook | |
10559 @vindex gnus-browse-menu-hook | |
10560 Hook called after creating the browse mode menu. | |
10561 | |
10562 @item gnus-score-menu-hook | |
10563 @vindex gnus-score-menu-hook | |
10564 Hook called after creating the score mode menu. | |
10565 | |
10566 @end table | |
10567 | |
10568 | |
10569 @node Buttons | |
10570 @section Buttons | |
10571 @cindex buttons | |
10572 @cindex mouse | |
10573 @cindex click | |
10574 | |
10575 Those new-fangled @dfn{mouse} contraptions is very popular with the | |
10576 young, hep kids who don't want to learn the proper way to do things | |
10577 these days. Why, I remember way back in the summer of '89, when I was | |
10578 using Emacs on a Tops 20 system. Three hundred users on one single | |
10579 machine, and every user was running Simula compilers. Bah! | |
10580 | |
10581 Right. | |
10582 | |
10583 @vindex gnus-carpal | |
10584 Well, you can make Gnus display bufferfuls of buttons you can click to | |
10585 do anything by setting @code{gnus-carpal} to @code{t}. Pretty simple, | |
10586 really. Tell the chiropractor I sent you. | |
10587 | |
10588 | |
10589 @table @code | |
10590 | |
10591 @item gnus-carpal-mode-hook | |
10592 @vindex gnus-carpal-mode-hook | |
10593 Hook run in all carpal mode buffers. | |
10594 | |
10595 @item gnus-carpal-button-face | |
10596 @vindex gnus-carpal-button-face | |
10597 Face used on buttons. | |
10598 | |
10599 @item gnus-carpal-header-face | |
10600 @vindex gnus-carpal-header-face | |
10601 Face used on carpal buffer headers. | |
10602 | |
10603 @item gnus-carpal-group-buffer-buttons | |
10604 @vindex gnus-carpal-group-buffer-buttons | |
10605 Buttons in the group buffer. | |
10606 | |
10607 @item gnus-carpal-summary-buffer-buttons | |
10608 @vindex gnus-carpal-summary-buffer-buttons | |
10609 Buttons in the summary buffer. | |
10610 | |
10611 @item gnus-carpal-server-buffer-buttons | |
10612 @vindex gnus-carpal-server-buffer-buttons | |
10613 Buttons in the server buffer. | |
10614 | |
10615 @item gnus-carpal-browse-buffer-buttons | |
10616 @vindex gnus-carpal-browse-buffer-buttons | |
10617 Buttons in the browse buffer. | |
10618 @end table | |
10619 | |
10620 All the @code{buttons} variables are lists. The elements in these list | |
10621 is either a cons cell where the car contains a text to be displayed and | |
10622 the cdr contains a function symbol, or a simple string. | |
10623 | |
10624 | |
10625 @node Daemons | |
10626 @section Daemons | |
10627 @cindex demons | |
10628 @cindex daemons | |
10629 | |
10630 Gnus, being larger than any program ever written (allegedly), does lots | |
10631 of strange stuff that you may wish to have done while you're not | |
10632 present. For instance, you may want it to check for new mail once in a | |
10633 while. Or you may want it to close down all connections to all servers | |
10634 when you leave Emacs idle. And stuff like that. | |
10635 | |
10636 Gnus will let you do stuff like that by defining various | |
10637 @dfn{handlers}. Each handler consists of three elements: A | |
10638 @var{function}, a @var{time}, and an @var{idle} parameter. | |
10639 | |
10640 Here's an example of a handler that closes connections when Emacs has | |
10641 been idle for thirty minutes: | |
10642 | |
10643 @lisp | |
10644 (gnus-demon-close-connections nil 30) | |
10645 @end lisp | |
10646 | |
10647 Here's a handler that scans for PGP headers every hour when Emacs is | |
10648 idle: | |
10649 | |
10650 @lisp | |
10651 (gnus-demon-scan-pgp 60 t) | |
10652 @end lisp | |
10653 | |
10654 This @var{time} parameter and than @var{idle} parameter works together | |
10655 in a strange, but wonderful fashion. Basically, if @var{idle} is | |
10656 @code{nil}, then the function will be called every @var{time} minutes. | |
10657 | |
10658 If @var{idle} is @code{t}, then the function will be called after | |
10659 @var{time} minutes only if Emacs is idle. So if Emacs is never idle, | |
10660 the function will never be called. But once Emacs goes idle, the | |
10661 function will be called every @var{time} minutes. | |
10662 | |
10663 If @var{idle} is a number and @var{time} is a number, the function will | |
10664 be called every @var{time} minutes only when Emacs has been idle for | |
10665 @var{idle} minutes. | |
10666 | |
10667 If @var{idle} is a number and @var{time} is @code{nil}, the function | |
10668 will be called once every time Emacs has been idle for @var{idle} | |
10669 minutes. | |
10670 | |
10671 And if @var{time} is a string, it should look like @samp{07:31}, and | |
10672 the function will then be called once every day somewhere near that | |
10673 time. Modified by the @var{idle} parameter, of course. | |
10674 | |
10675 @vindex gnus-demon-timestep | |
10676 (When I say ``minute'' here, I really mean @code{gnus-demon-timestep} | |
10677 seconds. This is @code{60} by default. If you change that variable, | |
10678 all the timings in the handlers will be affected.) | |
10679 | |
10680 @vindex gnus-use-demon | |
10681 To set the whole thing in motion, though, you have to set | |
10682 @code{gnus-use-demon} to @code{t}. | |
10683 | |
10684 So, if you want to add a handler, you could put something like this in | |
10685 your @file{.gnus} file: | |
10686 | |
10687 @findex gnus-demon-add-handler | |
10688 @lisp | |
10689 (gnus-demon-add-handler 'gnus-demon-close-connections nil 30) | |
10690 @end lisp | |
10691 | |
10692 @findex gnus-demon-add-nocem | |
10693 @findex gnus-demon-add-scanmail | |
10694 @findex gnus-demon-add-disconnection | |
10695 Some ready-made functions to do this has been created: | |
10696 @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection}, and | |
10697 @code{gnus-demon-add-scanmail}. Just put those functions in your | |
10698 @file{.gnus} if you want those abilities. | |
10699 | |
10700 @findex gnus-demon-init | |
10701 @findex gnus-demon-cancel | |
10702 @vindex gnus-demon-handlers | |
10703 If you add handlers to @code{gnus-demon-handlers} directly, you should | |
10704 run @code{gnus-demon-init} to make the changes take hold. To cancel all | |
10705 daemons, you can use the @code{gnus-demon-cancel} function. | |
10706 | |
10707 Note that adding daemons can be pretty naughty if you overdo it. Adding | |
10708 functions that scan all news and mail from all servers every two seconds | |
10709 is a sure-fire way of getting booted off any respectable system. So | |
10710 behave. | |
10711 | |
10712 | |
10713 @node NoCeM | |
10714 @section NoCeM | |
10715 @cindex nocem | |
10716 @cindex spam | |
10717 | |
10718 @dfn{Spamming} is posting the same article lots and lots of times. | |
10719 Spamming is bad. Spamming is evil. | |
10720 | |
10721 Spamming is usually canceled within a day or so by various anti-spamming | |
10722 agencies. These agencies usually also send out @dfn{NoCeM} messages. | |
10723 NoCeM is pronounced ``no see-'em'', and means what the name | |
10724 implies---these are messages that make the offending articles, like, go | |
10725 away. | |
10726 | |
10727 What use are these NoCeM messages if the articles are canceled anyway? | |
10728 Some sites do not honor cancel messages and some sites just honor cancels | |
10729 from a select few people. Then you may wish to make use of the NoCeM | |
10730 messages, which are distributed in the @samp{alt.nocem.misc} newsgroup. | |
10731 | |
10732 Gnus can read and parse the messages in this group automatically, and | |
10733 this will make spam disappear. | |
10734 | |
10735 There are some variables to customize, of course: | |
10736 | |
10737 @table @code | |
10738 @item gnus-use-nocem | |
10739 @vindex gnus-use-nocem | |
10740 Set this variable to @code{t} to set the ball rolling. It is @code{nil} | |
10741 by default. | |
10742 | |
10743 @item gnus-nocem-groups | |
10744 @vindex gnus-nocem-groups | |
10745 Gnus will look for NoCeM messages in the groups in this list. The | |
10746 default is @code{("alt.nocem.misc" "news.admin.net-abuse.announce")}. | |
10747 | |
10748 @item gnus-nocem-issuers | |
10749 @vindex gnus-nocem-issuers | |
10750 There are many people issuing NoCeM messages. This list says what | |
10751 people you want to listen to. The default is @code{("Automoose-1" | |
10752 "clewis@@ferret.ocunix.on.ca;" "jem@@xpat.com;" "red@@redpoll.mrfs.oh.us | |
10753 (Richard E. Depew)")}; fine, upstanding citizens all of them. | |
10754 | |
10755 Known despammers that you can put in this list include: | |
10756 | |
10757 @table @samp | |
10758 @item clewis@@ferret.ocunix.on.ca; | |
10759 @cindex Chris Lewis | |
10760 Chris Lewis---Major Canadian despammer who has probably canceled more | |
10761 usenet abuse than anybody else. | |
10762 | |
10763 @item Automoose-1 | |
10764 @cindex CancelMoose[tm] | |
10765 The CancelMoose[tm] on autopilot. The CancelMoose[tm] is reputed to be | |
10766 Norwegian, and was the person(s) who invented NoCeM. | |
10767 | |
10768 @item jem@@xpat.com; | |
10769 @cindex Jem | |
10770 Jem---Korean despammer who is getting very busy these days. | |
10771 | |
10772 @item red@@redpoll.mrfs.oh.us (Richard E. Depew) | |
10773 Richard E. Depew---lone American despammer. He mostly cancels binary | |
10774 postings to non-binary groups and removes spews (regurgitated articles). | |
10775 @end table | |
10776 | |
10777 You do not have to heed NoCeM messages from all these people---just the | |
10778 ones you want to listen to. | |
10779 | |
10780 @item gnus-nocem-directory | |
10781 @vindex gnus-nocem-directory | |
10782 This is where Gnus will store its NoCeM cache files. The default is | |
10783 @file{~/News/NoCeM/}. | |
10784 | |
10785 @item gnus-nocem-expiry-wait | |
10786 @vindex gnus-nocem-expiry-wait | |
10787 The number of days before removing old NoCeM entries from the cache. | |
10788 The default is 15. If you make it shorter Gnus will be faster, but you | |
10789 might then see old spam. | |
10790 | |
10791 @end table | |
10792 | |
10793 | |
10794 @node Picons | |
10795 @section Picons | |
10796 | |
10797 So... You want to slow down your news reader even more! This is a | |
10798 good way to do so. Its also a great way to impress people staring | |
10799 over your shoulder as you read news. | |
10800 | |
10801 @menu | |
10802 * Picon Basics:: What are picons and How do I get them. | |
10803 * Picon Requirements:: Don't go further if you aren't using XEmacs. | |
10804 * Easy Picons:: Displaying Picons -- the easy way. | |
10805 * Hard Picons:: The way you should do it. You'll learn something. | |
10806 * Picon Configuration:: Other variables you can trash/tweak/munge/play with. | |
10807 @end menu | |
10808 | |
10809 | |
10810 @node Picon Basics | |
10811 @subsection Picon Basics | |
10812 | |
10813 What are Picons? To quote directly from the Picons Web site | |
10814 (@samp{http://www.cs.indiana.edu/picons/ftp/index.html}): | |
10815 | |
10816 @quotation | |
10817 @dfn{Picons} is short for ``personal icons''. They're small, | |
10818 constrained images used to represent users and domains on the net, | |
10819 organized into databases so that the appropriate image for a given | |
10820 e-mail address can be found. Besides users and domains, there are picon | |
10821 databases for Usenet newsgroups and weather forecasts. The picons are | |
10822 in either monochrome @code{XBM} format or color @code{XPM} and | |
10823 @code{GIF} formats. | |
10824 @end quotation | |
10825 | |
10826 Please see the above mentioned web site for instructions on obtaining | |
10827 and installing the picons databases, or the following ftp site: | |
10828 @samp{http://www.cs.indiana.edu/picons/ftp/index.html}. | |
10829 | |
10830 @vindex gnus-picons-database | |
10831 Gnus expects picons to be installed into a location pointed to by | |
10832 @code{gnus-picons-database}. | |
10833 | |
10834 | |
10835 @node Picon Requirements | |
10836 @subsection Picon Requirements | |
10837 | |
10838 To use have Gnus display Picons for you, you must be running XEmacs | |
10839 19.13 or greater since all other versions of Emacs aren't yet able to | |
10840 display images. | |
10841 | |
10842 Additionally, you must have @code{xpm} support compiled into XEmacs. | |
10843 | |
10844 @vindex gnus-picons-convert-x-face | |
10845 If you want to display faces from @code{X-Face} headers, you must have | |
10846 the @code{netpbm} utilities installed, or munge the | |
10847 @code{gnus-picons-convert-x-face} variable to use something else. | |
10848 | |
10849 | |
10850 @node Easy Picons | |
10851 @subsection Easy Picons | |
10852 | |
10853 To enable displaying picons, simply put the following line in your | |
10854 @file{~/.gnus} file and start Gnus. | |
10855 | |
10856 @lisp | |
10857 (setq gnus-use-picons t) | |
10858 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t) | |
10859 (add-hook 'gnus-summary-prepare-hook 'gnus-group-display-picons t) | |
10860 (add-hook 'gnus-article-display-hook 'gnus-picons-article-display-x-face) | |
10861 @end lisp | |
10862 | |
10863 | |
10864 @node Hard Picons | |
10865 @subsection Hard Picons | |
10866 | |
10867 Gnus can display picons for you as you enter and leave groups and | |
10868 articles. It knows how to interact with three sections of the picons | |
10869 database. Namely, it can display the picons newsgroup pictures, | |
10870 author's face picture(s), and the authors domain. To enable this | |
10871 feature, you need to first decide where to display them. | |
10872 | |
10873 @table @code | |
10874 | |
10875 @item gnus-picons-display-where | |
10876 @vindex gnus-picons-display-where | |
10877 Where the picon images should be displayed. It is @code{picons} by | |
10878 default (which by default maps to the buffer @samp{*Picons*}). Other | |
10879 valid places could be @code{article}, @code{summary}, or | |
10880 @samp{"*scratch*"} for all I care. Just make sure that you've made the | |
10881 buffer visible using the standard Gnus window configuration routines -- | |
10882 @xref{Windows Configuration}. | |
10883 | |
10884 @end table | |
10885 | |
10886 Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your | |
10887 window configuration for you to include the @code{picons} buffer. | |
10888 | |
10889 Now that you've made that decision, you need to add the following | |
10890 functions to the appropriate hooks so these pictures will get | |
10891 displayed at the right time. | |
10892 | |
10893 @vindex gnus-article-display-hook | |
10894 @vindex gnus-picons-display-where | |
10895 @table @code | |
10896 @item gnus-article-display-picons | |
10897 @findex gnus-article-display-picons | |
10898 Looks up and display the picons for the author and the author's domain | |
10899 in the @code{gnus-picons-display-where} buffer. Should be added to | |
10900 the @code{gnus-article-display-hook}. | |
10901 | |
10902 @item gnus-group-display-picons | |
10903 @findex gnus-article-display-picons | |
10904 Displays picons representing the current group. This function should | |
10905 be added to the @code{gnus-summary-prepare-hook} or to the | |
10906 @code{gnus-article-display-hook} if @code{gnus-picons-display-where} | |
10907 is set to @code{article}. | |
10908 | |
10909 @item gnus-picons-article-display-x-face | |
10910 @findex gnus-article-display-picons | |
10911 Decodes and displays the X-Face header if present. This function | |
10912 should be added to @code{gnus-article-display-hook}. | |
10913 | |
10914 @end table | |
10915 | |
10916 Note: You must append them to the hook, so make sure to specify 't' | |
10917 to the append flag of @code{add-hook}: | |
10918 | |
10919 @lisp | |
10920 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t) | |
10921 @end lisp | |
10922 | |
10923 | |
10924 @node Picon Configuration | |
10925 @subsection Picon Configuration | |
10926 | |
10927 The following variables offer further control over how things are | |
10928 done, where things are located, and other useless stuff you really | |
10929 don't need to worry about. | |
10930 | |
10931 @table @code | |
10932 @item gnus-picons-database | |
10933 @vindex gnus-picons-database | |
10934 The location of the picons database. Should point to a directory | |
10935 containing the @file{news}, @file{domains}, @file{users} (and so on) | |
10936 subdirectories. Defaults to @file{/usr/local/faces}. | |
10937 | |
10938 @item gnus-picons-news-directory | |
10939 @vindex gnus-picons-news-directory | |
10940 Sub-directory of the faces database containing the icons for | |
10941 newsgroups. | |
10942 | |
10943 @item gnus-picons-user-directories | |
10944 @vindex gnus-picons-user-directories | |
10945 List of subdirectories to search in @code{gnus-picons-database} for user | |
10946 faces. Defaults to @code{("local" "users" "usenix" "misc/MISC")}. | |
10947 | |
10948 @item gnus-picons-domain-directories | |
10949 @vindex gnus-picons-domain-directories | |
10950 List of subdirectories to search in @code{gnus-picons-database} for | |
10951 domain name faces. Defaults to @code{("domains")}. Some people may | |
10952 want to add @samp{unknown} to this list. | |
10953 | |
10954 @item gnus-picons-convert-x-face | |
10955 @vindex gnus-picons-convert-x-face | |
10956 The command to use to convert the @code{X-Face} header to an X bitmap | |
10957 (@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48, | |
10958 Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" | |
10959 gnus-picons-x-face-file-name)} | |
10960 | |
10961 @item gnus-picons-x-face-file-name | |
10962 @vindex gnus-picons-x-face-file-name | |
10963 Names a temporary file to store the @code{X-Face} bitmap in. Defaults | |
10964 to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}. | |
10965 | |
10966 @item gnus-picons-buffer | |
10967 @vindex gnus-picons-buffer | |
10968 The name of the buffer that @code{picons} points to. Defaults to | |
10969 @samp{*Icon Buffer*}. | |
10970 | |
10971 @end table | |
10972 | |
10973 | |
10974 @node Various Various | |
10975 @section Various Various | |
10976 @cindex mode lines | |
10977 @cindex highlights | |
10978 | |
10979 @table @code | |
10980 | |
10981 @item gnus-verbose | |
10982 @vindex gnus-verbose | |
10983 This variable is an integer between zero and ten. The higher the value, | |
10984 the more messages will be displayed. If this variable is zero, Gnus | |
10985 will never flash any messages, if it is seven (which is the default), | |
10986 most important messages will be shown, and if it is ten, Gnus won't ever | |
10987 shut up, but will flash so many messages it will make your head swim. | |
10988 | |
10989 @item gnus-verbose-backends | |
10990 @vindex gnus-verbose-backends | |
10991 This variable works the same way as @code{gnus-verbose}, but it applies | |
10992 to the Gnus backends instead of Gnus proper. | |
10993 | |
10994 @item nnheader-max-head-length | |
10995 @vindex nnheader-max-head-length | |
10996 When the backends read straight heads of articles, they all try to read | |
10997 as little as possible. This variable (default @code{4096}) specifies | |
10998 the absolute max length the backends will try to read before giving up | |
10999 on finding a separator line between the head and the body. If this | |
11000 variable is @code{nil}, there is no upper read bound. If it is | |
11001 @code{t}, the backends won't try to read the articles piece by piece, | |
11002 but read the entire articles. This makes sense with some versions of | |
11003 @code{ange-ftp}. | |
11004 | |
11005 @item nnheader-file-name-translation-alist | |
11006 @vindex nnheader-file-name-translation-alist | |
11007 @cindex file names | |
11008 @cindex illegal characters in file names | |
11009 @cindex characters in file names | |
11010 This is an alist that says how to translate characters in file names. | |
11011 For instance, if @samp{:} is illegal as a file character in file names | |
11012 on your system (you OS/2 user you), you could say something like: | |
11013 | |
11014 @lisp | |
11015 (setq nnheader-file-name-translation-alist | |
11016 '((?: . ?_))) | |
11017 @end lisp | |
11018 | |
11019 In fact, this is the default value for this variable on OS/2 and MS | |
11020 Windows (phooey) systems. | |
11021 | |
11022 @item gnus-hidden-properties | |
11023 @vindex gnus-hidden-properties | |
11024 This is a list of properties to use to hide ``invisible'' text. It is | |
11025 @code{(invisible t intangible t)} by default on most systems, which | |
11026 makes invisible text invisible and intangible. | |
11027 | |
11028 @item gnus-parse-headers-hook | |
11029 @vindex gnus-parse-headers-hook | |
11030 A hook called before parsing headers. It can be used, for instance, to | |
11031 gather statistics on the headers fetched, or perhaps you'd like to prune | |
11032 some headers. I don't see why you'd want that, though. | |
11033 | |
11034 @end table | |
11035 | |
11036 | |
11037 @node The End | |
11038 @chapter The End | |
11039 | |
11040 Well, that's the manual---you can get on with your life now. Keep in | |
11041 touch. Say hello to your cats from me. | |
11042 | |
11043 My @strong{ghod}---I just can't stand goodbyes. Sniffle. | |
11044 | |
11045 Ol' Charles Reznikoff said it pretty well, so I leave the floor to him: | |
11046 | |
11047 @quotation | |
11048 @strong{Te Deum} | |
11049 @sp 1 | |
11050 Not because of victories @* | |
11051 I sing,@* | |
11052 having none,@* | |
11053 but for the common sunshine,@* | |
11054 the breeze,@* | |
11055 the largess of the spring. | |
11056 @sp 1 | |
11057 Not for victory@* | |
11058 but for the day's work done@* | |
11059 as well as I was able;@* | |
11060 not for a seat upon the dais@* | |
11061 but at the common table.@* | |
11062 @end quotation | |
11063 | |
11064 | |
11065 @node Appendices | |
11066 @chapter Appendices | |
11067 | |
11068 @menu | |
11069 * History:: How Gnus got where it is today. | |
11070 * Terminology:: We use really difficult, like, words here. | |
11071 * Customization:: Tailoring Gnus to your needs. | |
11072 * Troubleshooting:: What you might try if things do not work. | |
11073 * A Programmers Guide to Gnus:: Rilly, rilly technical stuff. | |
11074 * Emacs for Heathens:: A short introduction to Emacsian terms. | |
11075 * Frequently Asked Questions:: A question-and-answer session. | |
11076 @end menu | |
11077 | |
11078 | |
11079 @node History | |
11080 @section History | |
11081 | |
11082 @cindex history | |
11083 @sc{gnus} was written by Masanobu @sc{Umeda}. When autumn crept up in | |
11084 '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus. | |
11085 | |
11086 If you want to investigate the person responsible for this outrage, you | |
11087 can point your (feh!) web browser to | |
11088 @file{http://www.ifi.uio.no/~larsi/}. This is also the primary | |
11089 distribution point for the new and spiffy versions of Gnus, and is known | |
11090 as The Site That Destroys Newsrcs And Drives People Mad. | |
11091 | |
11092 During the first extended alpha period of development, the new Gnus was | |
11093 called ``(ding) Gnus''. @dfn{(ding)}, is, of course, short for | |
11094 @dfn{ding is not Gnus}, which is a total and utter lie, but who cares? | |
11095 (Besides, the ``Gnus'' in this abbreviation should probably be | |
11096 pronounced ``news'' as @sc{Umeda} intended, which makes it a more | |
11097 appropriate name, don't you think?) | |
11098 | |
11099 In any case, after spending all that energy on coming up with a new and | |
11100 spunky name, we decided that the name was @emph{too} spunky, so we | |
11101 renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs. | |
11102 ``@sc{gnus}''. New vs. old. | |
11103 | |
11104 The first ``proper'' release of Gnus 5 was done in November 1995 when it | |
11105 was included in the Emacs 19.30 distribution. | |
11106 | |
11107 In May 1996 the next Gnus generation (aka. ``September Gnus'') was | |
11108 released under the name ``Gnus 5.2''. | |
11109 | |
11110 @menu | |
11111 * Why?:: What's the point of Gnus? | |
11112 * Compatibility:: Just how compatible is Gnus with @sc{gnus}? | |
11113 * Conformity:: Gnus tries to conform to all standards. | |
11114 * Emacsen:: Gnus can be run on a few modern Emacsen. | |
11115 * Contributors:: Oodles of people. | |
11116 * New Features:: Pointers to some of the new stuff in Gnus. | |
11117 * Newest Features:: Features so new that they haven't been written yet. | |
11118 @end menu | |
11119 | |
11120 | |
11121 @node Why? | |
11122 @subsection Why? | |
11123 | |
11124 What's the point of Gnus? | |
11125 | |
11126 I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep'' | |
11127 newsreader, that lets you do anything you can think of. That was my | |
11128 original motivation, but while working on Gnus, it has become clear to | |
11129 me that this generation of newsreaders really belong in the stone age. | |
11130 Newsreaders haven't developed much since the infancy of the net. If the | |
11131 volume continues to rise with the current rate of increase, all current | |
11132 newsreaders will be pretty much useless. How do you deal with | |
11133 newsgroups that have thousands of new articles each day? How do you | |
11134 keep track of millions of people who post? | |
11135 | |
11136 Gnus offers no real solutions to these questions, but I would very much | |
11137 like to see Gnus being used as a testing ground for new methods of | |
11138 reading and fetching news. Expanding on @sc{Umeda}-san's wise decision | |
11139 to separate the newsreader from the backends, Gnus now offers a simple | |
11140 interface for anybody who wants to write new backends for fetching mail | |
11141 and news from different sources. I have added hooks for customizations | |
11142 everywhere I could imagine useful. By doing so, I'm inviting every one | |
11143 of you to explore and invent. | |
11144 | |
11145 May Gnus never be complete. @kbd{C-u 100 M-x hail-emacs}. | |
11146 | |
11147 | |
11148 @node Compatibility | |
11149 @subsection Compatibility | |
11150 | |
11151 @cindex compatibility | |
11152 Gnus was designed to be fully compatible with @sc{gnus}. Almost all key | |
11153 bindings have been kept. More key bindings have been added, of course, | |
11154 but only in one or two obscure cases have old bindings been changed. | |
11155 | |
11156 Our motto is: | |
11157 @quotation | |
11158 @cartouche | |
11159 @center In a cloud bones of steel. | |
11160 @end cartouche | |
11161 @end quotation | |
11162 | |
11163 All commands have kept their names. Some internal functions have changed | |
11164 their names. | |
11165 | |
11166 The @code{gnus-uu} package has changed drastically. @pxref{Decoding | |
11167 Articles}. | |
11168 | |
11169 One major compatibility question is the presence of several summary | |
11170 buffers. All variables that are relevant while reading a group are | |
11171 buffer-local to the summary buffer they belong in. Although many | |
11172 important variables have their values copied into their global | |
11173 counterparts whenever a command is executed in the summary buffer, this | |
11174 change might lead to incorrect values being used unless you are careful. | |
11175 | |
11176 All code that relies on knowledge of @sc{gnus} internals will probably | |
11177 fail. To take two examples: Sorting @code{gnus-newsrc-alist} (or | |
11178 changing it in any way, as a matter of fact) is strictly verboten. Gnus | |
11179 maintains a hash table that points to the entries in this alist (which | |
11180 speeds up many functions), and changing the alist directly will lead to | |
11181 peculiar results. | |
11182 | |
11183 @cindex hilit19 | |
11184 @cindex highlighting | |
11185 Old hilit19 code does not work at all. In fact, you should probably | |
11186 remove all hilit code from all Gnus hooks | |
11187 (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}). | |
11188 Gnus provides various integrated functions for highlighting. These are | |
11189 faster and more accurate. To make life easier for everybody, Gnus will | |
11190 by default remove all hilit calls from all hilit hooks. Uncleanliness! | |
11191 Away! | |
11192 | |
11193 Packages like @code{expire-kill} will no longer work. As a matter of | |
11194 fact, you should probably remove all old @sc{gnus} packages (and other | |
11195 code) when you start using Gnus. More likely than not, Gnus already | |
11196 does what you have written code to make @sc{gnus} do. (Snicker.) | |
11197 | |
11198 Even though old methods of doing things are still supported, only the | |
11199 new methods are documented in this manual. If you detect a new method of | |
11200 doing something while reading this manual, that does not mean you have | |
11201 to stop doing it the old way. | |
11202 | |
11203 Gnus understands all @sc{gnus} startup files. | |
11204 | |
11205 @kindex M-x gnus-bug | |
11206 @findex gnus-bug | |
11207 @cindex reporting bugs | |
11208 @cindex bugs | |
11209 Overall, a casual user who hasn't written much code that depends on | |
11210 @sc{gnus} internals should suffer no problems. If problems occur, | |
11211 please let me know by issuing that magic command @kbd{M-x gnus-bug}. | |
11212 | |
11213 | |
11214 @node Conformity | |
11215 @subsection Conformity | |
11216 | |
11217 No rebels without a clue here, ma'am. We conform to all standards known | |
11218 to (wo)man. Except for those standards and/or conventions we disagree | |
11219 with, of course. | |
11220 | |
11221 @table @strong | |
11222 | |
11223 @item RFC 822 | |
11224 @cindex RFC 822 | |
11225 There are no known breaches of this standard. | |
11226 | |
11227 @item RFC 1036 | |
11228 @cindex RFC 1036 | |
11229 There are no known breaches of this standard, either. | |
11230 | |
11231 @item Usenet Seal of Approval | |
11232 @cindex Usenet Seal of Approval | |
11233 Gnus hasn't been formally through the Seal process, but I have read | |
11234 through the Seal text and I think Gnus would pass. | |
11235 | |
11236 @item Son-of-RFC 1036 | |
11237 @cindex Son-of-RFC 1036 | |
11238 We do have some breaches to this one. | |
11239 | |
11240 @table @emph | |
11241 | |
11242 @item MIME | |
11243 Gnus does no MIME handling, and this standard-to-be seems to think that | |
11244 MIME is the bees' knees, so we have major breakage here. | |
11245 | |
11246 @item X-Newsreader | |
11247 This is considered to be a ``vanity header'', while I consider it to be | |
11248 consumer information. After seeing so many badly formatted articles | |
11249 coming from @code{tin} and @code{Netscape} I know not to use either of | |
11250 those for posting articles. I would not have known that if it wasn't | |
11251 for the @code{X-Newsreader} header. | |
11252 | |
11253 @item References | |
11254 Gnus does line breaking on this header. I infer from RFC1036 that being | |
11255 conservative in what you output is not creating 5000-character lines, so | |
11256 it seems like a good idea to me. However, this standard-to-be says that | |
11257 whitespace in the @code{References} header is to be preserved, so... It | |
11258 doesn't matter one way or the other to Gnus, so if somebody tells me | |
11259 what The Way is, I'll change it. Or not. | |
11260 @end table | |
11261 | |
11262 @end table | |
11263 | |
11264 If you ever notice Gnus acting non-compliantly with regards to the texts | |
11265 mentioned above, don't hesitate to drop a note to Gnus Towers and let us | |
11266 know. | |
11267 | |
11268 | |
11269 @node Emacsen | |
11270 @subsection Emacsen | |
11271 @cindex Emacsen | |
11272 @cindex XEmacs | |
11273 @cindex Mule | |
11274 @cindex Emacs | |
11275 | |
11276 Gnus should work on : | |
11277 | |
11278 @itemize @bullet | |
11279 | |
11280 @item | |
11281 Emacs 19.30 and up. | |
11282 | |
11283 @item | |
11284 XEmacs 19.13 and up. | |
11285 | |
11286 @item | |
11287 Mule versions based on Emacs 19.30 and up. | |
11288 | |
11289 @end itemize | |
11290 | |
11291 Gnus will absolutely not work on any Emacsen older than that. Not | |
11292 reliably, at least. | |
11293 | |
11294 There are some vague differences between Gnus on the various platforms: | |
11295 | |
11296 @itemize @bullet | |
11297 | |
11298 @item | |
11299 The mouse-face on Gnus lines under Emacs and Mule is delimited to | |
11300 certain parts of the lines while they cover the entire line under | |
11301 XEmacs. | |
11302 | |
11303 @item | |
11304 The same with current-article marking---XEmacs puts an underline under | |
11305 the entire summary line while Emacs and Mule are nicer and kinder. | |
11306 | |
11307 @item | |
11308 XEmacs features more graphics---a logo and a toolbar. | |
11309 | |
11310 @item | |
11311 Citation highlighting us better under Emacs and Mule than under XEmacs. | |
11312 | |
11313 @item | |
11314 Emacs 19.26-19.28 have tangible hidden headers, which can be a bit | |
11315 confusing. | |
11316 | |
11317 @end itemize | |
11318 | |
11319 | |
11320 @node Contributors | |
11321 @subsection Contributors | |
11322 @cindex contributors | |
11323 | |
11324 The new Gnus version couldn't have been done without the help of all the | |
11325 people on the (ding) mailing list. Every day for over a year I have | |
11326 gotten billions of nice bug reports from them, filling me with joy, | |
11327 every single one of them. Smooches. The people on the list have been | |
11328 tried beyond endurance, what with my ``oh, that's a neat idea <type | |
11329 type>, yup, I'll release it right away <ship off> no wait, that doesn't | |
11330 work at all <type type>, yup, I'll ship that one off right away <ship | |
11331 off> no, wait, that absolutely does not work'' policy for releases. | |
11332 Micro$oft---bah. Amateurs. I'm @emph{much} worse. (Or is that | |
11333 ``worser''? ``much worser''? ``worsest''?) | |
11334 | |
11335 I would like to take this opportunity to thank the Academy for... oops, | |
11336 wrong show. | |
11337 | |
11338 @itemize @bullet | |
11339 | |
11340 @item Masanobu @sc{Umeda} | |
11341 The writer of the original @sc{gnus}. | |
11342 | |
11343 @item Per Abrahamsen | |
11344 Custom, scoring, highlighting and @sc{soup} code (as well as numerous | |
11345 other things). | |
11346 | |
11347 @item Luis Fernandes | |
11348 Design and graphics. | |
11349 | |
11350 @item Wes Hardaker | |
11351 @file{gnus-picon.el} and the manual section on @dfn{picons} | |
11352 (@pxref{Picons}). | |
11353 | |
11354 @item Brad Miller | |
11355 @file{gnus-gl.el} and the GroupLens manual section (@pxref{GroupLens}). | |
11356 | |
11357 @item Sudish Joseph | |
11358 Innumerable bug fixes. | |
11359 | |
11360 @item Ilja Weis | |
11361 @file{gnus-topic.el}. | |
11362 | |
11363 @item Steven L. Baur | |
11364 Lots and lots of bugs detections and fixes. | |
11365 | |
11366 @item Vladimir Alexiev | |
11367 The refcard and reference booklets. | |
11368 | |
11369 @item Felix Lee & JWZ | |
11370 I stole some pieces from the XGnus distribution by Felix Lee and JWZ. | |
11371 | |
11372 @item Scott Byer | |
11373 @file{nnfolder.el} enhancements & rewrite. | |
11374 | |
11375 @item Peter Mutsaers | |
11376 Orphan article scoring code. | |
11377 | |
11378 @item Ken Raeburn | |
11379 POP mail support. | |
11380 | |
11381 @item Hallvard B Furuseth | |
11382 Various bits and pieces, especially dealing with .newsrc files. | |
11383 | |
11384 @item Brian Edmonds | |
11385 @file{gnus-bbdb.el}. | |
11386 | |
11387 @item Ricardo Nassif and Mark Borges | |
11388 Proof-reading. | |
11389 | |
11390 @item Kevin Davidson | |
11391 Came up with the name @dfn{ding}, so blame him. | |
11392 | |
11393 @end itemize | |
11394 | |
11395 Peter Arius, Stainless Steel Rat, Ulrik Dickow, Jack Vinson, Daniel | |
11396 Quinlan, Frank D. Cringle, Geoffrey T. Dairiki, Fabrice Popineau and | |
11397 Andrew Eskilsson have all contributed code and suggestions. | |
11398 | |
11399 | |
11400 @node New Features | |
11401 @subsection New Features | |
11402 @cindex new features | |
11403 | |
11404 @itemize @bullet | |
11405 | |
11406 @item | |
11407 The look of all buffers can be changed by setting format-like variables | |
11408 (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}). | |
11409 | |
11410 @item | |
11411 Local spool and several @sc{nntp} servers can be used at once | |
11412 (@pxref{Select Methods}). | |
11413 | |
11414 @item | |
11415 You can combine groups into virtual groups (@pxref{Virtual Groups}). | |
11416 | |
11417 @item | |
11418 You can read a number of different mail formats (@pxref{Getting Mail}). | |
11419 All the mail backends implement a convenient mail expiry scheme | |
11420 (@pxref{Expiring Mail}). | |
11421 | |
11422 @item | |
11423 Gnus can use various strategies for gathering threads that have lost | |
11424 their roots (thereby gathering loose sub-threads into one thread) or it | |
11425 can go back and retrieve enough headers to build a complete thread | |
11426 (@pxref{Customizing Threading}). | |
11427 | |
11428 @item | |
11429 Killed groups can be displayed in the group buffer, and you can read | |
11430 them as well (@pxref{Listing Groups}). | |
11431 | |
11432 @item | |
11433 Gnus can do partial group updates---you do not have to retrieve the | |
11434 entire active file just to check for new articles in a few groups | |
11435 (@pxref{The Active File}). | |
11436 | |
11437 @item | |
11438 Gnus implements a sliding scale of subscribedness to groups | |
11439 (@pxref{Group Levels}). | |
11440 | |
11441 @item | |
11442 You can score articles according to any number of criteria | |
11443 (@pxref{Scoring}). You can even get Gnus to find out how to score | |
11444 articles for you (@pxref{Adaptive Scoring}). | |
11445 | |
11446 @item | |
11447 Gnus maintains a dribble buffer that is auto-saved the normal Emacs | |
11448 manner, so it should be difficult to lose much data on what you have | |
11449 read if your machine should go down (@pxref{Auto Save}). | |
11450 | |
11451 @item | |
11452 Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up | |
11453 the @file{.emacs} file. | |
11454 | |
11455 @item | |
11456 You can set the process mark on both groups and articles and perform | |
11457 operations on all the marked items (@pxref{Process/Prefix}). | |
11458 | |
11459 @item | |
11460 You can grep through a subset of groups and create a group from the | |
11461 results (@pxref{Kibozed Groups}). | |
11462 | |
11463 @item | |
11464 You can list subsets of groups according to, well, anything | |
11465 (@pxref{Listing Groups}). | |
11466 | |
11467 @item | |
11468 You can browse foreign servers and subscribe to groups from those | |
11469 servers (@pxref{Browse Foreign Server}). | |
11470 | |
11471 @item | |
11472 Gnus can fetch articles asynchronously on a second connection to the | |
11473 server (@pxref{Asynchronous Fetching}). | |
11474 | |
11475 @item | |
11476 You can cache articles locally (@pxref{Article Caching}). | |
11477 | |
11478 @item | |
11479 The uudecode functions have been expanded and generalized | |
11480 (@pxref{Decoding Articles}). | |
11481 | |
11482 @item | |
11483 You can still post uuencoded articles, which was a little-known feature | |
11484 of @sc{gnus}' past (@pxref{Uuencoding and Posting}). | |
11485 | |
11486 @item | |
11487 Fetching parents (and other articles) now actually works without | |
11488 glitches (@pxref{Finding the Parent}). | |
11489 | |
11490 @item | |
11491 Gnus can fetch FAQs and group descriptions (@pxref{Group Information}). | |
11492 | |
11493 @item | |
11494 Digests (and other files) can be used as the basis for groups | |
11495 (@pxref{Document Groups}). | |
11496 | |
11497 @item | |
11498 Articles can be highlighted and customized (@pxref{Customizing | |
11499 Articles}). | |
11500 | |
11501 @item | |
11502 URLs and other external references can be buttonized (@pxref{Article | |
11503 Buttons}). | |
11504 | |
11505 @item | |
11506 You can do lots of strange stuff with the Gnus window & frame | |
11507 configuration (@pxref{Windows Configuration}). | |
11508 | |
11509 @item | |
11510 You can click on buttons instead of using the keyboard | |
11511 (@pxref{Buttons}). | |
11512 | |
11513 @item | |
11514 Gnus can use NoCeM files to weed out spam (@pxref{NoCeM}). | |
11515 | |
11516 @end itemize | |
11517 | |
11518 This is, of course, just a @emph{short} overview of the @emph{most} | |
11519 important new features. No, really. There are tons more. Yes, we have | |
11520 feeping creaturism in full effect, but nothing too gratuitous, I would | |
11521 hope. | |
11522 | |
11523 | |
11524 @node Newest Features | |
11525 @subsection Newest Features | |
11526 @cindex todo | |
11527 | |
11528 Also known as the @dfn{todo list}. Sure to be implemented before the | |
11529 next millennium. | |
11530 | |
11531 Be afraid. Be very afraid. | |
11532 | |
11533 @itemize @bullet | |
11534 @item | |
11535 Native @sc{mime} support is something that should be done. | |
11536 @item | |
11537 A better and simpler method for specifying mail composing methods. | |
11538 @item | |
11539 Allow posting through mail-to-news gateways. | |
11540 @item | |
11541 Really do unbinhexing. | |
11542 @end itemize | |
11543 | |
11544 And much, much, much more. There is more to come than has already been | |
11545 implemented. (But that's always true, isn't it?) | |
11546 | |
11547 @code{<URL:http://www.ifi.uio.no/~larsi/sgnus/todo>} is where the actual | |
11548 up-to-the-second todo list is located, so if you're really curious, you | |
11549 could point your Web browser over that-a-way. | |
11550 | |
11551 | |
11552 @node Terminology | |
11553 @section Terminology | |
11554 | |
11555 @cindex terminology | |
11556 @table @dfn | |
11557 | |
11558 @item news | |
11559 @cindex news | |
11560 This is what you are supposed to use this thing for---reading news. | |
11561 News is generally fetched from a nearby @sc{nntp} server, and is | |
11562 generally publicly available to everybody. If you post news, the entire | |
11563 world is likely to read just what you have written, and they'll all | |
11564 snigger mischievously. Behind your back. | |
11565 | |
11566 @item mail | |
11567 @cindex mail | |
11568 Everything that's delivered to you personally is mail. Some news/mail | |
11569 readers (like Gnus) blur the distinction between mail and news, but | |
11570 there is a difference. Mail is private. News is public. Mailing is | |
11571 not posting, and replying is not following up. | |
11572 | |
11573 @item reply | |
11574 @cindex reply | |
11575 Send a mail to the person who has written what you are reading. | |
11576 | |
11577 @item follow up | |
11578 @cindex follow up | |
11579 Post an article to the current newsgroup responding to the article you | |
11580 are reading. | |
11581 | |
11582 @item backend | |
11583 @cindex backend | |
11584 Gnus gets fed articles from a number of backends, both news and mail | |
11585 backends. Gnus does not handle the underlying media, so to speak---this | |
11586 is all done by the backends. | |
11587 | |
11588 @item native | |
11589 @cindex native | |
11590 Gnus will always use one method (and backend) as the @dfn{native}, or | |
11591 default, way of getting news. | |
11592 | |
11593 @item foreign | |
11594 @cindex foreign | |
11595 You can also have any number of foreign groups active at the same time. | |
11596 These are groups that use different backends for getting news. | |
11597 | |
11598 @item secondary | |
11599 @cindex secondary | |
11600 Secondary backends are somewhere half-way between being native and being | |
11601 foreign, but they mostly act like they are native. | |
11602 | |
11603 @item article | |
11604 @cindex article | |
11605 A nessage that has been posted as news. | |
11606 | |
11607 @item mail message | |
11608 @cindex mail message | |
11609 A message that has been mailed. | |
11610 | |
11611 @item message | |
11612 @cindex message | |
11613 A mail message or news article | |
11614 | |
11615 @item head | |
11616 @cindex head | |
11617 The top part of a message, where administrative information (etc.) is | |
11618 put. | |
11619 | |
11620 @item body | |
11621 @cindex body | |
11622 The rest of an article. Everything that is not in the head is in the | |
11623 body. | |
11624 | |
11625 @item header | |
11626 @cindex header | |
11627 A line from the head of an article. | |
11628 | |
11629 @item headers | |
11630 @cindex headers | |
11631 A collection of such lines, or a collection of heads. Or even a | |
11632 collection of @sc{nov} lines. | |
11633 | |
11634 @item @sc{nov} | |
11635 @cindex nov | |
11636 When Gnus enters a group, it asks the backend for the headers of all | |
11637 unread articles in the group. Most servers support the News OverView | |
11638 format, which is more compact and much faster to read and parse than the | |
11639 normal @sc{head} format. | |
11640 | |
11641 @item level | |
11642 @cindex levels | |
11643 Each group is subscribed at some @dfn{level} or other (1-9). The ones | |
11644 that have a lower level are ``more'' subscribed than the groups with a | |
11645 higher level. In fact, groups on levels 1-5 are considered | |
11646 @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9 | |
11647 are @dfn{killed}. Commands for listing groups and scanning for new | |
11648 articles will all use the numeric prefix as @dfn{working level}. | |
11649 | |
11650 @item killed groups | |
11651 @cindex killed groups | |
11652 No information on killed groups is stored or updated, which makes killed | |
11653 groups much easier to handle than subscribed groups. | |
11654 | |
11655 @item zombie groups | |
11656 @cindex zombie groups | |
11657 Just like killed groups, only slightly less dead. | |
11658 | |
11659 @item active file | |
11660 @cindex active file | |
11661 The news server has to keep track of what articles it carries, and what | |
11662 groups exist. All this information in stored in the active file, which | |
11663 is rather large, as you might surmise. | |
11664 | |
11665 @item bogus groups | |
11666 @cindex bogus groups | |
11667 A group that exists in the @file{.newsrc} file, but isn't known to the | |
11668 server (i. e., it isn't in the active file), is a @emph{bogus group}. | |
11669 This means that the group probably doesn't exist (any more). | |
11670 | |
11671 @item server | |
11672 @cindex server | |
11673 A machine than one can connect to and get news (or mail) from. | |
11674 | |
11675 @item select method | |
11676 @cindex select method | |
11677 A structure that specifies the backend, the server and the virtual | |
11678 server parameters. | |
11679 | |
11680 @item virtual server | |
11681 @cindex virtual server | |
11682 A named select method. Since a select methods defines all there is to | |
11683 know about connecting to a (physical) server, taking the who things as a | |
11684 whole is a virtual server. | |
11685 | |
11686 @end table | |
11687 | |
11688 | |
11689 @node Customization | |
11690 @section Customization | |
11691 @cindex general customization | |
11692 | |
11693 All variables are properly documented elsewhere in this manual. This | |
11694 section is designed to give general pointers on how to customize Gnus | |
11695 for some quite common situations. | |
11696 | |
11697 @menu | |
11698 * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere. | |
11699 * Slow Terminal Connection:: You run a remote Emacs. | |
11700 * Little Disk Space:: You feel that having large setup files is icky. | |
11701 * Slow Machine:: You feel like buying a faster machine. | |
11702 @end menu | |
11703 | |
11704 | |
11705 @node Slow/Expensive Connection | |
11706 @subsection Slow/Expensive @sc{nntp} Connection | |
11707 | |
11708 If you run Emacs on a machine locally, and get your news from a machine | |
11709 over some very thin strings, you want to cut down on the amount of data | |
11710 Gnus has to get from the @sc{nntp} server. | |
11711 | |
11712 @table @code | |
11713 | |
11714 @item gnus-read-active-file | |
11715 Set this to @code{nil}, which will inhibit Gnus from requesting the | |
11716 entire active file from the server. This file is often v. large. You | |
11717 also have to set @code{gnus-check-new-news} and | |
11718 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus | |
11719 doesn't suddenly decide to fetch the active file anyway. | |
11720 | |
11721 @item gnus-nov-is-evil | |
11722 This one has to be @code{nil}. If not, grabbing article headers from | |
11723 the @sc{nntp} server will not be very fast. Not all @sc{nntp} servers | |
11724 support @sc{xover}; Gnus will detect this by itself. | |
11725 @end table | |
11726 | |
11727 | |
11728 @node Slow Terminal Connection | |
11729 @subsection Slow Terminal Connection | |
11730 | |
11731 Let's say you use your home computer for dialing up the system that | |
11732 runs Emacs and Gnus. If your modem is slow, you want to reduce the | |
11733 amount of data that is sent over the wires as much as possible. | |
11734 | |
11735 @table @code | |
11736 | |
11737 @item gnus-auto-center-summary | |
11738 Set this to @code{nil} to inhibit Gnus from re-centering the summary | |
11739 buffer all the time. If it is @code{vertical}, do only vertical | |
11740 re-centering. If it is neither @code{nil} nor @code{vertical}, do both | |
11741 horizontal and vertical recentering. | |
11742 | |
11743 @item gnus-visible-headers | |
11744 Cut down on the headers that are included in the articles to the | |
11745 minimum. You can, in fact, make do without them altogether---most of the | |
11746 useful data is in the summary buffer, anyway. Set this variable to | |
11747 @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need. | |
11748 | |
11749 @item gnus-article-display-hook | |
11750 Set this hook to all the available hiding commands: | |
11751 @lisp | |
11752 (setq gnus-article-display-hook | |
11753 '(gnus-article-hide-headers gnus-article-hide-signature | |
11754 gnus-article-hide-citation)) | |
11755 @end lisp | |
11756 | |
11757 @item gnus-use-full-window | |
11758 By setting this to @code{nil}, you can make all the windows smaller. | |
11759 While this doesn't really cut down much generally, it means that you | |
11760 have to see smaller portions of articles before deciding that you didn't | |
11761 want to read them anyway. | |
11762 | |
11763 @item gnus-thread-hide-subtree | |
11764 If this is non-@code{nil}, all threads in the summary buffer will be | |
11765 hidden initially. | |
11766 | |
11767 @item gnus-updated-mode-lines | |
11768 If this is @code{nil}, Gnus will not put information in the buffer mode | |
11769 lines, which might save some time. | |
11770 @end table | |
11771 | |
11772 | |
11773 @node Little Disk Space | |
11774 @subsection Little Disk Space | |
11775 @cindex disk space | |
11776 | |
11777 The startup files can get rather large, so you may want to cut their | |
11778 sizes a bit if you are running out of space. | |
11779 | |
11780 @table @code | |
11781 | |
11782 @item gnus-save-newsrc-file | |
11783 If this is @code{nil}, Gnus will never save @file{.newsrc}---it will | |
11784 only save @file{.newsrc.eld}. This means that you will not be able to | |
11785 use any other newsreaders than Gnus. This variable is @code{t} by | |
11786 default. | |
11787 | |
11788 @item gnus-save-killed-list | |
11789 If this is @code{nil}, Gnus will not save the list of dead groups. You | |
11790 should also set @code{gnus-check-new-newsgroups} to @code{ask-server} | |
11791 and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this | |
11792 variable to @code{nil}. This variable is @code{t} by default. | |
11793 | |
11794 @end table | |
11795 | |
11796 | |
11797 @node Slow Machine | |
11798 @subsection Slow Machine | |
11799 @cindex slow machine | |
11800 | |
11801 If you have a slow machine, or are just really impatient, there are a | |
11802 few things you can do to make Gnus run faster. | |
11803 | |
11804 Set@code{gnus-check-new-newsgroups} and | |
11805 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster. | |
11806 | |
11807 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and | |
11808 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the | |
11809 summary buffer faster. | |
11810 | |
11811 Set @code{gnus-article-display-hook} to @code{nil} to make article | |
11812 processing a bit faster. | |
11813 | |
11814 | |
11815 @node Troubleshooting | |
11816 @section Troubleshooting | |
11817 @cindex troubleshooting | |
11818 | |
11819 Gnus works @emph{so} well straight out of the box---I can't imagine any | |
11820 problems, really. | |
11821 | |
11822 Ahem. | |
11823 | |
11824 @enumerate | |
11825 | |
11826 @item | |
11827 Make sure your computer is switched on. | |
11828 | |
11829 @item | |
11830 Make sure that you really load the current Gnus version. If you have | |
11831 been running @sc{gnus}, you need to exit Emacs and start it up again before | |
11832 Gnus will work. | |
11833 | |
11834 @item | |
11835 Try doing an @kbd{M-x gnus-version}. If you get something that looks | |
11836 like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded. If, | |
11837 on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp | |
11838 flee}, you have some old @file{.el} files lying around. Delete these. | |
11839 | |
11840 @item | |
11841 Read the help group (@kbd{G h} in the group buffer) for a FAQ and a | |
11842 how-to. | |
11843 @end enumerate | |
11844 | |
11845 If all else fails, report the problem as a bug. | |
11846 | |
11847 @cindex bugs | |
11848 @cindex reporting bugs | |
11849 | |
11850 @kindex M-x gnus-bug | |
11851 @findex gnus-bug | |
11852 If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug} | |
11853 command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send | |
11854 me the backtrace. I will fix bugs, but I can only fix them if you send | |
11855 me a precise description as to how to reproduce the bug. | |
11856 | |
11857 You really can never be too detailed in a bug report. Always use the | |
11858 @kbd{M-x gnus-bug} command when you make bug reports, even if it creates | |
11859 a 10Kb mail each time you use it, and even if you have sent me your | |
11860 environment 500 times before. I don't care. I want the full info each | |
11861 time. | |
11862 | |
11863 It is also important to remember that I have no memory whatsoever. If | |
11864 you send a bug report, and I send you a reply, and then you send back | |
11865 just ``No, it's not! Moron!'', I will have no idea what you are | |
11866 insulting me about. Always over-explain everything. It's much easier | |
11867 for all of us---if I don't have all the information I need, I will just | |
11868 mail you and ask for more info, and everything takes more time. | |
11869 | |
11870 If the problem you're seeing is very visual, and you can't quite explain | |
11871 it, copy the Emacs window to a file (with @code{xwd}, for instance), put | |
11872 it somewhere it can be reached, and include the URL of the picture in | |
11873 the bug report.a | |
11874 | |
11875 If you just need help, you are better off asking on | |
11876 @samp{gnu.emacs.gnus}. I'm not very helpful. | |
11877 | |
11878 @cindex gnu.emacs.gnus | |
11879 @cindex ding mailing list | |
11880 You can also ask on the ding mailing list---@samp{ding@@ifi.uio.no}. | |
11881 Write to @samp{ding-request@@ifi.uio.no} to subscribe. | |
11882 | |
11883 | |
11884 @node A Programmers Guide to Gnus | |
11885 @section A Programmer's Guide to Gnus | |
11886 | |
11887 It is my hope that other people will figure out smart stuff that Gnus | |
11888 can do, and that other people will write those smart things as well. To | |
11889 facilitate that I thought it would be a good idea to describe the inner | |
11890 workings of Gnus. And some of the not-so-inner workings, while I'm at | |
11891 it. | |
11892 | |
11893 You can never expect the internals of a program not to change, but I | |
11894 will be defining (in some details) the interface between Gnus and its | |
11895 backends (this is written in stone), the format of the score files | |
11896 (ditto), data structures (some are less likely to change than others) | |
11897 and general method of operations. | |
11898 | |
11899 @menu | |
11900 * Backend Interface:: How Gnus communicates with the servers. | |
11901 * Score File Syntax:: A BNF definition of the score file standard. | |
11902 * Headers:: How Gnus stores headers internally. | |
11903 * Ranges:: A handy format for storing mucho numbers. | |
11904 * Group Info:: The group info format. | |
11905 * Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen. | |
11906 * Various File Formats:: Formats of files that Gnus use. | |
11907 @end menu | |
11908 | |
11909 | |
11910 @node Backend Interface | |
11911 @subsection Backend Interface | |
11912 | |
11913 Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual | |
11914 groups. It only knows how to talk to @dfn{virtual servers}. A virtual | |
11915 server is a @dfn{backend} and some @dfn{backend variables}. As examples | |
11916 of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}. As | |
11917 examples of the latter we have @code{nntp-port-number} and | |
11918 @code{nnmbox-directory}. | |
11919 | |
11920 When Gnus asks for information from a backend---say @code{nntp}---on | |
11921 something, it will normally include a virtual server name in the | |
11922 function parameters. (If not, the backend should use the ``current'' | |
11923 virtual server.) For instance, @code{nntp-request-list} takes a virtual | |
11924 server as its only (optional) parameter. If this virtual server hasn't | |
11925 been opened, the function should fail. | |
11926 | |
11927 Note that a virtual server name has no relation to some physical server | |
11928 name. Take this example: | |
11929 | |
11930 @lisp | |
11931 (nntp "odd-one" | |
11932 (nntp-address "ifi.uio.no") | |
11933 (nntp-port-number 4324)) | |
11934 @end lisp | |
11935 | |
11936 Here the virtual server name is @samp{odd-one} while the name of | |
11937 the physical server is @samp{ifi.uio.no}. | |
11938 | |
11939 The backends should be able to switch between several virtual servers. | |
11940 The standard backends implement this by keeping an alist of virtual | |
11941 server environments that it pulls down/pushes up when needed. | |
11942 | |
11943 There are two groups of interface functions: @dfn{required functions}, | |
11944 which must be present, and @dfn{optional functions}, which Gnus will | |
11945 always check whether are present before attempting to call. | |
11946 | |
11947 All these functions are expected to return data in the buffer | |
11948 @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat | |
11949 unfortunately named, but we'll have to live with it. When I talk about | |
11950 ``resulting data'', I always refer to the data in that buffer. When I | |
11951 talk about ``return value'', I talk about the function value returned by | |
11952 the function call. | |
11953 | |
11954 Some backends could be said to be @dfn{server-forming} backends, and | |
11955 some might be said to not be. The latter are backends that generally | |
11956 only operate on one group at a time, and have no concept of ``server'' | |
11957 -- they have a group, and they deliver info on that group and nothing | |
11958 more. | |
11959 | |
11960 In the examples and definitions I will refer to the imaginary backend | |
11961 @code{nnchoke}. | |
11962 | |
11963 @cindex @code{nnchoke} | |
11964 | |
11965 @menu | |
11966 * Required Backend Functions:: Functions that must be implemented. | |
11967 * Optional Backend Functions:: Functions that need not be implemented. | |
11968 * Writing New Backends:: Extending old backends. | |
11969 @end menu | |
11970 | |
11971 | |
11972 @node Required Backend Functions | |
11973 @subsubsection Required Backend Functions | |
11974 | |
11975 @table @code | |
11976 | |
11977 @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD) | |
11978 | |
11979 @var{articles} is either a range of article numbers or a list of | |
11980 @code{Message-ID}s. Current backends do not fully support either---only | |
11981 sequences (lists) of article numbers, and most backends do not support | |
11982 retrieval of @code{Message-ID}s. But they should try for both. | |
11983 | |
11984 The result data should either be HEADs or NOV lines, and the result | |
11985 value should either be @code{headers} or @code{nov} to reflect this. | |
11986 This might later be expanded to @code{various}, which will be a mixture | |
11987 of HEADs and NOV lines, but this is currently not supported by Gnus. | |
11988 | |
11989 If @var{fetch-old} is non-@code{nil} it says to try to fetch "extra | |
11990 headers, in some meaning of the word. This is generally done by | |
11991 fetching (at most) @var{fetch-old} extra headers less than the smallest | |
11992 article number in @code{articles}, and fill in the gaps as well. The | |
11993 presence of this parameter can be ignored if the backend finds it | |
11994 cumbersome to follow the request. If this is non-@code{nil} and not a | |
11995 number, do maximum fetches. | |
11996 | |
11997 Here's an example HEAD: | |
11998 | |
11999 @example | |
12000 221 1056 Article retrieved. | |
12001 Path: ifi.uio.no!sturles | |
12002 From: sturles@@ifi.uio.no (Sturle Sunde) | |
12003 Newsgroups: ifi.discussion | |
12004 Subject: Re: Something very droll | |
12005 Date: 27 Oct 1994 14:02:57 +0100 | |
12006 Organization: Dept. of Informatics, University of Oslo, Norway | |
12007 Lines: 26 | |
12008 Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no> | |
12009 References: <38jdmq$4qu@@visbur.ifi.uio.no> | |
12010 NNTP-Posting-Host: holmenkollen.ifi.uio.no | |
12011 . | |
12012 @end example | |
12013 | |
12014 So a @code{headers} return value would imply that there's a number of | |
12015 these in the data buffer. | |
12016 | |
12017 Here's a BNF definition of such a buffer: | |
12018 | |
12019 @example | |
12020 headers = *head | |
12021 head = error / valid-head | |
12022 error-message = [ "4" / "5" ] 2number " " <error message> eol | |
12023 valid-head = valid-message *header "." eol | |
12024 valid-message = "221 " <number> " Article retrieved." eol | |
12025 header = <text> eol | |
12026 @end example | |
12027 | |
12028 If the return value is @code{nov}, the data buffer should contain | |
12029 @dfn{network overview database} lines. These are basically fields | |
12030 separated by tabs. | |
12031 | |
12032 @example | |
12033 nov-buffer = *nov-line | |
12034 nov-line = 8*9 [ field <TAB> ] eol | |
12035 field = <text except TAB> | |
12036 @end example | |
12037 | |
12038 For a closer explanation what should be in those fields, | |
12039 @pxref{Headers}. | |
12040 | |
12041 | |
12042 @item (nnchoke-open-server SERVER &optional DEFINITIONS) | |
12043 | |
12044 @var{server} is here the virtual server name. @var{definitions} is a | |
12045 list of @code{(VARIABLE VALUE)} pairs that defines this virtual server. | |
12046 | |
12047 If the server can't be opened, no error should be signaled. The backend | |
12048 may then choose to refuse further attempts at connecting to this | |
12049 server. In fact, it should do so. | |
12050 | |
12051 If the server is opened already, this function should return a | |
12052 non-@code{nil} value. There should be no data returned. | |
12053 | |
12054 | |
12055 @item (nnchoke-close-server &optional SERVER) | |
12056 | |
12057 Close connection to @var{server} and free all resources connected | |
12058 to it. Return @code{nil} if the server couldn't be closed for some | |
12059 reason. | |
12060 | |
12061 There should be no data returned. | |
12062 | |
12063 | |
12064 @item (nnchoke-request-close) | |
12065 | |
12066 Close connection to all servers and free all resources that the backend | |
12067 have reserved. All buffers that have been created by that backend | |
12068 should be killed. (Not the @code{nntp-server-buffer}, though.) This | |
12069 function is generally only called when Gnus is shutting down. | |
12070 | |
12071 There should be no data returned. | |
12072 | |
12073 | |
12074 @item (nnchoke-server-opened &optional SERVER) | |
12075 | |
12076 If @var{server} is the current virtual server, and the connection to the | |
12077 physical server is alive, then this function should return a | |
12078 non-@code{nil} vlue. This function should under no circumstances | |
12079 attempt to reconnect to a server that is has lost connection to. | |
12080 | |
12081 There should be no data returned. | |
12082 | |
12083 | |
12084 @item (nnchoke-status-message &optional SERVER) | |
12085 | |
12086 This function should return the last error message from @var{server}. | |
12087 | |
12088 There should be no data returned. | |
12089 | |
12090 | |
12091 @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER) | |
12092 | |
12093 The result data from this function should be the article specified by | |
12094 @var{article}. This might either be a @code{Message-ID} or a number. | |
12095 It is optional whether to implement retrieval by @code{Message-ID}, but | |
12096 it would be nice if that were possible. | |
12097 | |
12098 If @var{to-buffer} is non-@code{nil}, the result data should be returned | |
12099 in this buffer instead of the normal data buffer. This is to make it | |
12100 possible to avoid copying large amounts of data from one buffer to | |
12101 another, and Gnus mainly request articles to be inserted directly into | |
12102 its article buffer. | |
12103 | |
12104 If it is at all possible, this function should return a cons cell where | |
12105 the car is the group name the article was fetched from, and the cdr is | |
12106 the article number. This will enable Gnus to find out what the real | |
12107 group and article numbers are when fetching articles by | |
12108 @code{Message-ID}. If this isn't possible, @code{t} should be returned | |
12109 on successful article retrievement. | |
12110 | |
12111 | |
12112 @item (nnchoke-open-group GROUP &optional SERVER) | |
12113 | |
12114 Make @var{group} the current group. | |
12115 | |
12116 There should be no data returned by this function. | |
12117 | |
12118 | |
12119 @item (nnchoke-request-group GROUP &optional SERVER) | |
12120 | |
12121 Get data on @var{group}. This function also has the side effect of | |
12122 making @var{group} the current group. | |
12123 | |
12124 Here's an example of some result data and a definition of the same: | |
12125 | |
12126 @example | |
12127 211 56 1000 1059 ifi.discussion | |
12128 @end example | |
12129 | |
12130 The first number is the status, which should be @code{211}. Next is the | |
12131 total number of articles in the group, the lowest article number, the | |
12132 highest article number, and finally the group name. Note that the total | |
12133 number of articles may be less than one might think while just | |
12134 considering the highest and lowest article numbers, but some articles | |
12135 may have been canceled. Gnus just discards the total-number, so | |
12136 whether one should take the bother to generate it properly (if that is a | |
12137 problem) is left as an exercise to the reader. | |
12138 | |
12139 @example | |
12140 group-status = [ error / info ] eol | |
12141 error = [ "4" / "5" ] 2<number> " " <Error message> | |
12142 info = "211 " 3* [ <number> " " ] <string> | |
12143 @end example | |
12144 | |
12145 | |
12146 @item (nnchoke-close-group GROUP &optional SERVER) | |
12147 | |
12148 Close @var{group} and free any resources connected to it. This will be | |
12149 a no-op on most backends. | |
12150 | |
12151 There should be no data returned. | |
12152 | |
12153 | |
12154 @item (nnchoke-request-list &optional SERVER) | |
12155 | |
12156 Return a list of all groups available on @var{server}. And that means | |
12157 @emph{all}. | |
12158 | |
12159 Here's an example from a server that only carries two groups: | |
12160 | |
12161 @example | |
12162 ifi.test 0000002200 0000002000 y | |
12163 ifi.discussion 3324 3300 n | |
12164 @end example | |
12165 | |
12166 On each line we have a group name, then the highest article number in | |
12167 that group, the lowest article number, and finally a flag. | |
12168 | |
12169 @example | |
12170 active-file = *active-line | |
12171 active-line = name " " <number> " " <number> " " flags eol | |
12172 name = <string> | |
12173 flags = "n" / "y" / "m" / "x" / "j" / "=" name | |
12174 @end example | |
12175 | |
12176 The flag says whether the group is read-only (@samp{n}), is moderated | |
12177 (@samp{m}), is dead (@samp{x}), is aliased to some other group | |
12178 (@samp{=other-group} or none of the above (@samp{y}). | |
12179 | |
12180 | |
12181 @item (nnchoke-request-post &optional SERVER) | |
12182 | |
12183 This function should post the current buffer. It might return whether | |
12184 the posting was successful or not, but that's not required. If, for | |
12185 instance, the posting is done asynchronously, it has generally not been | |
12186 completed by the time this function concludes. In that case, this | |
12187 function should set up some kind of sentinel to beep the user loud and | |
12188 clear if the posting could not be completed. | |
12189 | |
12190 There should be no result data from this function. | |
12191 | |
12192 @end table | |
12193 | |
12194 | |
12195 @node Optional Backend Functions | |
12196 @subsubsection Optional Backend Functions | |
12197 | |
12198 @table @code | |
12199 | |
12200 @item (nnchoke-retrieve-groups GROUPS &optional SERVER) | |
12201 | |
12202 @var{groups} is a list of groups, and this function should request data | |
12203 on all those groups. How it does it is of no concern to Gnus, but it | |
12204 should attempt to do this in a speedy fashion. | |
12205 | |
12206 The return value of this function can be either @code{active} or | |
12207 @code{group}, which says what the format of the result data is. The | |
12208 former is in the same format as the data from | |
12209 @code{nnchoke-request-list}, while the latter is a buffer full of lines | |
12210 in the same format as @code{nnchoke-request-group} gives. | |
12211 | |
12212 @example | |
12213 group-buffer = *active-line / *group-status | |
12214 @end example | |
12215 | |
12216 | |
12217 @item (nnchoke-request-update-info GROUP INFO &optional SERVER) | |
12218 | |
12219 A Gnus group info (@pxref{Group Info}) is handed to the backend for | |
12220 alterations. This comes in handy if the backend really carries all the | |
12221 information (as is the case with virtual an imap groups). This function | |
12222 may alter the info in any manner it sees fit, and should return the | |
12223 (altered) group info. This function may alter the group info | |
12224 destructively, so no copying is needed before boogeying. | |
12225 | |
12226 There should be no result data from this function. | |
12227 | |
12228 | |
12229 @item (nnchoke-request-type GROUP &optional ARTICLE) | |
12230 | |
12231 When the user issues commands for ``sending news'' (@kbd{F} in the | |
12232 summary buffer, for instance), Gnus has to know whether the article the | |
12233 user is following up is news or mail. This function should return | |
12234 @code{news} if @var{article} in @var{group} is news, @code{mail} if it | |
12235 is mail and @code{unknown} if the type can't be decided. (The | |
12236 @var{article} parameter is necessary in @code{nnvirtual} groups which | |
12237 might very well combine mail groups and news groups.) | |
12238 | |
12239 There should be no result data from this function. | |
12240 | |
12241 | |
12242 @item (nnchoke-request-update-mark GROUP ARTICLE MARK) | |
12243 | |
12244 If the user tries to set a mark that the backend doesn't like, this | |
12245 function may change the mark. Gnus will use whatever this function | |
12246 returns as the mark for @var{article} instead of the original | |
12247 @var{mark}. If the backend doesn't care, it must return the original | |
12248 @var{mark}, and not @code{nil} or any other type of garbage. | |
12249 | |
12250 The only use for this that I can see is what @code{nnvirtual} does with | |
12251 it---if a component group is auto-expirable, marking an article as read | |
12252 in the virtual group should result in the article being marked as | |
12253 expirable. | |
12254 | |
12255 There should be no result data from this function. | |
12256 | |
12257 | |
12258 @item (nnchoke-request-scan &optional GROUP SERVER) | |
12259 | |
12260 This function may be called at any time (by Gnus or anything else) to | |
12261 request that the backend check for incoming articles, in one way or | |
12262 another. A mail backend will typically read the spool file or query the | |
12263 POP server when this function is invoked. The @var{group} doesn't have | |
12264 to be heeded---if the backend decides that it is too much work just | |
12265 scanning for a single group, it may do a total scan of all groups. It | |
12266 would be nice, however, to keep things local if that's practical. | |
12267 | |
12268 There should be no result data from this function. | |
12269 | |
12270 | |
12271 @item (nnchoke-request-asynchronous GROUP &optional SERVER ARTICLES) | |
12272 | |
12273 This is a request to fetch articles asynchronously later. | |
12274 @var{articles} is an alist of @var{(article-number line-number)}. One | |
12275 would generally expect that if one later fetches article number 4, for | |
12276 instance, some sort of asynchronous fetching of the articles after 4 | |
12277 (which might be 5, 6, 7 or 11, 3, 909 depending on the order in that | |
12278 alist) would be fetched asynchronously, but that is left up to the | |
12279 backend. Gnus doesn't care. | |
12280 | |
12281 There should be no result data from this function. | |
12282 | |
12283 | |
12284 @item (nnchoke-request-group-description GROUP &optional SERVER) | |
12285 | |
12286 The result data from this function should be a description of | |
12287 @var{group}. | |
12288 | |
12289 @example | |
12290 description-line = name <TAB> description eol | |
12291 name = <string> | |
12292 description = <text> | |
12293 @end example | |
12294 | |
12295 @item (nnchoke-request-list-newsgroups &optional SERVER) | |
12296 | |
12297 The result data from this function should be the description of all | |
12298 groups available on the server. | |
12299 | |
12300 @example | |
12301 description-buffer = *description-line | |
12302 @end example | |
12303 | |
12304 | |
12305 @item (nnchoke-request-newgroups DATE &optional SERVER) | |
12306 | |
12307 The result data from this function should be all groups that were | |
12308 created after @samp{date}, which is in normal human-readable date | |
12309 format. The data should be in the active buffer format. | |
12310 | |
12311 | |
12312 @item (nnchoke-request-create-group GROUP &optional SERVER) | |
12313 | |
12314 This function should create an empty group with name @var{group}. | |
12315 | |
12316 There should be no return data. | |
12317 | |
12318 | |
12319 @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE) | |
12320 | |
12321 This function should run the expiry process on all articles in the | |
12322 @var{articles} range (which is currently a simple list of article | |
12323 numbers.) It is left up to the backend to decide how old articles | |
12324 should be before they are removed by this function. If @var{force} is | |
12325 non-@code{nil}, all @var{articles} should be deleted, no matter how new | |
12326 they are. | |
12327 | |
12328 This function should return a list of articles that it did not/was not | |
12329 able to delete. | |
12330 | |
12331 There should be no result data returned. | |
12332 | |
12333 | |
12334 @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM | |
12335 &optional LAST) | |
12336 | |
12337 This function should move @var{article} (which is a number) from | |
12338 @var{group} by calling @var{accept-form}. | |
12339 | |
12340 This function should ready the article in question for moving by | |
12341 removing any header lines it has added to the article, and generally | |
12342 should ``tidy up'' the article. Then it should @code{eval} | |
12343 @var{accept-form} in the buffer where the ``tidy'' article is. This | |
12344 will do the actual copying. If this @code{eval} returns a | |
12345 non-@code{nil} value, the article should be removed. | |
12346 | |
12347 If @var{last} is @code{nil}, that means that there is a high likelihood | |
12348 that there will be more requests issued shortly, so that allows some | |
12349 optimizations. | |
12350 | |
12351 The function should return a cons where the car is the group name and | |
12352 the cdr is the article number that the article was entered as. | |
12353 | |
12354 There should be no data returned. | |
12355 | |
12356 | |
12357 @item (nnchoke-request-accept-article GROUP &optional SERVER LAST) | |
12358 | |
12359 This function takes the current buffer and inserts it into @var{group}. | |
12360 If @var{last} in @code{nil}, that means that there will be more calls to | |
12361 this function in short order. | |
12362 | |
12363 The function should return a cons where the car is the group name and | |
12364 the cdr is the article number that the article was entered as. | |
12365 | |
12366 There should be no data returned. | |
12367 | |
12368 | |
12369 @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER) | |
12370 | |
12371 This function should remove @var{article} (which is a number) from | |
12372 @var{group} and insert @var{buffer} there instead. | |
12373 | |
12374 There should be no data returned. | |
12375 | |
12376 | |
12377 @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER) | |
12378 | |
12379 This function should delete @var{group}. If @var{force}, it should | |
12380 really delete all the articles in the group, and then delete the group | |
12381 itself. (If there is such a thing as ``the group itself''.) | |
12382 | |
12383 There should be no data returned. | |
12384 | |
12385 | |
12386 @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER) | |
12387 | |
12388 This function should rename @var{group} into @var{new-name}. All | |
12389 articles that are in @var{group} should move to @var{new-name}. | |
12390 | |
12391 There should be no data returned. | |
12392 | |
12393 @end table | |
12394 | |
12395 | |
12396 @node Writing New Backends | |
12397 @subsubsection Writing New Backends | |
12398 | |
12399 The various backends share many similarities. @code{nnml} is just like | |
12400 @code{nnspool}, but it allows you to edit the articles on the server. | |
12401 @code{nnmh} is just like @code{nnml}, but it doesn't use an active file, | |
12402 and it doesn't maintain overview databases. @code{nndir} is just like | |
12403 @code{nnml}, but it has no concept of ``groups'', and it doesn't allow | |
12404 editing articles. | |
12405 | |
12406 It would make sense if it were possible to ``inherit'' functions from | |
12407 backends when writing new backends. And, indeed, you can do that if you | |
12408 want to. (You don't have to if you don't want to, of course.) | |
12409 | |
12410 All the backends declare their public variables and functions by using a | |
12411 package called @code{nnoo}. | |
12412 | |
12413 To inherit functions from other backends (and allow other backends to | |
12414 inherit functions from the current backend), you should use the | |
12415 following macros: | |
12416 following. | |
12417 | |
12418 @table @code | |
12419 | |
12420 @item nnoo-declare | |
12421 This macro declares the first parameter to be a child of the subsequent | |
12422 parameters. For instance: | |
12423 | |
12424 @lisp | |
12425 (nnoo-declare nndir | |
12426 nnml nnmh) | |
12427 @end lisp | |
12428 | |
12429 @code{nndir} has here declared that it intends to inherit functions from | |
12430 both @code{nnml} and @code{nnmh}. | |
12431 | |
12432 @item defvoo | |
12433 This macro is equivalent to @code{defvar}, but registers the variable as | |
12434 a public server variable. Most state-oriented variables should be | |
12435 declared with @code{defvoo} instead of @code{defvar}. | |
12436 | |
12437 In addition to the normal @code{defvar} parameters, it takes a list of | |
12438 variables in the parent backends to map the variable to when executing | |
12439 a function in those backends. | |
12440 | |
12441 @lisp | |
12442 (defvoo nndir-directory nil | |
12443 "Where nndir will look for groups." | |
12444 nnml-current-directory nnmh-current-directory) | |
12445 @end lisp | |
12446 | |
12447 This means that @code{nnml-current-directory} will be set to | |
12448 @code{nndir-directory} when an @code{nnml} function is called on behalf | |
12449 of @code{nndir}. (The same with @code{nnmh}.) | |
12450 | |
12451 @item nnoo-define-basics | |
12452 This macro defines some common functions that almost all backends should | |
12453 have. | |
12454 | |
12455 @example | |
12456 (nnoo-define-basics nndir) | |
12457 @end example | |
12458 | |
12459 @item deffoo | |
12460 This macro is just like @code{defun} and takes the same parameters. In | |
12461 addition to doing the normal @code{defun} things, it registers the | |
12462 function as being public so that other backends can inherit it. | |
12463 | |
12464 @item nnoo-map-functions | |
12465 This macro allows mapping of functions from the current backend to | |
12466 functions from the parent backends. | |
12467 | |
12468 @example | |
12469 (nnoo-map-functions nndir | |
12470 (nnml-retrieve-headers 0 nndir-current-group 0 0) | |
12471 (nnmh-request-article 0 nndir-current-group 0 0)) | |
12472 @end example | |
12473 | |
12474 This means that when @code{nndir-retrieve-headers} is called, the first, | |
12475 third, and fourth parameters will be passed on to | |
12476 @code{nnml-retrieve-headers}, while the second parameter is set to the | |
12477 value of @code{nndir-current-group}. | |
12478 | |
12479 @item nnoo-import | |
12480 This macro allows importing functions from backends. It should be the | |
12481 last thing in the source file, since it will only define functions that | |
12482 haven't already been defined. | |
12483 | |
12484 @example | |
12485 (nnoo-import nndir | |
12486 (nnmh | |
12487 nnmh-request-list | |
12488 nnmh-request-newgroups) | |
12489 (nnml)) | |
12490 @end example | |
12491 | |
12492 This means that calls to @code{nndir-request-list} should just be passed | |
12493 on to @code{nnmh-request-list}, while all public functions from | |
12494 @code{nnml} that haven't been defined in @code{nndir} yet should be | |
12495 defined now. | |
12496 | |
12497 @end table | |
12498 | |
12499 Below is a slightly shortened version of the @code{nndir} backend. | |
12500 | |
12501 @lisp | |
12502 ;;; nndir.el --- single directory newsgroup access for Gnus | |
12503 ;; Copyright (C) 1995,96 Free Software Foundation, Inc. | |
12504 | |
12505 ;;; Code: | |
12506 | |
12507 (require 'nnheader) | |
12508 (require 'nnmh) | |
12509 (require 'nnml) | |
12510 (require 'nnoo) | |
12511 (eval-when-compile (require 'cl)) | |
12512 | |
12513 (nnoo-declare nndir | |
12514 nnml nnmh) | |
12515 | |
12516 (defvoo nndir-directory nil | |
12517 "Where nndir will look for groups." | |
12518 nnml-current-directory nnmh-current-directory) | |
12519 | |
12520 (defvoo nndir-nov-is-evil nil | |
12521 "*Non-nil means that nndir will never retrieve NOV headers." | |
12522 nnml-nov-is-evil) | |
12523 | |
12524 (defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group) | |
12525 (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory) | |
12526 (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail) | |
12527 | |
12528 (defvoo nndir-status-string "" nil nnmh-status-string) | |
12529 (defconst nndir-version "nndir 1.0") | |
12530 | |
12531 ;;; Interface functions. | |
12532 | |
12533 (nnoo-define-basics nndir) | |
12534 | |
12535 (deffoo nndir-open-server (server &optional defs) | |
12536 (setq nndir-directory | |
12537 (or (cadr (assq 'nndir-directory defs)) | |
12538 server)) | |
12539 (unless (assq 'nndir-directory defs) | |
12540 (push `(nndir-directory ,server) defs)) | |
12541 (push `(nndir-current-group | |
12542 ,(file-name-nondirectory (directory-file-name nndir-directory))) | |
12543 defs) | |
12544 (push `(nndir-top-directory | |
12545 ,(file-name-directory (directory-file-name nndir-directory))) | |
12546 defs) | |
12547 (nnoo-change-server 'nndir server defs)) | |
12548 | |
12549 (nnoo-map-functions nndir | |
12550 (nnml-retrieve-headers 0 nndir-current-group 0 0) | |
12551 (nnmh-request-article 0 nndir-current-group 0 0) | |
12552 (nnmh-request-group nndir-current-group 0 0) | |
12553 (nnmh-close-group nndir-current-group 0)) | |
12554 | |
12555 (nnoo-import nndir | |
12556 (nnmh | |
12557 nnmh-status-message | |
12558 nnmh-request-list | |
12559 nnmh-request-newgroups)) | |
12560 | |
12561 (provide 'nndir) | |
12562 @end lisp | |
12563 | |
12564 | |
12565 | |
12566 @node Score File Syntax | |
12567 @subsection Score File Syntax | |
12568 | |
12569 Score files are meant to be easily parsable, but yet extremely | |
12570 mallable. It was decided that something that had the same read syntax | |
12571 as an Emacs Lisp list would fit that spec. | |
12572 | |
12573 Here's a typical score file: | |
12574 | |
12575 @lisp | |
12576 (("summary" | |
12577 ("win95" -10000 nil s) | |
12578 ("Gnus")) | |
12579 ("from" | |
12580 ("Lars" -1000)) | |
12581 (mark -100)) | |
12582 @end lisp | |
12583 | |
12584 BNF definition of a score file: | |
12585 | |
12586 @example | |
12587 score-file = "" / "(" *element ")" | |
12588 element = rule / atom | |
12589 rule = string-rule / number-rule / date-rule | |
12590 string-rule = "(" quote string-header quote space *string-match ")" | |
12591 number-rule = "(" quote number-header quote space *number-match ")" | |
12592 date-rule = "(" quote date-header quote space *date-match ")" | |
12593 quote = <ascii 34> | |
12594 string-header = "subject" / "from" / "references" / "message-id" / | |
12595 "xref" / "body" / "head" / "all" / "followup" | |
12596 number-header = "lines" / "chars" | |
12597 date-header = "date" | |
12598 string-match = "(" quote <string> quote [ "" / [ space score [ "" / | |
12599 space date [ "" / [ space string-match-t ] ] ] ] ] ")" | |
12600 score = "nil" / <integer> | |
12601 date = "nil" / <natural number> | |
12602 string-match-t = "nil" / "s" / "substring" / "S" / "Substring" / | |
12603 "r" / "regex" / "R" / "Regex" / | |
12604 "e" / "exact" / "E" / "Exact" / | |
12605 "f" / "fuzzy" / "F" / "Fuzzy" | |
12606 number-match = "(" <integer> [ "" / [ space score [ "" / | |
12607 space date [ "" / [ space number-match-t ] ] ] ] ] ")" | |
12608 number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<=" | |
12609 date-match = "(" quote <string> quote [ "" / [ space score [ "" / | |
12610 space date [ "" / [ space date-match-t ] ] ] ] ")" | |
12611 date-match-t = "nil" / "at" / "before" / "after" | |
12612 atom = "(" [ required-atom / optional-atom ] ")" | |
12613 required-atom = mark / expunge / mark-and-expunge / files / | |
12614 exclude-files / read-only / touched | |
12615 optional-atom = adapt / local / eval | |
12616 mark = "mark" space nil-or-number | |
12617 nil-or-number = "nil" / <integer> | |
12618 expunge = "expunge" space nil-or-number | |
12619 mark-and-expunge = "mark-and-expunge" space nil-or-number | |
12620 files = "files" *[ space <string> ] | |
12621 exclude-files = "exclude-files" *[ space <string> ] | |
12622 read-only = "read-only" [ space "nil" / space "t" ] | |
12623 adapt = "adapt" [ space "nil" / space "t" / space adapt-rule ] | |
12624 adapt-rule = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")" | |
12625 local = "local" *[ space "(" <string> space <form> ")" ] | |
12626 eval = "eval" space <form> | |
12627 space = *[ " " / <TAB> / <NEWLINE> ] | |
12628 @end example | |
12629 | |
12630 Any unrecognized elements in a score file should be ignored, but not | |
12631 discarded. | |
12632 | |
12633 As you can see, white space is needed, but the type and amount of white | |
12634 space is irrelevant. This means that formatting of the score file is | |
12635 left up to the programmer---if it's simpler to just spew it all out on | |
12636 one looong line, then that's ok. | |
12637 | |
12638 The meaning of the various atoms are explained elsewhere in this | |
12639 manual. | |
12640 | |
12641 | |
12642 @node Headers | |
12643 @subsection Headers | |
12644 | |
12645 Gnus uses internally a format for storing article headers that | |
12646 corresponds to the @sc{nov} format in a mysterious fashion. One could | |
12647 almost suspect that the author looked at the @sc{nov} specification and | |
12648 just shamelessly @emph{stole} the entire thing, and one would be right. | |
12649 | |
12650 @dfn{Header} is a severely overloaded term. ``Header'' is used in | |
12651 RFC1036 to talk about lines in the head of an article (eg., | |
12652 @code{From}). It is used by many people as a synonym for | |
12653 ``head''---``the header and the body''. (That should be avoided, in my | |
12654 opinion.) And Gnus uses a format internally that it calls ``header'', | |
12655 which is what I'm talking about here. This is a 9-element vector, | |
12656 basically, with each header (ouch) having one slot. | |
12657 | |
12658 These slots are, in order: @code{number}, @code{subject}, @code{from}, | |
12659 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines}, | |
12660 @code{xref}. There are macros for accessing and setting these slots -- | |
12661 they all have predictable names beginning with @code{mail-header-} and | |
12662 @code{mail-header-set-}, respectively. | |
12663 | |
12664 The @code{xref} slot is really a @code{misc} slot. Any extra info will | |
12665 be put in there. | |
12666 | |
12667 | |
12668 @node Ranges | |
12669 @subsection Ranges | |
12670 | |
12671 @sc{gnus} introduced a concept that I found so useful that I've started | |
12672 using it a lot and have elaborated on it greatly. | |
12673 | |
12674 The question is simple: If you have a large amount of objects that are | |
12675 identified by numbers (say, articles, to take a @emph{wild} example) | |
12676 that you want to callify as being ``included'', a normal sequence isn't | |
12677 very useful. (A 200,000 length sequence is a bit long-winded.) | |
12678 | |
12679 The solution is as simple as the question: You just collapse the | |
12680 sequence. | |
12681 | |
12682 @example | |
12683 (1 2 3 4 5 6 10 11 12) | |
12684 @end example | |
12685 | |
12686 is transformed into | |
12687 | |
12688 @example | |
12689 ((1 . 6) (10 . 12)) | |
12690 @end example | |
12691 | |
12692 To avoid having those nasty @samp{(13 . 13)} elements to denote a | |
12693 lonesome object, a @samp{13} is a valid element: | |
12694 | |
12695 @example | |
12696 ((1 . 6) 7 (10 . 12)) | |
12697 @end example | |
12698 | |
12699 This means that comparing two ranges to find out whether they are equal | |
12700 is slightly tricky: | |
12701 | |
12702 @example | |
12703 ((1 . 5) 7 8 (10 . 12)) | |
12704 @end example | |
12705 | |
12706 and | |
12707 | |
12708 @example | |
12709 ((1 . 5) (7 . 8) (10 . 12)) | |
12710 @end example | |
12711 | |
12712 are equal. In fact, any non-descending list is a range: | |
12713 | |
12714 @example | |
12715 (1 2 3 4 5) | |
12716 @end example | |
12717 | |
12718 is a perfectly valid range, although a pretty long-winded one. This is | |
12719 also legal: | |
12720 | |
12721 @example | |
12722 (1 . 5) | |
12723 @end example | |
12724 | |
12725 and is equal to the previous range. | |
12726 | |
12727 Here's a BNF definition of ranges. Of course, one must remember the | |
12728 semantic requirement that the numbers are non-descending. (Any number | |
12729 of repetition of the same number is allowed, but apt to disappear in | |
12730 range handling.) | |
12731 | |
12732 @example | |
12733 range = simple-range / normal-range | |
12734 simple-range = "(" number " . " number ")" | |
12735 normal-range = "(" start-contents ")" | |
12736 contents = "" / simple-range *[ " " contents ] / | |
12737 number *[ " " contents ] | |
12738 @end example | |
12739 | |
12740 Gnus currently uses ranges to keep track of read articles and article | |
12741 marks. I plan on implementing a number of range operators in C if The | |
12742 Powers That Be are willing to let me. (I haven't asked yet, because I | |
12743 need to do some more thinking on what operators I need to make life | |
12744 totally range-based without ever having to convert back to normal | |
12745 sequences.) | |
12746 | |
12747 | |
12748 @node Group Info | |
12749 @subsection Group Info | |
12750 | |
12751 Gnus stores all permanent info on groups in a @dfn{group info} list. | |
12752 This list is from three to six elements (or more) long and exhaustively | |
12753 describes the group. | |
12754 | |
12755 Here are two example group infos; one is a very simple group while the | |
12756 second is a more complex one: | |
12757 | |
12758 @example | |
12759 ("no.group" 5 (1 . 54324)) | |
12760 | |
12761 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55)) | |
12762 ((tick (15 . 19)) (replied 3 6 (19 . 3))) | |
12763 (nnml "") | |
12764 (auto-expire (to-address "ding@@ifi.uio.no"))) | |
12765 @end example | |
12766 | |
12767 The first element is the group name as Gnus knows the group; the second | |
12768 is the group level; the third is the read articles in range format; the | |
12769 fourth is a list of article marks lists; the fifth is the select method; | |
12770 and the sixth contains the group parameters. | |
12771 | |
12772 Here's a BNF definition of the group info format: | |
12773 | |
12774 @example | |
12775 info = "(" group space level space read | |
12776 [ "" / [ space marks-list [ "" / [ space method [ "" / | |
12777 space parameters ] ] ] ] ] ")" | |
12778 group = quote <string> quote | |
12779 level = <integer in the range of 1 to inf> | |
12780 read = range | |
12781 marks-lists = nil / "(" *marks ")" | |
12782 marks = "(" <string> range ")" | |
12783 method = "(" <string> *elisp-forms ")" | |
12784 parameters = "(" *elisp-forms ")" | |
12785 @end example | |
12786 | |
12787 Actually that @samp{marks} rule is a fib. A @samp{marks} is a | |
12788 @samp{<string>} consed on to a @samp{range}, but that's a bitch to say | |
12789 in pseudo-BNF. | |
12790 | |
12791 | |
12792 @node Emacs/XEmacs Code | |
12793 @subsection Emacs/XEmacs Code | |
12794 @cindex XEmacs | |
12795 @cindex Emacsen | |
12796 | |
12797 While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the | |
12798 platforms must be the primary one. I chose Emacs. Not because I don't | |
12799 like XEmacs or Mule, but because it comes first alphabetically. | |
12800 | |
12801 This means that Gnus will byte-compile under Emacs with nary a warning, | |
12802 while XEmacs will pump out gigabytes of warnings while byte-compiling. | |
12803 As I use byte-compilation warnings to help me root out trivial errors in | |
12804 Gnus, that's very useful. | |
12805 | |
12806 I've also consistently used Emacs function interfaces, but have used | |
12807 Gnusey aliases for the functions. To take an example: Emacs defines a | |
12808 @code{run-at-time} function while XEmacs defines a @code{start-itimer} | |
12809 function. I then define a function called @code{gnus-run-at-time} that | |
12810 takes the same parameters as the Emacs @code{run-at-time}. When running | |
12811 Gnus under Emacs, the former function is just an alias for the latter. | |
12812 However, when running under XEmacs, the former is an alias for the | |
12813 following function: | |
12814 | |
12815 @lisp | |
12816 (defun gnus-xmas-run-at-time (time repeat function &rest args) | |
12817 (start-itimer | |
12818 "gnus-run-at-time" | |
12819 `(lambda () | |
12820 (,function ,@@args)) | |
12821 time repeat)) | |
12822 @end lisp | |
12823 | |
12824 This sort of thing has been done for bunches of functions. Gnus does | |
12825 not redefine any native Emacs functions while running under XEmacs -- it | |
12826 does this @code{defalias} thing with Gnus equivalents instead. Cleaner | |
12827 all over. | |
12828 | |
12829 Of course, I could have chosen XEmacs as my native platform and done | |
12830 mapping functions the other way around. But I didn't. The performance | |
12831 hit these indirections impose on Gnus under XEmacs should be slight. | |
12832 | |
12833 | |
12834 @node Various File Formats | |
12835 @subsection Various File Formats | |
12836 | |
12837 @menu | |
12838 * Active File Format:: Information on articles and groups available. | |
12839 * Newsgroups File Format:: Group descriptions. | |
12840 @end menu | |
12841 | |
12842 | |
12843 @node Active File Format | |
12844 @subsubsection Active File Format | |
12845 | |
12846 The active file lists all groups that are available on the server in | |
12847 question. It also lists the highest and lowest current article numbers | |
12848 in each group. | |
12849 | |
12850 Here's an excerpt from a typical active file: | |
12851 | |
12852 @example | |
12853 soc.motss 296030 293865 y | |
12854 alt.binaries.pictures.fractals 3922 3913 n | |
12855 comp.sources.unix 1605 1593 m | |
12856 comp.binaries.ibm.pc 5097 5089 y | |
12857 no.general 1000 900 y | |
12858 @end example | |
12859 | |
12860 Here's a pseudo-BNF definition of this file: | |
12861 | |
12862 @example | |
12863 active = *group-line | |
12864 group-line = group space high-number space low-number space flag <NEWLINE> | |
12865 group = <non-white-space string> | |
12866 space = " " | |
12867 high-number = <non-negative integer> | |
12868 low-number = <positive integer> | |
12869 flag = "y" / "n" / "m" / "j" / "x" / "=" group | |
12870 @end example | |
12871 | |
12872 | |
12873 @node Newsgroups File Format | |
12874 @subsubsection Newsgroups File Format | |
12875 | |
12876 The newsgroups file lists groups along with their descriptions. Not all | |
12877 groups on the server have to be listed, and not all groups in the file | |
12878 have to exist on the server. The file is meant purely as information to | |
12879 the user. | |
12880 | |
12881 The format is quite simple; a group name, a tab, and the description. | |
12882 Here's the definition: | |
12883 | |
12884 @example | |
12885 newsgroups = *line | |
12886 line = group tab description <NEWLINE> | |
12887 group = <non-white-space string> | |
12888 tab = <TAB> | |
12889 description = <string> | |
12890 @end example | |
12891 | |
12892 | |
12893 @node Emacs for Heathens | |
12894 @section Emacs for Heathens | |
12895 | |
12896 Believe it or not, but some people who use Gnus haven't really used | |
12897 Emacs much before they embarked on their journey on the Gnus Love Boat. | |
12898 If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the | |
12899 region'', and ``set @code{gnus-flargblossen} to an alist where the key | |
12900 is a regexp that is used for matching on the group name'' are magical | |
12901 phrases with little or no meaning, then this appendix is for you. If | |
12902 you are already familiar with Emacs, just ignore this and go fondle your | |
12903 cat instead. | |
12904 | |
12905 @menu | |
12906 * Keystrokes:: Entering text and executing commands. | |
12907 * Emacs Lisp:: The built-in Emacs programming language. | |
12908 @end menu | |
12909 | |
12910 | |
12911 @node Keystrokes | |
12912 @subsection Keystrokes | |
12913 | |
12914 @itemize @bullet | |
12915 @item | |
12916 Q: What is an experienced Emacs user? | |
12917 | |
12918 @item | |
12919 A: A person who wishes that the terminal had pedals. | |
12920 @end itemize | |
12921 | |
12922 Yes, when you use Emacs, you are apt to use the control key, the shift | |
12923 key and the meta key a lot. This is very annoying to some people | |
12924 (notably @code{vi}le users), and the rest of us just love the hell out | |
12925 of it. Just give up and submit. Emacs really does stand for | |
12926 ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you | |
12927 may have heard from other disreputable sources (like the Emacs author). | |
12928 | |
12929 The shift key is normally located near your pinky fingers, and are | |
12930 normally used to get capital letters and stuff. You probably use it all | |
12931 the time. The control key is normally marked ``CTRL'' or something like | |
12932 that. The meta key is, funnily enough, never marked as such on any | |
12933 keyboards. The one I'm currently at has a key that's marked ``Alt'', | |
12934 which is the meta key on this keyboard. It's usually located somewhere | |
12935 to the left hand side of the keyboard, usually on the bottom row. | |
12936 | |
12937 Now, us Emacs people doesn't say ``press the meta-control-m key'', | |
12938 because that's just too inconvenient. We say ``press the @kbd{M-C-m} | |
12939 key''. @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the | |
12940 prefix that means ``control''. So ``press @kbd{C-k}'' means ``press | |
12941 down the control key, and hold it down while you press @kbd{k}''. | |
12942 ``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and | |
12943 the control key and then press @kbd{k}''. Simple, ay? | |
12944 | |
12945 This is somewhat complicated by the fact that not all keyboards have a | |
12946 meta key. In that case you can use the ``escape'' key. Then @kbd{M-k} | |
12947 means ``press escape, release escape, press @kbd{k}''. That's much more | |
12948 work than if you have a meta key, so if that's the case, I respectfully | |
12949 suggest you get a real keyboard with a meta key. You can't live without | |
12950 it. | |
12951 | |
12952 | |
12953 | |
12954 @node Emacs Lisp | |
12955 @subsection Emacs Lisp | |
12956 | |
12957 Emacs is the King of Editors because it's really a Lisp interpreter. | |
12958 Each and every key you tap runs some Emacs Lisp code snippet, and since | |
12959 Emacs Lisp is an interpreted language, that means that you can configure | |
12960 any key to run any arbitrary code. You just, like, do it. | |
12961 | |
12962 Gnus is written in Emacs Lisp, and is run as a bunch of interpreted | |
12963 functions. (These are byte-compiled for speed, but it's still | |
12964 interpreted.) If you decide that you don't like the way Gnus does | |
12965 certain things, it's trivial to have it do something a different way. | |
12966 (Well, at least if you know how to write Lisp code.) However, that's | |
12967 beyond the scope of this manual, so we are simply going to talk about | |
12968 some common constructs that you normally use in your @file{.emacs} file | |
12969 to customize Gnus. | |
12970 | |
12971 If you want to set the variable @code{gnus-florgbnize} to four (4), you | |
12972 write the following: | |
12973 | |
12974 @lisp | |
12975 (setq gnus-florgbnize 4) | |
12976 @end lisp | |
12977 | |
12978 This function (really ``special form'') @code{setq} is the one that can | |
12979 set a variable to some value. This is really all you need to know. Now | |
12980 you can go and fill your @code{.emacs} file with lots of these to change | |
12981 how Gnus works. | |
12982 | |
12983 If you have put that thing in your @code{.emacs} file, it will be read | |
12984 and @code{eval}ed (which is lisp-ese for ``run'') the next time you | |
12985 start Emacs. If you want to change the variable right away, simply say | |
12986 @kbd{C-x C-e} after the closing parenthesis. That will @code{eval} the | |
12987 previous ``form'', which here is a simple @code{setq} statement. | |
12988 | |
12989 Go ahead---just try it, if you're located at your Emacs. After you | |
12990 @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which | |
12991 is the return value of the form you @code{eval}ed. | |
12992 | |
12993 Some pitfalls: | |
12994 | |
12995 If the manual says ``set @code{gnus-read-active-file} to @code{some}'', | |
12996 that means: | |
12997 | |
12998 @lisp | |
12999 (setq gnus-read-active-file 'some) | |
13000 @end lisp | |
13001 | |
13002 On the other hand, if the manual says ``set @code{gnus-nntp-server} to | |
13003 @samp{nntp.ifi.uio.no}'', that means: | |
13004 | |
13005 @lisp | |
13006 (setq gnus-nntp-server "nntp.ifi.uio.no") | |
13007 @end lisp | |
13008 | |
13009 So be careful not to mix up strings (the latter) with symbols (the | |
13010 former). The manual is unambiguous, but it can be confusing. | |
13011 | |
13012 | |
13013 @include gnus-faq.texi | |
13014 | |
13015 @node Index | |
13016 @chapter Index | |
13017 @printindex cp | |
13018 | |
13019 @node Key Index | |
13020 @chapter Key Index | |
13021 @printindex ky | |
13022 | |
13023 @summarycontents | |
13024 @contents | |
13025 @bye | |
13026 | |
13027 @iftex | |
13028 @iflatex | |
13029 \end{document} | |
13030 @end iflatex | |
13031 @end iftex | |
13032 | |
13033 @c End: | |
13034 |