\input texinfo @c -*- mode: texinfo; coding: iso-latin-1; -*-@setfilename ../info/gnus@settitle Gnus Manual@synindex fn cp@synindex vr cp@synindex pg cp@dircategory Emacs@direntry* Gnus: (gnus). The newsreader Gnus.@end direntry@iftex@finalout@end iftex@setchapternewpage odd@iftex@iflatex\documentclass[twoside,a4paper,openright,11pt]{book}\usepackage[latin1]{inputenc}\usepackage{pagestyle}\usepackage{epsfig}\usepackage{bembo}\usepackage{pixidx}\makeindex\begin{document}\newcommand{\gnuschaptername}{}\newcommand{\gnussectionname}{}\newcommand{\gnusbackslash}{/}\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}\newcommand{\gnuskindex}[1]{\index{#1}}\newcommand{\gnusindex}[1]{\index{#1}}\newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}}\newcommand{\gnuscode}[1]{\gnustt{#1}}\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''}\newcommand{\gnuslisp}[1]{\gnustt{#1}}\newcommand{\gnuskbd}[1]{`\gnustt{#1}'}\newcommand{\gnusfile}[1]{`\gnustt{#1}'}\newcommand{\gnusdfn}[1]{\textit{#1}}\newcommand{\gnusi}[1]{\textit{#1}}\newcommand{\gnusstrong}[1]{\textbf{#1}}\newcommand{\gnusemph}[1]{\textit{#1}}\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}\newcommand{\gnussc}[1]{\textsc{#1}}\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}\newcommand{\gnusresult}[1]{\gnustt{=> #1}}\newcommand{\gnusbullet}{{${\bullet}$}}\newcommand{\gnusdollar}{\$}\newcommand{\gnusampersand}{\&}\newcommand{\gnuspercent}{\%}\newcommand{\gnushash}{\#}\newcommand{\gnushat}{\symbol{"5E}}\newcommand{\gnusunderline}{\symbol{"5F}}\newcommand{\gnusnot}{$\neg$}\newcommand{\gnustilde}{\symbol{"7E}}\newcommand{\gnusless}{{$<$}}\newcommand{\gnusgreater}{{$>$}}\newcommand{\gnusbraceleft}{{$>$}}\newcommand{\gnusbraceright}{{$>$}}\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}}\newcommand{\gnusinteresting}{\marginpar[\mbox{}\hfill\gnushead]{\gnushead}}\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}\newcommand{\gnuspagechapter}[1]{{\mbox{}}}\newdimen{\gnusdimen}\gnusdimen 0pt\newcommand{\gnuschapter}[2]{\gnuscleardoublepage\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi\chapter{#2}\renewcommand{\gnussectionname}{}\renewcommand{\gnuschaptername}{#2}\thispagestyle{empty}\hspace*{-2cm}\begin{picture}(500,500)(0,0)\put(480,350){\makebox(0,0)[tr]{#1}}\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}\end{picture}\clearpage}\newcommand{\gnusfigure}[3]{\begin{figure}\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)#3\end{picture}\caption{#1}\end{figure}}\newcommand{\gnusicon}[1]{\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}}}\newcommand{\gnuspicon}[1]{\margindex{\epsfig{figure=#1,width=2cm}}}\newcommand{\gnusxface}[2]{\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}}\newcommand{\gnussmiley}[2]{\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}}\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}\newcommand{\gnussection}[1]{\renewcommand{\gnussectionname}{#1}\section{#1}}\newenvironment{codelist}%{\begin{list}{}{}}{\end{list}}\newenvironment{kbdlist}%{\begin{list}{}{\labelwidth=0cm}}{\end{list}}\newenvironment{dfnlist}%{\begin{list}{}{}}{\end{list}}\newenvironment{stronglist}%{\begin{list}{}{}}{\end{list}}\newenvironment{samplist}%{\begin{list}{}{}}{\end{list}}\newenvironment{varlist}%{\begin{list}{}{}}{\end{list}}\newenvironment{emphlist}%{\begin{list}{}{}}{\end{list}}\newlength\gnusheadtextwidth\setlength{\gnusheadtextwidth}{\headtextwidth}\addtolength{\gnusheadtextwidth}{1cm}\newpagestyle{gnuspreamble}%{{\ifodd\count0{\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}}\else{\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}}}\fi}}{\ifodd\count0\mbox{} \hfill\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}\else\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}\hfill \mbox{}\fi}\newpagestyle{gnusindex}%{{\ifodd\count0{\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}}\else{\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}\fi}}{\ifodd\count0\mbox{} \hfill\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}\else\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}\hfill \mbox{}\fi}\newpagestyle{gnus}%{{\ifodd\count0{\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}}\else{\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}}\fi}}{\ifodd\count0\mbox{} \hfill\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}\else\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}\hfill \mbox{}\fi}\pagenumbering{roman}\pagestyle{gnuspreamble}@end iflatex@end iftex@iftex@iflatex\begin{titlepage}{%\addtolength{\oddsidemargin}{-5cm}%\addtolength{\evensidemargin}{-5cm}\parindent=0cm\addtolength{\textheight}{2cm}\gnustitle{\gnustitlename}\\\rule{15cm}{1mm}\\\vfill\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm}\vfill\rule{15cm}{1mm}\\\gnusauthor{by Lars Magne Ingebrigtsen}\newpage}\mbox{}\vfill\thispagestyle{empty}Copyright \copyright{} 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.1 orany later version published by the Free Software Foundation; with noInvariant Sections, with the Front-Cover texts being ``A GNUManual'', and with the Back-Cover Texts as in (a) below. A copy of thelicense is included in the section entitled ``GNU Free DocumentationLicense'' in the Emacs manual.(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modifythis GNU Manual, like GNU software. Copies published by the FreeSoftware Foundation raise funds for GNU development.''This document is part of a collection distributed under the GNU FreeDocumentation License. If you want to distribute this documentseparately from the collection, you can do so by adding a copy of thelicense to the document, as described in section 6 of the license.\newpage\end{titlepage}@end iflatex@end iftex@ifnottexThis file documents Gnus, the GNU Emacs newsreader.Copyright (C) 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.1 orany later version published by the Free Software Foundation; with theInvariant Sections being none, with the Front-Cover texts being ``A GNUManual'', and with the Back-Cover Texts as in (a) below. A copy of thelicense is included in the section entitled ``GNU Free DocumentationLicense'' in the Emacs manual.(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modifythis GNU Manual, like GNU software. Copies published by the FreeSoftware Foundation raise funds for GNU development.''This document is part of a collection distributed under the GNU FreeDocumentation License. If you want to distribute this documentseparately from the collection, you can do so by adding a copy of thelicense to the document, as described in section 6 of the license.@end ifnottex@tex@titlepage@title Gnus Manual@author by Lars Magne Ingebrigtsen@page@vskip 0pt plus 1filllCopyright @copyright{} 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.1 orany later version published by the Free Software Foundation; with noInvariant Sections, with the Front-Cover texts being ``A GNUManual'', and with the Back-Cover Texts as in (a) below. A copy of thelicense is included in the section entitled ``GNU Free DocumentationLicense'' in the Emacs manual.(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modifythis GNU Manual, like GNU software. Copies published by the FreeSoftware Foundation raise funds for GNU development.''This document is part of a collection distributed under the GNU FreeDocumentation License. If you want to distribute this documentseparately from the collection, you can do so by adding a copy of thelicense to the document, as described in section 6 of the license.@end titlepage@page@end tex@node Top@top The Gnus Newsreader@ifinfoYou can read news (and mail) from within Emacs by using Gnus. The newscan be gotten by any nefarious means you can think of---@sc{nntp}, localspool or your mbox file. All at the same time, if you want to push yourluck.This manual corresponds to Gnus 5.9.0.@end ifinfo@iftex@iflatex\tableofcontents\gnuscleardoublepage@end iflatexGnus is the advanced, self-documenting, customizable, extensibleunreal-time newsreader for GNU Emacs.Oops. That sounds oddly familiar, so let's start over again to avoidbeing accused of plagiarism:Gnus is a message-reading laboratory. It will let you look at justabout anything as if it were a newsgroup. You can read mail with it,you can browse directories with it, you can @code{ftp} with it---youcan even read news with it!Gnus tries to empower people who read news the same way Emacs empowerspeople who edit text. Gnus sets no limits to what the user should beallowed to do. Users are encouraged to extend Gnus to make it behavelike they want it to behave. A program should not control people;people should be empowered to do what they want by using (or abusing)the program.@end iftex@menu* Starting Up:: Finding news can be a pain.* The Group Buffer:: Selecting, subscribing and killing groups.* The Summary Buffer:: Reading, saving and posting articles.* The Article Buffer:: Displaying and handling articles.* Composing Messages:: Information on sending mail and news.* Select Methods:: Gnus reads all messages from various select methods.* Scoring:: Assigning values to articles.* Various:: General purpose settings.* The End:: Farewell and goodbye.* Appendices:: Terminology, Emacs intro, FAQ, History, Internals.* Index:: Variable, function and concept index.* Key Index:: Key Index.@detailmenu --- The Detailed Node Listing ---Starting Gnus* Finding the News:: Choosing a method for getting news.* The First Time:: What does Gnus do the first time you start it?* The Server is Down:: How can I read my mail then?* Slave Gnusae:: You can have more than one Gnus active at a time.* Fetching a Group:: Starting Gnus just to read a group.* New Groups:: What is Gnus supposed to do with new groups?* Startup Files:: Those pesky startup files---@file{.newsrc}.* Auto Save:: Recovering from a crash.* The Active File:: Reading the active file over a slow line Takes Time.* Changing Servers:: You may want to move from one server to another.* Startup Variables:: Other variables you might change.New Groups* Checking New Groups:: Determining what groups are new.* Subscription Methods:: What Gnus should do with new groups.* Filtering New Groups:: Making Gnus ignore certain new groups.The Group Buffer* Group Buffer Format:: Information listed and how you can change it.* Group Maneuvering:: Commands for moving in the group buffer.* Selecting a Group:: Actually reading news.* Group Data:: Changing the info for a group.* Subscription Commands:: Unsubscribing, killing, subscribing.* Group Levels:: Levels? What are those, then?* Group Score:: A mechanism for finding out what groups you like.* Marking Groups:: You can mark groups for later processing.* Foreign Groups:: Creating and editing groups.* Group Parameters:: Each group may have different parameters set.* Listing Groups:: Gnus can list various subsets of the groups.* Sorting Groups:: Re-arrange the group order.* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.* Browse Foreign Server:: You can browse a server. See what it has to offer.* Exiting Gnus:: Stop reading news and get some work done.* Group Topics:: A folding group mode divided into topics.* Misc Group Stuff:: Other stuff that you can to do.Group Buffer Format* Group Line Specification:: Deciding how the group buffer is to look.* Group Modeline Specification:: The group buffer modeline.* Group Highlighting:: Having nice colors in the group buffer.Group Topics* Topic Variables:: How to customize the topics the Lisp Way.* Topic Commands:: Interactive E-Z commands.* Topic Sorting:: Sorting each topic individually.* Topic Topology:: A map of the world.* Topic Parameters:: Parameters that apply to all groups in a topic.Misc Group Stuff* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.* Group Information:: Information and help on groups and Gnus.* Group Timestamp:: Making Gnus keep track of when you last read a group.* File Commands:: Reading and writing the Gnus files.The Summary Buffer* Summary Buffer Format:: Deciding how the summary buffer is to look.* Summary Maneuvering:: Moving around the summary buffer.* Choosing Articles:: Reading articles.* Paging the Article:: Scrolling the current article.* Reply Followup and Post:: Posting articles.* Marking Articles:: Marking articles as read, expirable, etc.* Limiting:: You can limit the summary buffer.* Threading:: How threads are made.* Sorting:: How articles and threads are sorted.* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.* Article Caching:: You may store articles in a cache.* Persistent Articles:: Making articles expiry-resistant.* Article Backlog:: Having already read articles hang around.* Saving Articles:: Ways of customizing article saving.* Decoding Articles:: Gnus can treat series of (uu)encoded articles.* Article Treatment:: The article buffer can be mangled at will.* MIME Commands:: Doing MIMEy things with the articles.* Charsets:: Character set issues.* Article Commands:: Doing various things with the article buffer.* Summary Sorting:: Sorting the summary buffer in various ways.* Finding the Parent:: No child support? Get the parent.* Alternative Approaches:: Reading using non-default summaries.* Tree Display:: A more visual display of threads.* Mail Group Commands:: Some commands can only be used in mail groups.* Various Summary Stuff:: What didn't fit anywhere else.* Exiting the Summary Buffer:: Returning to the Group buffer.* Crosspost Handling:: How crossposted articles are dealt with.* Duplicate Suppression:: An alternative when crosspost handling fails.Summary Buffer Format* Summary Buffer Lines:: You can specify how summary lines should look.* To From Newsgroups:: How to not display your own name.* Summary Buffer Mode Line:: You can say how the mode line should look.* Summary Highlighting:: Making the summary buffer all pretty and nice.Choosing Articles* Choosing Commands:: Commands for choosing articles.* Choosing Variables:: Variables that influence these commands.Reply, Followup and Post* Summary Mail Commands:: Sending mail.* Summary Post Commands:: Sending news.* Summary Message Commands:: Other Message-related commands.* Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''Marking Articles* Unread Articles:: Marks for unread articles.* Read Articles:: Marks for read articles.* Other Marks:: Marks that do not affect readedness.* Setting Marks:: How to set and remove marks.* Generic Marking Commands:: How to customize the marking.* Setting Process Marks:: How to mark articles for later processing.Threading* Customizing Threading:: Variables you can change to affect the threading.* Thread Commands:: Thread based commands in the summary buffer.Customizing Threading* Loose Threads:: How Gnus gathers loose threads into bigger threads.* Filling In Threads:: Making the threads displayed look fuller.* More Threading:: Even more variables for fiddling with threads.* Low-Level Threading:: You thought it was over... but you were wrong!Decoding Articles* Uuencoded Articles:: Uudecode articles.* Shell Archives:: Unshar articles.* PostScript Files:: Split PostScript.* Other Files:: Plain save and binhex.* Decoding Variables:: Variables for a happy decoding.* Viewing Files:: You want to look at the result of the decoding?Decoding Variables* Rule Variables:: Variables that say how a file is to be viewed.* Other Decode Variables:: Other decode variables.* Uuencoding and Posting:: Variables for customizing uuencoding.Article Treatment* Article Highlighting:: You want to make the article look like fruit salad.* Article Fontisizing:: Making emphasized text look nice.* Article Hiding:: You also want to make certain info go away.* Article Washing:: Lots of way-neat functions to make life better.* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.* Article Date:: Grumble, UT!* Article Signature:: What is a signature?* Article Miscellanea:: Various other stuff.Alternative Approaches* Pick and Read:: First mark articles and then read them.* Binary Groups:: Auto-decode all articles.Various Summary Stuff* Summary Group Information:: Information oriented commands.* Searching for Articles:: Multiple article commands.* Summary Generation Commands:: (Re)generating the summary buffer.* Really Various Summary Commands:: Those pesky non-conformant commands.The Article Buffer* Hiding Headers:: Deciding what headers should be displayed.* Using MIME:: Pushing articles through @sc{mime} before reading them.* Customizing Articles:: Tailoring the look of the articles.* Article Keymap:: Keystrokes available in the article buffer.* Misc Article:: Other stuff.Composing Messages* Mail:: Mailing and replying.* Posting Server:: What server should you post via?* Mail and Post:: Mailing and posting at the same time.* Archived Messages:: Where Gnus stores the messages you've sent.* Posting Styles:: An easier way to specify who you are.* Drafts:: Postponing messages and rejected messages.* Rejected Articles:: What happens if the server doesn't like your article?Select Methods* The Server Buffer:: Making and editing virtual servers.* Getting News:: Reading USENET news with Gnus.* Getting Mail:: Reading your personal mail with Gnus.* Browsing the Web:: Getting messages from a plethora of Web sources.* Other Sources:: Reading directories, files, SOUP packets.* Combined Groups:: Combining groups into one group.* Gnus Unplugged:: Reading news and mail offline.The Server Buffer* Server Buffer Format:: You can customize the look of this buffer.* Server Commands:: Commands to manipulate servers.* Example Methods:: Examples server specifications.* Creating a Virtual Server:: An example session.* Server Variables:: Which variables to set.* Servers and Methods:: You can use server names as select methods.* Unavailable Servers:: Some servers you try to contact may be down.Getting News* NNTP:: Reading news from an @sc{nntp} server.* News Spool:: Reading news from the local spool.Getting Mail* Mail in a Newsreader:: Important introductory notes.* Getting Started Reading Mail:: A simple cookbook example.* Splitting Mail:: How to create mail groups.* Mail Sources:: How to tell Gnus where to get mail from.* Mail Back End Variables:: Variables for customizing mail handling.* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.* Group Mail Splitting:: Use group customize to drive mail splitting.* Incorporating Old Mail:: What about the old mail you have?* Expiring Mail:: Getting rid of unwanted mail.* Washing Mail:: Removing cruft from the mail you get.* Duplicates:: Dealing with duplicated mail.* Not Reading Mail:: Using mail back ends for reading other files.* Choosing a Mail Back End:: Gnus can read a variety of mail formats.Mail Sources* Mail Source Specifiers:: How to specify what a mail source is.* Mail Source Customization:: Some variables that influence things.* Fetching Mail:: Using the mail source specifiers.Choosing a Mail Back End* Unix Mail Box:: Using the (quite) standard Un*x mbox.* Rmail Babyl:: Emacs programs use the rmail babyl format.* Mail Spool:: Store your mail in a private spool?* MH Spool:: An mhspool-like back end.* Mail Folders:: Having one file for each group.* Comparing Mail Back Ends:: An in-depth looks at pros and cons.Browsing the Web* Web Searches:: Creating groups from articles that match a string.* Slashdot:: Reading the Slashdot comments.* Ultimate:: The Ultimate Bulletin Board systems.* Web Archive:: Reading mailing list archived on web.Other Sources* Directory Groups:: You can read a directory as if it was a newsgroup.* Anything Groups:: Dired? Who needs dired?* Document Groups:: Single files can be the basis of a group.* SOUP:: Reading @sc{soup} packets ``offline''.* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.* IMAP:: Using Gnus as a @sc{imap} client.Document Groups* Document Server Internals:: How to add your own document types.SOUP* SOUP Commands:: Commands for creating and sending @sc{soup} packets* SOUP Groups:: A back end for reading @sc{soup} packets.* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.@sc{imap}* Splitting in IMAP:: Splitting mail with nnimap.* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.* Expunging mailboxes:: Equivalent of a "compress mailbox" button.Combined Groups* Virtual Groups:: Combining articles from many groups.* Kibozed Groups:: Looking through parts of the newsfeed for articles.Gnus Unplugged* Agent Basics:: How it all is supposed to work.* Agent Categories:: How to tell the Gnus Agent what to download.* Agent Commands:: New commands for all the buffers.* Agent Expiry:: How to make old articles go away.* Agent and IMAP:: How to use the Agent with IMAP.* Outgoing Messages:: What happens when you post/mail something?* Agent Variables:: Customizing is fun.* Example Setup:: An example @file{.gnus.el} file for offline people.* Batching Agents:: How to fetch news from a @code{cron} job.* Agent Caveats:: What you think it'll do and what it does.Agent Categories* Category Syntax:: What a category looks like.* The Category Buffer:: A buffer for maintaining categories.* Category Variables:: Customize'r'Us.Agent Commands* Group Agent Commands::* Summary Agent Commands::* Server Agent Commands::Scoring* Summary Score Commands:: Adding score entries for the current group.* Group Score Commands:: General score commands.* Score Variables:: Customize your scoring. (My, what terminology).* Score File Format:: What a score file may contain.* Score File Editing:: You can edit score files by hand as well.* Adaptive Scoring:: Big Sister Gnus knows what you read.* Home Score File:: How to say where new score entries are to go.* Followups To Yourself:: Having Gnus notice when people answer you.* Scoring Tips:: How to score effectively.* Reverse Scoring:: That problem child of old is not problem.* Global Score Files:: Earth-spanning, ear-splitting score files.* Kill Files:: They are still here, but they can be ignored.* Converting Kill Files:: Translating kill files to score files.* GroupLens:: Getting predictions on what you like to read.* Advanced Scoring:: Using logical expressions to build score rules.* Score Decays:: It can be useful to let scores wither away.GroupLens* Using GroupLens:: How to make Gnus use GroupLens.* Rating Articles:: Letting GroupLens know how you rate articles.* Displaying Predictions:: Displaying predictions given by GroupLens.* GroupLens Variables:: Customizing GroupLens.Advanced Scoring* Advanced Scoring Syntax:: A definition.* Advanced Scoring Examples:: What they look like.* Advanced Scoring Tips:: Getting the most out of it.Various* Process/Prefix:: A convention used by many treatment commands.* Interactive:: Making Gnus ask you many questions.* Symbolic Prefixes:: How to supply some Gnus functions with options.* Formatting Variables:: You can specify what buffers should look like.* Windows Configuration:: Configuring the Gnus buffer windows.* Faces and Fonts:: How to change how faces look.* Compilation:: How to speed Gnus up.* Mode Lines:: Displaying information in the mode lines.* Highlighting and Menus:: Making buffers look all nice and cozy.* Buttons:: Get tendinitis in ten easy steps!* Daemons:: Gnus can do things behind your back.* NoCeM:: How to avoid spam and other fatty foods.* Undo:: Some actions can be undone.* Moderation:: What to do if you're a moderator.* XEmacs Enhancements:: There are more pictures and stuff under XEmacs.* Fuzzy Matching:: What's the big fuzz?* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.* Various Various:: Things that are really various.Formatting Variables* Formatting Basics:: A formatting variable is basically a format string.* Mode Line Formatting:: Some rules about mode line formatting variables.* Advanced Formatting:: Modifying output in various ways.* User-Defined Specs:: Having Gnus call your own functions.* Formatting Fonts:: Making the formatting look colorful and nice.XEmacs Enhancements* Picons:: How to display pictures of what your reading.* Smileys:: Show all those happy faces the way they were meant to be shown.* Toolbar:: Click'n'drool.* XVarious:: Other XEmacsy Gnusey variables.Picons* Picon Basics:: What are picons and How do I get them.* Picon Requirements:: Don't go further if you aren't using XEmacs.* Easy Picons:: Displaying Picons---the easy way.* Hard Picons:: The way you should do it. You'll learn something.* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.Appendices* History:: How Gnus got where it is today.* On Writing Manuals:: Why this is not a beginner's guide.* Terminology:: We use really difficult, like, words here.* Customization:: Tailoring Gnus to your needs.* Troubleshooting:: What you might try if things do not work.* Gnus Reference Guide:: Rilly, rilly technical stuff.* Emacs for Heathens:: A short introduction to Emacsian terms.* Frequently Asked Questions:: A question-and-answer session.History* Gnus Versions:: What Gnus versions have been released.* Other Gnus Versions:: Other Gnus versions that also have been released.* Why?:: What's the point of Gnus?* Compatibility:: Just how compatible is Gnus with @sc{gnus}?* Conformity:: Gnus tries to conform to all standards.* Emacsen:: Gnus can be run on a few modern Emacsen.* Gnus Development:: How Gnus is developed.* Contributors:: Oodles of people.* New Features:: Pointers to some of the new stuff in Gnus.New Features* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.* Red Gnus:: Third time best---Gnus 5.4/5.5.* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.Customization* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.* Slow Terminal Connection:: You run a remote Emacs.* Little Disk Space:: You feel that having large setup files is icky.* Slow Machine:: You feel like buying a faster machine.Gnus Reference Guide* Gnus Utility Functions:: Common functions and variable to use.* Back End Interface:: How Gnus communicates with the servers.* Score File Syntax:: A BNF definition of the score file standard.* Headers:: How Gnus stores headers internally.* Ranges:: A handy format for storing mucho numbers.* Group Info:: The group info format.* Extended Interactive:: Symbolic prefixes and stuff.* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.* Various File Formats:: Formats of files that Gnus use.Back End Interface* Required Back End Functions:: Functions that must be implemented.* Optional Back End Functions:: Functions that need not be implemented.* Error Messaging:: How to get messages and report errors.* Writing New Back Ends:: Extending old back ends.* Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.* Mail-like Back Ends:: Some tips on mail back ends.Various File Formats* Active File Format:: Information on articles and groups available.* Newsgroups File Format:: Group descriptions.Emacs for Heathens* Keystrokes:: Entering text and executing commands.* Emacs Lisp:: The built-in Emacs programming language.@end detailmenu@end menu@node Starting Up@chapter Starting Gnus@cindex starting up@kindex M-x gnus@findex gnusIf your system administrator has set things up properly, starting Gnusand reading news is extremely easy---you just type @kbd{M-x gnus} inyour Emacs.@findex gnus-other-frame@kindex M-x gnus-other-frameIf you want to start Gnus in a different frame, you can use the command@kbd{M-x gnus-other-frame} instead.If things do not go smoothly at startup, you have to twiddle somevariables in your @file{~/.gnus} file. This file is similar to@file{~/.emacs}, but is read when gnus starts.If you puzzle at any terms used in this manual, please refer to theterminology section (@pxref{Terminology}).@menu* Finding the News:: Choosing a method for getting news.* The First Time:: What does Gnus do the first time you start it?* The Server is Down:: How can I read my mail then?* Slave Gnusae:: You can have more than one Gnus active at a time.* Fetching a Group:: Starting Gnus just to read a group.* New Groups:: What is Gnus supposed to do with new groups?* Startup Files:: Those pesky startup files---@file{.newsrc}.* Auto Save:: Recovering from a crash.* The Active File:: Reading the active file over a slow line Takes Time.* Changing Servers:: You may want to move from one server to another.* Startup Variables:: Other variables you might change.@end menu@node Finding the News@section Finding the News@cindex finding news@vindex gnus-select-method@c @headThe @code{gnus-select-method} variable says where Gnus should look fornews. This variable should be a list where the first element says@dfn{how} and the second element says @dfn{where}. This method is yournative method. All groups not fetched with this method areforeign groups.For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is whereyou want to get your daily dosage of news from, you'd say:@lisp(setq gnus-select-method '(nntp "news.somewhere.edu"))@end lispIf you want to read directly from the local spool, say:@lisp(setq gnus-select-method '(nnspool ""))@end lispIf you can use a local spool, you probably should, as it will almostcertainly be much faster.@vindex gnus-nntpserver-file@cindex NNTPSERVER@cindex @sc{nntp} serverIf this variable is not set, Gnus will take a look at the@code{NNTPSERVER} environment variable. If that variable isn't set,Gnus will see whether @code{gnus-nntpserver-file}(@file{/etc/nntpserver} by default) has any opinions on the matter. Ifthat fails as well, Gnus will try to use the machine running Emacs as an @sc{nntp} server. That's a long shot, though.@vindex gnus-nntp-serverIf @code{gnus-nntp-server} is set, this variable will override@code{gnus-select-method}. You should therefore set@code{gnus-nntp-server} to @code{nil}, which is what it is by default.@vindex gnus-secondary-servers@vindex gnus-nntp-serverYou can also make Gnus prompt you interactively for the name of an@sc{nntp} server. If you give a non-numerical prefix to @code{gnus}(i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the serversin the @code{gnus-secondary-servers} list (if any). You can also justtype in the name of any server you feel like visiting. (Note that thiswill set @code{gnus-nntp-server}, which means that if you then @kbd{M-xgnus} later in the same Emacs session, Gnus will contact the sameserver.)@findex gnus-group-browse-foreign-server@kindex B @r{(Group)}However, if you use one @sc{nntp} server regularly and are justinterested in a couple of groups from a different server, you would bebetter served by using the @kbd{B} command in the group buffer. It willlet you have a look at what groups are available, and you can subscribeto any of the groups you want to. This also makes @file{.newsrc}maintenance much tidier. @xref{Foreign Groups}.@vindex gnus-secondary-select-methods@c @headA slightly different approach to foreign groups is to set the@code{gnus-secondary-select-methods} variable. The select methodslisted in this variable are in many ways just as native as the@code{gnus-select-method} server. They will also be queried for activefiles during startup (if that's required), and new newsgroups thatappear on these servers will be subscribed (or not) just as nativegroups are.For instance, if you use the @code{nnmbox} back end to read your mail,you would typically set this variable to@lisp(setq gnus-secondary-select-methods '((nnmbox "")))@end lisp@node The First Time@section The First Time@cindex first time usageIf no startup files exist, Gnus will try to determine what groups shouldbe subscribed by default.@vindex gnus-default-subscribed-newsgroupsIf the variable @code{gnus-default-subscribed-newsgroups} is set, Gnuswill subscribe you to just those groups in that list, leaving the restkilled. Your system administrator should have set this variable tosomething useful.Since she hasn't, Gnus will just subscribe you to a few arbitrarilypicked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is definedhere as @dfn{whatever Lars thinks you should read}.)You'll also be subscribed to the Gnus documentation group, which shouldhelp you with most common problems.If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will justuse the normal functions for handling new groups, and not do anythingspecial.@node The Server is Down@section The Server is Down@cindex server errorsIf the default server is down, Gnus will understandably have someproblems starting. However, if you have some mail groups in addition tothe news groups, you may want to start Gnus anyway.Gnus, being the trusting sort of program, will ask whether to proceedwithout a native select method if that server can't be contacted. Thiswill happen whether the server doesn't actually exist (i.e., you havegiven the wrong address) or the server has just momentarily taken illfor some reason or other. If you decide to continue and have no foreigngroups, you'll find it difficult to actually do anything in the groupbuffer. But, hey, that's your problem. Blllrph!@findex gnus-no-server@kindex M-x gnus-no-server@c @headIf you know that the server is definitely down, or you just want to readyour mail without bothering with the server at all, you can use the@code{gnus-no-server} command to start Gnus. That might come in handyif you're in a hurry as well. This command will not attempt to contactyour primary server---instead, it will just activate all groups on level1 and 2. (You should preferably keep no native groups on those twolevels.)@node Slave Gnusae@section Slave Gnusae@cindex slaveYou might want to run more than one Emacs with more than one Gnus at thesame time. If you are using different @file{.newsrc} files (e.g., if youare using the two different Gnusae to read from two different servers),that is no problem whatsoever. You just do it.The problem appears when you want to run two Gnusae that use the same@code{.newsrc} file.To work around that problem some, we here at the Think-Tank at the GnusTowers have come up with a new concept: @dfn{Masters} and@dfn{slaves}. (We have applied for a patent on this concept, and havetaken out a copyright on those words. If you wish to use those words inconjunction with each other, you have to send $1 per usage instance tome. Usage of the patent (@dfn{Master/Slave Relationships In ComputerApplications}) will be much more expensive, of course.)Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (orhowever you do it). Each subsequent slave Gnusae should be started with@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}files, but instead save @dfn{slave files} that contain information onlyon what groups have been read in the slave session. When a master Gnusstarts, it will read (and delete) these slave files, incorporating allinformation from them. (The slave files will be read in the sequencethey were created, so the latest changes will have precedence.)Information from the slave files has, of course, precedence over theinformation in the normal (i.e., master) @code{.newsrc} file.@node Fetching a Group@section Fetching a Group@cindex fetching a group@findex gnus-fetch-groupIt is sometimes convenient to be able to just say ``I want to read thisgroup and I don't care whether Gnus has been started or not''. This isperhaps more useful for people who write code than for users, but thecommand @code{gnus-fetch-group} provides this functionality in any case.It takes the group name as a parameter.@node New Groups@section New Groups@cindex new groups@cindex subscription@vindex gnus-check-new-newsgroupsIf you are satisfied that you really never want to see any new groups,you can set @code{gnus-check-new-newsgroups} to @code{nil}. This willalso save you some time at startup. Even if this variable is@code{nil}, you can always subscribe to the new groups just by pressing@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variableis @code{ask-server} by default. If you set this variable to@code{always}, then Gnus will query the back ends for new groups evenwhen you do the @kbd{g} command (@pxref{Scanning New Messages}).@menu* Checking New Groups:: Determining what groups are new.* Subscription Methods:: What Gnus should do with new groups.* Filtering New Groups:: Making Gnus ignore certain new groups.@end menu@node Checking New Groups@subsection Checking New GroupsGnus normally determines whether a group is new or not by comparing thelist of groups from the active file(s) with the lists of subscribed anddead groups. This isn't a particularly fast method. If@code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask theserver for new groups since the last time. This is both faster andcheaper. This also means that you can get rid of the list of killedgroups altogether, so you may set @code{gnus-save-killed-list} to@code{nil}, which will save time both at startup, at exit, and all over.Saves disk space, too. Why isn't this the default, then?Unfortunately, not all servers support this command.I bet I know what you're thinking now: How do I find out whether myserver supports @code{ask-server}? No? Good, because I don't have afail-safe answer. I would suggest just setting this variable to@code{ask-server} and see whether any new groups appear within the nextfew days. If any do, then it works. If none do, then it doesn'twork. I could write a function to make Gnus guess whether the serversupports @code{ask-server}, but it would just be a guess. So I won't.You could @code{telnet} to the server and say @code{HELP} and seewhether it lists @samp{NEWGROUPS} among the commands it understands. Ifit does, then it might work. (But there are servers that lists@samp{NEWGROUPS} without supporting the function properly.)This variable can also be a list of select methods. If so, Gnus willissue an @code{ask-server} command to each of the select methods, andsubscribe them (or not) using the normal methods. This might be handyif you are monitoring a few servers for new groups. A side effect isthat startup will take much longer, so you can meditate while waiting.Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.@node Subscription Methods@subsection Subscription Methods@vindex gnus-subscribe-newsgroup-methodWhat Gnus does when it encounters a new group is determined by the@code{gnus-subscribe-newsgroup-method} variable.This variable should contain a function. This function will be calledwith the name of the new group as the only parameter.Some handy pre-fab functions are:@table @code@item gnus-subscribe-zombies@vindex gnus-subscribe-zombiesMake all new groups zombies. This is the default. You can browse thezombies later (with @kbd{A z}) and either kill them all off properly(with @kbd{S z}), or subscribe to them (with @kbd{u}).@item gnus-subscribe-randomly@vindex gnus-subscribe-randomlySubscribe all new groups in arbitrary order. This really means that allnew groups will be added at ``the top'' of the group buffer.@item gnus-subscribe-alphabetically@vindex gnus-subscribe-alphabeticallySubscribe all new groups in alphabetical order.@item gnus-subscribe-hierarchically@vindex gnus-subscribe-hierarchicallySubscribe all new groups hierarchically. The difference between thisfunction and @code{gnus-subscribe-alphabetically} is slight.@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictlyalphabetical fashion, while this function will enter groups into itshierarchy. So if you want to have the @samp{rec} hierarchy before the@samp{comp} hierarchy, this function will not mess that configurationup. Or something like that.@item gnus-subscribe-interactively@vindex gnus-subscribe-interactivelySubscribe new groups interactively. This means that Gnus will askyou about @strong{all} new groups. The groups you choose to subscribeto will be subscribed hierarchically.@item gnus-subscribe-killed@vindex gnus-subscribe-killedKill all new groups.@item gnus-subscribe-topics@vindex gnus-subscribe-topicsPut the groups into the topic that has a matching @code{subscribe} topicparameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}topic parameter that looks like@example"nnslashdot"@end examplewill mean that all groups that match that regex will be subscribed underthat topic.If no topics match the groups, the groups will be subscribed in thetop-level topic.@end table@vindex gnus-subscribe-hierarchical-interactiveA closely related variable is@code{gnus-subscribe-hierarchical-interactive}. (That's quite amouthful.) If this variable is non-@code{nil}, Gnus will ask you in ahierarchical fashion whether to subscribe to new groups or not. Gnuswill ask you for each sub-hierarchy whether you want to descend thehierarchy or not.One common mistake is to set the variable a few paragraphs above(@code{gnus-subscribe-newsgroup-method}) to@code{gnus-subscribe-hierarchical-interactive}. This is an error. Thiswill not work. This is ga-ga. So don't do it.@node Filtering New Groups@subsection Filtering New GroupsA nice and portable way to control which new newsgroups should besubscribed (or ignored) is to put an @dfn{options} line at the start ofthe @file{.newsrc} file. Here's an example:@exampleoptions -n !alt.all !rec.all sci.all@end example@vindex gnus-subscribe-options-newsgroup-methodThis line obviously belongs to a serious-minded intellectual scientificperson (or she may just be plain old boring), because it says that allgroups that have names beginning with @samp{alt} and @samp{rec} shouldbe ignored, and all groups with names beginning with @samp{sci} shouldbe subscribed. Gnus will not use the normal subscription method forsubscribing these groups.@code{gnus-subscribe-options-newsgroup-method} is used instead. Thisvariable defaults to @code{gnus-subscribe-alphabetically}.@vindex gnus-options-not-subscribe@vindex gnus-options-subscribeIf you don't want to mess with your @file{.newsrc} file, you can justset the two variables @code{gnus-options-subscribe} and@code{gnus-options-not-subscribe}. These two variables do exactly thesame as the @file{.newsrc} @samp{options -n} trick. Both are regexps,and if the new group matches the former, it will be unconditionallysubscribed, and if it matches the latter, it will be ignored.@vindex gnus-auto-subscribed-groupsYet another variable that meddles here is@code{gnus-auto-subscribed-groups}. It works exactly like@code{gnus-options-subscribe}, and is therefore really superfluous, but Ithought it would be nice to have two of these. This variable is moremeant for setting some ground rules, while the other variable is usedmore for user fiddling. By default this variable makes all new groupsthat come from mail back ends (@code{nnml}, @code{nnbabyl},@code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed. If youdon't like that, just set this variable to @code{nil}.New groups that match this regexp are subscribed using@code{gnus-subscribe-options-newsgroup-method}.@node Changing Servers@section Changing Servers@cindex changing serversSometimes it is necessary to move from one @sc{nntp} server to another.This happens very rarely, but perhaps you change jobs, or one server isvery flaky and you want to use another.Changing the server is pretty easy, right? You just change@code{gnus-select-method} to point to the new server?@emph{Wrong!}Article numbers are not (in any way) kept synchronized between different@sc{nntp} servers, and the only way Gnus keeps track of what articlesyou have read is by keeping track of article numbers. So when youchange @code{gnus-select-method}, your @file{.newsrc} file becomesworthless.Gnus provides a few functions to attempt to translate a @file{.newsrc}file from one server to another. They all have one thing incommon---they take a looong time to run. You don't want to use thesefunctions more than absolutely necessary.@kindex M-x gnus-change-server@findex gnus-change-serverIf you have access to both servers, Gnus can request the headers for allthe articles you have read and compare @code{Message-ID}s and map thearticle numbers of the read articles and article marks. The @kbd{M-xgnus-change-server} command will do this for all your native groups. Itwill prompt for the method you want to move to.@kindex M-x gnus-group-move-group-to-server@findex gnus-group-move-group-to-serverYou can also move individual groups with the @kbd{M-xgnus-group-move-group-to-server} command. This is useful if you want tomove a (foreign) group from one server to another.@kindex M-x gnus-group-clear-data-on-native-groups@findex gnus-group-clear-data-on-native-groupsIf you don't have access to both the old and new server, all your marksand read ranges have become worthless. You can use the @kbd{M-xgnus-group-clear-data-on-native-groups} command to clear out all datathat you have on your native groups. Use with caution.After changing servers, you @strong{must} move the cache hierarchy away,since the cached articles will have wrong article numbers, which willaffect which articles Gnus thinks are read.@node Startup Files@section Startup Files@cindex startup files@cindex .newsrc@cindex .newsrc.el@cindex .newsrc.eldNow, you all know about the @file{.newsrc} file. All subscriptioninformation is traditionally stored in this file.Things got a bit more complicated with @sc{gnus}. In addition tokeeping the @file{.newsrc} file updated, it also used a file called@file{.newsrc.el} for storing all the information that didn't fit intothe @file{.newsrc} file. (Actually, it also duplicated everything inthe @file{.newsrc} file.) @sc{gnus} would read whichever one of thesefiles was the most recently saved, which enabled people to swap between@sc{gnus} and other newsreaders.That was kinda silly, so Gnus went one better: In addition to the@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called@file{.newsrc.eld}. It will read whichever of these files that are mostrecent, but it will never write a @file{.newsrc.el} file. You shouldnever delete the @file{.newsrc.eld} file---it contains much informationnot stored in the @file{.newsrc} file.@vindex gnus-save-newsrc-file@vindex gnus-read-newsrc-fileYou can turn off writing the @file{.newsrc} file by setting@code{gnus-save-newsrc-file} to @code{nil}, which means you can deletethe file and save some space, as well as exiting from Gnus faster.However, this will make it impossible to use other newsreaders thanGnus. But hey, who would want to, right? Similarly, setting@code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the@file{.newsrc} file and any @file{.newsrc-SERVER} files, which isconvenient if you have a tendency to use Netscape once in a while.@vindex gnus-save-killed-listIf @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnuswill not save the list of killed groups to the startup file. This willsave both time (when starting and quitting) and space (on disk). Itwill also mean that Gnus has no record of what groups are new or old,so the automatic new groups subscription methods become meaningless.You should always set @code{gnus-check-new-newsgroups} to @code{nil} or@code{ask-server} if you set this variable to @code{nil} (@pxref{NewGroups}). This variable can also be a regular expression. If that'sthe case, remove all groups that do not match this regexp beforesaving. This can be useful in certain obscure situations that involveseveral servers where not all servers support @code{ask-server}.@vindex gnus-startup-fileThe @code{gnus-startup-file} variable says where the startup files are.The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startupfile being whatever that one is, with a @samp{.eld} appended.@vindex gnus-save-newsrc-hook@vindex gnus-save-quick-newsrc-hook@vindex gnus-save-standard-newsrc-hook@code{gnus-save-newsrc-hook} is called before saving any of the newsrcfiles, while @code{gnus-save-quick-newsrc-hook} is called just beforesaving the @file{.newsrc.eld} file, and@code{gnus-save-standard-newsrc-hook} is called just before saving the@file{.newsrc} file. The latter two are commonly used to turn versioncontrol on or off. Version control is on by default when saving thestartup files. If you want to turn backup creation off, say something like:@lisp(defun turn-off-backup () (set (make-local-variable 'backup-inhibited) t))(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)@end lisp@vindex gnus-init-fileWhen Gnus starts, it will read the @code{gnus-site-init-file}(@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}(@file{~/.gnus} by default) files. These are normal Emacs Lisp filesand can be used to avoid cluttering your @file{~/.emacs} and@file{site-init} files with Gnus stuff. Gnus will also check for fileswith the same names as these, but with @file{.elc} and @file{.el}suffixes. In other words, if you have set @code{gnus-init-file} to@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},and finally @file{~/.gnus} (in this order).@node Auto Save@section Auto Save@cindex dribble file@cindex auto-saveWhenever you do something that changes the Gnus data (reading articles,catching up, killing/subscribing groups), the change is added to aspecial @dfn{dribble buffer}. This buffer is auto-saved the normalEmacs way. If your Emacs should crash before you have saved the@file{.newsrc} files, all changes you have made can be recovered fromthis file.If Gnus detects this file at startup, it will ask the user whether toread it. The auto save file is deleted whenever the real startup file issaved.@vindex gnus-use-dribble-fileIf @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create andmaintain a dribble buffer. The default is @code{t}.@vindex gnus-dribble-directoryGnus will put the dribble file(s) in @code{gnus-dribble-directory}. Ifthis variable is @code{nil}, which it is by default, Gnus will dribbleinto the directory where the @file{.newsrc} file is located. (This isnormally the user's home directory.) The dribble file will get the samefile permissions as the @code{.newsrc} file.@vindex gnus-always-read-dribble-fileIf @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus willread the dribble file on startup without querying the user.@node The Active File@section The Active File@cindex active file@cindex ignored groupsWhen Gnus starts, or indeed whenever it tries to determine whether newarticles have arrived, it reads the active file. This is a very largefile that lists all the active groups and articles on the server.@vindex gnus-ignored-newsgroupsBefore examining the active file, Gnus deletes all lines that match theregexp @code{gnus-ignored-newsgroups}. This is done primarily to rejectany groups with bogus names, but you can use this variable to make Gnusignore hierarchies you aren't ever interested in. However, this is notrecommended. In fact, it's highly discouraged. Instead, @pxref{NewGroups} for an overview of other variables that can be used instead.@c This variable is@c @code{nil} by default, and will slow down active file handling somewhat@c if you set it to anything else.@vindex gnus-read-active-file@c @headThe active file can be rather Huge, so if you have a slow network, youcan set @code{gnus-read-active-file} to @code{nil} to prevent Gnus fromreading the active file. This variable is @code{some} by default.Gnus will try to make do by getting information just on the groups thatyou actually subscribe to.Note that if you subscribe to lots and lots of groups, setting thisvariable to @code{nil} will probably make Gnus slower, not faster. Atpresent, having this variable @code{nil} will slow Gnus downconsiderably, unless you read news over a 2400 baud modem.This variable can also have the value @code{some}. Gnus will thenattempt to read active info only on the subscribed groups. On someservers this is quite fast (on sparkling, brand new INN servers thatsupport the @code{LIST ACTIVE group} command), on others this isn't fastat all. In any case, @code{some} should be faster than @code{nil}, andis certainly faster than @code{t} over slow lines.Some news servers (old versions of Leafnode and old versions of INN, forinstance) do not support the @code{LIST ACTIVE group}. For theseservers, @code{nil} is probably the most efficient value for thisvariable.If this variable is @code{nil}, Gnus will ask for group info in totallock-step, which isn't very fast. If it is @code{some} and you use an@sc{nntp} server, Gnus will pump out commands as fast as it can, andread all the replies in one swoop. This will normally result in betterperformance, but if the server does not support the aforementioned@code{LIST ACTIVE group} command, this isn't very nice to the server.If you think that starting up Gnus takes too long, try all the threedifferent values for this variable and see what works best for you.In any case, if you use @code{some} or @code{nil}, you should definitelykill all groups that you aren't interested in to speed things up.Note that this variable also affects active file retrieval fromsecondary select methods.@node Startup Variables@section Startup Variables@table @code@item gnus-load-hook@vindex gnus-load-hookA hook run while Gnus is being loaded. Note that this hook willnormally be run just once in each Emacs session, no matter how manytimes you start Gnus.@item gnus-before-startup-hook@vindex gnus-before-startup-hookA hook run after starting up Gnus successfully.@item gnus-startup-hook@vindex gnus-startup-hookA hook run as the very last thing after starting up Gnus@item gnus-started-hook@vindex gnus-started-hookA hook that is run as the very last thing after starting up Gnussuccessfully.@item gnus-setup-news-hook@vindex gnus-setup-news-hookA hook that is run after reading the @file{.newsrc} file(s), but beforegenerating the group buffer.@item gnus-check-bogus-newsgroups@vindex gnus-check-bogus-newsgroupsIf non-@code{nil}, Gnus will check for and delete all bogus groups atstartup. A @dfn{bogus group} is a group that you have in your@file{.newsrc} file, but doesn't exist on the news server. Checking forbogus groups can take quite a while, so to save time and resources it'sbest to leave this option off, and do the checking for bogus groups oncein a while from the group buffer instead (@pxref{Group Maintenance}).@item gnus-inhibit-startup-message@vindex gnus-inhibit-startup-messageIf non-@code{nil}, the startup message won't be displayed. That way,your boss might not notice as easily that you are reading news insteadof doing your job. Note that this variable is used before@file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead.@item gnus-no-groups-message@vindex gnus-no-groups-messageMessage displayed by Gnus when no groups are available.@item gnus-play-startup-jingle@vindex gnus-play-startup-jingleIf non-@code{nil}, play the Gnus jingle at startup.@item gnus-startup-jingle@vindex gnus-startup-jingleJingle to be played if the above variable is non-@code{nil}. Thedefault is @samp{Tuxedomoon.Jingle4.au}.@end table@node The Group Buffer@chapter The Group Buffer@cindex group bufferThe @dfn{group buffer} lists all (or parts) of the available groups. Itis the first buffer shown when Gnus starts, and will never be killed aslong as Gnus is active.@iftex@iflatex\gnusfigure{The Group Buffer}{320}{\put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}}\put(120,37){\makebox(0,0)[t]{Buffer name}}\put(120,38){\vector(1,2){10}}\put(40,60){\makebox(0,0)[r]{Mode line}}\put(40,58){\vector(1,0){30}}\put(200,28){\makebox(0,0)[t]{Native select method}}\put(200,26){\vector(-1,2){15}}}@end iflatex@end iftex@menu* Group Buffer Format:: Information listed and how you can change it.* Group Maneuvering:: Commands for moving in the group buffer.* Selecting a Group:: Actually reading news.* Group Data:: Changing the info for a group.* Subscription Commands:: Unsubscribing, killing, subscribing.* Group Levels:: Levels? What are those, then?* Group Score:: A mechanism for finding out what groups you like.* Marking Groups:: You can mark groups for later processing.* Foreign Groups:: Creating and editing groups.* Group Parameters:: Each group may have different parameters set.* Listing Groups:: Gnus can list various subsets of the groups.* Sorting Groups:: Re-arrange the group order.* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.* Browse Foreign Server:: You can browse a server. See what it has to offer.* Exiting Gnus:: Stop reading news and get some work done.* Group Topics:: A folding group mode divided into topics.* Misc Group Stuff:: Other stuff that you can to do.@end menu@node Group Buffer Format@section Group Buffer Format@menu* Group Line Specification:: Deciding how the group buffer is to look.* Group Modeline Specification:: The group buffer modeline.* Group Highlighting:: Having nice colors in the group buffer.@end menu@node Group Line Specification@subsection Group Line Specification@cindex group buffer formatThe default format of the group buffer is nice and dull, but you canmake it as exciting and ugly as you feel like.Here's a couple of example group lines:@example 25: news.announce.newusers * 0: alt.fan.andrea-dworkin@end exampleQuite simple, huh?You can see that there are 25 unread articles in@samp{news.announce.newusers}. There are no unread articles, but someticked articles, in @samp{alt.fan.andrea-dworkin} (see that littleasterisk at the beginning of the line?).@vindex gnus-group-line-formatYou can change that format to whatever you want by fiddling with the@code{gnus-group-line-format} variable. This variable works along thelines of a @code{format} specification, which is pretty much the same asa @code{printf} specifications, for those of you who use (feh!) C.@xref{Formatting Variables}.@samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above.There should always be a colon on the line; the cursor always moves tothe colon after performing an operation. Nothing else is required---noteven the group name. All displayed text is just window dressing, and isnever examined by Gnus. Gnus stores all real information it needs usingtext properties.(Note that if you make a really strange, wonderful, spreadsheet-likelayout, everybody will believe you are hard at work with the accountinginstead of wasting time reading news.)Here's a list of all available format characters:@table @samp@item MAn asterisk if the group only has marked articles.@item SWhether the group is subscribed.@item LLevel of subscribedness.@item NNumber of unread articles.@item INumber of dormant articles.@item TNumber of ticked articles.@item RNumber of read articles.@item tEstimated total number of articles. (This is really @var{max-number}minus @var{min-number} plus 1.)@item yNumber of unread, unticked, non-dormant articles.@item iNumber of ticked and dormant articles.@item gFull group name.@item GGroup name.@item DNewsgroup description.@item o@samp{m} if moderated.@item O@samp{(m)} if moderated.@item sSelect method.@item nSelect from where.@item zA string that looks like @samp{<%s:%n>} if a foreign select method isused.@item PIndentation based on the level of the topic (@pxref{Group Topics}).@item c@vindex gnus-group-uncollapsed-levelsShort (collapsed) group name. The @code{gnus-group-uncollapsed-levels}variable says how many levels to leave at the end of the group name.The default is 1---this will mean that group names like@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.@item m@vindex gnus-new-mail-mark@cindex %@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail tothe group lately.@item p@samp{#} (@code{gnus-process-mark}) if the group is process marked.@item dA string that says when you last read the group (@pxref{GroupTimestamp}).@item uUser defined specifier. The next character in the format string shouldbe a letter. Gnus will call the function@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letterfollowing @samp{%u}. The function will be passed a single dummyparameter as argument. The function should return a string, which willbe inserted into the buffer just like information from any otherspecifier.@end table@cindex *All the ``number-of'' specs will be filled with an asterisk (@samp{*})if no info is available---for instance, if it is a non-activated foreigngroup, or a bogus native group.@node Group Modeline Specification@subsection Group Modeline Specification@cindex group modeline@vindex gnus-group-mode-line-formatThe mode line can be changed by setting@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). Itdoesn't understand that many format specifiers:@table @samp@item SThe native news server.@item MThe native select method.@end table@node Group Highlighting@subsection Group Highlighting@cindex highlighting@cindex group highlighting@vindex gnus-group-highlightHighlighting in the group buffer is controlled by the@code{gnus-group-highlight} variable. This is an alist with elementsthat look like @code{(@var{form} . @var{face})}. If @var{form} evaluates tosomething non-@code{nil}, the @var{face} will be used on the line.Here's an example value for this variable that might look nice if thebackground is dark:@lisp(cond (window-system (setq custom-background-mode 'light) (defface my-group-face-1 '((t (:foreground "Red" :bold t))) "First group face") (defface my-group-face-2 '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face") (defface my-group-face-3 '((t (:foreground "Green4" :bold t))) "Third group face") (defface my-group-face-4 '((t (:foreground "SteelBlue" :bold t))) "Fourth group face") (defface my-group-face-5 '((t (:foreground "Blue" :bold t))) "Fifth group face")))(setq gnus-group-highlight '(((> unread 200) . my-group-face-1) ((and (< level 3) (zerop unread)) . my-group-face-2) ((< level 3) . my-group-face-3) ((zerop unread) . my-group-face-4) (t . my-group-face-5)))@end lispAlso @pxref{Faces and Fonts}.Variables that are dynamically bound when the forms are evaluatedinclude:@table @code@item groupThe group name.@item unreadThe number of unread articles in the group.@item methodThe select method.@item mailpWhether the group is a mail group.@item levelThe level of the group.@item scoreThe score of the group.@item tickedThe number of ticked articles in the group.@item totalThe total number of articles in the group. Or rather, MAX-NUMBER minusMIN-NUMBER plus one.@item topicWhen using the topic minor mode, this variable is bound to the currenttopic being inserted.@end tableWhen the forms are @code{eval}ed, point is at the beginning of the lineof the group in question, so you can use many of the normal Gnusfunctions for snarfing info on the group.@vindex gnus-group-update-hook@findex gnus-group-highlight-line@code{gnus-group-update-hook} is called when a group line is changed.It will not be called when @code{gnus-visual} is @code{nil}. This hookcalls @code{gnus-group-highlight-line} by default.@node Group Maneuvering@section Group Maneuvering@cindex group movementAll movement commands understand the numeric prefix and will behave asexpected, hopefully.@table @kbd@item n@kindex n @r{(Group)}@findex gnus-group-next-unread-groupGo to the next group that has unread articles(@code{gnus-group-next-unread-group}).@item p@itemx @key{DEL}@kindex @key{DEL} @r{(Group)}@kindex p @r{(Group)}@findex gnus-group-prev-unread-groupGo to the previous group that has unread articles(@code{gnus-group-prev-unread-group}).@item N@kindex N @r{(Group)}@findex gnus-group-next-groupGo to the next group (@code{gnus-group-next-group}).@item P@kindex P @r{(Group)}@findex gnus-group-prev-groupGo to the previous group (@code{gnus-group-prev-group}).@item M-n@kindex M-n @r{(Group)}@findex gnus-group-next-unread-group-same-levelGo to the next unread group on the same (or lower) level(@code{gnus-group-next-unread-group-same-level}).@item M-p@kindex M-p @r{(Group)}@findex gnus-group-prev-unread-group-same-levelGo to the previous unread group on the same (or lower) level(@code{gnus-group-prev-unread-group-same-level}).@end tableThree commands for jumping to groups:@table @kbd@item j@kindex j @r{(Group)}@findex gnus-group-jump-to-groupJump to a group (and make it visible if it isn't already)(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, justlike living groups.@item ,@kindex , @r{(Group)}@findex gnus-group-best-unread-groupJump to the unread group with the lowest level(@code{gnus-group-best-unread-group}).@item .@kindex . @r{(Group)}@findex gnus-group-first-unread-groupJump to the first group with unread articles(@code{gnus-group-first-unread-group}).@end table@vindex gnus-group-goto-unreadIf @code{gnus-group-goto-unread} is @code{nil}, all the movementcommands will move to the next group, not the next unread group. Eventhe commands that say they move to the next unread group. The defaultis @code{t}.@node Selecting a Group@section Selecting a Group@cindex group selection@table @kbd@item @key{SPC}@kindex @key{SPC} @r{(Group)}@findex gnus-group-read-groupSelect the current group, switch to the summary buffer and display thefirst unread article (@code{gnus-group-read-group}). If there are nounread articles in the group, or if you give a non-numerical prefix tothis command, Gnus will offer to fetch all the old articles in thisgroup from the server. If you give a numerical prefix @var{N}, @var{N}determines the number of articles Gnus will fetch. If @var{N} ispositive, Gnus fetches the @var{N} newest articles, if @var{N} isnegative, Gnus fetches the @code{abs(@var{N})} oldest articles.Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers oldarticles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u- 4 2 SPC} fetches the 42 oldest ones.When you are in the group (in the Summary buffer), you can type@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the oldones.@item @key{RET}@kindex @key{RET} @r{(Group)}@findex gnus-group-select-groupSelect the current group and switch to the summary buffer(@code{gnus-group-select-group}). Takes the same arguments as@code{gnus-group-read-group}---the only difference is that this commanddoes not display the first unread article automatically upon groupentry.@item M-@key{RET}@kindex M-@key{RET} @r{(Group)}@findex gnus-group-quick-select-groupThis does the same as the command above, but tries to do it with theminimum amount of fuzz (@code{gnus-group-quick-select-group}). Noscoring/killing will be performed, there will be no highlights and noexpunging. This might be useful if you're in a real hurry and have toenter some humongous group. If you give a 0 prefix to this command(i.e., @kbd{0 M-@key{RET}}), Gnus won't even generate the summary buffer,which is useful if you want to toggle threading before generating thesummary buffer (@pxref{Summary Generation Commands}).@item M-@key{SPC}@kindex M-@key{SPC} @r{(Group)}@findex gnus-group-visible-select-groupThis is yet one more command that does the same as the @key{RET}command, but this one does it without expunging and hiding dormants(@code{gnus-group-visible-select-group}).@item C-M-@key{RET}@kindex C-M-@key{RET} @r{(Group)}@findex gnus-group-select-group-ephemerallyFinally, this command selects the current group ephemerally withoutdoing any processing of its contents(@code{gnus-group-select-group-ephemerally}). Even threading has beenturned off. Everything you do in the group after selecting it in thismanner will have no permanent effects.@end table@vindex gnus-large-newsgroupThe @code{gnus-large-newsgroup} variable says what Gnus should considerto be a big group. This is 200 by default. If the group has more(unread and/or ticked) articles than this, Gnus will query the userbefore entering the group. The user can then specify how many articlesshould be fetched from the server. If the user specifies a negativenumber (@code{-n}), the @code{n} oldest articles will be fetched. If itis positive, the @code{n} articles that have arrived most recently willbe fetched.@vindex gnus-select-group-hook@vindex gnus-auto-select-first@code{gnus-auto-select-first} control whether any articles are selectedautomatically when entering a group with the @key{SPC} command.@table @code@item nilDon't select any articles when entering the group. Just display thefull summary buffer.@item tSelect the first unread article when entering the group.@item bestSelect the highest scored article in the group when entering thegroup.@end tableThis variable can also be a function. In that case, that function willbe called to place point on a subject line, and/or select some article.Useful functions include:@table @code@item gnus-summary-first-unread-subjectPlace point on the subject line of the first unread article, butdon't select the article.@item gnus-summary-first-unread-articleSelect the first unread article.@item gnus-summary-best-unread-articleSelect the highest-scored unread article.@end tableIf you want to prevent automatic selection in some group (say, in abinary group with Huge articles) you can set this variable to @code{nil}in @code{gnus-select-group-hook}, which is called when a group isselected.@node Subscription Commands@section Subscription Commands@cindex subscription@table @kbd@item S t@itemx u@kindex S t @r{(Group)}@kindex u @r{(Group)}@findex gnus-group-unsubscribe-current-group@c @icon{gnus-group-unsubscribe}Toggle subscription to the current group(@code{gnus-group-unsubscribe-current-group}).@item S s@itemx U@kindex S s @r{(Group)}@kindex U @r{(Group)}@findex gnus-group-unsubscribe-groupPrompt for a group to subscribe, and then subscribe it. If it wassubscribed already, unsubscribe it instead(@code{gnus-group-unsubscribe-group}).@item S k@itemx C-k@kindex S k @r{(Group)}@kindex C-k @r{(Group)}@findex gnus-group-kill-group@c @icon{gnus-group-kill-group}Kill the current group (@code{gnus-group-kill-group}).@item S y@itemx C-y@kindex S y @r{(Group)}@kindex C-y @r{(Group)}@findex gnus-group-yank-groupYank the last killed group (@code{gnus-group-yank-group}).@item C-x C-t@kindex C-x C-t @r{(Group)}@findex gnus-group-transpose-groupsTranspose two groups (@code{gnus-group-transpose-groups}). This isn'treally a subscription command, but you can use it instead of akill-and-yank sequence sometimes.@item S w@itemx C-w@kindex S w @r{(Group)}@kindex C-w @r{(Group)}@findex gnus-group-kill-regionKill all groups in the region (@code{gnus-group-kill-region}).@item S z@kindex S z @r{(Group)}@findex gnus-group-kill-all-zombiesKill all zombie groups (@code{gnus-group-kill-all-zombies}).@item S C-k@kindex S C-k @r{(Group)}@findex gnus-group-kill-levelKill all groups on a certain level (@code{gnus-group-kill-level}).These groups can't be yanked back after killing, so this command shouldbe used with some caution. The only time where this command comes inreally handy is when you have a @file{.newsrc} with lots of unsubscribedgroups that you want to get rid off. @kbd{S C-k} on level 7 willkill off all unsubscribed groups that do not have message numbers in the@file{.newsrc} file.@end tableAlso @pxref{Group Levels}.@node Group Data@section Group Data@table @kbd@item c@kindex c @r{(Group)}@findex gnus-group-catchup-current@vindex gnus-group-catchup-group-hook@c @icon{gnus-group-catchup-current}Mark all unticked articles in this group as read(@code{gnus-group-catchup-current}).@code{gnus-group-catchup-group-hook} is called when catching up a group fromthe group buffer.@item C@kindex C @r{(Group)}@findex gnus-group-catchup-current-allMark all articles in this group, even the ticked ones, as read(@code{gnus-group-catchup-current-all}).@item M-c@kindex M-c @r{(Group)}@findex gnus-group-clear-dataClear the data from the current group---nix out marks and the list ofread articles (@code{gnus-group-clear-data}).@item M-x gnus-group-clear-data-on-native-groups@kindex M-x gnus-group-clear-data-on-native-groups@findex gnus-group-clear-data-on-native-groupsIf you have switched from one @sc{nntp} server to another, all your marksand read ranges have become worthless. You can use this command toclear out all data that you have on your native groups. Use withcaution.@end table@node Group Levels@section Group Levels@cindex group level@cindex levelAll groups have a level of @dfn{subscribedness}. For instance, if agroup is on level 2, it is more subscribed than a group on level 5. Youcan ask Gnus to just list groups on a given level or lower(@pxref{Listing Groups}), or to just check for new articles in groups ona given level or lower (@pxref{Scanning New Messages}).Remember: The higher the level of the group, the less important it is.@table @kbd@item S l@kindex S l @r{(Group)}@findex gnus-group-set-current-levelSet the level of the current group. If a numeric prefix is given, thenext @var{n} groups will have their levels set. The user will beprompted for a level.@end table@vindex gnus-level-killed@vindex gnus-level-zombie@vindex gnus-level-unsubscribed@vindex gnus-level-subscribedGnus considers groups from levels 1 to@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,@code{gnus-level-subscribed} (exclusive) and@code{gnus-level-unsubscribed} (inclusive) (default 7) to beunsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)(default 8) and @code{gnus-level-killed} to be killed (completely dead)(default 9). Gnus treats subscribed and unsubscribed groups exactly thesame, but zombie and killed groups have no information on what articlesyou have read, etc, stored. This distinction between dead and livinggroups isn't done because it is nice or clever, it is done purely forreasons of efficiency.It is recommended that you keep all your mail groups (if any) on quitelow levels (e.g. 1 or 2).Maybe the following description of the default behavior of Gnus helps tounderstand what these levels are all about. By default, Gnus shows yousubscribed nonempty groups, but by hitting @kbd{L} you can have it showempty subscribed groups and unsubscribed groups, too. Type @kbd{l} togo back to showing nonempty subscribed groups again. Thus, unsubscribedgroups are hidden, in a way.Zombie and killed groups are similar to unsubscribed groups in that theyare hidden by default. But they are different from subscribed andunsubscribed groups in that Gnus doesn't ask the news server forinformation (number of messages, number of unread messages) on zombieand killed groups. Normally, you use @kbd{C-k} to kill the groups youaren't interested in. If most groups are killed, Gnus is faster.Why does Gnus distinguish between zombie and killed groups? Well, whena new group arrives on the server, Gnus by default makes it a zombiegroup. This means that you are normally not bothered with new groups,but you can type @kbd{A z} to get a list of all new groups. Subscribethe ones you like and kill the ones you don't want. (@kbd{A k} shows alist of killed groups.)If you want to play with the level variables, you should show some care.Set them once, and don't touch them ever again. Better yet, don't touchthem at all unless you know exactly what you're doing.@vindex gnus-level-default-unsubscribed@vindex gnus-level-default-subscribedTwo closely related variables are @code{gnus-level-default-subscribed}(default 3) and @code{gnus-level-default-unsubscribed} (default 6),which are the levels that new groups will be put on if they are(un)subscribed. These two variables should, of course, be inside therelevant valid ranges.@vindex gnus-keep-same-levelIf @code{gnus-keep-same-level} is non-@code{nil}, some movement commandswill only move to groups of the same level (or lower). Inparticular, going from the last article in one group to the next groupwill go to the next group of the same level (or lower). This might behandy if you want to read the most important groups before you read therest.If this variable is @code{best}, Gnus will make the next newsgroup theone with the best level.@vindex gnus-group-default-list-levelAll groups with a level less than or equal to@code{gnus-group-default-list-level} will be listed in the group bufferby default.@vindex gnus-group-list-inactive-groupsIf @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-activegroups will be listed along with the unread groups. This variable is@code{t} by default. If it is @code{nil}, inactive groups won't belisted.@vindex gnus-group-use-permanent-levelsIf @code{gnus-group-use-permanent-levels} is non-@code{nil}, once yougive a level prefix to @kbd{g} or @kbd{l}, all subsequent commands willuse this level as the ``work'' level.@vindex gnus-activate-levelGnus will normally just activate (i. e., query the server about) groupson level @code{gnus-activate-level} or less. If you don't want toactivate unsubscribed groups, for instance, you might set this variableto 5. The default is 6.@node Group Score@section Group Score@cindex group score@cindex group rank@cindex rankYou would normally keep important groups on high levels, but that schemeis somewhat restrictive. Don't you wish you could have Gnus sort thegroup buffer according to how often you read groups, perhaps? Withinreason?This is what @dfn{group score} is for. You can have Gnus assign a scoreto each group through the mechanism described below. You can then sortthe group buffer based on this score. Alternatively, you can sort onscore and then level. (Taken together, the level and the score iscalled the @dfn{rank} of the group. A group that is on level 4 and hasa score of 1 has a higher rank than a group on level 5 that has a scoreof 300. (The level is the most significant part and the score is theleast significant part.))@findex gnus-summary-bubble-groupIf you want groups you read often to get higher scores than groups youread seldom you can add the @code{gnus-summary-bubble-group} function tothe @code{gnus-summary-exit-hook} hook. This will result (aftersorting) in a bubbling sort of action. If you want to see that inaction after each summary exit, you can add@code{gnus-group-sort-groups-by-rank} or@code{gnus-group-sort-groups-by-score} to the same hook, but that willslow things down somewhat.@node Marking Groups@section Marking Groups@cindex marking groupsIf you want to perform some command on several groups, and they appearsubsequently in the group buffer, you would normally just give anumerical prefix to the command. Most group commands will then do yourbidding on those groups.However, if the groups are not in sequential order, you can stillperform a command on several groups. You simply mark the groups firstwith the process mark and then execute the command.@table @kbd@item #@kindex # @r{(Group)}@itemx M m@kindex M m @r{(Group)}@findex gnus-group-mark-groupSet the mark on the current group (@code{gnus-group-mark-group}).@item M-#@kindex M-# @r{(Group)}@itemx M u@kindex M u @r{(Group)}@findex gnus-group-unmark-groupRemove the mark from the current group(@code{gnus-group-unmark-group}).@item M U@kindex M U @r{(Group)}@findex gnus-group-unmark-all-groupsRemove the mark from all groups (@code{gnus-group-unmark-all-groups}).@item M w@kindex M w @r{(Group)}@findex gnus-group-mark-regionMark all groups between point and mark (@code{gnus-group-mark-region}).@item M b@kindex M b @r{(Group)}@findex gnus-group-mark-bufferMark all groups in the buffer (@code{gnus-group-mark-buffer}).@item M r@kindex M r @r{(Group)}@findex gnus-group-mark-regexpMark all groups that match some regular expression(@code{gnus-group-mark-regexp}).@end tableAlso @pxref{Process/Prefix}.@findex gnus-group-universal-argumentIf you want to execute some command on all groups that have been markedwith the process mark, you can use the @kbd{M-&}(@code{gnus-group-universal-argument}) command. It will prompt you forthe command to be executed.@node Foreign Groups@section Foreign Groups@cindex foreign groupsBelow are some group mode commands for making and editing general foreigngroups, as well as commands to ease the creation of a fewspecial-purpose groups. All these commands insert the newly createdgroups under point---@code{gnus-subscribe-newsgroup-method} is notconsulted.@table @kbd@item G m@kindex G m @r{(Group)}@findex gnus-group-make-group@cindex making groupsMake a new group (@code{gnus-group-make-group}). Gnus will prompt youfor a name, a method and possibly an @dfn{address}. For an easier wayto subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.@item G r@kindex G r @r{(Group)}@findex gnus-group-rename-group@cindex renaming groupsRename the current group to something else(@code{gnus-group-rename-group}). This is valid only on somegroups---mail groups mostly. This command might very well be quite slowon some back ends.@item G c@kindex G c @r{(Group)}@cindex customizing@findex gnus-group-customizeCustomize the group parameters (@code{gnus-group-customize}).@item G e@kindex G e @r{(Group)}@findex gnus-group-edit-group-method@cindex renaming groupsEnter a buffer where you can edit the select method of the currentgroup (@code{gnus-group-edit-group-method}).@item G p@kindex G p @r{(Group)}@findex gnus-group-edit-group-parametersEnter a buffer where you can edit the group parameters(@code{gnus-group-edit-group-parameters}).@item G E@kindex G E @r{(Group)}@findex gnus-group-edit-groupEnter a buffer where you can edit the group info(@code{gnus-group-edit-group}).@item G d@kindex G d @r{(Group)}@findex gnus-group-make-directory-group@cindex nndirMake a directory group (@pxref{Directory Groups}). You will be promptedfor a directory name (@code{gnus-group-make-directory-group}).@item G h@kindex G h @r{(Group)}@cindex help group@findex gnus-group-make-help-groupMake the Gnus help group (@code{gnus-group-make-help-group}).@item G a@kindex G a @r{(Group)}@cindex (ding) archive@cindex archive group@findex gnus-group-make-archive-group@vindex gnus-group-archive-directory@vindex gnus-group-recent-archive-directoryMake a Gnus archive group (@code{gnus-group-make-archive-group}). Bydefault a group pointing to the most recent articles will be created(@code{gnus-group-recent-archive-directory}), but given a prefix, a fullgroup will be created from @code{gnus-group-archive-directory}.@item G k@kindex G k @r{(Group)}@findex gnus-group-make-kiboze-group@cindex nnkibozeMake a kiboze group. You will be prompted for a name, for a regexp tomatch groups to be ``included'' in the kiboze group, and a series ofstrings to match on headers (@code{gnus-group-make-kiboze-group}).@xref{Kibozed Groups}.@item G D@kindex G D @r{(Group)}@findex gnus-group-enter-directory@cindex nneethingRead an arbitrary directory as if it were a newsgroup with the@code{nneething} back end (@code{gnus-group-enter-directory}).@xref{Anything Groups}.@item G f@kindex G f @r{(Group)}@findex gnus-group-make-doc-group@cindex ClariNet Briefs@cindex nndocMake a group based on some file or other(@code{gnus-group-make-doc-group}). If you give a prefix to thiscommand, you will be prompted for a file name and a file type.Currently supported types are @code{babyl}, @code{mbox}, @code{digest},@code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs},@code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}.If you run this command without a prefix, Gnus will guess at the filetype. @xref{Document Groups}.@item G u@kindex G u @r{(Group)}@vindex gnus-useful-groups@findex gnus-group-make-useful-groupCreate one of the groups mentioned in @code{gnus-useful-groups}(@code{gnus-group-make-useful-group}).@item G w@kindex G w @r{(Group)}@findex gnus-group-make-web-group@cindex DejaNews@cindex Alta Vista@cindex InReference@cindex nnwebMake an ephemeral group based on a web search(@code{gnus-group-make-web-group}). If you give a prefix to thiscommand, make a solid group instead. You will be prompted for thesearch engine type and the search string. Valid search engine typesinclude @code{dejanews}, @code{altavista} and @code{reference}.@xref{Web Searches}.If you use the @code{dejanews} search engine, you can limit the searchto a particular group by using a match string like@samp{~g alt.sysadmin.recovery shaving}.@item G @key{DEL}@kindex G @key{DEL} @r{(Group)}@findex gnus-group-delete-groupThis function will delete the current group(@code{gnus-group-delete-group}). If given a prefix, this function willactually delete all the articles in the group, and forcibly remove thegroup itself from the face of the Earth. Use a prefix only if you areabsolutely sure of what you are doing. This command can't be used onread-only groups (like @code{nntp} group), though.@item G V@kindex G V @r{(Group)}@findex gnus-group-make-empty-virtualMake a new, fresh, empty @code{nnvirtual} group(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.@item G v@kindex G v @r{(Group)}@findex gnus-group-add-to-virtualAdd the current group to an @code{nnvirtual} group(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.@end table@xref{Select Methods}, for more information on the various selectmethods.@vindex gnus-activate-foreign-newsgroupsIf @code{gnus-activate-foreign-newsgroups} is a positive number,Gnus will check all foreign groups with this level or lower at startup.This might take quite a while, especially if you subscribe to lots ofgroups from different @sc{nntp} servers. Also @pxref{Group Levels};@code{gnus-activate-level} also affects activation of foreignnewsgroups.@node Group Parameters@section Group Parameters@cindex group parametersThe group parameters store information local to a particular group.Here's an example group parameter list:@example((to-address . "ding@@gnus.org") (auto-expire . t))@end exampleWe see that each element consists of a "dotted pair"---the thing beforethe dot is the key, while the thing after the dot is the value. All theparameters have this form @emph{except} local variable specs, which arenot dotted pairs, but proper lists.The following group parameters can be used:@table @code@item to-address@cindex to-addressAddress used by when doing followups and new posts.@example(to-address . "some@@where.com")@end exampleThis is primarily useful in mail groups that represent closed mailinglists---mailing lists where it's expected that everybody that writes tothe mailing list is subscribed to it. Since using this parameterensures that the mail only goes to the mailing list itself, it meansthat members won't receive two copies of your followups.Using @code{to-address} will actually work whether the group is foreignor not. Let's say there's a group on the server that is called@samp{fa.4ad-l}. This is a real newsgroup, but the server has gottenthe articles from a mail-to-news gateway. Posting directly to thisgroup is therefore impossible---you have to send mail to the mailinglist address instead.Some parameters have corresponding customizable variables, each of whichis an alist of regexps and values.@item to-list@cindex to-listAddress used when doing @kbd{a} in that group.@example(to-list . "some@@where.com")@end exampleIt is totally ignoredwhen doing a followup---except that if it is present in a news group,you'll get mail group semantics when doing @kbd{f}.If you do an @kbd{a} command in a mail group and you have neither a@code{to-list} group parameter nor a @code{to-address} group parameter,then a @code{to-list} group parameter will be added automatically uponsending the message if @code{gnus-add-to-list} is set to @code{t}.@vindex gnus-add-to-listIf you do an @kbd{a} command in a mail group and you don't have a@code{to-list} group parameter, one will be added automatically uponsending the message.See also @code{gnus-parameter-to-list-alist}.@item visible@cindex visibleIf the group parameter list has the element @code{(visible . t)},that group will always be visible in the Group buffer, regardlessof whether it has any unread articles.@item broken-reply-to@cindex broken-reply-toElements like @code{(broken-reply-to . t)} signals that @code{Reply-To}headers in this group are to be ignored. This can be useful if you'rereading a mailing list group where the listserv has inserted@code{Reply-To} headers that point back to the listserv itself. This isbroken behavior. So there!@item to-group@cindex to-groupElements like @code{(to-group . "some.group.name")} means that allposts in that group will be sent to @code{some.group.name}.@item newsgroup@cindex newsgroupIf you have @code{(newsgroup . t)} in the group parameter list, Gnuswill treat all responses as if they were responses to news articles.This can be useful if you have a mail group that's really a mirror of anews group.@item gcc-self@cindex gcc-selfIf @code{(gcc-self . t)} is present in the group parameter list, newlycomposed messages will be @code{Gcc}'d to the current group. If@code{(gcc-self . none)} is present, no @code{Gcc:} header will begenerated, if @code{(gcc-self . "string")} is present, this string willbe inserted literally as a @code{gcc} header. This parameter takesprecedence over any default @code{Gcc} rules as described later(@pxref{Archived Messages}).@item auto-expire@cindex auto-expireIf the group parameter has an element that looks like @code{(auto-expire. t)}, all articles read will be marked as expirable. For analternative approach, @pxref{Expiring Mail}.@item total-expire@cindex total-expireIf the group parameter has an element that looks like@code{(total-expire . t)}, all read articles will be put through theexpiry process, even if they are not marked as expirable. Use withcaution. Unread, ticked and dormant articles are not eligible forexpiry.See also @code{gnus-total-expirable-newsgroups}.@item expiry-wait@cindex expiry-wait@vindex nnmail-expiry-wait-functionIf the group parameter has an element that looks like @code{(expiry-wait. 10)}, this value will override any @code{nnmail-expiry-wait} and@code{nnmail-expiry-wait-function} when expiring expirable messages.The value can either be a number of days (not necessarily an integer) orthe symbols @code{never} or @code{immediate}.@item score-file@cindex score file group parameterElements that look like @code{(score-file . "file")} will make@file{file} into the current score file for the group in question. Allinteractive score entries will be put into this file.@item adapt-file@cindex adapt file group parameterElements that look like @code{(adapt-file . "file")} will make@file{file} into the current adaptive file for the group in question.All adaptive score entries will be put into this file.@item admin-addressWhen unsubscribing from a mailing list you should never send theunsubscription notice to the mailing list itself. Instead, you'd sendmessages to the administrative address. This parameter allows you toput the admin address somewhere convenient.@item displayElements that look like @code{(display . MODE)} say which articles todisplay on entering the group. Valid values are:@table @code@item allDisplay all articles, both read and unread.@item defaultDisplay the default visible articles, which normally includes unread andticked articles.@end table@item commentElements that look like @code{(comment . "This is a comment")}are arbitrary comments on the group. They are currently ignored byGnus, but provide a place for you to store information on particulargroups.@item charsetElements that look like @code{(charset . iso-8859-1)} will make@code{iso-8859-1} the default charset; that is, the charset that will beused for all articles that do not specify a charset.See also @code{gnus-group-charset-alist}.@item ignored-charsetsElements that look like @code{(ignored-charsets x-known iso-8859-1)}will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, thedefault charset will be used for decoding articles.See also @code{gnus-group-ignored-charsets-alist}.@item posting-styleYou can store additional posting style information for this group onlyhere (@pxref{Posting Styles}). The format is that of an entry in the@code{gnus-posting-styles} alist, except that there's no regexp matchingthe group name (of course). Style elements in this group parameter willtake precedence over the ones found in @code{gnus-posting-styles}.For instance, if you want a funky name and signature in this group only,instead of hacking @code{gnus-posting-styles}, you could put somethinglike this in the group parameters:@example(posting-style (name "Funky Name") (signature "Funky Signature"))@end example@item bannerAn item like @code{(banner . "regex")} causes any part of an articlethat matches the regular expression "regex" to be stripped. Instead of"regex", you can also use the symbol @code{signature} which strips thelast signature or any of the elements of the alist@code{gnus-article-banner-alist}.@item (@var{variable} @var{form})You can use the group parameters to set variables local to the group youare entering. If you want to turn threading off in @samp{news.answers},you could put @code{(gnus-show-threads nil)} in the group parameters ofthat group. @code{gnus-show-threads} will be made into a local variablein the summary buffer you enter, and the form @code{nil} will be@code{eval}ed there.This can also be used as a group-specific hook function, if you like.If you want to hear a beep when you enter a group, you could putsomething like @code{(dummy-variable (ding))} in the parameters of thatgroup. @code{dummy-variable} will be set to the result of the@code{(ding)} form, but who cares?@end tableUse the @kbd{G p} or the @kbd{G c} command to edit group parameters of agroup. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}presents you with a Customize-like interface. The latter helps avoidsilly Lisp errors.) You might also be interested in reading about topicparameters (@pxref{Topic Parameters}).@node Listing Groups@section Listing Groups@cindex group listingThese commands all list various slices of the groups available.@table @kbd@item l@itemx A s@kindex A s @r{(Group)}@kindex l @r{(Group)}@findex gnus-group-list-groupsList all groups that have unread articles(@code{gnus-group-list-groups}). If the numeric prefix is used, thiscommand will list only groups of level ARG and lower. By default, itonly lists groups of level five (i. e.,@code{gnus-group-default-list-level}) or lower (i.e., just subscribedgroups).@item L@itemx A u@kindex A u @r{(Group)}@kindex L @r{(Group)}@findex gnus-group-list-all-groupsList all groups, whether they have unread articles or not(@code{gnus-group-list-all-groups}). If the numeric prefix is used,this command will list only groups of level ARG and lower. By default,it lists groups of level seven or lower (i.e., just subscribed andunsubscribed groups).@item A l@kindex A l @r{(Group)}@findex gnus-group-list-levelList all unread groups on a specific level(@code{gnus-group-list-level}). If given a prefix, also list the groupswith no unread articles.@item A k@kindex A k @r{(Group)}@findex gnus-group-list-killedList all killed groups (@code{gnus-group-list-killed}). If given aprefix argument, really list all groups that are available, but aren'tcurrently (un)subscribed. This could entail reading the active filefrom the server.@item A z@kindex A z @r{(Group)}@findex gnus-group-list-zombiesList all zombie groups (@code{gnus-group-list-zombies}).@item A m@kindex A m @r{(Group)}@findex gnus-group-list-matchingList all unread, subscribed groups with names that match a regexp(@code{gnus-group-list-matching}).@item A M@kindex A M @r{(Group)}@findex gnus-group-list-all-matchingList groups that match a regexp (@code{gnus-group-list-all-matching}).@item A A@kindex A A @r{(Group)}@findex gnus-group-list-activeList absolutely all groups in the active file(s) of theserver(s) you are connected to (@code{gnus-group-list-active}). Thismight very well take quite a while. It might actually be a better ideato do a @kbd{A M} to list all matching, and just give @samp{.} as thething to match on. Also note that this command may list groups thatdon't exist (yet)---these will be listed as if they were killed groups.Take the output with some grains of salt.@item A a@kindex A a @r{(Group)}@findex gnus-group-aproposList all groups that have names that match a regexp(@code{gnus-group-apropos}).@item A d@kindex A d @r{(Group)}@findex gnus-group-description-aproposList all groups that have names or descriptions that match a regexp(@code{gnus-group-description-apropos}).@item A c@kindex A c @r{(Group)}@findex gnus-group-list-cachedList all groups with cached articles (@code{gnus-group-list-cached}).@item A ?@kindex A ? @r{(Group)}@findex gnus-group-list-dormantList all groups with dormant articles (@code{gnus-group-list-dormant}).@end table@vindex gnus-permanently-visible-groups@cindex visible group parameterGroups that match the @code{gnus-permanently-visible-groups} regexp willalways be shown, whether they have unread articles or not. You can alsoadd the @code{visible} element to the group parameters in question toget the same effect.@vindex gnus-list-groups-with-ticked-articlesGroups that have just ticked articles in it are normally listed in thegroup buffer. If @code{gnus-list-groups-with-ticked-articles} is@code{nil}, these groups will be treated just like totally emptygroups. It is @code{t} by default.@node Sorting Groups@section Sorting Groups@cindex sorting groups@kindex C-c C-s @r{(Group)}@findex gnus-group-sort-groups@vindex gnus-group-sort-functionThe @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts thegroup buffer according to the function(s) given by the@code{gnus-group-sort-function} variable. Available sorting functionsinclude:@table @code@item gnus-group-sort-by-alphabet@findex gnus-group-sort-by-alphabetSort the group names alphabetically. This is the default.@item gnus-group-sort-by-real-name@findex gnus-group-sort-by-real-nameSort the group alphabetically on the real (unprefixed) group names.@item gnus-group-sort-by-level@findex gnus-group-sort-by-levelSort by group level.@item gnus-group-sort-by-score@findex gnus-group-sort-by-scoreSort by group score. @xref{Group Score}.@item gnus-group-sort-by-rank@findex gnus-group-sort-by-rankSort by group score and then the group level. The level and the scoreare, when taken together, the group's @dfn{rank}. @xref{Group Score}.@item gnus-group-sort-by-unread@findex gnus-group-sort-by-unreadSort by number of unread articles.@item gnus-group-sort-by-method@findex gnus-group-sort-by-methodSort alphabetically on the select method.@end table@code{gnus-group-sort-function} can also be a list of sortingfunctions. In that case, the most significant sort key function must bethe last one.There are also a number of commands for sorting directly according tosome sorting criteria:@table @kbd@item G S a@kindex G S a @r{(Group)}@findex gnus-group-sort-groups-by-alphabetSort the group buffer alphabetically by group name(@code{gnus-group-sort-groups-by-alphabet}).@item G S u@kindex G S u @r{(Group)}@findex gnus-group-sort-groups-by-unreadSort the group buffer by the number of unread articles(@code{gnus-group-sort-groups-by-unread}).@item G S l@kindex G S l @r{(Group)}@findex gnus-group-sort-groups-by-levelSort the group buffer by group level(@code{gnus-group-sort-groups-by-level}).@item G S v@kindex G S v @r{(Group)}@findex gnus-group-sort-groups-by-scoreSort the group buffer by group score(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.@item G S r@kindex G S r @r{(Group)}@findex gnus-group-sort-groups-by-rankSort the group buffer by group rank(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.@item G S m@kindex G S m @r{(Group)}@findex gnus-group-sort-groups-by-methodSort the group buffer alphabetically by back end name(@code{gnus-group-sort-groups-by-method}).@end tableAll the commands below obey the process/prefix convention(@pxref{Process/Prefix}).When given a symbolic prefix (@pxref{Symbolic Prefixes}), all thesecommands will sort in reverse order.You can also sort a subset of the groups:@table @kbd@item G P a@kindex G P a @r{(Group)}@findex gnus-group-sort-selected-groups-by-alphabetSort the groups alphabetically by group name(@code{gnus-group-sort-selected-groups-by-alphabet}).@item G P u@kindex G P u @r{(Group)}@findex gnus-group-sort-selected-groups-by-unreadSort the groups by the number of unread articles(@code{gnus-group-sort-selected-groups-by-unread}).@item G P l@kindex G P l @r{(Group)}@findex gnus-group-sort-selected-groups-by-levelSort the groups by group level(@code{gnus-group-sort-selected-groups-by-level}).@item G P v@kindex G P v @r{(Group)}@findex gnus-group-sort-selected-groups-by-scoreSort the groups by group score(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.@item G P r@kindex G P r @r{(Group)}@findex gnus-group-sort-selected-groups-by-rankSort the groups by group rank(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.@item G P m@kindex G P m @r{(Group)}@findex gnus-group-sort-selected-groups-by-methodSort the groups alphabetically by back end name(@code{gnus-group-sort-selected-groups-by-method}).@end table@node Group Maintenance@section Group Maintenance@cindex bogus groups@table @kbd@item b@kindex b @r{(Group)}@findex gnus-group-check-bogus-groupsFind bogus groups and delete them(@code{gnus-group-check-bogus-groups}).@item F@kindex F @r{(Group)}@findex gnus-group-find-new-groupsFind new groups and process them (@code{gnus-group-find-new-groups}).With 1 @kbd{C-u}, use the @code{ask-server} method to query the serverfor new groups. With 2 @kbd{C-u}'s, use most complete method possibleto query the server for new groups, and subscribe the new groups aszombies.@item C-c C-x@kindex C-c C-x @r{(Group)}@findex gnus-group-expire-articlesRun all expirable articles in the current group through the expiryprocess (if any) (@code{gnus-group-expire-articles}).@item C-c C-M-x@kindex C-c C-M-x @r{(Group)}@findex gnus-group-expire-all-groupsRun all articles in all groups through the expiry process(@code{gnus-group-expire-all-groups}).@end table@node Browse Foreign Server@section Browse Foreign Server@cindex foreign servers@cindex browsing servers@table @kbd@item B@kindex B @r{(Group)}@findex gnus-group-browse-foreign-serverYou will be queried for a select method and a server name. Gnus willthen attempt to contact this server and let you browse the groups there(@code{gnus-group-browse-foreign-server}).@end table@findex gnus-browse-modeA new buffer with a list of available groups will appear. This bufferwill use the @code{gnus-browse-mode}. This buffer looks a bit (well,a lot) like a normal group buffer.Here's a list of keystrokes available in the browse mode:@table @kbd@item n@kindex n (Browse)@findex gnus-group-next-groupGo to the next group (@code{gnus-group-next-group}).@item p@kindex p (Browse)@findex gnus-group-prev-groupGo to the previous group (@code{gnus-group-prev-group}).@item @key{SPC}@kindex @key{SPC} (Browse)@findex gnus-browse-read-groupEnter the current group and display the first article(@code{gnus-browse-read-group}).@item @key{RET}@kindex @key{RET} (Browse)@findex gnus-browse-select-groupEnter the current group (@code{gnus-browse-select-group}).@item u@kindex u (Browse)@findex gnus-browse-unsubscribe-current-groupUnsubscribe to the current group, or, as will be the case here,subscribe to it (@code{gnus-browse-unsubscribe-current-group}).@item l@itemx q@kindex q (Browse)@kindex l (Browse)@findex gnus-browse-exitExit browse mode (@code{gnus-browse-exit}).@item ?@kindex ? (Browse)@findex gnus-browse-describe-brieflyDescribe browse mode briefly (well, there's not much to describe, isthere) (@code{gnus-browse-describe-briefly}).@end table@node Exiting Gnus@section Exiting Gnus@cindex exiting GnusYes, Gnus is ex(c)iting.@table @kbd@item z@kindex z @r{(Group)}@findex gnus-group-suspendSuspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,but it kills all buffers except the Group buffer. I'm not sure why thisis a gain, but then who am I to judge?@item q@kindex q @r{(Group)}@findex gnus-group-exit@c @icon{gnus-group-exit}Quit Gnus (@code{gnus-group-exit}).@item Q@kindex Q @r{(Group)}@findex gnus-group-quitQuit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).The dribble file will be saved, though (@pxref{Auto Save}).@end table@vindex gnus-exit-gnus-hook@vindex gnus-suspend-gnus-hook@code{gnus-suspend-gnus-hook} is called when you suspend Gnus and@code{gnus-exit-gnus-hook} is called when you quit Gnus, while@code{gnus-after-exiting-gnus-hook} is called as the final item whenexiting Gnus.@findex gnus-unload@cindex unloadingIf you wish to completely unload Gnus and all its adherents, you can usethe @code{gnus-unload} command. This command is also very handy whentrying to customize meta-variables.Note:@quotationMiss Lisa Cannifax, while sitting in English class, felt her feet gonumbly heavy and herself fall into a hazy trance as the boy sittingbehind her drew repeated lines with his pencil across the back of herplastic chair.@end quotation@node Group Topics@section Group Topics@cindex topicsIf you read lots and lots of groups, it might be convenient to groupthem hierarchically according to topics. You put your Emacs groups overhere, your sex groups over there, and the rest (what, two groups or so?)you put in some misc section that you never bother with anyway. You caneven group the Emacs sex groups as a sub-topic to either the Emacsgroups or the sex groups---or both! Go wild!@iftex@iflatex\gnusfigure{Group Topics}{400}{\put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}}}@end iflatex@end iftexHere's an example:@exampleGnus Emacs -- I wuw it! 3: comp.emacs 2: alt.religion.emacs Naughty Emacs 452: alt.sex.emacs 0: comp.talk.emacs.recovery Misc 8: comp.binaries.fractals 13: comp.sources.unix@end example@findex gnus-topic-mode@kindex t @r{(Group)}To get this @emph{fab} functionality you simply turn on (ooh!) the@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (Thisis a toggling command.)Go ahead, just try it. I'll still be here when you get back. La dedum... Nice tune, that... la la la... What, you're back? Yes, and nowpress @kbd{l}. There. All your groups are now listed under@samp{misc}. Doesn't that make you feel all warm and fuzzy? Hot andbothered?If you want this permanently enabled, you should add that minor mode tothe hook for the group mode:@lisp(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)@end lisp@menu* Topic Variables:: How to customize the topics the Lisp Way.* Topic Commands:: Interactive E-Z commands.* Topic Sorting:: Sorting each topic individually.* Topic Topology:: A map of the world.* Topic Parameters:: Parameters that apply to all groups in a topic.@end menu@node Topic Variables@subsection Topic Variables@cindex topic variablesNow, if you select a topic, it will fold/unfold that topic, which isreally neat, I think.@vindex gnus-topic-line-formatThe topic lines themselves are created according to the@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).Valid elements are:@table @samp@item iIndentation.@item nTopic name.@item vVisibility.@item lLevel.@item gNumber of groups in the topic.@item aNumber of unread articles in the topic.@item ANumber of unread articles in the topic and all its subtopics.@end table@vindex gnus-topic-indent-levelEach sub-topic (and the groups in the sub-topics) will be indented with@code{gnus-topic-indent-level} times the topic level number of spaces.The default is 2.@vindex gnus-topic-mode-hook@code{gnus-topic-mode-hook} is called in topic minor mode buffers.@vindex gnus-topic-display-empty-topicsThe @code{gnus-topic-display-empty-topics} says whether to display eventopics that have no unread articles in them. The default is @code{t}.@node Topic Commands@subsection Topic Commands@cindex topic commandsWhen the topic minor mode is turned on, a new @kbd{T} submap will beavailable. In addition, a few of the standard keys change theirdefinitions slightly.@table @kbd@item T n@kindex T n (Topic)@findex gnus-topic-create-topicPrompt for a new topic name and create it(@code{gnus-topic-create-topic}).@item T m@kindex T m (Topic)@findex gnus-topic-move-groupMove the current group to some other topic(@code{gnus-topic-move-group}). This command uses the process/prefixconvention (@pxref{Process/Prefix}).@item T j@kindex T j (Topic)@findex gnus-topic-jump-to-topicGo to a topic (@code{gnus-topic-jump-to-topic}).@item T c@kindex T c (Topic)@findex gnus-topic-copy-groupCopy the current group to some other topic(@code{gnus-topic-copy-group}). This command uses the process/prefixconvention (@pxref{Process/Prefix}).@item T h@kindex T h (Topic)@findex gnus-topic-hide-topicHide the current topic (@code{gnus-topic-hide-topic}). If givena prefix, hide the topic permanently.@item T s@kindex T s (Topic)@findex gnus-topic-show-topicShow the current topic (@code{gnus-topic-show-topic}). If givena prefix, show the topic permanently.@item T D@kindex T D (Topic)@findex gnus-topic-remove-groupRemove a group from the current topic (@code{gnus-topic-remove-group}).This command is mainly useful if you have the same group in severaltopics and wish to remove it from one of the topics. You may alsoremove a group from all topics, but in that case, Gnus will add it tothe root topic the next time you start Gnus. In fact, all new groups(which, naturally, don't belong to any topic) will show up in the roottopic.This command uses the process/prefix convention(@pxref{Process/Prefix}).@item T M@kindex T M (Topic)@findex gnus-topic-move-matchingMove all groups that match some regular expression to a topic(@code{gnus-topic-move-matching}).@item T C@kindex T C (Topic)@findex gnus-topic-copy-matchingCopy all groups that match some regular expression to a topic(@code{gnus-topic-copy-matching}).@item T H@kindex T H (Topic)@findex gnus-topic-toggle-display-empty-topicsToggle hiding empty topics(@code{gnus-topic-toggle-display-empty-topics}).@item T #@kindex T # (Topic)@findex gnus-topic-mark-topicMark all groups in the current topic with the process mark(@code{gnus-topic-mark-topic}).@item T M-#@kindex T M-# (Topic)@findex gnus-topic-unmark-topicRemove the process mark from all groups in the current topic(@code{gnus-topic-unmark-topic}).@item T TAB@itemx TAB@kindex T TAB (Topic)@kindex TAB (Topic)@findex gnus-topic-indent``Indent'' the current topic so that it becomes a sub-topic of theprevious topic (@code{gnus-topic-indent}). If given a prefix,``un-indent'' the topic instead.@item M-TAB@kindex M-TAB (Topic)@findex gnus-topic-unindent``Un-indent'' the current topic so that it becomes a sub-topic of theparent of its current parent (@code{gnus-topic-unindent}).@item @key{RET}@kindex @key{RET} (Topic)@findex gnus-topic-select-group@itemx @key{SPC}Either select a group or fold a topic (@code{gnus-topic-select-group}).When you perform this command on a group, you'll enter the group, asusual. When done on a topic line, the topic will be folded (if it wasvisible) or unfolded (if it was folded already). So it's basically atoggling command on topics. In addition, if you give a numericalprefix, group on that level (and lower) will be displayed.@item C-c C-x@kindex C-c C-x (Topic)@findex gnus-topic-expire-articlesRun all expirable articles in the current group or topic through the expiryprocess (if any) (@code{gnus-topic-expire-articles}).@item C-k@kindex C-k (Topic)@findex gnus-topic-kill-groupKill a group or topic (@code{gnus-topic-kill-group}). All groups in thetopic will be removed along with the topic.@item C-y@kindex C-y (Topic)@findex gnus-topic-yank-groupYank the previously killed group or topic(@code{gnus-topic-yank-group}). Note that all topics will be yankedbefore all groups.@item T r@kindex T r (Topic)@findex gnus-topic-renameRename a topic (@code{gnus-topic-rename}).@item T @key{DEL}@kindex T @key{DEL} (Topic)@findex gnus-topic-deleteDelete an empty topic (@code{gnus-topic-delete}).@item A T@kindex A T (Topic)@findex gnus-topic-list-activeList all groups that Gnus knows about in a topics-ified way(@code{gnus-topic-list-active}).@item G p@kindex G p (Topic)@findex gnus-topic-edit-parameters@cindex group parameters@cindex topic parameters@cindex parametersEdit the topic parameters (@code{gnus-topic-edit-parameters}).@xref{Topic Parameters}.@end table@node Topic Sorting@subsection Topic Sorting@cindex topic sortingYou can sort the groups in each topic individually with the followingcommands:@table @kbd@item T S a@kindex T S a (Topic)@findex gnus-topic-sort-groups-by-alphabetSort the current topic alphabetically by group name(@code{gnus-topic-sort-groups-by-alphabet}).@item T S u@kindex T S u (Topic)@findex gnus-topic-sort-groups-by-unreadSort the current topic by the number of unread articles(@code{gnus-topic-sort-groups-by-unread}).@item T S l@kindex T S l (Topic)@findex gnus-topic-sort-groups-by-levelSort the current topic by group level(@code{gnus-topic-sort-groups-by-level}).@item T S v@kindex T S v (Topic)@findex gnus-topic-sort-groups-by-scoreSort the current topic by group score(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.@item T S r@kindex T S r (Topic)@findex gnus-topic-sort-groups-by-rankSort the current topic by group rank(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.@item T S m@kindex T S m (Topic)@findex gnus-topic-sort-groups-by-methodSort the current topic alphabetically by back end name(@code{gnus-topic-sort-groups-by-method}).@end table@xref{Sorting Groups}, for more information about group sorting.@node Topic Topology@subsection Topic Topology@cindex topic topology@cindex topologySo, let's have a look at an example group buffer:@exampleGnus Emacs -- I wuw it! 3: comp.emacs 2: alt.religion.emacs Naughty Emacs 452: alt.sex.emacs 0: comp.talk.emacs.recovery Misc 8: comp.binaries.fractals 13: comp.sources.unix@end exampleSo, here we have one top-level topic (@samp{Gnus}), two topics underthat, and one sub-topic under one of the sub-topics. (There is alwaysjust one (1) top-level topic). This topology can be expressed asfollows:@lisp(("Gnus" visible) (("Emacs -- I wuw it!" visible) (("Naughty Emacs" visible))) (("Misc" visible)))@end lisp@vindex gnus-topic-topologyThis is in fact how the variable @code{gnus-topic-topology} would lookfor the display above. That variable is saved in the @file{.newsrc.eld}file, and shouldn't be messed with manually---unless you really wantto. Since this variable is read from the @file{.newsrc.eld} file,setting it in any other startup files will have no effect.This topology shows what topics are sub-topics of what topics (right),and which topics are visible. Two settings are currentlyallowed---@code{visible} and @code{invisible}.@node Topic Parameters@subsection Topic Parameters@cindex topic parametersAll groups in a topic will inherit group parameters from the parent (andancestor) topic parameters. All valid group parameters are valid topicparameters (@pxref{Group Parameters}).In addition, the following parameters are only valid as topicparameters:@table @code@item subscribeWhen subscribing new groups by topic (@pxref{Subscription Methods}), the@code{subscribe} topic parameter says what groups go in what topic. Itsvalue should be a regexp to match the groups that should go in thattopic.@end tableGroup parameters (of course) override topic parameters, and topicparameters in sub-topics override topic parameters in super-topics. Youknow. Normal inheritance rules. (@dfn{Rules} is here a noun, not averb, although you may feel free to disagree with me here.)@exampleGnus Emacs 3: comp.emacs 2: alt.religion.emacs 452: alt.sex.emacs Relief 452: alt.sex.emacs 0: comp.talk.emacs.recovery Misc 8: comp.binaries.fractals 13: comp.sources.unix 452: alt.sex.emacs@end exampleThe @samp{Emacs} topic has the topic parameter @code{(score-file. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has thetopic parameter @code{(score-file . "emacs.SCORE")}. In addition,@* @samp{alt.religion.emacs} has the group parameter @code{(score-file. "religion.SCORE")}.Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, youwill get the @file{relief.SCORE} home score file. If you enter the samegroup in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} homescore file. If you enter the group @samp{alt.religion.emacs}, you'llget the @file{religion.SCORE} home score file.This seems rather simple and self-evident, doesn't it? Well, yes. Butthere are some problems, especially with the @code{total-expiry}parameter. Say you have a mail group in two topics; one with@code{total-expiry} and one without. What happens when you do @kbd{M-xgnus-expire-all-expirable-groups}? Gnus has no way of telling which oneof these topics you mean to expire articles from, so anything mayhappen. In fact, I hereby declare that it is @dfn{undefined} whathappens. You just have to be careful if you do stuff like that.@node Misc Group Stuff@section Misc Group Stuff@menu* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.* Group Information:: Information and help on groups and Gnus.* Group Timestamp:: Making Gnus keep track of when you last read a group.* File Commands:: Reading and writing the Gnus files.@end menu@table @kbd@item ^@kindex ^ @r{(Group)}@findex gnus-group-enter-server-modeEnter the server buffer (@code{gnus-group-enter-server-mode}).@xref{The Server Buffer}.@item a@kindex a @r{(Group)}@findex gnus-group-post-newsPost an article to a group (@code{gnus-group-post-news}). If given aprefix, the current group name will be used as the default.@item m@kindex m @r{(Group)}@findex gnus-group-mailMail a message somewhere (@code{gnus-group-mail}).@end tableVariables for the group buffer:@table @code@item gnus-group-mode-hook@vindex gnus-group-mode-hookis called after the group buffer has beencreated.@item gnus-group-prepare-hook@vindex gnus-group-prepare-hookis called after the group buffer isgenerated. It may be used to modify the buffer in some strange,unnatural way.@item gnus-group-prepared-hook@vindex gnus-group-prepare-hookis called as the very last thing after the group buffer has beengenerated. It may be used to move point around, for instance.@item gnus-permanently-visible-groups@vindex gnus-permanently-visible-groupsGroups matching this regexp will always be listed in the group buffer,whether they are empty or not.@item gnus-group-name-charset-method-alist@vindex gnus-group-name-charset-method-alistAn alist of method and the charset for group names. It is used to shownon-ASCII group names.For example:@lisp(setq gnus-group-name-charset-method-alist '(((nntp "news.com.cn") . cn-gb-2312)))@end lisp@item gnus-group-name-charset-group-alist@vindex gnus-group-name-charset-group-alistAn alist of regexp of group name and the charset for group names.It is used to show non-ASCII group names.For example:@lisp(setq gnus-group-name-charset-group-alist '(("\\.com\\.cn:" . cn-gb-2312)))@end lisp@end table@node Scanning New Messages@subsection Scanning New Messages@cindex new messages@cindex scanning new news@table @kbd@item g@kindex g @r{(Group)}@findex gnus-group-get-new-news@c @icon{gnus-group-get-new-news}Check the server(s) for new articles. If the numerical prefix is used,this command will check only groups of level @var{arg} and lower(@code{gnus-group-get-new-news}). If given a non-numerical prefix, thiscommand will force a total re-reading of the active file(s) from theback end(s).@item M-g@kindex M-g @r{(Group)}@findex gnus-group-get-new-news-this-group@vindex gnus-goto-next-group-when-activating@c @icon{gnus-group-get-new-news-this-group}Check whether new articles have arrived in the current group(@code{gnus-group-get-new-news-this-group}).@code{gnus-goto-next-group-when-activating} says whether this command isto move point to the next group or not. It is @code{t} by default.@findex gnus-activate-all-groups@cindex activating groups@item C-c M-g@kindex C-c M-g @r{(Group)}Activate absolutely all groups (@code{gnus-activate-all-groups}).@item R@kindex R @r{(Group)}@cindex restarting@findex gnus-group-restartRestart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}file(s), closes the connection to all servers, clears up all run-timeGnus variables, and then starts Gnus all over again.@end table@vindex gnus-get-new-news-hook@code{gnus-get-new-news-hook} is run just before checking for new news.@vindex gnus-after-getting-new-news-hook@code{gnus-after-getting-new-news-hook} is run after checking for newnews.@node Group Information@subsection Group Information@cindex group information@cindex information on groups@table @kbd@item H f@kindex H f @r{(Group)}@findex gnus-group-fetch-faq@vindex gnus-group-faq-directory@cindex FAQ@cindex ange-ftpTry to fetch the FAQ for the current group(@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from@code{gnus-group-faq-directory}, which is usually a directory on aremote machine. This variable can also be a list of directories. Inthat case, giving a prefix to this command will allow you to choosebetween the various sites. @code{ange-ftp} (or @code{efs}) will be usedfor fetching the file.If fetching from the first site is unsuccessful, Gnus will attempt to gothrough @code{gnus-group-faq-directory} and try to open them one by one.@item H d@itemx C-c C-d@c @icon{gnus-group-describe-group}@kindex H d @r{(Group)}@kindex C-c C-d @r{(Group)}@cindex describing groups@cindex group description@findex gnus-group-describe-groupDescribe the current group (@code{gnus-group-describe-group}). If givena prefix, force Gnus to re-read the description from the server.@item M-d@kindex M-d @r{(Group)}@findex gnus-group-describe-all-groupsDescribe all groups (@code{gnus-group-describe-all-groups}). If given aprefix, force Gnus to re-read the description file from the server.@item H v@itemx V@kindex V @r{(Group)}@kindex H v @r{(Group)}@cindex version@findex gnus-versionDisplay current Gnus version numbers (@code{gnus-version}).@item ?@kindex ? @r{(Group)}@findex gnus-group-describe-brieflyGive a very short help message (@code{gnus-group-describe-briefly}).@item C-c C-i@kindex C-c C-i @r{(Group)}@cindex info@cindex manual@findex gnus-info-find-nodeGo to the Gnus info node (@code{gnus-info-find-node}).@end table@node Group Timestamp@subsection Group Timestamp@cindex timestamps@cindex group timestampsIt can be convenient to let Gnus keep track of when you last read agroup. To set the ball rolling, you should add@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:@lisp(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)@end lispAfter doing this, each time you enter a group, it'll be recorded.This information can be displayed in various ways---the easiest is touse the @samp{%d} spec in the group line format:@lisp(setq gnus-group-line-format "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")@end lispThis will result in lines looking like:@example* 0: mail.ding 19961002T012943 0: custom 19961002T012713@end exampleAs you can see, the date is displayed in compact ISO 8601 format. Thismay be a bit too much, so to just display the date, you could saysomething like:@lisp(setq gnus-group-line-format "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")@end lisp@node File Commands@subsection File Commands@cindex file commands@table @kbd@item r@kindex r @r{(Group)}@findex gnus-group-read-init-file@vindex gnus-init-file@cindex reading init fileRe-read the init file (@code{gnus-init-file}, which defaults to@file{~/.gnus}) (@code{gnus-group-read-init-file}).@item s@kindex s @r{(Group)}@findex gnus-group-save-newsrc@cindex saving .newsrcSave the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)(@code{gnus-group-save-newsrc}). If given a prefix, force saving thefile(s) whether Gnus thinks it is necessary or not.@c @item Z@c @kindex Z @r{(Group)}@c @findex gnus-group-clear-dribble@c Clear the dribble buffer (@code{gnus-group-clear-dribble}).@end table@node The Summary Buffer@chapter The Summary Buffer@cindex summary bufferA line for each article is displayed in the summary buffer. You canmove around, read articles, post articles and reply to articles.The most common way to a summary buffer is to select a group from thegroup buffer (@pxref{Selecting a Group}).You can have as many summary buffers open as you wish.@menu* Summary Buffer Format:: Deciding how the summary buffer is to look.* Summary Maneuvering:: Moving around the summary buffer.* Choosing Articles:: Reading articles.* Paging the Article:: Scrolling the current article.* Reply Followup and Post:: Posting articles.* Marking Articles:: Marking articles as read, expirable, etc.* Limiting:: You can limit the summary buffer.* Threading:: How threads are made.* Sorting:: How articles and threads are sorted.* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.* Article Caching:: You may store articles in a cache.* Persistent Articles:: Making articles expiry-resistant.* Article Backlog:: Having already read articles hang around.* Saving Articles:: Ways of customizing article saving.* Decoding Articles:: Gnus can treat series of (uu)encoded articles.* Article Treatment:: The article buffer can be mangled at will.* MIME Commands:: Doing MIMEy things with the articles.* Charsets:: Character set issues.* Article Commands:: Doing various things with the article buffer.* Summary Sorting:: Sorting the summary buffer in various ways.* Finding the Parent:: No child support? Get the parent.* Alternative Approaches:: Reading using non-default summaries.* Tree Display:: A more visual display of threads.* Mail Group Commands:: Some commands can only be used in mail groups.* Various Summary Stuff:: What didn't fit anywhere else.* Exiting the Summary Buffer:: Returning to the Group buffer, or reselecting the current group.* Crosspost Handling:: How crossposted articles are dealt with.* Duplicate Suppression:: An alternative when crosspost handling fails.@end menu@node Summary Buffer Format@section Summary Buffer Format@cindex summary buffer format@iftex@iflatex\gnusfigure{The Summary Buffer}{180}{\put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}}\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}}}@end iflatex@end iftex@menu* Summary Buffer Lines:: You can specify how summary lines should look.* To From Newsgroups:: How to not display your own name.* Summary Buffer Mode Line:: You can say how the mode line should look.* Summary Highlighting:: Making the summary buffer all pretty and nice.@end menu@findex mail-extract-address-components@findex gnus-extract-address-components@vindex gnus-extract-address-componentsGnus will use the value of the @code{gnus-extract-address-components}variable as a function for getting the name and address parts of a@code{From} header. Two pre-defined functions exist:@code{gnus-extract-address-components}, which is the default, quitefast, and too simplistic solution; and@code{mail-extract-address-components}, which works very nicely, but isslower. The default function will return the wrong answer in 5% of thecases. If this is unacceptable to you, use the other function instead:@lisp(setq gnus-extract-address-components 'mail-extract-address-components)@end lisp@vindex gnus-summary-same-subject@code{gnus-summary-same-subject} is a string indicating that the currentarticle has the same subject as the previous. This string will be usedwith those specs that require it. The default is @code{""}.@node Summary Buffer Lines@subsection Summary Buffer Lines@vindex gnus-summary-line-formatYou can change the format of the lines in the summary buffer by changingthe @code{gnus-summary-line-format} variable. It works along the samelines as a normal @code{format} string, with some extensions(@pxref{Formatting Variables}).The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.The following format specification characters are understood:@table @samp@item NArticle number.@item SSubject string. List identifiers stripped,@code{gnus-list-identifies}. @xref{Article Hiding}.@item sSubject if the article is the root of the thread or the previous articlehad a different subject, @code{gnus-summary-same-subject} otherwise.(@code{gnus-summary-same-subject} defaults to @code{""}.)@item FFull @code{From} header.@item nThe name (from the @code{From} header).@item fThe name, code @code{To} header or the @code{Newsgroups} header(@pxref{To From Newsgroups}).@item aThe name (from the @code{From} header). This differs from the @code{n}spec in that it uses the function designated by the@code{gnus-extract-address-components} variable, which is slower, butmay be more thorough.@item AThe address (from the @code{From} header). This works the same way asthe @code{a} spec.@item LNumber of lines in the article.@item cNumber of characters in the article. This specifier is not supported in somemethods (like nnfolder).@item IIndentation based on thread level (@pxref{Customizing Threading}).@item TNothing if the article is a root and lots of spaces if it isn't (itpushes everything after it off the screen).@item [Opening bracket, which is normally @samp{[}, but can also be @samp{<}for adopted articles (@pxref{Customizing Threading}).@item ]Closing bracket, which is normally @samp{]}, but can also be @samp{>}for adopted articles.@item >One space for each thread level.@item <Twenty minus thread level spaces.@item UUnread.@item RThis misleadingly named specifier is the @dfn{secondary mark}. Thismark will say whether the article has been replied to, has been cached,or has been saved.@item iScore as a number (@pxref{Scoring}).@item z@vindex gnus-summary-zcore-fuzzZcore, @samp{+} if above the default level and @samp{-} if below thedefault level. If the difference between@code{gnus-summary-default-score} and the score is less than@code{gnus-summary-zcore-fuzz}, this spec will not be used.@item VTotal thread score.@item x@code{Xref}.@item D@code{Date}.@item dThe @code{Date} in @code{DD-MMM} format.@item oThe @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.@item M@code{Message-ID}.@item r@code{References}.@item tNumber of articles in the current sub-thread. Using this spec will slowdown summary buffer generation somewhat.@item eAn @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if thearticle has any children.@item PThe line number.@item ODownload mark.@item uUser defined specifier. The next character in the format string shouldbe a letter. Gnus will call the function@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letterfollowing @samp{%u}. The function will be passed the current header asargument. The function should return a string, which will be insertedinto the summary just like information from any other summary specifier.@end tableThe @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specshave to be handled with care. For reasons of efficiency, Gnus willcompute what column these characters will end up in, and ``hard-code''that. This means that it is invalid to have these specs after avariable-length spec. Well, you might not be arrested, but your summarybuffer will look strange, which is bad enough.The smart choice is to have these specs as far to the left as possible.(Isn't that the case with everything, though? But I digress.)This restriction may disappear in later versions of Gnus.@node To From Newsgroups@subsection To From Newsgroups@cindex To@cindex NewsgroupsIn some groups (particularly in archive groups), the @code{From} headerisn't very interesting, since all the articles there are written byyou. To display the information in the @code{To} or @code{Newsgroups}headers instead, you need to decide three things: What information togather; where to display it; and when to display it.@enumerate@item@vindex gnus-extra-headersThe reading of extra header information is controlled by the@code{gnus-extra-headers}. This is a list of header symbols. Forinstance:@lisp(setq gnus-extra-headers '(To Newsgroups X-Newsreader))@end lispThis will result in Gnus trying to obtain these three headers, andstoring it in header structures for later easy retrieval.@item@findex gnus-extra-headerThe value of these extra headers can be accessed via the@code{gnus-extra-header} function. Here's a format line spec that willaccess the @code{X-Newsreader} header:@example"%~(form (gnus-extra-header 'X-Newsreader))@@"@end example@item@vindex gnus-ignored-from-addressesThe @code{gnus-ignored-from-addresses} variable says when the @samp{%f}summary line spec returns the @code{To}, @code{Newsreader} or@code{From} header. If this regexp matches the contents of the@code{From} header, the value of the @code{To} or @code{Newsreader}headers are used instead.@end enumerate@vindex nnmail-extra-headersA related variable is @code{nnmail-extra-headers}, which controls whento include extra headers when generating overview (@sc{nov}) files. Ifyou have old overview files, you should regenerate them after changingthis variable.@vindex gnus-summary-line-formatYou also have to instruct Gnus to display the data by changing the@code{%n} spec to the @code{%f} spec in the@code{gnus-summary-line-format} variable.In summary, you'd typically do something like the following:@lisp(setq gnus-extra-headers '(To Newsgroups))(setq nnmail-extra-headers gnus-extra-headers)(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-20,20f%]%) %s\n")(setq gnus-ignored-from-addresses "Your Name Here")@end lispNow, this is mostly useful for mail groups, where you have control overthe @sc{nov} files that are created. However, if you can persuade yournntp admin to add:@exampleNewsgroups:full@end exampleto the end of her @file{overview.fmt} file, then you can use that justas you would the extra headers from the mail groups.@node Summary Buffer Mode Line@subsection Summary Buffer Mode Line@vindex gnus-summary-mode-line-formatYou can also change the format of the summary mode bar (@pxref{Mode LineFormatting}). Set @code{gnus-summary-mode-line-format} to whatever youlike. The default is @samp{Gnus: %%b [%A] %Z}.Here are the elements you can play with:@table @samp@item GGroup name.@item pUnprefixed group name.@item ACurrent article number.@item zCurrent article score.@item VGnus version.@item UNumber of unread articles in this group.@item eNumber of unread articles in this group that aren't displayed in thesummary buffer.@item ZA string with the number of unread and unselected articles representedeither as @samp{<%U(+%e) more>} if there are both unread and unselectedarticles, and just as @samp{<%U more>} if there are just unread articlesand no unselected ones.@item gShortish group name. For instance, @samp{rec.arts.anime} will beshortened to @samp{r.a.anime}.@item SSubject of the current article.@item uUser-defined spec (@pxref{User-Defined Specs}).@item sName of the current score file (@pxref{Scoring}).@item dNumber of dormant articles (@pxref{Unread Articles}).@item tNumber of ticked articles (@pxref{Unread Articles}).@item rNumber of articles that have been marked as read in this session.@item ENumber of articles expunged by the score files.@end table@node Summary Highlighting@subsection Summary Highlighting@table @code@item gnus-visual-mark-article-hook@vindex gnus-visual-mark-article-hookThis hook is run after selecting an article. It is meant to be used forhighlighting the article in some way. It is not run if@code{gnus-visual} is @code{nil}.@item gnus-summary-update-hook@vindex gnus-summary-update-hookThis hook is called when a summary line is changed. It is not run if@code{gnus-visual} is @code{nil}.@item gnus-summary-selected-face@vindex gnus-summary-selected-faceThis is the face (or @dfn{font} as some people call it) used tohighlight the current article in the summary buffer.@item gnus-summary-highlight@vindex gnus-summary-highlightSummary lines are highlighted according to this variable, which is alist where the elements are of the format @code{(@var{form}. @var{face})}. If you would, for instance, like ticked articles to beitalic and high-scored articles to be bold, you could set this variableto something like@lisp(((eq mark gnus-ticked-mark) . italic) ((> score default) . bold))@end lispAs you may have guessed, if @var{form} returns a non-@code{nil} value,@var{face} will be applied to the line.@end table@node Summary Maneuvering@section Summary Maneuvering@cindex summary movementAll the straight movement commands understand the numeric prefix andbehave pretty much as you'd expect.None of these commands select articles.@table @kbd@item G M-n@itemx M-n@kindex M-n @r{(Summary)}@kindex G M-n @r{(Summary)}@findex gnus-summary-next-unread-subjectGo to the next summary line of an unread article(@code{gnus-summary-next-unread-subject}).@item G M-p@itemx M-p@kindex M-p @r{(Summary)}@kindex G M-p @r{(Summary)}@findex gnus-summary-prev-unread-subjectGo to the previous summary line of an unread article(@code{gnus-summary-prev-unread-subject}).@item G g@kindex G g @r{(Summary)}@findex gnus-summary-goto-subjectAsk for an article number and then go to the summary line of that articlewithout displaying the article (@code{gnus-summary-goto-subject}).@end tableIf Gnus asks you to press a key to confirm going to the next group, youcan use the @kbd{C-n} and @kbd{C-p} keys to move around the groupbuffer, searching for the next group to read without actually returningto the group buffer.Variables related to summary movement:@table @code@vindex gnus-auto-select-next@item gnus-auto-select-nextIf you issue one of the movement commands (like @kbd{n}) and there areno more unread articles after the current one, Gnus will offer to go tothe next group. If this variable is @code{t} and the next group isempty, Gnus will exit summary mode and return to the group buffer. Ifthis variable is neither @code{t} nor @code{nil}, Gnus will select thenext group, no matter whether it has any unread articles or not. As aspecial case, if this variable is @code{quietly}, Gnus will select thenext group without asking for confirmation. If this variable is@code{almost-quietly}, the same will happen only if you are located onthe last article in the group. Finally, if this variable is@code{slightly-quietly}, the @kbd{Z n} command will go to the next groupwithout confirmation. Also @pxref{Group Levels}.@item gnus-auto-select-same@vindex gnus-auto-select-sameIf non-@code{nil}, all the movement commands will try to go to the nextarticle with the same subject as the current. (@dfn{Same} here mightmean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}for details (@pxref{Customizing Threading}).) If there are no morearticles with the same subject, go to the first unread article.This variable is not particularly useful if you use a threaded display.@item gnus-summary-check-current@vindex gnus-summary-check-currentIf non-@code{nil}, all the ``unread'' movement commands will not proceedto the next (or previous) article if the current article is unread.Instead, they will choose the current article.@item gnus-auto-center-summary@vindex gnus-auto-center-summaryIf non-@code{nil}, Gnus will keep the point in the summary buffercentered at all times. This makes things quite tidy, but if you have aslow network connection, or simply do not like this un-Emacsism, you canset this variable to @code{nil} to get the normal Emacs scrollingaction. This will also inhibit horizontal re-centering of the summarybuffer, which might make it more inconvenient to read extremely longthreads.This variable can also be a number. In that case, center the window atthe given number of lines from the top.@end table@node Choosing Articles@section Choosing Articles@cindex selecting articles@menu* Choosing Commands:: Commands for choosing articles.* Choosing Variables:: Variables that influence these commands.@end menu@node Choosing Commands@subsection Choosing CommandsNone of the following movement commands understand the numeric prefix,and they all select and display an article.If you want to fetch new articles or redisplay the group, see@ref{Exiting the Summary Buffer}.@table @kbd@item @key{SPC}@kindex @key{SPC} @r{(Summary)}@findex gnus-summary-next-pageSelect the current article, or, if that one's read already, the nextunread article (@code{gnus-summary-next-page}).@item G n@itemx n@kindex n @r{(Summary)}@kindex G n @r{(Summary)}@findex gnus-summary-next-unread-article@c @icon{gnus-summary-next-unread}Go to next unread article (@code{gnus-summary-next-unread-article}).@item G p@itemx p@kindex p @r{(Summary)}@findex gnus-summary-prev-unread-article@c @icon{gnus-summary-prev-unread}Go to previous unread article (@code{gnus-summary-prev-unread-article}).@item G N@itemx N@kindex N @r{(Summary)}@kindex G N @r{(Summary)}@findex gnus-summary-next-articleGo to the next article (@code{gnus-summary-next-article}).@item G P@itemx P@kindex P @r{(Summary)}@kindex G P @r{(Summary)}@findex gnus-summary-prev-articleGo to the previous article (@code{gnus-summary-prev-article}).@item G C-n@kindex G C-n @r{(Summary)}@findex gnus-summary-next-same-subjectGo to the next article with the same subject(@code{gnus-summary-next-same-subject}).@item G C-p@kindex G C-p @r{(Summary)}@findex gnus-summary-prev-same-subjectGo to the previous article with the same subject(@code{gnus-summary-prev-same-subject}).@item G f@itemx .@kindex G f @r{(Summary)}@kindex . @r{(Summary)}@findex gnus-summary-first-unread-articleGo to the first unread article(@code{gnus-summary-first-unread-article}).@item G b@itemx ,@kindex G b @r{(Summary)}@kindex , @r{(Summary)}@findex gnus-summary-best-unread-articleGo to the article with the highest score(@code{gnus-summary-best-unread-article}).@item G l@itemx l@kindex l @r{(Summary)}@kindex G l @r{(Summary)}@findex gnus-summary-goto-last-articleGo to the previous article read (@code{gnus-summary-goto-last-article}).@item G o@kindex G o @r{(Summary)}@findex gnus-summary-pop-article@cindex history@cindex article historyPop an article off the summary history and go to this article(@code{gnus-summary-pop-article}). This command differs from thecommand above in that you can pop as many previous articles off thehistory as you like, while @kbd{l} toggles the two last read articles.For a somewhat related issue (if you use these commands a lot),@pxref{Article Backlog}.@item G j@itemx j@kindex j @r{(Summary)}@kindex G j @r{(Summary)}@findex gnus-summary-goto-articleAsk for an article number or @code{Message-ID}, and then go to thatarticle (@code{gnus-summary-goto-article}).@end table@node Choosing Variables@subsection Choosing VariablesSome variables relevant for moving and selecting articles:@table @code@item gnus-auto-extend-newsgroup@vindex gnus-auto-extend-newsgroupAll the movement commands will try to go to the previous (or next)article, even if that article isn't displayed in the Summary buffer ifthis variable is non-@code{nil}. Gnus will then fetch the article fromthe server and display it in the article buffer.@item gnus-select-article-hook@vindex gnus-select-article-hookThis hook is called whenever an article is selected. By default itexposes any threads hidden under the selected article.@item gnus-mark-article-hook@vindex gnus-mark-article-hook@findex gnus-summary-mark-unread-as-read@findex gnus-summary-mark-read-and-unread-as-read@findex gnus-unread-markThis hook is called whenever an article is selected. It is intended tobe used for marking articles as read. The default value is@code{gnus-summary-mark-read-and-unread-as-read}, and will change themark of almost any article you read to @code{gnus-unread-mark}. Theonly articles not affected by this function are ticked, dormant, andexpirable articles. If you'd instead like to just have unread articlesmarked as read, you can use @code{gnus-summary-mark-unread-as-read}instead. It will leave marks like @code{gnus-low-score-mark},@code{gnus-del-mark} (and so on) alone.@end table@node Paging the Article@section Scrolling the Article@cindex article scrolling@table @kbd@item @key{SPC}@kindex @key{SPC} @r{(Summary)}@findex gnus-summary-next-pagePressing @key{SPC} will scroll the current article forward one page,or, if you have come to the end of the current article, will choose thenext article (@code{gnus-summary-next-page}).@item @key{DEL}@kindex @key{DEL} @r{(Summary)}@findex gnus-summary-prev-pageScroll the current article back one page (@code{gnus-summary-prev-page}).@item @key{RET}@kindex @key{RET} @r{(Summary)}@findex gnus-summary-scroll-upScroll the current article one line forward(@code{gnus-summary-scroll-up}).@item M-@key{RET}@kindex M-@key{RET} @r{(Summary)}@findex gnus-summary-scroll-downScroll the current article one line backward(@code{gnus-summary-scroll-down}).@item A g@itemx g@kindex A g @r{(Summary)}@kindex g @r{(Summary)}@findex gnus-summary-show-article@vindex gnus-summary-show-article-charset-alist(Re)fetch the current article (@code{gnus-summary-show-article}). Ifgiven a prefix, fetch the current article, but don't run any of thearticle treatment functions. This will give you a ``raw'' article, justthe way it came from the server.If given a numerical prefix, you can do semi-manual charset stuff.@kbd{C-u 0 g cn-gb-2312 @key{RET}} will decode the message as if it wereencoded in the @code{cn-gb-2312} charset. If you have@lisp(setq gnus-summary-show-article-charset-alist '((1 . cn-gb-2312) (2 . big5)))@end lispthen you can say @kbd{C-u 1 g} to get the same effect.@item A <@itemx <@kindex < @r{(Summary)}@kindex A < @r{(Summary)}@findex gnus-summary-beginning-of-articleScroll to the beginning of the article(@code{gnus-summary-beginning-of-article}).@item A >@itemx >@kindex > @r{(Summary)}@kindex A > @r{(Summary)}@findex gnus-summary-end-of-articleScroll to the end of the article (@code{gnus-summary-end-of-article}).@item A s@itemx s@kindex A s @r{(Summary)}@kindex s @r{(Summary)}@findex gnus-summary-isearch-articlePerform an isearch in the article buffer(@code{gnus-summary-isearch-article}).@item h@kindex h @r{(Summary)}@findex gnus-summary-select-article-bufferSelect the article buffer (@code{gnus-summary-select-article-buffer}).@end table@node Reply Followup and Post@section Reply, Followup and Post@menu* Summary Mail Commands:: Sending mail.* Summary Post Commands:: Sending news.* Summary Message Commands:: Other Message-related commands.* Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''@end menu@node Summary Mail Commands@subsection Summary Mail Commands@cindex mail@cindex composing mailCommands for composing a mail message:@table @kbd@item S r@itemx r@kindex S r @r{(Summary)}@kindex r @r{(Summary)}@findex gnus-summary-reply@c @icon{gnus-summary-mail-reply}@c @icon{gnus-summary-reply}Mail a reply to the author of the current article(@code{gnus-summary-reply}).@item S R@itemx R@kindex R @r{(Summary)}@kindex S R @r{(Summary)}@findex gnus-summary-reply-with-original@c @icon{gnus-summary-reply-with-original}Mail a reply to the author of the current article and include theoriginal message (@code{gnus-summary-reply-with-original}). Thiscommand uses the process/prefix convention.@item S w@kindex S w @r{(Summary)}@findex gnus-summary-wide-replyMail a wide reply to the author of the current article(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply thatgoes out to all people listed in the @code{To}, @code{From} (or@code{Reply-to}) and @code{Cc} headers.@item S W@kindex S W @r{(Summary)}@findex gnus-summary-wide-reply-with-originalMail a wide reply to the current article and include the originalmessage (@code{gnus-summary-wide-reply-with-original}). This command usesthe process/prefix convention.@item S o m@itemx C-c C-f@kindex S o m @r{(Summary)}@kindex C-c C-f @r{(Summary)}@findex gnus-summary-mail-forward@c @icon{gnus-summary-mail-forward}Forward the current article to some other person(@code{gnus-summary-mail-forward}). If no prefix is given, the messageis forwarded according to the value of (@code{message-forward-as-mime})and (@code{message-forward-show-mml}); if the prefix is 1, decode themessage and forward directly inline; if the prefix is 2, forward messageas an rfc822 MIME section; if the prefix is 3, decode message andforward as an rfc822 MIME section; if the prefix is 4, forward messagedirectly inline; otherwise, the message is forwarded as no prefix givenbut use the flipped value of (@code{message-forward-as-mime}). Bydefault, the message is decoded and forwarded as an rfc822 MIME section.@item S m@itemx m@kindex m @r{(Summary)}@kindex S m @r{(Summary)}@findex gnus-summary-mail-other-window@c @icon{gnus-summary-mail-originate}Send a mail to some other person(@code{gnus-summary-mail-other-window}).@item S D b@kindex S D b @r{(Summary)}@findex gnus-summary-resend-bounced-mail@cindex bouncing mailIf you have sent a mail, but the mail was bounced back to you for somereason (wrong address, transient failure), you can use this command toresend that bounced mail (@code{gnus-summary-resend-bounced-mail}). Youwill be popped into a mail buffer where you can edit the headers beforesending the mail off again. If you give a prefix to this command, andthe bounced mail is a reply to some other mail, Gnus will try to fetchthat mail and display it for easy perusal of its headers. This mightvery well fail, though.@item S D r@kindex S D r @r{(Summary)}@findex gnus-summary-resend-messageNot to be confused with the previous command,@code{gnus-summary-resend-message} will prompt you for an address tosend the current message off to, and then send it to that place. Theheaders of the message won't be altered---but lots of headers that say@code{Resent-To}, @code{Resent-From} and so on will be added. Thismeans that you actually send a mail to someone that has a @code{To}header that (probably) points to yourself. This will confuse people.So, natcherly you'll only do that if you're really eVIl.This command is mainly used if you have several accounts and want toship a mail to a different account of yours. (If you're both@code{root} and @code{postmaster} and get a mail for @code{postmaster}to the @code{root} account, you may want to resend it to@code{postmaster}. Ordnung mu� sein!This command understands the process/prefix convention(@pxref{Process/Prefix}).@item S O m@kindex S O m @r{(Summary)}@findex gnus-uu-digest-mail-forwardDigest the current series (@pxref{Decoding Articles}) and forward theresult using mail (@code{gnus-uu-digest-mail-forward}). This commanduses the process/prefix convention (@pxref{Process/Prefix}).@item S M-c@kindex S M-c @r{(Summary)}@findex gnus-summary-mail-crosspost-complaint@cindex crossposting@cindex excessive crosspostingSend a complaint about excessive crossposting to the author of thecurrent article (@code{gnus-summary-mail-crosspost-complaint}).@findex gnus-crosspost-complaintThis command is provided as a way to fight back against the currentcrossposting pandemic that's sweeping Usenet. It will compose a replyusing the @code{gnus-crosspost-complaint} variable as a preamble. Thiscommand understands the process/prefix convention(@pxref{Process/Prefix}) and will prompt you before sending each mail.@end tableAlso @pxref{(message)Header Commands} for more information.@node Summary Post Commands@subsection Summary Post Commands@cindex post@cindex composing newsCommands for posting a news article:@table @kbd@item S p@itemx a@kindex a @r{(Summary)}@kindex S p @r{(Summary)}@findex gnus-summary-post-news@c @icon{gnus-summary-post-news}Post an article to the current group(@code{gnus-summary-post-news}).@item S f@itemx f@kindex f @r{(Summary)}@kindex S f @r{(Summary)}@findex gnus-summary-followup@c @icon{gnus-summary-followup}Post a followup to the current article (@code{gnus-summary-followup}).@item S F@itemx F@kindex S F @r{(Summary)}@kindex F @r{(Summary)}@c @icon{gnus-summary-followup-with-original}@findex gnus-summary-followup-with-originalPost a followup to the current article and include the original message(@code{gnus-summary-followup-with-original}). This command uses theprocess/prefix convention.@item S n@kindex S n @r{(Summary)}@findex gnus-summary-followup-to-mailPost a followup to the current article via news, even if you got themessage through mail (@code{gnus-summary-followup-to-mail}).@item S N@kindex S N @r{(Summary)}@findex gnus-summary-followup-to-mail-with-originalPost a followup to the current article via news, even if you got themessage through mail and include the original message(@code{gnus-summary-followup-to-mail-with-original}). This command usesthe process/prefix convention.@item S o p@kindex S o p @r{(Summary)}@findex gnus-summary-post-forwardForward the current article to a newsgroup(@code{gnus-summary-post-forward}). If no prefix is given, the message is forwarded according to the valueof (@code{message-forward-as-mime}) and(@code{message-forward-show-mml}); if the prefix is 1, decode themessage and forward directly inline; if the prefix is 2, forward messageas an rfc822 MIME section; if the prefix is 3, decode message andforward as an rfc822 MIME section; if the prefix is 4, forward messagedirectly inline; otherwise, the message is forwarded as no prefix givenbut use the flipped value of (@code{message-forward-as-mime}). Bydefault, the message is decoded and forwarded as an rfc822 MIME section.@item S O p@kindex S O p @r{(Summary)}@findex gnus-uu-digest-post-forward@cindex digests@cindex making digestsDigest the current series and forward the result to a newsgroup(@code{gnus-uu-digest-mail-forward}). This command uses theprocess/prefix convention.@item S u@kindex S u @r{(Summary)}@findex gnus-uu-post-news@c @icon{gnus-uu-post-news}Uuencode a file, split it into parts, and post it as a series(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).@end tableAlso @pxref{(message)Header Commands} for more information.@node Summary Message Commands@subsection Summary Message Commands@table @kbd@item S y@kindex S y @r{(Summary)}@findex gnus-summary-yank-messageYank the current article into an already existing Message compositionbuffer (@code{gnus-summary-yank-message}). This command prompts forwhat message buffer you want to yank into, and understands theprocess/prefix convention (@pxref{Process/Prefix}).@end table@node Canceling and Superseding@subsection Canceling Articles@cindex canceling articles@cindex superseding articlesHave you ever written something, and then decided that you really,really, really wish you hadn't posted that?Well, you can't cancel mail, but you can cancel posts.@findex gnus-summary-cancel-article@kindex C @r{(Summary)}@c @icon{gnus-summary-cancel-article}Find the article you wish to cancel (you can only cancel your ownarticles, so don't try any funny stuff). Then press @kbd{C} or @kbd{Sc} (@code{gnus-summary-cancel-article}). Your article will becanceled---machines all over the world will be deleting your article.This command uses the process/prefix convention (@pxref{Process/Prefix}).Be aware, however, that not all sites honor cancels, so your article maylive on here and there, while most sites will delete the article inquestion.Gnus will use the ``current'' select method when canceling. If youwant to use the standard posting method, use the @samp{a} symbolicprefix (@pxref{Symbolic Prefixes}).If you discover that you have made some mistakes and want to do somecorrections, you can post a @dfn{superseding} article that will replaceyour original article.@findex gnus-summary-supersede-article@kindex S @r{(Summary)}Go to the original article and press @kbd{S s}(@code{gnus-summary-supersede-article}). You will be put in a bufferwhere you can edit the article all you want before sending it off theusual way.The same goes for superseding as for canceling, only more so: Somesites do not honor superseding. On those sites, it will appear that youhave posted almost the same article twice.If you have just posted the article, and change your mind right away,there is a trick you can use to cancel/supersede the article withoutwaiting for the article to appear on your site first. You simply returnto the post buffer (which is called @code{*sent ...*}). There you willfind the article you just posted, with all the headers intact. Changethe @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}header by substituting one of those words for the word@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article asyou would do normally. The previous article will becanceled/superseded.Just remember, kids: There is no 'c' in 'supersede'.@node Marking Articles@section Marking Articles@cindex article marking@cindex article ticking@cindex marksThere are several marks you can set on an article.You have marks that decide the @dfn{readedness} (whoo, neato-keanoneologism ohoy!) of the article. Alphabetic marks generally mean@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.In addition, you also have marks that do not affect readedness.@menu* Unread Articles:: Marks for unread articles.* Read Articles:: Marks for read articles.* Other Marks:: Marks that do not affect readedness.@end menu@ifinfoThere's a plethora of commands for manipulating these marks:@end ifinfo@menu* Setting Marks:: How to set and remove marks.* Generic Marking Commands:: How to customize the marking.* Setting Process Marks:: How to mark articles for later processing.@end menu@node Unread Articles@subsection Unread ArticlesThe following marks mark articles as (kinda) unread, in one form orother.@table @samp@item !@vindex gnus-ticked-markMarked as ticked (@code{gnus-ticked-mark}).@dfn{Ticked articles} are articles that will remain visible always. Ifyou see an article that you find interesting, or you want to put offreading it, or replying to it, until sometime later, you'd typicallytick it. However, articles can be expired, so if you want to keep anarticle forever, you'll have to make it persistent (@pxref{PersistentArticles}).@item ?@vindex gnus-dormant-markMarked as dormant (@code{gnus-dormant-mark}).@dfn{Dormant articles} will only appear in the summary buffer if thereare followups to it. If you want to see them even if they don't havefollowups, you can use the @kbd{/ D} command (@pxref{Limiting}).@item @key{SPC}@vindex gnus-unread-markMarked as unread (@code{gnus-unread-mark}).@dfn{Unread articles} are articles that haven't been read at all yet.@end table@node Read Articles@subsection Read Articles@cindex expirable markAll the following marks mark articles as read.@table @samp@item r@vindex gnus-del-markThese are articles that the user has marked as read with the @kbd{d}command manually, more or less (@code{gnus-del-mark}).@item R@vindex gnus-read-markArticles that have actually been read (@code{gnus-read-mark}).@item O@vindex gnus-ancient-markArticles that were marked as read in previous sessions and are now@dfn{old} (@code{gnus-ancient-mark}).@item K@vindex gnus-killed-markMarked as killed (@code{gnus-killed-mark}).@item X@vindex gnus-kill-file-markMarked as killed by kill files (@code{gnus-kill-file-mark}).@item Y@vindex gnus-low-score-markMarked as read by having too low a score (@code{gnus-low-score-mark}).@item C@vindex gnus-catchup-markMarked as read by a catchup (@code{gnus-catchup-mark}).@item G@vindex gnus-canceled-markCanceled article (@code{gnus-canceled-mark})@item F@vindex gnus-souped-mark@sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}.@item Q@vindex gnus-sparse-markSparsely reffed article (@code{gnus-sparse-mark}). @xref{CustomizingThreading}.@item M@vindex gnus-duplicate-markArticle marked as read by duplicate suppression(@code{gnus-duplicated-mark}). @xref{Duplicate Suppression}.@end tableAll these marks just mean that the article is marked as read, really.They are interpreted differently when doing adaptive scoring, though.One more special mark, though:@table @samp@item E@vindex gnus-expirable-markMarked as expirable (@code{gnus-expirable-mark}).Marking articles as @dfn{expirable} (or have them marked as suchautomatically) doesn't make much sense in normal groups---a user doesn'tcontrol expiring of news articles, but in mail groups, for instance,articles marked as @dfn{expirable} can be deleted by Gnus atany time.@end table@node Other Marks@subsection Other Marks@cindex process mark@cindex bookmarksThere are some marks that have nothing to do with whether the article isread or not.@itemize @bullet@itemYou can set a bookmark in the current article. Say you are reading along thesis on cats' urinary tracts, and have to go home for dinnerbefore you've finished reading the thesis. You can then set a bookmarkin the article, and Gnus will jump to this bookmark the next time itencounters the article. @xref{Setting Marks}.@item@vindex gnus-replied-markAll articles that you have replied to or made a followup to (i.e., haveanswered) will be marked with an @samp{A} in the second column(@code{gnus-replied-mark}).@item@vindex gnus-cached-markArticles stored in the article cache will be marked with an @samp{*} inthe second column (@code{gnus-cached-mark}). @xref{Article Caching}.@item@vindex gnus-saved-markArticles ``saved'' (in some manner or other; not necessarilyreligiously) are marked with an @samp{S} in the second column(@code{gnus-saved-mark}).@item@vindex gnus-not-empty-thread-mark@vindex gnus-empty-thread-markIf the @samp{%e} spec is used, the presence of threads or not will bemarked with @code{gnus-not-empty-thread-mark} and@code{gnus-empty-thread-mark} in the third column, respectively.@item@vindex gnus-process-markFinally we have the @dfn{process mark} (@code{gnus-process-mark}). Avariety of commands react to the presence of the process mark. Forinstance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and viewall articles that have been marked with the process mark. Articlesmarked with the process mark have a @samp{#} in the second column.@end itemizeYou might have noticed that most of these ``non-readedness'' marksappear in the second column by default. So if you have a cached, saved,replied article that you have process-marked, what will that look like?Nothing much. The precedence rules go as follows: process -> cache ->replied -> saved. So if the article is in the cache and is replied,you'll only see the cache mark and not the replied mark.@node Setting Marks@subsection Setting Marks@cindex setting marksAll the marking commands understand the numeric prefix.@table @kbd@item M c@itemx M-u@kindex M c @r{(Summary)}@kindex M-u @r{(Summary)}@findex gnus-summary-clear-mark-forward@cindex mark as unreadClear all readedness-marks from the current article(@code{gnus-summary-clear-mark-forward}). In other words, mark thearticle as unread.@item M t@itemx !@kindex ! @r{(Summary)}@kindex M t @r{(Summary)}@findex gnus-summary-tick-article-forwardTick the current article (@code{gnus-summary-tick-article-forward}).@xref{Article Caching}.@item M ?@itemx ?@kindex ? @r{(Summary)}@kindex M ? @r{(Summary)}@findex gnus-summary-mark-as-dormantMark the current article as dormant(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.@item M d@itemx d@kindex M d @r{(Summary)}@kindex d @r{(Summary)}@findex gnus-summary-mark-as-read-forwardMark the current article as read(@code{gnus-summary-mark-as-read-forward}).@item D@kindex D @r{(Summary)}@findex gnus-summary-mark-as-read-backwardMark the current article as read and move point to the previous line(@code{gnus-summary-mark-as-read-backward}).@item M k@itemx k@kindex k @r{(Summary)}@kindex M k @r{(Summary)}@findex gnus-summary-kill-same-subject-and-selectMark all articles that have the same subject as the current one as read,and then select the next unread article(@code{gnus-summary-kill-same-subject-and-select}).@item M K@itemx C-k@kindex M K @r{(Summary)}@kindex C-k @r{(Summary)}@findex gnus-summary-kill-same-subjectMark all articles that have the same subject as the current one as read(@code{gnus-summary-kill-same-subject}).@item M C@kindex M C @r{(Summary)}@findex gnus-summary-catchup@c @icon{gnus-summary-catchup}Mark all unread articles as read (@code{gnus-summary-catchup}).@item M C-c@kindex M C-c @r{(Summary)}@findex gnus-summary-catchup-allMark all articles in the group as read---even the ticked and dormantarticles (@code{gnus-summary-catchup-all}).@item M H@kindex M H @r{(Summary)}@findex gnus-summary-catchup-to-hereCatchup the current group to point(@code{gnus-summary-catchup-to-here}).@item C-w@kindex C-w @r{(Summary)}@findex gnus-summary-mark-region-as-readMark all articles between point and mark as read(@code{gnus-summary-mark-region-as-read}).@item M V k@kindex M V k @r{(Summary)}@findex gnus-summary-kill-belowKill all articles with scores below the default score (or below thenumeric prefix) (@code{gnus-summary-kill-below}).@item M e@itemx E@kindex M e @r{(Summary)}@kindex E @r{(Summary)}@findex gnus-summary-mark-as-expirableMark the current article as expirable(@code{gnus-summary-mark-as-expirable}).@item M b@kindex M b @r{(Summary)}@findex gnus-summary-set-bookmarkSet a bookmark in the current article(@code{gnus-summary-set-bookmark}).@item M B@kindex M B @r{(Summary)}@findex gnus-summary-remove-bookmarkRemove the bookmark from the current article(@code{gnus-summary-remove-bookmark}).@item M V c@kindex M V c @r{(Summary)}@findex gnus-summary-clear-aboveClear all marks from articles with scores over the default score (orover the numeric prefix) (@code{gnus-summary-clear-above}).@item M V u@kindex M V u @r{(Summary)}@findex gnus-summary-tick-aboveTick all articles with scores over the default score (or over thenumeric prefix) (@code{gnus-summary-tick-above}).@item M V m@kindex M V m @r{(Summary)}@findex gnus-summary-mark-abovePrompt for a mark, and mark all articles with scores over the defaultscore (or over the numeric prefix) with this mark(@code{gnus-summary-clear-above}).@end table@vindex gnus-summary-goto-unreadThe @code{gnus-summary-goto-unread} variable controls what action shouldbe taken after setting a mark. If non-@code{nil}, point will move tothe next/previous unread article. If @code{nil}, point will just moveone line up or down. As a special case, if this variable is@code{never}, all the marking commands as well as other commands (like@key{SPC}) will move to the next article, whether it is unread or not.The default is @code{t}.@node Generic Marking Commands@subsection Generic Marking CommandsSome people would like the command that ticks an article (@kbd{!}) go tothe next article. Others would like it to go to the next unreadarticle. Yet others would like it to stay on the current article. Andeven though I haven't heard of anybody wanting it to go to theprevious (unread) article, I'm sure there are people that want that aswell.Multiply these five behaviors by five different marking commands, andyou get a potentially complex set of variable to control what eachcommand should do.To sidestep that mess, Gnus provides commands that do all thesedifferent things. They can be found on the @kbd{M M} map in the summarybuffer. Type @kbd{M M C-h} to see them all---there are too many of themto list in this manual.While you can use these commands directly, most users would preferaltering the summary mode keymap. For instance, if you would like the@kbd{!} command to go to the next article instead of the next unreadarticle, you could say something like:@lisp(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)(defun my-alter-summary-map () (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))@end lispor@lisp(defun my-alter-summary-map () (local-set-key "!" "MM!n"))@end lisp@node Setting Process Marks@subsection Setting Process Marks@cindex setting process marks@table @kbd@item M P p@itemx #@kindex # @r{(Summary)}@kindex M P p @r{(Summary)}@findex gnus-summary-mark-as-processableMark the current article with the process mark(@code{gnus-summary-mark-as-processable}).@findex gnus-summary-unmark-as-processable@item M P u@itemx M-#@kindex M P u @r{(Summary)}@kindex M-# @r{(Summary)}Remove the process mark, if any, from the current article(@code{gnus-summary-unmark-as-processable}).@item M P U@kindex M P U @r{(Summary)}@findex gnus-summary-unmark-all-processableRemove the process mark from all articles(@code{gnus-summary-unmark-all-processable}).@item M P i@kindex M P i @r{(Summary)}@findex gnus-uu-invert-processableInvert the list of process marked articles(@code{gnus-uu-invert-processable}).@item M P R@kindex M P R @r{(Summary)}@findex gnus-uu-mark-by-regexpMark articles that have a @code{Subject} header that matches a regularexpression (@code{gnus-uu-mark-by-regexp}).@item M P G@kindex M P G @r{(Summary)}@findex gnus-uu-unmark-by-regexpUnmark articles that have a @code{Subject} header that matches a regularexpression (@code{gnus-uu-unmark-by-regexp}).@item M P r@kindex M P r @r{(Summary)}@findex gnus-uu-mark-regionMark articles in region (@code{gnus-uu-mark-region}).@item M P t@kindex M P t @r{(Summary)}@findex gnus-uu-mark-threadMark all articles in the current (sub)thread(@code{gnus-uu-mark-thread}).@item M P T@kindex M P T @r{(Summary)}@findex gnus-uu-unmark-threadUnmark all articles in the current (sub)thread(@code{gnus-uu-unmark-thread}).@item M P v@kindex M P v @r{(Summary)}@findex gnus-uu-mark-overMark all articles that have a score above the prefix argument(@code{gnus-uu-mark-over}).@item M P s@kindex M P s @r{(Summary)}@findex gnus-uu-mark-seriesMark all articles in the current series (@code{gnus-uu-mark-series}).@item M P S@kindex M P S @r{(Summary)}@findex gnus-uu-mark-sparseMark all series that have already had some articles marked(@code{gnus-uu-mark-sparse}).@item M P a@kindex M P a @r{(Summary)}@findex gnus-uu-mark-allMark all articles in series order (@code{gnus-uu-mark-series}).@item M P b@kindex M P b @r{(Summary)}@findex gnus-uu-mark-bufferMark all articles in the buffer in the order they appear(@code{gnus-uu-mark-buffer}).@item M P k@kindex M P k @r{(Summary)}@findex gnus-summary-kill-process-markPush the current process mark set onto the stack and unmark all articles(@code{gnus-summary-kill-process-mark}).@item M P y@kindex M P y @r{(Summary)}@findex gnus-summary-yank-process-markPop the previous process mark set from the stack and restore it(@code{gnus-summary-yank-process-mark}).@item M P w@kindex M P w @r{(Summary)}@findex gnus-summary-save-process-markPush the current process mark set onto the stack(@code{gnus-summary-save-process-mark}).@end tableAlso see the @kbd{&} command in @pxref{Searching for Articles} for how toset process marks based on article body contents.@node Limiting@section Limiting@cindex limitingIt can be convenient to limit the summary buffer to just show somesubset of the articles currently in the group. The effect most limitcommands have is to remove a few (or many) articles from the summarybuffer.All limiting commands work on subsets of the articles already fetchedfrom the servers. None of these commands query the server foradditional articles.@table @kbd@item / /@itemx / s@kindex / / @r{(Summary)}@findex gnus-summary-limit-to-subjectLimit the summary buffer to articles that match some subject(@code{gnus-summary-limit-to-subject}).@item / a@kindex / a @r{(Summary)}@findex gnus-summary-limit-to-authorLimit the summary buffer to articles that match some author(@code{gnus-summary-limit-to-author}).@item / x@kindex / x @r{(Summary)}@findex gnus-summary-limit-to-extraLimit the summary buffer to articles that match one of the ``extra''headers (@pxref{To From Newsgroups})(@code{gnus-summary-limit-to-extra}).@item / u@itemx x@kindex / u @r{(Summary)}@kindex x @r{(Summary)}@findex gnus-summary-limit-to-unreadLimit the summary buffer to articles not marked as read(@code{gnus-summary-limit-to-unread}). If given a prefix, limit thebuffer to articles strictly unread. This means that ticked anddormant articles will also be excluded.@item / m@kindex / m @r{(Summary)}@findex gnus-summary-limit-to-marksAsk for a mark and then limit to all articles that have been markedwith that mark (@code{gnus-summary-limit-to-marks}).@item / t@kindex / t @r{(Summary)}@findex gnus-summary-limit-to-ageAsk for a number and then limit the summary buffer to articles older than (or equal to) that number of days(@code{gnus-summary-limit-to-age}). If given a prefix, limit toarticles younger than that number of days.@item / n@kindex / n @r{(Summary)}@findex gnus-summary-limit-to-articlesLimit the summary buffer to the current article(@code{gnus-summary-limit-to-articles}). Uses the process/prefixconvention (@pxref{Process/Prefix}).@item / w@kindex / w @r{(Summary)}@findex gnus-summary-pop-limitPop the previous limit off the stack and restore it(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits offthe stack.@item / v@kindex / v @r{(Summary)}@findex gnus-summary-limit-to-scoreLimit the summary buffer to articles that have a score at or above somescore (@code{gnus-summary-limit-to-score}).@item / E@itemx M S@kindex M S @r{(Summary)}@kindex / E @r{(Summary)}@findex gnus-summary-limit-include-expungedInclude all expunged articles in the limit(@code{gnus-summary-limit-include-expunged}).@item / D@kindex / D @r{(Summary)}@findex gnus-summary-limit-include-dormantInclude all dormant articles in the limit(@code{gnus-summary-limit-include-dormant}).@item / *@kindex / * @r{(Summary)}@findex gnus-summary-limit-include-cachedInclude all cached articles in the limit(@code{gnus-summary-limit-include-cached}).@item / d@kindex / d @r{(Summary)}@findex gnus-summary-limit-exclude-dormantExclude all dormant articles from the limit(@code{gnus-summary-limit-exclude-dormant}).@item / M@kindex / M @r{(Summary)}@findex gnus-summary-limit-exclude-marksExclude all marked articles (@code{gnus-summary-limit-exclude-marks}).@item / T@kindex / T @r{(Summary)}@findex gnus-summary-limit-include-threadInclude all the articles in the current thread in the limit.@item / c@kindex / c @r{(Summary)}@findex gnus-summary-limit-exclude-childless-dormantExclude all dormant articles that have no children from the limit(@code{gnus-summary-limit-exclude-childless-dormant}).@item / C@kindex / C @r{(Summary)}@findex gnus-summary-limit-mark-excluded-as-readMark all excluded unread articles as read(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,also mark excluded ticked and dormant articles as read.@end table@node Threading@section Threading@cindex threading@cindex article threadingGnus threads articles by default. @dfn{To thread} is to put responsesto articles directly after the articles they respond to---in ahierarchical fashion.Threading is done by looking at the @code{References} headers of thearticles. In a perfect world, this would be enough to build prettytrees, but unfortunately, the @code{References} header is often brokenor simply missing. Weird news propagation exacerbates the problem,so one has to employ other heuristics to get pleasing results. Aplethora of approaches exists, as detailed in horrible detail in@pxref{Customizing Threading}.First, a quick overview of the concepts:@table @dfn@item rootThe top-most article in a thread; the first article in the thread.@item threadA tree-like article structure.@item sub-threadA small(er) section of this tree-like structure.@item loose threadsThreads often lose their roots due to article expiry, or due to the rootalready having been read in a previous session, and not displayed in thesummary buffer. We then typically have many sub-threads that reallybelong to one thread, but are without connecting roots. These arecalled loose threads.@item thread gatheringAn attempt to gather loose threads into bigger threads.@item sparse threadsA thread where the missing articles have been ``guessed'' at, and aredisplayed as empty lines in the summary buffer.@end table@menu* Customizing Threading:: Variables you can change to affect the threading.* Thread Commands:: Thread based commands in the summary buffer.@end menu@node Customizing Threading@subsection Customizing Threading@cindex customizing threading@menu* Loose Threads:: How Gnus gathers loose threads into bigger threads.* Filling In Threads:: Making the threads displayed look fuller.* More Threading:: Even more variables for fiddling with threads.* Low-Level Threading:: You thought it was over... but you were wrong!@end menu@node Loose Threads@subsubsection Loose Threads@cindex <@cindex >@cindex loose threads@table @code@item gnus-summary-make-false-root@vindex gnus-summary-make-false-rootIf non-@code{nil}, Gnus will gather all loose subtrees into one big treeand create a dummy root at the top. (Wait a minute. Root at the top?Yup.) Loose subtrees occur when the real root has expired, or you'veread or killed the root in a previous session.When there is no real root of a thread, Gnus will have to fudgesomething. This variable says what fudging method Gnus should use.There are four possible values:@iftex@iflatex\gnusfigure{The Summary Buffer}{390}{\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}}@end iflatex@end iftex@cindex adopting articles@table @code@item adoptGnus will make the first of the orphaned articles the parent. Thisparent will adopt all the other articles. The adopted articles will bemarked as such by pointy brackets (@samp{<>}) instead of the standardsquare brackets (@samp{[]}). This is the default method.@item dummy@vindex gnus-summary-dummy-line-formatGnus will create a dummy summary line that will pretend to be theparent. This dummy line does not correspond to any real article, soselecting it will just select the first real article after the dummyarticle. @code{gnus-summary-dummy-line-format} is used to specify theformat of the dummy roots. It accepts only one format spec: @samp{S},which is the subject of the article. @xref{Formatting Variables}.@item emptyGnus won't actually make any article the parent, but simply leave thesubject field of all orphans except the first empty. (Actually, it willuse @code{gnus-summary-same-subject} as the subject (@pxref{SummaryBuffer Format}).)@item noneDon't make any article parent at all. Just gather the threads anddisplay them after one another.@item nilDon't gather loose threads.@end table@item gnus-summary-gather-subject-limit@vindex gnus-summary-gather-subject-limitLoose threads are gathered by comparing subjects of articles. If thisvariable is @code{nil}, Gnus requires an exact match between thesubjects of the loose threads before gathering them into one bigsuper-thread. This might be too strict a requirement, what with thepresence of stupid newsreaders that chop off long subject lines. Ifyou think so, set this variable to, say, 20 to require that only thefirst 20 characters of the subjects have to match. If you set thisvariable to a really low number, you'll find that Gnus will gathereverything in sight into one thread, which isn't very helpful.@cindex fuzzy article gatheringIf you set this variable to the special value @code{fuzzy}, Gnus willuse a fuzzy string comparison algorithm on the subjects (@pxref{FuzzyMatching}).@item gnus-simplify-subject-fuzzy-regexp@vindex gnus-simplify-subject-fuzzy-regexpThis can either be a regular expression or list of regular expressionsthat match strings that will be removed from subjects if fuzzy subjectsimplification is used.@item gnus-simplify-ignored-prefixes@vindex gnus-simplify-ignored-prefixesIf you set @code{gnus-summary-gather-subject-limit} to something as lowas 10, you might consider setting this variable to something sensible:@c Written by Michael Ernst <mernst@cs.rice.edu>@lisp(setq gnus-simplify-ignored-prefixes (concat "\\`\\[?\\(" (mapconcat 'identity '("looking" "wanted" "followup" "summary\\( of\\)?" "help" "query" "problem" "question" "answer" "reference" "announce" "How can I" "How to" "Comparison of" ;; ... ) "\\|") "\\)\\s *\\(" (mapconcat 'identity '("for" "for reference" "with" "about") "\\|") "\\)?\\]?:?[ \t]*"))@end lispAll words that match this regexp will be removed before comparing twosubjects.@item gnus-simplify-subject-functions@vindex gnus-simplify-subject-functionsIf non-@code{nil}, this variable overrides@code{gnus-summary-gather-subject-limit}. This variable should be alist of functions to apply to the @code{Subject} string iteratively toarrive at the simplified version of the string.Useful functions to put in this list include:@table @code@item gnus-simplify-subject-re@findex gnus-simplify-subject-reStrip the leading @samp{Re:}.@item gnus-simplify-subject-fuzzy@findex gnus-simplify-subject-fuzzySimplify fuzzily.@item gnus-simplify-whitespace@findex gnus-simplify-whitespaceRemove excessive whitespace.@end tableYou may also write your own functions, of course.@item gnus-summary-gather-exclude-subject@vindex gnus-summary-gather-exclude-subjectSince loose thread gathering is done on subjects only, that might leadto many false hits, especially with certain common subjects like@samp{} and @samp{(none)}. To make the situation slightly better,you can use the regexp @code{gnus-summary-gather-exclude-subject} to saywhat subjects should be excluded from the gathering process.@*The default is @samp{^ *$\\|^(none)$}.@item gnus-summary-thread-gathering-function@vindex gnus-summary-thread-gathering-functionGnus gathers threads by looking at @code{Subject} headers. This meansthat totally unrelated articles may end up in the same ``thread'', whichis confusing. An alternate approach is to look at all the@code{Message-ID}s in all the @code{References} headers to find matches.This will ensure that no gathered threads ever include unrelatedarticles, but it also means that people who have posted with brokennewsreaders won't be gathered properly. The choice is yours---plague orcholera:@table @code@item gnus-gather-threads-by-subject@findex gnus-gather-threads-by-subjectThis function is the default gathering function and looks at@code{Subject}s exclusively.@item gnus-gather-threads-by-references@findex gnus-gather-threads-by-referencesThis function looks at @code{References} headers exclusively.@end tableIf you want to test gathering by @code{References}, you could saysomething like:@lisp(setq gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references)@end lisp@end table@node Filling In Threads@subsubsection Filling In Threads@table @code@item gnus-fetch-old-headers@vindex gnus-fetch-old-headersIf non-@code{nil}, Gnus will attempt to build old threads by fetchingmore old headers---headers to articles marked as read. If youwould like to display as few summary lines as possible, but stillconnect as many loose threads as possible, you should set this variableto @code{some} or a number. If you set it to a number, no more thanthat number of extra old headers will be fetched. In either case,fetching old headers only works if the back end you are using carriesoverview files---this would normally be @code{nntp}, @code{nnspool} and@code{nnml}. Also remember that if the root of the thread has beenexpired by the server, there's not much Gnus can do about that.This variable can also be set to @code{invisible}. This won't have anyvisible effects, but is useful if you use the @kbd{A T} command a lot(@pxref{Finding the Parent}).@item gnus-build-sparse-threads@vindex gnus-build-sparse-threadsFetching old headers can be slow. A low-rent similar effect can begotten by setting this variable to @code{some}. Gnus will then look atthe complete @code{References} headers of all articles and try to stringtogether articles that belong in the same thread. This will leave@dfn{gaps} in the threading display where Gnus guesses that an articleis missing from the thread. (These gaps appear like normal summarylines. If you select a gap, Gnus will try to fetch the article inquestion.) If this variable is @code{t}, Gnus will display all these``gaps'' without regard for whether they are useful for completing thethread or not. Finally, if this variable is @code{more}, Gnus won't cutoff sparse leaf nodes that don't lead anywhere. This variable is@code{nil} by default.@end table@node More Threading@subsubsection More Threading@table @code@item gnus-show-threads@vindex gnus-show-threadsIf this variable is @code{nil}, no threading will be done, and all ofthe rest of the variables here will have no effect. Turning threadingoff will speed group selection up a bit, but it is sure to make readingslower and more awkward.@item gnus-thread-hide-subtree@vindex gnus-thread-hide-subtreeIf non-@code{nil}, all threads will be hidden when the summary buffer isgenerated.@item gnus-thread-expunge-below@vindex gnus-thread-expunge-belowAll threads that have a total score (as defined by@code{gnus-thread-score-function}) less than this number will beexpunged. This variable is @code{nil} by default, which means that nothreads are expunged.@item gnus-thread-hide-killed@vindex gnus-thread-hide-killedif you kill a thread and this variable is non-@code{nil}, the subtreewill be hidden.@item gnus-thread-ignore-subject@vindex gnus-thread-ignore-subjectSometimes somebody changes the subject in the middle of a thread. Ifthis variable is non-@code{nil}, the subject change is ignored. If itis @code{nil}, which is the default, a change in the subject will resultin a new thread.@item gnus-thread-indent-level@vindex gnus-thread-indent-levelThis is a number that says how much each sub-thread should be indented.The default is 4.@item gnus-sort-gathered-threads-function@vindex gnus-sort-gathered-threads-functionSometimes, particularly with mailing lists, the order in which mailsarrive locally is not necessarily the same as the order in which theyarrived on the mailing list. Consequently, when sorting sub-threadsusing the default @code{gnus-thread-sort-by-number}, responses can endup appearing before the article to which they are responding to.Setting this variable to an alternate value(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in anappropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce amore logical sub-thread ordering in such instances.@end table@node Low-Level Threading@subsubsection Low-Level Threading@table @code@item gnus-parse-headers-hook@vindex gnus-parse-headers-hookHook run before parsing any headers.@item gnus-alter-header-function@vindex gnus-alter-header-functionIf non-@code{nil}, this function will be called to allow alteration ofarticle header structures. The function is called with one parameter,the article header vector, which it may alter in any way. For instance,if you have a mail-to-news gateway which alters the @code{Message-ID}sin systematic ways (by adding prefixes and such), you can use thisvariable to un-scramble the @code{Message-ID}s so that they are moremeaningful. Here's one example:@lisp(setq gnus-alter-header-function 'my-alter-message-id)(defun my-alter-message-id (header) (let ((id (mail-header-id header))) (when (string-match "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id) (mail-header-set-id (concat (match-string 1 id) "@@" (match-string 2 id)) header))))@end lisp@end table@node Thread Commands@subsection Thread Commands@cindex thread commands@table @kbd@item T k@itemx C-M-k@kindex T k @r{(Summary)}@kindex C-M-k @r{(Summary)}@findex gnus-summary-kill-threadMark all articles in the current (sub-)thread as read(@code{gnus-summary-kill-thread}). If the prefix argument is positive,remove all marks instead. If the prefix argument is negative, tickarticles instead.@item T l@itemx C-M-l@kindex T l @r{(Summary)}@kindex C-M-l @r{(Summary)}@findex gnus-summary-lower-threadLower the score of the current (sub-)thread(@code{gnus-summary-lower-thread}).@item T i@kindex T i @r{(Summary)}@findex gnus-summary-raise-threadIncrease the score of the current (sub-)thread(@code{gnus-summary-raise-thread}).@item T #@kindex T # @r{(Summary)}@findex gnus-uu-mark-threadSet the process mark on the current (sub-)thread(@code{gnus-uu-mark-thread}).@item T M-#@kindex T M-# @r{(Summary)}@findex gnus-uu-unmark-threadRemove the process mark from the current (sub-)thread(@code{gnus-uu-unmark-thread}).@item T T@kindex T T @r{(Summary)}@findex gnus-summary-toggle-threadsToggle threading (@code{gnus-summary-toggle-threads}).@item T s@kindex T s @r{(Summary)}@findex gnus-summary-show-threadExpose the (sub-)thread hidden under the current article, if any(@code{gnus-summary-show-thread}).@item T h@kindex T h @r{(Summary)}@findex gnus-summary-hide-threadHide the current (sub-)thread (@code{gnus-summary-hide-thread}).@item T S@kindex T S @r{(Summary)}@findex gnus-summary-show-all-threadsExpose all hidden threads (@code{gnus-summary-show-all-threads}).@item T H@kindex T H @r{(Summary)}@findex gnus-summary-hide-all-threadsHide all threads (@code{gnus-summary-hide-all-threads}).@item T t@kindex T t @r{(Summary)}@findex gnus-summary-rethread-currentRe-thread the current article's thread(@code{gnus-summary-rethread-current}). This works even when thesummary buffer is otherwise unthreaded.@item T ^@kindex T ^ @r{(Summary)}@findex gnus-summary-reparent-threadMake the current article the child of the marked (or previous) article(@code{gnus-summary-reparent-thread}).@end tableThe following commands are thread movement commands. They allunderstand the numeric prefix.@table @kbd@item T n@kindex T n @r{(Summary)}@itemx C-M-n@kindex C-M-n @r{(Summary)}@itemx M-down@kindex M-down @r{(Summary)}@findex gnus-summary-next-threadGo to the next thread (@code{gnus-summary-next-thread}).@item T p@kindex T p @r{(Summary)}@itemx C-M-p@kindex C-M-p @r{(Summary)}@itemx M-up@kindex M-up @r{(Summary)}@findex gnus-summary-prev-threadGo to the previous thread (@code{gnus-summary-prev-thread}).@item T d@kindex T d @r{(Summary)}@findex gnus-summary-down-threadDescend the thread (@code{gnus-summary-down-thread}).@item T u@kindex T u @r{(Summary)}@findex gnus-summary-up-threadAscend the thread (@code{gnus-summary-up-thread}).@item T o@kindex T o @r{(Summary)}@findex gnus-summary-top-threadGo to the top of the thread (@code{gnus-summary-top-thread}).@end table@vindex gnus-thread-operation-ignore-subjectIf you ignore subject while threading, you'll naturally end up withthreads that have several different subjects in them. If you then issuea command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might notwish to kill the entire thread, but just those parts of the thread thathave the same subject as the current article. If you like this idea,you can fiddle with @code{gnus-thread-operation-ignore-subject}. If itis non-@code{nil} (which it is by default), subjects will be ignoredwhen doing thread commands. If this variable is @code{nil}, articles inthe same thread with different subjects will not be included in theoperation in question. If this variable is @code{fuzzy}, only articlesthat have subjects fuzzily equal will be included (@pxref{FuzzyMatching}).@node Sorting@section Sorting@findex gnus-thread-sort-by-total-score@findex gnus-thread-sort-by-date@findex gnus-thread-sort-by-score@findex gnus-thread-sort-by-subject@findex gnus-thread-sort-by-author@findex gnus-thread-sort-by-number@vindex gnus-thread-sort-functionsIf you are using a threaded summary display, you can sort the threads bysetting @code{gnus-thread-sort-functions}, which can be either a singlefunction, a list of functions, or a list containing functions and@code{(not some-function)} elements.By default, sorting is done on article numbers. Ready-made sortingpredicate functions include @code{gnus-thread-sort-by-number},@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and@code{gnus-thread-sort-by-total-score}.Each function takes two threads and returns non-@code{nil} if the firstthread should be sorted before the other. Note that sorting really isnormally done by looking only at the roots of each thread.If you use more than one function, the primary sort key should be thelast function in the list. You should probably always include@code{gnus-thread-sort-by-number} in the list of sortingfunctions---preferably first. This will ensure that threads that areequal with respect to the other sort criteria will be displayed inascending article order.If you would like to sort by reverse score, then by subject, and finallyby number, you could do something like:@lisp(setq gnus-thread-sort-functions '(gnus-thread-sort-by-number gnus-thread-sort-by-subject (not gnus-thread-sort-by-total-score)))@end lispThe threads that have highest score will be displayed first in thesummary buffer. When threads have the same score, they will be sortedalphabetically. The threads that have the same score and the samesubject will be sorted by number, which is (normally) the sequence inwhich the articles arrived.If you want to sort by score and then reverse arrival order, you couldsay something like:@lisp(setq gnus-thread-sort-functions '((lambda (t1 t2) (not (gnus-thread-sort-by-number t1 t2))) gnus-thread-sort-by-score))@end lisp@vindex gnus-thread-score-functionThe function in the @code{gnus-thread-score-function} variable (default@code{+}) is used for calculating the total score of a thread. Usefulfunctions might be @code{max}, @code{min}, or squared means, or whatevertickles your fancy.@findex gnus-article-sort-functions@findex gnus-article-sort-by-date@findex gnus-article-sort-by-score@findex gnus-article-sort-by-subject@findex gnus-article-sort-by-author@findex gnus-article-sort-by-numberIf you are using an unthreaded display for some strange reason or other,you have to fiddle with the @code{gnus-article-sort-functions} variable.It is very similar to the @code{gnus-thread-sort-functions}, except thatit uses slightly different functions for article comparison. Availablesorting predicate functions are @code{gnus-article-sort-by-number},@code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},@code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.If you want to sort an unthreaded summary display by subject, you couldsay something like:@lisp(setq gnus-article-sort-functions '(gnus-article-sort-by-number gnus-article-sort-by-subject))@end lisp@node Asynchronous Fetching@section Asynchronous Article Fetching@cindex asynchronous article fetching@cindex article pre-fetch@cindex pre-fetchIf you read your news from an @sc{nntp} server that's far away, thenetwork latencies may make reading articles a chore. You have to waitfor a while after pressing @kbd{n} to go to the next article before thearticle appears. Why can't Gnus just go ahead and fetch the articlewhile you are reading the previous one? Why not, indeed.First, some caveats. There are some pitfalls to using asynchronousarticle fetching, especially the way Gnus does it.Let's say you are reading article 1, which is short, and article 2 isquite long, and you are not interested in reading that. Gnus does notknow this, so it goes ahead and fetches article 2. You decide to readarticle 3, but since Gnus is in the process of fetching article 2, theconnection is blocked.To avoid these situations, Gnus will open two (count 'em two)connections to the server. Some people may think this isn't a very nicething to do, but I don't see any real alternatives. Setting up thatextra connection takes some time, so Gnus startup will be slower.Gnus will fetch more articles than you will read. This will mean thatthe link between your machine and the @sc{nntp} server will become moreloaded than if you didn't use article pre-fetch. The server itself willalso become more loaded---both with the extra article requests, and theextra connection.Ok, so now you know that you shouldn't really use this thing... unlessyou really want to.@vindex gnus-asynchronousHere's how: Set @code{gnus-asynchronous} to @code{t}. The rest shouldhappen automatically.@vindex gnus-use-article-prefetchYou can control how many articles are to be pre-fetched by setting@code{gnus-use-article-prefetch}. This is 30 by default, which meansthat when you read an article in the group, the back end will pre-fetchthe next 30 articles. If this variable is @code{t}, the back end willpre-fetch all the articles it can without bound. If it is@code{nil}, no pre-fetching will be done.@vindex gnus-async-prefetch-article-p@findex gnus-async-read-pThere are probably some articles that you don't want to pre-fetch---readarticles, for instance. The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched. This function shouldreturn non-@code{nil} when the article in question is to bepre-fetched. The default is @code{gnus-async-read-p}, which returns@code{nil} on read articles. The function is called with an articledata structure as the only parameter.If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like:@lisp(defun my-async-short-unread-p (data) "Return non-nil for short, unread articles." (and (gnus-data-unread-p data) (< (mail-header-lines (gnus-data-header data)) 100)))(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)@end lispThese functions will be called many, many times, so they shouldpreferably be short and sweet to avoid slowing down Gnus too much.It's probably a good idea to byte-compile things like this.@vindex gnus-prefetched-article-deletion-strategyArticles have to be removed from the asynch buffer sooner or later. The@code{gnus-prefetched-article-deletion-strategy} says when to removearticles. This is a list that may contain the following elements:@table @code@item readRemove articles when they are read.@item exitRemove articles when exiting the group.@end tableThe default value is @code{(read exit)}.@c @vindex gnus-use-header-prefetch@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles@c from the next group.@node Article Caching@section Article Caching@cindex article caching@cindex cachingIf you have an @emph{extremely} slow @sc{nntp} connection, you mayconsider turning article caching on. Each article will then be storedlocally under your home directory. As you may surmise, this couldpotentially use @emph{huge} amounts of disk space, as well as eat up allyour inodes so fast it will make your head swim. In vodka.Used carefully, though, it could be just an easier way to save articles.@vindex gnus-use-long-file-name@vindex gnus-cache-directory@vindex gnus-use-cacheTo turn caching on, set @code{gnus-use-cache} to @code{t}. By default,all articles ticked or marked as dormant will then be copiedover to your local cache (@code{gnus-cache-directory}). Whether thiscache is flat or hierarchical is controlled by the@code{gnus-use-long-file-name} variable, as usual.When re-selecting a ticked or dormant article, it will be fetched from thecache instead of from the server. As articles in your cache will neverexpire, this might serve as a method of saving articles while stillkeeping them where they belong. Just mark all articles you want to saveas dormant, and don't worry.When an article is marked as read, is it removed from the cache.@vindex gnus-cache-remove-articles@vindex gnus-cache-enter-articlesThe entering/removal of articles from the cache is controlled by the@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}variables. Both are lists of symbols. The first is @code{(tickeddormant)} by default, meaning that ticked and dormant articles will beput in the cache. The latter is @code{(read)} by default, meaning thatarticles marked as read are removed from the cache. Possiblysymbols in these two lists are @code{ticked}, @code{dormant},@code{unread} and @code{read}.@findex gnus-jog-cacheSo where does the massive article-fetching and storing come into thepicture? The @code{gnus-jog-cache} command will go through allsubscribed newsgroups, request all unread articles, score them, andstore them in the cache. You should only ever, ever ever ever, use thiscommand if 1) your connection to the @sc{nntp} server is really, really,really slow and 2) you have a really, really, really huge disk.Seriously. One way to cut down on the number of articles downloaded isto score unwanted articles down and have them marked as read. They willnot then be downloaded by this command.@vindex gnus-uncacheable-groups@vindex gnus-cacheable-groupsIt is likely that you do not want caching on all groups. For instance,if your @code{nnml} mail is located under your home directory, it makes nosense to cache it somewhere else under your home directory. Unless youfeel that it's neat to use twice as much space.To limit the caching, you could set @code{gnus-cacheable-groups} to aregexp of groups to cache, @samp{^nntp} for instance, or set the@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.Both variables are @code{nil} by default. If a group matches bothvariables, the group is not cached.@findex gnus-cache-generate-nov-databases@findex gnus-cache-generate-active@vindex gnus-cache-active-fileThe cache stores information on what articles it contains in its activefile (@code{gnus-cache-active-file}). If this file (or any other partsof the cache) becomes all messed up for some reason or other, Gnusoffers two functions that will try to set things right. @kbd{M-xgnus-cache-generate-nov-databases} will (re)build all the @sc{nov}files, and @kbd{gnus-cache-generate-active} will (re)generate the activefile.@node Persistent Articles@section Persistent Articles@cindex persistent articlesClosely related to article caching, we have @dfn{persistent articles}.In fact, it's just a different way of looking at caching, and much moreuseful in my opinion.Say you're reading a newsgroup, and you happen on to some valuable gemthat you want to keep and treasure forever. You'd normally just save it(using one of the many saving commands) in some file. The problem withthat is that it's just, well, yucky. Ideally you'd prefer just havingthe article remain in the group where you found it forever; untouched bythe expiry going on at the news server.This is what a @dfn{persistent article} is---an article that just won'tbe deleted. It's implemented using the normal cache functions, butyou use two explicit commands for managing persistent articles:@table @kbd@item *@kindex * @r{(Summary)}@findex gnus-cache-enter-articleMake the current article persistent (@code{gnus-cache-enter-article}).@item M-*@kindex M-* @r{(Summary)}@findex gnus-cache-remove-articleRemove the current article from the persistent articles(@code{gnus-cache-remove-article}). This will normally delete thearticle.@end tableBoth these commands understand the process/prefix convention.To avoid having all ticked articles (and stuff) entered into the cache,you should set @code{gnus-use-cache} to @code{passive} if you're justinterested in persistent articles:@lisp(setq gnus-use-cache 'passive)@end lisp@node Article Backlog@section Article Backlog@cindex backlog@cindex article backlogIf you have a slow connection, but the idea of using caching seemsunappealing to you (and it is, really), you can help the situation someby switching on the @dfn{backlog}. This is where Gnus will bufferalready read articles so that it doesn't have to re-fetch articlesyou've already read. This only helps if you are in the habit ofre-selecting articles you've recently read, of course. If you never dothat, turning the backlog on will slow Gnus down a little bit, andincrease memory usage some.@vindex gnus-keep-backlogIf you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will storeat most @var{n} old articles in a buffer for later re-fetching. If thisvariable is non-@code{nil} and is not a number, Gnus will store@emph{all} read articles, which means that your Emacs will grow withoutbound before exploding and taking your machine down with you. I putthat in there just to keep y'all on your toes.This variable is @code{nil} by default.@node Saving Articles@section Saving Articles@cindex saving articlesGnus can save articles in a number of ways. Below is the documentationfor saving articles in a fairly straight-forward fashion (i.e., littleprocessing of the article is done before it is saved). For a differentapproach (uudecoding, unsharing) you should use @code{gnus-uu}(@pxref{Decoding Articles}).@vindex gnus-save-all-headersIf @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not deleteunwanted headers before saving the article.@vindex gnus-saved-headersIf the preceding variable is @code{nil}, all headers that match the@code{gnus-saved-headers} regexp will be kept, while the rest will bedeleted before saving.@table @kbd@item O o@itemx o@kindex O o @r{(Summary)}@kindex o @r{(Summary)}@findex gnus-summary-save-article@c @icon{gnus-summary-save-article}Save the current article using the default article saver(@code{gnus-summary-save-article}).@item O m@kindex O m @r{(Summary)}@findex gnus-summary-save-article-mailSave the current article in mail format(@code{gnus-summary-save-article-mail}).@item O r@kindex O r @r{(Summary)}@findex gnus-summary-save-article-rmailSave the current article in rmail format(@code{gnus-summary-save-article-rmail}).@item O f@kindex O f @r{(Summary)}@findex gnus-summary-save-article-file@c @icon{gnus-summary-save-article-file}Save the current article in plain file format(@code{gnus-summary-save-article-file}).@item O F@kindex O F @r{(Summary)}@findex gnus-summary-write-article-fileWrite the current article in plain file format, overwriting any previousfile contents (@code{gnus-summary-write-article-file}).@item O b@kindex O b @r{(Summary)}@findex gnus-summary-save-article-body-fileSave the current article body in plain file format(@code{gnus-summary-save-article-body-file}).@item O h@kindex O h @r{(Summary)}@findex gnus-summary-save-article-folderSave the current article in mh folder format(@code{gnus-summary-save-article-folder}).@item O v@kindex O v @r{(Summary)}@findex gnus-summary-save-article-vmSave the current article in a VM folder(@code{gnus-summary-save-article-vm}).@item O p@kindex O p @r{(Summary)}@findex gnus-summary-pipe-outputSave the current article in a pipe. Uhm, like, what I mean is---Pipethe current article to a process (@code{gnus-summary-pipe-output}).@end table@vindex gnus-prompt-before-savingAll these commands use the process/prefix convention(@pxref{Process/Prefix}). If you save bunches of articles using thesefunctions, you might get tired of being prompted for files to save eachand every article in. The prompting action is controlled bythe @code{gnus-prompt-before-saving} variable, which is @code{always} bydefault, giving you that excessive prompting action you know andloathe. If you set this variable to @code{t} instead, you'll be promptedjust once for each series of articles you save. If you like to reallyhave Gnus do all your thinking for you, you can even set this variableto @code{nil}, which means that you will never be prompted for files tosave articles in. Gnus will simply save all the articles in the defaultfiles.@vindex gnus-default-article-saverYou can customize the @code{gnus-default-article-saver} variable to makeGnus do what you want it to. You can use any of the six ready-madefunctions below, or you can create your own.@table @code@item gnus-summary-save-in-rmail@findex gnus-summary-save-in-rmail@vindex gnus-rmail-save-name@findex gnus-plain-save-nameThis is the default format, @dfn{babyl}. Uses the function in the@code{gnus-rmail-save-name} variable to get a file name to save thearticle in. The default is @code{gnus-plain-save-name}.@item gnus-summary-save-in-mail@findex gnus-summary-save-in-mail@vindex gnus-mail-save-nameSave in a Unix mail (mbox) file. Uses the function in the@code{gnus-mail-save-name} variable to get a file name to save thearticle in. The default is @code{gnus-plain-save-name}.@item gnus-summary-save-in-file@findex gnus-summary-save-in-file@vindex gnus-file-save-name@findex gnus-numeric-save-nameAppend the article straight to an ordinary file. Uses the function inthe @code{gnus-file-save-name} variable to get a file name to save thearticle in. The default is @code{gnus-numeric-save-name}.@item gnus-summary-save-body-in-file@findex gnus-summary-save-body-in-fileAppend the article body to an ordinary file. Uses the function in the@code{gnus-file-save-name} variable to get a file name to save thearticle in. The default is @code{gnus-numeric-save-name}.@item gnus-summary-save-in-folder@findex gnus-summary-save-in-folder@findex gnus-folder-save-name@findex gnus-Folder-save-name@vindex gnus-folder-save-name@cindex rcvstore@cindex MH foldersSave the article to an MH folder using @code{rcvstore} from the MHlibrary. Uses the function in the @code{gnus-folder-save-name} variableto get a file name to save the article in. The default is@code{gnus-folder-save-name}, but you can also use@code{gnus-Folder-save-name}, which creates capitalized names.@item gnus-summary-save-in-vm@findex gnus-summary-save-in-vmSave the article in a VM folder. You have to have the VM mailreader to use this setting.@end table@vindex gnus-article-save-directoryAll of these functions, except for the last one, will save the articlein the @code{gnus-article-save-directory}, which is initialized from the@code{SAVEDIR} environment variable. This is @file{~/News/} bydefault.As you can see above, the functions use different functions to find asuitable name of a file to save the article in. Below is a list ofavailable functions that generate names:@table @code@item gnus-Numeric-save-name@findex gnus-Numeric-save-nameFile names like @file{~/News/Alt.andrea-dworkin/45}.@item gnus-numeric-save-name@findex gnus-numeric-save-nameFile names like @file{~/News/alt.andrea-dworkin/45}.@item gnus-Plain-save-name@findex gnus-Plain-save-nameFile names like @file{~/News/Alt.andrea-dworkin}.@item gnus-plain-save-name@findex gnus-plain-save-nameFile names like @file{~/News/alt.andrea-dworkin}.@end table@vindex gnus-split-methodsYou can have Gnus suggest where to save articles by plonking a regexp intothe @code{gnus-split-methods} alist. For instance, if you would like tosave articles related to Gnus in the file @file{gnus-stuff}, and articlesrelated to VM in @code{vm-stuff}, you could set this variable to somethinglike:@lisp(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff") ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff") (my-choosing-function "../other-dir/my-stuff") ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))@end lispWe see that this is a list where each element is a list that has twoelements---the @dfn{match} and the @dfn{file}. The match can either bea string (in which case it is used as a regexp to match on the articlehead); it can be a symbol (which will be called as a function with thegroup name as a parameter); or it can be a list (which will be@code{eval}ed). If any of these actions have a non-@code{nil} result,the @dfn{file} will be used as a default prompt. In addition, theresult of the operation itself will be used if the function or formcalled returns a string or a list of strings.You basically end up with a list of file names that might be used whensaving the current article. (All ``matches'' will be used.) You willthen be prompted for what you really want to use as a name, with filename completion over the results from applying this variable.This variable is @code{((gnus-article-archive-name))} by default, whichmeans that Gnus will look at the articles it saves for an@code{Archive-name} line and use that as a suggestion for the filename.Here's an example function to clean up file names somewhat. If you havelots of mail groups called things like@samp{nnml:mail.whatever}, you may want to chop off the beginning ofthese group names before creating the file name to save to. Thefollowing will do just that:@lisp(defun my-save-name (group) (when (string-match "^nnml:mail." group) (substring group (match-end 0))))(setq gnus-split-methods '((gnus-article-archive-name) (my-save-name)))@end lisp@vindex gnus-use-long-file-nameFinally, you have the @code{gnus-use-long-file-name} variable. If it is@code{nil}, all the preceding functions will replace all periods(@samp{.}) in the group names with slashes (@samp{/})---which means thatthe functions will generate hierarchies of directories instead of havingall the files in the top level directory(@file{~/News/alt/andrea-dworkin} instead of@file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by defaulton most systems. However, for historical reasons, this is @code{nil} onXenix and usg-unix-v machines by default.This function also affects kill and score file names. If this variableis a list, and the list contains the element @code{not-score}, long filenames will not be used for score files, if it contains the element@code{not-save}, long file names will not be used for saving, and if itcontains the element @code{not-kill}, long file names will not be usedfor kill files.If you'd like to save articles in a hierarchy that looks something likea spool, you could@lisp(setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy(setq gnus-default-article-saver 'gnus-summary-save-in-file) ; no encoding@end lispThen just save with @kbd{o}. You'd then read this hierarchy withephemeral @code{nneething} groups---@kbd{G D} in the group buffer, andthe top level directory as the argument (@file{~/News/}). Then just walkaround to the groups/directories with @code{nneething}.@node Decoding Articles@section Decoding Articles@cindex decoding articlesSometime users post articles (or series of articles) that have beenencoded in some way or other. Gnus can decode them for you.@menu* Uuencoded Articles:: Uudecode articles.* Shell Archives:: Unshar articles.* PostScript Files:: Split PostScript.* Other Files:: Plain save and binhex.* Decoding Variables:: Variables for a happy decoding.* Viewing Files:: You want to look at the result of the decoding?@end menu@cindex series@cindex article seriesAll these functions use the process/prefix convention(@pxref{Process/Prefix}) for finding out what articles to work on, withthe extension that a ``single article'' means ``a single series''. Gnuscan find out by itself what articles belong to a series, decode all thearticles and unpack/view/save the resulting file(s).Gnus guesses what articles are in the series according to the followingsimplish rule: The subjects must be (nearly) identical, except for thelast two numbers of the line. (Spaces are largely ignored, however.)For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnuswill find all the articles that match the regexp @samp{^cat.gif([0-9]+/[0-9]+).*$}.Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of aseries}, will not be properly recognized by any of the automatic viewingcommands, and you have to mark the articles manually with @kbd{#}.@node Uuencoded Articles@subsection Uuencoded Articles@cindex uudecode@cindex uuencoded articles@table @kbd@item X u@kindex X u @r{(Summary)}@findex gnus-uu-decode-uu@c @icon{gnus-uu-decode-uu}Uudecodes the current series (@code{gnus-uu-decode-uu}).@item X U@kindex X U @r{(Summary)}@findex gnus-uu-decode-uu-and-saveUudecodes and saves the current series(@code{gnus-uu-decode-uu-and-save}).@item X v u@kindex X v u @r{(Summary)}@findex gnus-uu-decode-uu-viewUudecodes and views the current series (@code{gnus-uu-decode-uu-view}).@item X v U@kindex X v U @r{(Summary)}@findex gnus-uu-decode-uu-and-save-viewUudecodes, views and saves the current series(@code{gnus-uu-decode-uu-and-save-view}).@end tableRemember that these all react to the presence of articles marked withthe process mark. If, for instance, you'd like to decode and save anentire newsgroup, you'd typically do @kbd{M P a}(@code{gnus-uu-mark-all}) and then @kbd{X U}(@code{gnus-uu-decode-uu-and-save}).All this is very much different from how @code{gnus-uu} worked with@sc{gnus 4.1}, where you had explicit keystrokes for everything underthe sun. This version of @code{gnus-uu} generally assumes that you markarticles in some way (@pxref{Setting Process Marks}) and then press@kbd{X u}.@vindex gnus-uu-notify-filesNote: When trying to decode articles that have names matching@code{gnus-uu-notify-files}, which is hard-coded to@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} willautomatically post an article on @samp{comp.unix.wizards} saying thatyou have just viewed the file in question. This feature can't be turnedoff.@node Shell Archives@subsection Shell Archives@cindex unshar@cindex shell archives@cindex shared articlesShell archives (``shar files'') used to be a popular way to distributesources, but it isn't used all that much today. In any case, we havesome commands to deal with these:@table @kbd@item X s@kindex X s @r{(Summary)}@findex gnus-uu-decode-unsharUnshars the current series (@code{gnus-uu-decode-unshar}).@item X S@kindex X S @r{(Summary)}@findex gnus-uu-decode-unshar-and-saveUnshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).@item X v s@kindex X v s @r{(Summary)}@findex gnus-uu-decode-unshar-viewUnshars and views the current series (@code{gnus-uu-decode-unshar-view}).@item X v S@kindex X v S @r{(Summary)}@findex gnus-uu-decode-unshar-and-save-viewUnshars, views and saves the current series(@code{gnus-uu-decode-unshar-and-save-view}).@end table@node PostScript Files@subsection PostScript Files@cindex PostScript@table @kbd@item X p@kindex X p @r{(Summary)}@findex gnus-uu-decode-postscriptUnpack the current PostScript series (@code{gnus-uu-decode-postscript}).@item X P@kindex X P @r{(Summary)}@findex gnus-uu-decode-postscript-and-saveUnpack and save the current PostScript series(@code{gnus-uu-decode-postscript-and-save}).@item X v p@kindex X v p @r{(Summary)}@findex gnus-uu-decode-postscript-viewView the current PostScript series(@code{gnus-uu-decode-postscript-view}).@item X v P@kindex X v P @r{(Summary)}@findex gnus-uu-decode-postscript-and-save-viewView and save the current PostScript series(@code{gnus-uu-decode-postscript-and-save-view}).@end table@node Other Files@subsection Other Files@table @kbd@item X o@kindex X o @r{(Summary)}@findex gnus-uu-decode-saveSave the current series(@code{gnus-uu-decode-save}).@item X b@kindex X b @r{(Summary)}@findex gnus-uu-decode-binhexUnbinhex the current series (@code{gnus-uu-decode-binhex}). Thisdoesn't really work yet.@end table@node Decoding Variables@subsection Decoding VariablesAdjective, not verb.@menu* Rule Variables:: Variables that say how a file is to be viewed.* Other Decode Variables:: Other decode variables.* Uuencoding and Posting:: Variables for customizing uuencoding.@end menu@node Rule Variables@subsubsection Rule Variables@cindex rule variablesGnus uses @dfn{rule variables} to decide how to view a file. All thesevariables are of the form@lisp (list '(regexp1 command2) '(regexp2 command2) ...)@end lisp@table @code@item gnus-uu-user-view-rules@vindex gnus-uu-user-view-rules@cindex soxThis variable is consulted first when viewing files. If you wish to use,for instance, @code{sox} to convert an @samp{.au} sound file, you couldsay something like:@lisp(setq gnus-uu-user-view-rules (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))@end lisp@item gnus-uu-user-view-rules-end@vindex gnus-uu-user-view-rules-endThis variable is consulted if Gnus couldn't make any matches from theuser and default view rules.@item gnus-uu-user-archive-rules@vindex gnus-uu-user-archive-rulesThis variable can be used to say what commands should be used to unpackarchives.@end table@node Other Decode Variables@subsubsection Other Decode Variables@table @code@vindex gnus-uu-grabbed-file-functions@item gnus-uu-grabbed-file-functionsAll functions in this list will be called right after each file has beensuccessfully decoded---so that you can move or view files right away,and don't have to wait for all files to be decoded before you can doanything. Ready-made functions you can put in this list are:@table @code@item gnus-uu-grab-view@findex gnus-uu-grab-viewView the file.@item gnus-uu-grab-move@findex gnus-uu-grab-moveMove the file (if you're using a saving function.)@end table@item gnus-uu-be-dangerous@vindex gnus-uu-be-dangerousSpecifies what to do if unusual situations arise during decoding. If@code{nil}, be as conservative as possible. If @code{t}, ignore thingsthat didn't work, and overwrite existing files. Otherwise, ask eachtime.@item gnus-uu-ignore-files-by-name@vindex gnus-uu-ignore-files-by-nameFiles with name matching this regular expression won't be viewed.@item gnus-uu-ignore-files-by-type@vindex gnus-uu-ignore-files-by-typeFiles with a @sc{mime} type matching this variable won't be viewed.Note that Gnus tries to guess what type the file is based on the name.@code{gnus-uu} is not a @sc{mime} package (yet), so this is slightlykludgey.@item gnus-uu-tmp-dir@vindex gnus-uu-tmp-dirWhere @code{gnus-uu} does its work.@item gnus-uu-do-not-unpack-archives@vindex gnus-uu-do-not-unpack-archivesNon-@code{nil} means that @code{gnus-uu} won't peek inside archiveslooking for files to display.@item gnus-uu-view-and-save@vindex gnus-uu-view-and-saveNon-@code{nil} means that the user will always be asked to save a fileafter viewing it.@item gnus-uu-ignore-default-view-rules@vindex gnus-uu-ignore-default-view-rulesNon-@code{nil} means that @code{gnus-uu} will ignore the default viewingrules.@item gnus-uu-ignore-default-archive-rules@vindex gnus-uu-ignore-default-archive-rulesNon-@code{nil} means that @code{gnus-uu} will ignore the default archiveunpacking commands.@item gnus-uu-kill-carriage-return@vindex gnus-uu-kill-carriage-returnNon-@code{nil} means that @code{gnus-uu} will strip all carriage returnsfrom articles.@item gnus-uu-unmark-articles-not-decoded@vindex gnus-uu-unmark-articles-not-decodedNon-@code{nil} means that @code{gnus-uu} will mark unsuccessfullydecoded articles as unread.@item gnus-uu-correct-stripped-uucode@vindex gnus-uu-correct-stripped-uucodeNon-@code{nil} means that @code{gnus-uu} will @emph{try} to fixuuencoded files that have had trailing spaces deleted.@item gnus-uu-pre-uudecode-hook@vindex gnus-uu-pre-uudecode-hookHook run before sending a message to @code{uudecode}.@item gnus-uu-view-with-metamail@vindex gnus-uu-view-with-metamail@cindex metamailNon-@code{nil} means that @code{gnus-uu} will ignore the viewingcommands defined by the rule variables and just fudge a @sc{mime}content type based on the file name. The result will be fed to@code{metamail} for viewing.@item gnus-uu-save-in-digest@vindex gnus-uu-save-in-digestNon-@code{nil} means that @code{gnus-uu}, when asked to save withoutdecoding, will save in digests. If this variable is @code{nil},@code{gnus-uu} will just save everything in a file without anyembellishments. The digesting almost conforms to RFC 1153---no easy wayto specify any meaningful volume and issue numbers were found, so Isimply dropped them.@end table@node Uuencoding and Posting@subsubsection Uuencoding and Posting@table @code@item gnus-uu-post-include-before-composing@vindex gnus-uu-post-include-before-composingNon-@code{nil} means that @code{gnus-uu} will ask for a file to encodebefore you compose the article. If this variable is @code{t}, you caneither include an encoded file with @kbd{C-c C-i} or have one includedfor you when you post the article.@item gnus-uu-post-length@vindex gnus-uu-post-lengthMaximum length of an article. The encoded file will be split into howmany articles it takes to post the entire file.@item gnus-uu-post-threaded@vindex gnus-uu-post-threadedNon-@code{nil} means that @code{gnus-uu} will post the encoded file in athread. This may not be smart, as no other decoder I have seen is ableto follow threads when collecting uuencoded articles. (Well, I haveseen one package that does that---@code{gnus-uu}, but somehow, I don'tthink that counts...) Default is @code{nil}.@item gnus-uu-post-separate-description@vindex gnus-uu-post-separate-descriptionNon-@code{nil} means that the description will be posted in a separatearticle. The first article will typically be numbered (0/x). If thisvariable is @code{nil}, the description the user enters will be includedat the beginning of the first article, which will be numbered (1/x).Default is @code{t}.@end table@node Viewing Files@subsection Viewing Files@cindex viewing files@cindex pseudo-articlesAfter decoding, if the file is some sort of archive, Gnus will attemptto unpack the archive and see if any of the files in the archive can beviewed. For instance, if you have a gzipped tar file @file{pics.tar.gz}containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus willuncompress and de-tar the main file, and then view the two pictures.This unpacking process is recursive, so if the archive contains archivesof archives, it'll all be unpacked.Finally, Gnus will normally insert a @dfn{pseudo-article} for eachextracted file into the summary buffer. If you go to these``articles'', you will be prompted for a command to run (usually Gnuswill make a suggestion), and then the command will be run.@vindex gnus-view-pseudo-asynchronouslyIf @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will waituntil the viewing is done before proceeding.@vindex gnus-view-pseudosIf @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insertthe pseudo-articles into the summary buffer, but view themimmediately. If this variable is @code{not-confirm}, the user won't evenbe asked for a confirmation before viewing is done.@vindex gnus-view-pseudos-separatelyIf @code{gnus-view-pseudos-separately} is non-@code{nil}, onepseudo-article will be created for each file to be viewed. If@code{nil}, all files that use the same viewing command will be given asa list of parameters to that command.@vindex gnus-insert-pseudo-articlesIf @code{gnus-insert-pseudo-articles} is non-@code{nil}, insertpseudo-articles when decoding. It is @code{t} by default.So; there you are, reading your @emph{pseudo-articles} in your@emph{virtual newsgroup} from the @emph{virtual server}; and you think:Why isn't anything real anymore? How did we get here?@node Article Treatment@section Article TreatmentReading through this huge manual, you may have quite forgotten that theobject of newsreaders is to actually, like, read what people havewritten. Reading articles. Unfortunately, people are quite bad atwriting, so there are tons of functions and variables to make readingthese articles easier.@menu* Article Highlighting:: You want to make the article look like fruit salad.* Article Fontisizing:: Making emphasized text look nice.* Article Hiding:: You also want to make certain info go away.* Article Washing:: Lots of way-neat functions to make life better.* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.* Article Date:: Grumble, UT!* Article Signature:: What is a signature?* Article Miscellanea:: Various other stuff.@end menu@node Article Highlighting@subsection Article Highlighting@cindex highlightingNot only do you want your article buffer to look like fruit salad, butyou want it to look like technicolor fruit salad.@table @kbd@item W H a@kindex W H a @r{(Summary)}@findex gnus-article-highlight@findex gnus-article-maybe-highlightDo much highlighting of the current article(@code{gnus-article-highlight}). This function highlights header, citedtext, the signature, and adds buttons to the body and the head.@item W H h@kindex W H h @r{(Summary)}@findex gnus-article-highlight-headers@vindex gnus-header-face-alistHighlight the headers (@code{gnus-article-highlight-headers}). Thehighlighting will be done according to the @code{gnus-header-face-alist}variable, which is a list where each element has the form@code{(@var{regexp} @var{name} @var{content})}.@var{regexp} is a regular expression for matching theheader, @var{name} is the face used for highlighting the header name(@pxref{Faces and Fonts}) and @var{content} is the face for highlightingthe header value. The first match made will be used. Note that@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.@item W H c@kindex W H c @r{(Summary)}@findex gnus-article-highlight-citationHighlight cited text (@code{gnus-article-highlight-citation}).Some variables to customize the citation highlights:@table @code@vindex gnus-cite-parse-max-size@item gnus-cite-parse-max-sizeIf the article size if bigger than this variable (which is 25000 bydefault), no citation highlighting will be performed.@item gnus-cite-prefix-regexp@vindex gnus-cite-prefix-regexpRegexp matching the longest possible citation prefix on a line.@item gnus-cite-max-prefix@vindex gnus-cite-max-prefixMaximum possible length for a citation prefix (default 20).@item gnus-cite-face-list@vindex gnus-cite-face-listList of faces used for highlighting citations (@pxref{Faces and Fonts}).When there are citations from multiple articles in the same message,Gnus will try to give each citation from each article its own face.This should make it easier to see who wrote what.@item gnus-supercite-regexp@vindex gnus-supercite-regexpRegexp matching normal Supercite attribution lines.@item gnus-supercite-secondary-regexp@vindex gnus-supercite-secondary-regexpRegexp matching mangled Supercite attribution lines.@item gnus-cite-minimum-match-count@vindex gnus-cite-minimum-match-countMinimum number of identical prefixes we have to see before we believethat it's a citation.@item gnus-cite-attribution-prefix@vindex gnus-cite-attribution-prefixRegexp matching the beginning of an attribution line.@item gnus-cite-attribution-suffix@vindex gnus-cite-attribution-suffixRegexp matching the end of an attribution line.@item gnus-cite-attribution-face@vindex gnus-cite-attribution-faceFace used for attribution lines. It is merged with the face for thecited text belonging to the attribution.@end table@item W H s@kindex W H s @r{(Summary)}@vindex gnus-signature-separator@vindex gnus-signature-face@findex gnus-article-highlight-signatureHighlight the signature (@code{gnus-article-highlight-signature}).Everything after @code{gnus-signature-separator} (@pxref{ArticleSignature}) in an article will be considered a signature and will behighlighted with @code{gnus-signature-face}, which is @code{italic} bydefault.@end table@xref{Customizing Articles}, for how to highlight articles automatically.@node Article Fontisizing@subsection Article Fontisizing@cindex emphasis@cindex article emphasis@findex gnus-article-emphasize@kindex W e @r{(Summary)}People commonly add emphasis to words in news articles by writing thingslike @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can makethis look nicer by running the article through the @kbd{W e}(@code{gnus-article-emphasize}) command.@vindex gnus-emphasis-alistHow the emphasis is computed is controlled by the@code{gnus-emphasis-alist} variable. This is an alist where the firstelement is a regular expression to be matched. The second is a numberthat says what regular expression grouping is used to find the entireemphasized word. The third is a number that says what regexp groupingshould be displayed and highlighted. (The text between these twogroupings will be hidden.) The fourth is the face used forhighlighting.@lisp(setq gnus-article-emphasis '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline) ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))@end lisp@cindex slash@cindex asterisk@cindex underline@cindex /@cindex *@vindex gnus-emphasis-underline@vindex gnus-emphasis-bold@vindex gnus-emphasis-italic@vindex gnus-emphasis-underline-bold@vindex gnus-emphasis-underline-italic@vindex gnus-emphasis-bold-italic@vindex gnus-emphasis-underline-bold-italicBy default, there are seven rules, and they use the following faces:@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},@code{gnus-emphasis-underline-italic},@code{gnus-emphasis-underline-bold}, and@code{gnus-emphasis-underline-bold-italic}.If you want to change these faces, you can either use @kbd{M-xcustomize}, or you can use @code{copy-face}. For instance, if you wantto make @code{gnus-emphasis-italic} use a red face instead, you couldsay something like:@lisp(copy-face 'red 'gnus-emphasis-italic)@end lisp@vindex gnus-group-highlight-words-alistIf you want to highlight arbitrary words, you can use the@code{gnus-group-highlight-words-alist} variable, which uses the samesyntax as @code{gnus-emphasis-alist}. The @code{highlight-words} groupparameter (@pxref{Group Parameters}) can also be used.@xref{Customizing Articles}, for how to fontize articles automatically.@node Article Hiding@subsection Article Hiding@cindex article hidingOr rather, hiding certain things in each article. There usually is muchtoo much cruft in most articles.@table @kbd@item W W a@kindex W W a @r{(Summary)}@findex gnus-article-hideDo quite a lot of hiding on the article buffer(@kbd{gnus-article-hide}). In particular, this function will hideheaders, PGP, cited text and the signature.@item W W h@kindex W W h @r{(Summary)}@findex gnus-article-hide-headersHide headers (@code{gnus-article-hide-headers}). @xref{HidingHeaders}.@item W W b@kindex W W b @r{(Summary)}@findex gnus-article-hide-boring-headersHide headers that aren't particularly interesting(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.@item W W s@kindex W W s @r{(Summary)}@findex gnus-article-hide-signatureHide signature (@code{gnus-article-hide-signature}). @xref{ArticleSignature}.@item W W l@kindex W W l @r{(Summary)}@findex gnus-article-hide-list-identifiers@vindex gnus-list-identifiersStrip list identifiers specified in @code{gnus-list-identifiers}. Theseare strings some mailing list servers add to the beginning of all@code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}may not contain @code{\\(..\\)}.@table @code@item gnus-list-identifiers@vindex gnus-list-identifiersA regular expression that matches list identifiers to be removed fromsubject. This can also be a list of regular expressions.@end table@item W W p@kindex W W p @r{(Summary)}@findex gnus-article-hide-pgp@vindex gnus-article-hide-pgp-hookHide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). The@code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp}signature has been hidden. For example, to automatically verifyarticles that have signatures in them do:@lisp;;; Hide pgp cruft if any.(setq gnus-treat-strip-pgp t);;; After hiding pgp, verify the message;;;; only happens if pgp signature is found.(add-hook 'gnus-article-hide-pgp-hook (lambda () (save-excursion (set-buffer gnus-original-article-buffer) (mc-verify))))@end lisp@item W W P@kindex W W P @r{(Summary)}@findex gnus-article-hide-pemHide @sc{pem} (privacy enhanced messages) cruft(@code{gnus-article-hide-pem}).@item W W B@kindex W W B @r{(Summary)}@findex gnus-article-strip-banner@cindex banner@cindex OneList@cindex stripping advertisements@cindex advertisementsStrip the banner specified by the @code{banner} group parameter(@code{gnus-article-strip-banner}). This is mainly used to hide thoseannoying banners and/or signatures that some mailing lists and moderatedgroups adds to all the messages. The way to use this function is to addthe @code{banner} group parameter (@pxref{Group Parameters}) to thegroup you want banners stripped from. The parameter either be a string,which will be interpreted as a regular expression matching text to beremoved, or the symbol @code{signature}, meaning that the (last)signature should be removed, or other symbol, meaning that thecorresponding regular expression in @code{gnus-article-banner-alist} isused.@item W W c@kindex W W c @r{(Summary)}@findex gnus-article-hide-citationHide citation (@code{gnus-article-hide-citation}). Some variables forcustomizing the hiding:@table @code@item gnus-cited-opened-text-button-line-format@itemx gnus-cited-closed-text-button-line-format@vindex gnus-cited-closed-text-button-line-format@vindex gnus-cited-opened-text-button-line-formatGnus adds buttons to show where the cited text has been hidden, and toallow toggle hiding the text. The format of the variable is specifiedby these format-like variable (@pxref{Formatting Variables}). Thesespecs are valid:@table @samp@item bStarting point of the hidden text.@item eEnding point of the hidden text.@item lNumber of characters in the hidden region.@item nNumber of lines of hidden text.@end table@item gnus-cited-lines-visible@vindex gnus-cited-lines-visibleThe number of lines at the beginning of the cited text to leaveshown. This can also be a cons cell with the number of lines at the topand bottom of the text, respectively, to remain visible.@end table@item W W C-c@kindex W W C-c @r{(Summary)}@findex gnus-article-hide-citation-maybeHide citation (@code{gnus-article-hide-citation-maybe}) depending on thefollowing two variables:@table @code@item gnus-cite-hide-percentage@vindex gnus-cite-hide-percentageIf the cited text is of a bigger percentage than this variable (default50), hide the cited text.@item gnus-cite-hide-absolute@vindex gnus-cite-hide-absoluteThe cited text must have at least this length (default 10) before itis hidden.@end table@item W W C@kindex W W C @r{(Summary)}@findex gnus-article-hide-citation-in-followupsHide cited text in articles that aren't roots(@code{gnus-article-hide-citation-in-followups}). This isn't veryuseful as an interactive command, but might be a handy function to stickhave happen automatically (@pxref{Customizing Articles}).@end tableAll these ``hiding'' commands are toggles, but if you give a negativeprefix to these commands, they will show what they have previouslyhidden. If you give a positive prefix, they will always hide.Also @pxref{Article Highlighting} for further variables forcitation customization.@xref{Customizing Articles}, for how to hide article elementsautomatically.@node Article Washing@subsection Article Washing@cindex washing@cindex article washingWe call this ``article washing'' for a really good reason. Namely, the@kbd{A} key was taken, so we had to use the @kbd{W} key instead.@dfn{Washing} is defined by us as ``changing something from something tosomething else'', but normally results in something looking better.Cleaner, perhaps.@xref{Customizing Articles}, if you want to change how Gnus displaysarticles by default.@table @kbd@item C-u gThis is not really washing, it's sort of the opposite of washing. Ifyou type this, you see the article exactly as it exists on disk or onthe server.@item W l@kindex W l @r{(Summary)}@findex gnus-summary-stop-page-breakingRemove page breaks from the current article(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for pagedelimiters.@item W r@kindex W r @r{(Summary)}@findex gnus-summary-caesar-message@c @icon{gnus-summary-caesar-message}Do a Caesar rotate (rot13) on the article buffer(@code{gnus-summary-caesar-message}).Unreadable articles that tell you to read them with Caesar rotate or rot13.(Typically offensive jokes and such.)It's commonly called @dfn{rot13} because each letter is rotated 13positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter#15). It is sometimes referred to as ``Caesar rotate'' because Caesaris rumored to have employed this form of, uh, somewhat weak encryption.@item W t@item t@kindex W t @r{(Summary)}@kindex t @r{(Summary)}@findex gnus-summary-toggle-headerToggle whether to display all headers in the article buffer(@code{gnus-summary-toggle-header}).@item W v@kindex W v @r{(Summary)}@findex gnus-summary-verbose-headerToggle whether to display all headers in the article buffer permanently(@code{gnus-summary-verbose-header}).@item W o@kindex W o @r{(Summary)}@findex gnus-article-treat-overstrikeTreat overstrike (@code{gnus-article-treat-overstrike}).@item W d@kindex W d @r{(Summary)}@findex gnus-article-treat-dumbquotes@vindex gnus-article-dumbquotes-map@cindex Smartquotes@cindex M******** sm*rtq**t*s@cindex Latin 1Treat M******** sm*rtq**t*s according to@code{gnus-article-dumbquotes-map}(@code{gnus-article-treat-dumbquotes}). Note that this function guesseswhether a character is a sm*rtq**t* or not, so it should only be usedinteractively.In reality, this function is translates a subset of the subset of the@code{cp1252} (or @code{Windows-1252}) character set that isn't in ISOLatin-1, including the quote characters @code{\222} and @code{\264}.Messages in this character set often have a MIME header saying thatthey are Latin-1.@item W w@kindex W w @r{(Summary)}@findex gnus-article-fill-cited-articleDo word wrap (@code{gnus-article-fill-cited-article}).You can give the command a numerical prefix to specify the width to usewhen filling.@item W Q@kindex W Q @r{(Summary)}@findex gnus-article-fill-long-linesFill long lines (@code{gnus-article-fill-long-lines}).@item W C@kindex W C @r{(Summary)}@findex gnus-article-capitalize-sentencesCapitalize the first word in each sentence(@code{gnus-article-capitalize-sentences}).@item W c@kindex W c @r{(Summary)}@findex gnus-article-remove-crTranslate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF(this takes care of DOS line endings), and then translate any remainingCRs into LF (this takes care of Mac line endings)(@code{gnus-article-remove-cr}).@item W q@kindex W q @r{(Summary)}@findex gnus-article-de-quoted-unreadableTreat quoted-printable (@code{gnus-article-de-quoted-unreadable}).Quoted-Printable is one common @sc{mime} encoding employed when sendingnon-ASCII (i. e., 8-bit) articles. It typically makes strings like@samp{d�j� vu} look like @samp{d=E9j=E0 vu}, which doesn't look veryreadable to me. Note that the this is usually done automatically byGnus if the message in question has a @code{Content-Transfer-Encoding}header that says that this encoding has been done.@item W 6@kindex W 6 @r{(Summary)}@findex gnus-article-de-base64-unreadableTreat base64 (@code{gnus-article-de-base64-unreadable}).Base64 is one common @sc{mime} encoding employed when sending non-ASCII(i. e., 8-bit) articles. Note that the this is usually doneautomatically by Gnus if the message in question has a@code{Content-Transfer-Encoding} header that says that this encoding hasbeen done.@item W Z@kindex W Z @r{(Summary)}@findex gnus-article-decode-HZTreat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is onecommon encoding employed when sending Chinese articles. It typicallymakes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.@item W h@kindex W h @r{(Summary)}@findex gnus-article-wash-htmlTreat HTML (@code{gnus-article-wash-html}).Note that the this is usually done automatically by Gnus if the messagein question has a @code{Content-Type} header that says that this typehas been done.@item W f@kindex W f @r{(Summary)}@cindex x-face@findex gnus-article-display-x-face@findex gnus-article-x-face-command@vindex gnus-article-x-face-command@vindex gnus-article-x-face-too-ugly@iftex@iflatex\include{xface}@end iflatex@end iftex@anchor{X-Face}Look for and display any X-Face headers(@code{gnus-article-display-x-face}). The command executed by thisfunction is given by the @code{gnus-article-x-face-command} variable.If this variable is a string, this string will be executed in asub-shell. If it is a function, this function will be called with theface as the argument. If the @code{gnus-article-x-face-too-ugly} (whichis a regexp) matches the @code{From} header, the face will not be shown.The default action under Emacs is to fork off the @code{display}program@footnote{@code{display} is from the ImageMagick package. For the@code{uncompface} and @code{icontopbm} programs look for a packagelike `compface' or `faces-xface' on a GNU/Linux system.}to view the face. Under XEmacs or Emacs 21+ with suitable imagesupport, the default action is to display the face before the@code{From} header. (It's nicer if XEmacs has been compiled with X-Facesupport---that will make display somewhat faster. If there's no nativeX-Face support, Gnus will try to convert the @code{X-Face} header usingexternal programs from the @code{pbmplus} package andfriends.@footnote{On a GNU/Linux system look for packages with nameslike @code{netpbm} or @code{libgr-progs}.}) If youwant to have this function in the display hook, it should probably comelast.@item W b@kindex W b @r{(Summary)}@findex gnus-article-add-buttonsAdd clickable buttons to the article (@code{gnus-article-add-buttons}).@xref{Article Buttons}.@item W B@kindex W B @r{(Summary)}@findex gnus-article-add-buttons-to-headAdd clickable buttons to the article headers(@code{gnus-article-add-buttons-to-head}).@item W W H@kindex W W H @r{(Summary)}@findex gnus-article-strip-headers-from-bodyStrip headers like the @code{X-No-Archive} header from the beginning ofarticle bodies (@code{gnus-article-strip-headers-from-body}).@item W E l@kindex W E l @r{(Summary)}@findex gnus-article-strip-leading-blank-linesRemove all blank lines from the beginning of the article(@code{gnus-article-strip-leading-blank-lines}).@item W E m@kindex W E m @r{(Summary)}@findex gnus-article-strip-multiple-blank-linesReplace all blank lines with empty lines and then all multiple emptylines with a single empty line.(@code{gnus-article-strip-multiple-blank-lines}).@item W E t@kindex W E t @r{(Summary)}@findex gnus-article-remove-trailing-blank-linesRemove all blank lines at the end of the article(@code{gnus-article-remove-trailing-blank-lines}).@item W E a@kindex W E a @r{(Summary)}@findex gnus-article-strip-blank-linesDo all the three commands above(@code{gnus-article-strip-blank-lines}).@item W E A@kindex W E A @r{(Summary)}@findex gnus-article-strip-all-blank-linesRemove all blank lines(@code{gnus-article-strip-all-blank-lines}).@item W E s@kindex W E s @r{(Summary)}@findex gnus-article-strip-leading-spaceRemove all white space from the beginning of all lines of the articlebody (@code{gnus-article-strip-leading-space}).@item W E e@kindex W E e @r{(Summary)}@findex gnus-article-strip-trailing-spaceRemove all white space from the end of all lines of the articlebody (@code{gnus-article-strip-trailing-space}).@end table@xref{Customizing Articles}, for how to wash articles automatically.@node Article Buttons@subsection Article Buttons@cindex buttonsPeople often include references to other stuff in articles, and it wouldbe nice if Gnus could just fetch whatever it is that people talk aboutwith the minimum of fuzz when you hit @key{RET} or use the middle mousebutton on these references.Gnus adds @dfn{buttons} to certain standard references by default:Well-formed URLs, mail addresses and Message-IDs. This is controlled bytwo variables, one that handles article bodies and one that handlesarticle heads:@table @code@item gnus-button-alist@vindex gnus-button-alistThis is an alist where each entry has this form:@lisp(REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)@end lisp@table @var@item regexpAll text that match this regular expression will be considered anexternal reference. Here's a typical regexp that matches embedded URLs:@samp{<URL:\\([^\n\r>]*\\)>}.@item button-parGnus has to know which parts of the matches is to be highlighted. Thisis a number that says what sub-expression of the regexp is to behighlighted. If you want it all highlighted, you use 0 here.@item use-pThis form will be @code{eval}ed, and if the result is non-@code{nil},this is considered a match. This is useful if you want extra sifting toavoid false matches.@item functionThis function will be called when you click on this button.@item data-parAs with @var{button-par}, this is a sub-expression number, but this onesays which part of the match is to be sent as data to @var{function}.@end tableSo the full entry for buttonizing URLs is then@lisp("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)@end lisp@item gnus-header-button-alist@vindex gnus-header-button-alistThis is just like the other alist, except that it is applied to thearticle head only, and that each entry has an additional element that isused to say what headers to apply the buttonize coding to:@lisp(HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)@end lisp@var{header} is a regular expression.@item gnus-button-url-regexp@vindex gnus-button-url-regexpA regular expression that matches embedded URLs. It is used in thedefault values of the variables above.@item gnus-article-button-face@vindex gnus-article-button-faceFace used on buttons.@item gnus-article-mouse-face@vindex gnus-article-mouse-faceFace used when the mouse cursor is over a button.@end table@xref{Customizing Articles}, for how to buttonize articles automatically.@node Article Date@subsection Article DateThe date is most likely generated in some obscure timezone you've neverheard of, so it's quite nice to be able to find out what the time waswhen the article was sent.@table @kbd@item W T u@kindex W T u @r{(Summary)}@findex gnus-article-date-utDisplay the date in UT (aka. GMT, aka ZULU)(@code{gnus-article-date-ut}).@item W T i@kindex W T i @r{(Summary)}@findex gnus-article-date-iso8601@cindex ISO 8601Display the date in international format, aka. ISO 8601(@code{gnus-article-date-iso8601}).@item W T l@kindex W T l @r{(Summary)}@findex gnus-article-date-localDisplay the date in the local timezone (@code{gnus-article-date-local}).@item W T s@kindex W T s @r{(Summary)}@vindex gnus-article-time-format@findex gnus-article-date-user@findex format-time-stringDisplay the date using a user-defined format(@code{gnus-article-date-user}). The format is specified by the@code{gnus-article-time-format} variable, and is a string that's passedto @code{format-time-string}. See the documentation of that variablefor a list of possible format specs.@item W T e@kindex W T e @r{(Summary)}@findex gnus-article-date-lapsed@findex gnus-start-date-timer@findex gnus-stop-date-timerSay how much time has elapsed between the article was posted and now(@code{gnus-article-date-lapsed}). It looks something like:@exampleX-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago@end exampleThe value of @code{gnus-article-date-lapsed-new-header} determineswhether this header will just be added below the old Date one, or willreplace it.An advantage of using Gnus to read mail is that it converts simple bugsinto wonderful absurdities.If you want to have this line updated continually, you can put@lisp(gnus-start-date-timer)@end lispin your @file{.gnus.el} file, or you can run it off of some hook. Ifyou want to stop the timer, you can use the @code{gnus-stop-date-timer}command.@item W T o@kindex W T o @r{(Summary)}@findex gnus-article-date-originalDisplay the original date (@code{gnus-article-date-original}). This canbe useful if you normally use some other conversion function and areworried that it might be doing something totally wrong. Say, claimingthat the article was posted in 1854. Although something like that is@emph{totally} impossible. Don't you trust me? *titter*@end table@xref{Customizing Articles}, for how to display the date in yourpreferred format automatically.@node Article Signature@subsection Article Signature@cindex signatures@cindex article signature@vindex gnus-signature-separatorEach article is divided into two parts---the head and the body. Thebody can be divided into a signature part and a text part. The variablethat says what is to be considered a signature is@code{gnus-signature-separator}. This is normally the standard@samp{^-- $} as mandated by son-of-RFC 1036. However, many people usenon-standard signature separators, so this variable can also be a listof regular expressions to be tested, one by one. (Searches are donefrom the end of the body towards the beginning.) One likely value is:@lisp(setq gnus-signature-separator '("^-- $" ; The standard "^-- *$" ; A common mangling "^-------*$" ; Many people just use a looong ; line of dashes. Shame! "^ *--------*$" ; Double-shame! "^________*$" ; Underscores are also popular "^========*$")) ; Pervert!@end lispThe more permissive you are, the more likely it is that you'll get falsepositives.@vindex gnus-signature-limit@code{gnus-signature-limit} provides a limit to what is considered asignature when displaying articles.@enumerate@itemIf it is an integer, no signature may be longer (in characters) thanthat integer.@itemIf it is a floating point number, no signature may be longer (in lines)than that number.@itemIf it is a function, the function will be called without any parameters,and if it returns @code{nil}, there is no signature in the buffer.@itemIf it is a string, it will be used as a regexp. If it matches, the textin question is not a signature.@end enumerateThis variable can also be a list where the elements may be of the typeslisted above. Here's an example:@lisp(setq gnus-signature-limit '(200.0 "^---*Forwarded article"))@end lispThis means that if there are more than 200 lines after the signatureseparator, or the text after the signature separator is matched bythe regular expression @samp{^---*Forwarded article}, then it isn't asignature after all.@node Article Miscellanea@subsection Article Miscellanea@table @kbd@item A t@kindex A t @r{(Summary)}@findex gnus-article-babelTranslate the article from one language to another(@code{gnus-article-babel}).@end table@node MIME Commands@section @sc{mime} Commands@cindex MIME decoding@cindex attachments@cindex viewing attachmentsThe following commands all understand the numerical prefix. Forinstance, @kbd{3 b} means ``view the third @sc{mime} part''.@table @kbd@item b@itemx K v@kindex b @r{(Summary)}@kindex K v @r{(Summary)}View the @sc{mime} part.@item K o@kindex K o @r{(Summary)}Save the @sc{mime} part.@item K c@kindex K c @r{(Summary)}Copy the @sc{mime} part.@item K e@kindex K e @r{(Summary)}View the @sc{mime} part externally.@item K i@kindex K i @r{(Summary)}View the @sc{mime} part internally.@item K |@kindex K | @r{(Summary)}Pipe the @sc{mime} part to an external command.@end tableThe rest of these @sc{mime} commands do not use the numerical prefix inthe same manner:@table @kbd@item K b@kindex K b @r{(Summary)}Make all the @sc{mime} parts have buttons in front of them. This ismostly useful if you wish to save (or perform other actions) on inlinedparts.@item K m@kindex K m @r{(Summary)}@findex gnus-summary-repair-multipartSome multipart messages are transmitted with missing or faulty headers.This command will attempt to ``repair'' these messages so that they canbe viewed in a more pleasant manner(@code{gnus-summary-repair-multipart}).@item X m@kindex X m @r{(Summary)}@findex gnus-summary-save-partsSave all parts matching a @sc{mime} type to a directory(@code{gnus-summary-save-parts}). Understands the process/prefixconvention (@pxref{Process/Prefix}).@item M-t@kindex M-t @r{(Summary)}@findex gnus-summary-display-buttonizedToggle the buttonized display of the article buffer(@code{gnus-summary-toggle-display-buttonized}).@item W M w@kindex W M w @r{(Summary)}Decode RFC 2047-encoded words in the article headers(@code{gnus-article-decode-mime-words}).@item W M c@kindex W M c @r{(Summary)}Decode encoded article bodies as well as charsets(@code{gnus-article-decode-charset}).This command looks in the @code{Content-Type} header to determine thecharset. If there is no such header in the article, you can give it aprefix, which will prompt for the charset to decode as. In regionalgroups where people post using some common encoding (but do not includeMIME headers), you can set the @code{charset} group/topic parameter tothe required charset (@pxref{Group Parameters}).@item W M v@kindex W M v @r{(Summary)}View all the @sc{mime} parts in the current article(@code{gnus-mime-view-all-parts}).@end tableRelevant variables:@table @code@item gnus-ignored-mime-types@vindex gnus-ignored-mime-typesThis is a list of regexps. @sc{mime} types that match a regexp fromthis list will be completely ignored by Gnus. The default value is@code{nil}.To have all Vcards be ignored, you'd say something like this:@lisp(setq gnus-ignored-mime-types '("text/x-vcard"))@end lisp@item gnus-unbuttonized-mime-types@vindex gnus-unbuttonized-mime-typesThis is a list of regexps. @sc{mime} types that match a regexp fromthis list won't have @sc{mime} buttons inserted unless they aren'tdisplayed. The default value is @code{(".*/.*")}.@item gnus-article-mime-part-function@vindex gnus-article-mime-part-functionFor each @sc{mime} part, this function will be called with the @sc{mime}handle as the parameter. The function is meant to be used to allowusers to gather information from the article (e. g., add Vcard info tothe bbdb database) or to do actions based on parts (e. g., automaticallysave all jpegs into some directory).Here's an example function the does the latter:@lisp(defun my-save-all-jpeg-parts (handle) (when (equal (car (mm-handle-type handle)) "image/jpeg") (with-temp-buffer (insert (mm-get-part handle)) (write-region (point-min) (point-max) (read-file-name "Save jpeg to: ")))))(setq gnus-article-mime-part-function 'my-save-all-jpeg-parts)@end lisp@vindex gnus-mime-multipart-functions@item gnus-mime-multipart-functionsAlist of @sc{mime} multipart types and functions to handle them.@end table@node Charsets@section Charsets@cindex charsetsPeople use different charsets, and we have @sc{mime} to let us know whatcharsets they use. Or rather, we wish we had. Many people usenewsreaders and mailers that do not understand or use @sc{mime}, andjust send out messages without saying what character sets they use. Tohelp a bit with this, some local news hierarchies have policies that saywhat character set is the default. For instance, the @samp{fj}hierarchy uses @code{iso-2022-jp-2}.@vindex gnus-group-charset-alistThis knowledge is encoded in the @code{gnus-group-charset-alist}variable, which is an alist of regexps (to match group names) anddefault charsets to be used when reading these groups.In addition, some people do use soi-disant @sc{mime}-aware agents thataren't. These blithely mark messages as being in @code{iso-8859-1} evenif they really are in @code{koi-8}. To help here, the@code{gnus-newsgroup-ignored-charsets} variable can be used. Thecharsets that are listed here will be ignored. The variable can be seton a group-by-group basis using the group parameters (@pxref{GroupParameters}). The default value is @code{(unknown-8bit)}, which issomething some agents insist on having in there.@vindex gnus-group-posting-charset-alistWhen posting, @code{gnus-group-posting-charset-alist} is used todetermine which charsets should not be encoded using the @sc{mime}encodings. For instance, some hierarchies discourage usingquoted-printable header encoding.This variable is an alist of regexps and permitted unencoded charsetsfor posting. Each element of the alist has the form @code{(}@var{testheader body-list}@code{)}, where:@table @var@item testis either a regular expression matching the newsgroup header or avariable to query,@item headeris the charset which may be left unencoded in the header (@code{nil}means encode all charsets),@item body-listis a list of charsets which may be encoded using 8bit content-transferencoding in the body, or one of the special values @code{nil} (alwaysencode using quoted-printable) or @code{t} (always use 8bit).@end table@cindex Russian@cindex koi8-r@cindex koi8-u@cindex iso-8859-5@cindex coding system aliases@cindex preferred charsetOther charset tricks that may be useful, although not Gnus-specific:If there are several @sc{mime} charsets that encode the same Emacscharset, you can choose what charset to use by saying the following:@lisp(put-charset-property 'cyrillic-iso8859-5 'preferred-coding-system 'koi8-r)@end lispThis means that Russian will be encoded using @code{koi8-r} instead ofthe default @code{iso-8859-5} @sc{mime} charset.If you want to read messages in @code{koi8-u}, you can cheat and say@lisp(define-coding-system-alias 'koi8-u 'koi8-r)@end lispThis will almost do the right thing.And finally, to read charsets like @code{windows-1251}, you can saysomething like@lisp(codepage-setup 1251)(define-coding-system-alias 'windows-1251 'cp1251)@end lispwhile if you use a non-Latin-1 language environment you could see theLatin-1 subset of @code{windows-1252} using:@lisp(define-coding-system-alias 'windows-1252 'latin-1)@end lisp@node Article Commands@section Article Commands@table @kbd@item A P@cindex PostScript@cindex printing@kindex A P @r{(Summary)}@vindex gnus-ps-print-hook@findex gnus-summary-print-articleGenerate and print a PostScript image of the article buffer(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will berun just before printing the buffer.@end table@node Summary Sorting@section Summary Sorting@cindex summary sortingYou can have the summary buffer sorted in various ways, even though Ican't really see why you'd want that.@table @kbd@item C-c C-s C-n@kindex C-c C-s C-n @r{(Summary)}@findex gnus-summary-sort-by-numberSort by article number (@code{gnus-summary-sort-by-number}).@item C-c C-s C-a@kindex C-c C-s C-a @r{(Summary)}@findex gnus-summary-sort-by-authorSort by author (@code{gnus-summary-sort-by-author}).@item C-c C-s C-s@kindex C-c C-s C-s @r{(Summary)}@findex gnus-summary-sort-by-subjectSort by subject (@code{gnus-summary-sort-by-subject}).@item C-c C-s C-d@kindex C-c C-s C-d @r{(Summary)}@findex gnus-summary-sort-by-dateSort by date (@code{gnus-summary-sort-by-date}).@item C-c C-s C-l@kindex C-c C-s C-l @r{(Summary)}@findex gnus-summary-sort-by-linesSort by lines (@code{gnus-summary-sort-by-lines}).@item C-c C-s C-c@kindex C-c C-s C-c @r{(Summary)}@findex gnus-summary-sort-by-charsSort by article length (@code{gnus-summary-sort-by-chars}).@item C-c C-s C-i@kindex C-c C-s C-i @r{(Summary)}@findex gnus-summary-sort-by-scoreSort by score (@code{gnus-summary-sort-by-score}).@end tableThese functions will work both when you use threading and when you don'tuse threading. In the latter case, all summary lines will be sorted,line by line. In the former case, sorting will be done on aroot-by-root basis, which might not be what you were looking for. Totoggle whether to use threading, type @kbd{T T} (@pxref{ThreadCommands}).@node Finding the Parent@section Finding the Parent@cindex parent articles@cindex referring articles@table @kbd@item ^@kindex ^ @r{(Summary)}@findex gnus-summary-refer-parent-articleIf you'd like to read the parent of the current article, and it is notdisplayed in the summary buffer, you might still be able to. That is,if the current group is fetched by @sc{nntp}, the parent hasn't expiredand the @code{References} in the current article are not mangled, youcan just press @kbd{^} or @kbd{A r}(@code{gnus-summary-refer-parent-article}). If everything goes well,you'll get the parent. If the parent is already displayed in thesummary buffer, point will just move to this article.If given a positive numerical prefix, fetch that many articles back intothe ancestry. If given a negative numerical prefix, fetch just thatancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, thegrandparent and the grandgrandparent of the current article. If you say@kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the currentarticle.@item A R @r{(Summary)}@findex gnus-summary-refer-references@kindex A R @r{(Summary)}Fetch all articles mentioned in the @code{References} header of thearticle (@code{gnus-summary-refer-references}).@item A T @r{(Summary)}@findex gnus-summary-refer-thread@kindex A T @r{(Summary)}Display the full thread where the current article appears(@code{gnus-summary-refer-thread}). This command has to fetch all theheaders in the current group to work, so it usually takes a while. Ifyou do it often, you may consider setting @code{gnus-fetch-old-headers}to @code{invisible} (@pxref{Filling In Threads}). This won't have anyvisible effects normally, but it'll make this command work a whole lotfaster. Of course, it'll make group entry somewhat slow.@vindex gnus-refer-thread-limitThe @code{gnus-refer-thread-limit} variable says how many old (i. e.,articles before the first displayed in the current group) headers tofetch when doing this command. The default is 200. If @code{t}, allthe available headers will be fetched. This variable can be overriddenby giving the @kbd{A T} command a numerical prefix.@item M-^ @r{(Summary)}@findex gnus-summary-refer-article@kindex M-^ @r{(Summary)}@cindex Message-ID@cindex fetching by Message-IDYou can also ask the @sc{nntp} server for an arbitrary article, nomatter what group it belongs to. @kbd{M-^}(@code{gnus-summary-refer-article}) will ask you for a@code{Message-ID}, which is one of those long, hard-to-read thingiesthat look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. Youhave to get it all exactly right. No fuzzy searches, I'm afraid.@end tableThe current select method will be used when fetching by@code{Message-ID} from non-news select method, but you can override thisby giving this command a prefix.@vindex gnus-refer-article-methodIf the group you are reading is located on a back end that does notsupport fetching by @code{Message-ID} very well (like @code{nnspool}),you can set @code{gnus-refer-article-method} to an @sc{nntp} method. Itwould, perhaps, be best if the @sc{nntp} server you consult is the oneupdating the spool you are reading from, but that's not reallynecessary.It can also be a list of select methods, as well as the special symbol@code{current}, which means to use the current select method. If itis a list, Gnus will try all the methods in the list until it finds amatch.Here's an example setting that will first try the current method, andthen ask Deja if that fails:@lisp(setq gnus-refer-article-method '(current (nnweb "refer" (nnweb-type dejanews))))@end lispMost of the mail back ends support fetching by @code{Message-ID}, but donot do a particularly excellent job at it. That is, @code{nnmbox} and@code{nnbabyl} are able to locate articles from any groups, while@code{nnml} and @code{nnfolder} are only able to locate articles thathave been posted to the current group. (Anything else would be too timeconsuming.) @code{nnmh} does not support this at all.@node Alternative Approaches@section Alternative ApproachesDifferent people like to read news using different methods. This beingGnus, we offer a small selection of minor modes for the summary buffers.@menu* Pick and Read:: First mark articles and then read them.* Binary Groups:: Auto-decode all articles.@end menu@node Pick and Read@subsection Pick and Read@cindex pick and readSome newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) usea two-phased reading interface. The user first marks in a summarybuffer the articles she wants to read. Then she starts reading thearticles with just an article buffer displayed.@findex gnus-pick-mode@kindex M-x gnus-pick-modeGnus provides a summary buffer minor mode that allowsthis---@code{gnus-pick-mode}. This basically means that a few processmark commands become one-keystroke commands to allow easy marking, andit provides one additional command for switching to the summary buffer.Here are the available keystrokes when using pick mode:@table @kbd@item .@kindex . (Pick)@findex gnus-pick-article-or-threadPick the article or thread on the current line(@code{gnus-pick-article-or-thread}). If the variable@code{gnus-thread-hide-subtree} is true, then this key selects theentire thread when used at the first article of the thread. Otherwise,it selects just the article. If given a numerical prefix, go to thatthread or article and pick it. (The line number is normally displayedat the beginning of the summary pick lines.)@item @key{SPC}@kindex @key{SPC} (Pick)@findex gnus-pick-next-pageScroll the summary buffer up one page (@code{gnus-pick-next-page}). Ifat the end of the buffer, start reading the picked articles.@item u@kindex u (Pick)@findex gnus-pick-unmark-article-or-thread.Unpick the thread or article(@code{gnus-pick-unmark-article-or-thread}). If the variable@code{gnus-thread-hide-subtree} is true, then this key unpicks thethread if used at the first article of the thread. Otherwise it unpicksjust the article. You can give this key a numerical prefix to unpickthe thread or article at that line.@item @key{RET}@kindex @key{RET} (Pick)@findex gnus-pick-start-reading@vindex gnus-pick-display-summaryStart reading the picked articles (@code{gnus-pick-start-reading}). Ifgiven a prefix, mark all unpicked articles as read first. If@code{gnus-pick-display-summary} is non-@code{nil}, the summary bufferwill still be visible when you are reading.@end tableAll the normal summary mode commands are still available in thepick-mode, with the exception of @kbd{u}. However @kbd{!} is availablewhich is mapped to the same function@code{gnus-summary-tick-article-forward}.If this sounds like a good idea to you, you could say:@lisp(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)@end lisp@vindex gnus-pick-mode-hook@code{gnus-pick-mode-hook} is run in pick minor mode buffers.@vindex gnus-mark-unpicked-articles-as-readIf @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, markall unpicked articles as read. The default is @code{nil}.@vindex gnus-summary-pick-line-formatThe summary line format in pick mode is slightly different from thestandard format. At the beginning of each line the line number isdisplayed. The pick mode line format is controlled by the@code{gnus-summary-pick-line-format} variable (@pxref{FormattingVariables}). It accepts the same format specs that@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).@node Binary Groups@subsection Binary Groups@cindex binary groups@findex gnus-binary-mode@kindex M-x gnus-binary-modeIf you spend much time in binary groups, you may grow tired of hitting@kbd{X u}, @kbd{n}, @key{RET} all the time. @kbd{M-x gnus-binary-mode}is a minor mode for summary buffers that makes all ordinary Gnus articleselection functions uudecode series of articles and display the resultinstead of just displaying the articles the normal way.@kindex g (Binary)@findex gnus-binary-show-articleThe only way, in fact, to see the actual articles is the @kbd{g}command, when you have turned on this mode(@code{gnus-binary-show-article}).@vindex gnus-binary-mode-hook@code{gnus-binary-mode-hook} is called in binary minor mode buffers.@node Tree Display@section Tree Display@cindex trees@vindex gnus-use-treesIf you don't like the normal Gnus summary display, you might try setting@code{gnus-use-trees} to @code{t}. This will create (by default) anadditional @dfn{tree buffer}. You can execute all summary mode commandsin the tree buffer.There are a few variables to customize the tree display, of course:@table @code@item gnus-tree-mode-hook@vindex gnus-tree-mode-hookA hook called in all tree mode buffers.@item gnus-tree-mode-line-format@vindex gnus-tree-mode-line-formatA format string for the mode bar in the tree mode buffers (@pxref{ModeLine Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a listof valid specs, @pxref{Summary Buffer Mode Line}.@item gnus-selected-tree-face@vindex gnus-selected-tree-faceFace used for highlighting the selected article in the tree buffer. Thedefault is @code{modeline}.@item gnus-tree-line-format@vindex gnus-tree-line-formatA format string for the tree nodes. The name is a bit of a misnomer,though---it doesn't define a line, but just the node. The default valueis @samp{%(%[%3,3n%]%)}, which displays the first three characters ofthe name of the poster. It is vital that all nodes are of the samelength, so you @emph{must} use @samp{%4,4n}-like specifiers.Valid specs are:@table @samp@item nThe name of the poster.@item fThe @code{From} header.@item NThe number of the article.@item [The opening bracket.@item ]The closing bracket.@item sThe subject.@end table@xref{Formatting Variables}.Variables related to the display are:@table @code@item gnus-tree-brackets@vindex gnus-tree-bracketsThis is used for differentiating between ``real'' articles and``sparse'' articles. The format is @code{((@var{real-open} . @var{real-close})(@var{sparse-open} . @var{sparse-close}) (@var{dummy-open} . @var{dummy-close}))}, and thedefault is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.@item gnus-tree-parent-child-edges@vindex gnus-tree-parent-child-edgesThis is a list that contains the characters used for connecting parentnodes to their children. The default is @code{(?- ?\\ ?|)}.@end table@item gnus-tree-minimize-window@vindex gnus-tree-minimize-windowIf this variable is non-@code{nil}, Gnus will try to keep the treebuffer as small as possible to allow more room for the other Gnuswindows. If this variable is a number, the tree buffer will never behigher than that number. The default is @code{t}. Note that if youhave several windows displayed side-by-side in a frame and the treebuffer is one of these, minimizing the tree window will also resize allother windows displayed next to it.@item gnus-generate-tree-function@vindex gnus-generate-tree-function@findex gnus-generate-horizontal-tree@findex gnus-generate-vertical-treeThe function that actually generates the thread tree. Two predefinedfunctions are available: @code{gnus-generate-horizontal-tree} and@code{gnus-generate-vertical-tree} (which is the default).@end tableHere's an example from a horizontal tree buffer:@example@{***@}-(***)-[odd]-[Gun] | \[Jan] | \[odd]-[Eri] | \(***)-[Eri] | \[odd]-[Paa] \[Bjo] \[Gun] \[Gun]-[Jor]@end exampleHere's the same thread displayed in a vertical tree buffer:@example@{***@} |--------------------------\-----\-----\(***) [Bjo] [Gun] [Gun] |--\-----\-----\ |[odd] [Jan] [odd] (***) [Jor] | | |--\[Gun] [Eri] [Eri] [odd] | [Paa]@end exampleIf you're using horizontal trees, it might be nice to display the treesside-by-side with the summary buffer. You could add something like thefollowing to your @file{.gnus.el} file:@lisp(setq gnus-use-trees t gnus-generate-tree-function 'gnus-generate-horizontal-tree gnus-tree-minimize-window nil)(gnus-add-configuration '(article (vertical 1.0 (horizontal 0.25 (summary 0.75 point) (tree 1.0)) (article 1.0))))@end lisp@xref{Windows Configuration}.@node Mail Group Commands@section Mail Group Commands@cindex mail group commandsSome commands only make sense in mail groups. If these commands areinvalid in the current group, they will raise a hell and let you know.All these commands (except the expiry and edit commands) use theprocess/prefix convention (@pxref{Process/Prefix}).@table @kbd@item B e@kindex B e @r{(Summary)}@findex gnus-summary-expire-articlesExpire all expirable articles in the group(@code{gnus-summary-expire-articles}).@item B C-M-e@kindex B C-M-e @r{(Summary)}@findex gnus-summary-expire-articles-nowDelete all the expirable articles in the group(@code{gnus-summary-expire-articles-now}). This means that @strong{all}articles eligible for expiry in the current group willdisappear forever into that big @file{/dev/null} in the sky.@item B @key{DEL}@kindex B @key{DEL} @r{(Summary)}@findex gnus-summary-delete-article@c @icon{gnus-summary-mail-delete}Delete the mail article. This is ``delete'' as in ``delete it from yourdisk forever and ever, never to return again.'' Use with caution.(@code{gnus-summary-delete-article}).@item B m@kindex B m @r{(Summary)}@cindex move mail@findex gnus-summary-move-article@vindex gnus-preserve-marksMove the article from one mail group to another(@code{gnus-summary-move-article}). Marks will be preserved if@var{gnus-preserve-marks} is non-@code{nil} (which is the default).@item B c@kindex B c @r{(Summary)}@cindex copy mail@findex gnus-summary-copy-article@c @icon{gnus-summary-mail-copy}Copy the article from one group (mail group or not) to a mail group(@code{gnus-summary-copy-article}). Marks will be preserved if@var{gnus-preserve-marks} is non-@code{nil} (which is the default).@item B B@kindex B B @r{(Summary)}@cindex crosspost mail@findex gnus-summary-crosspost-articleCrosspost the current article to some other group(@code{gnus-summary-crosspost-article}). This will create a new copy ofthe article in the other group, and the Xref headers of the article willbe properly updated.@item B i@kindex B i @r{(Summary)}@findex gnus-summary-import-articleImport an arbitrary file into the current mail newsgroup(@code{gnus-summary-import-article}). You will be prompted for a filename, a @code{From} header and a @code{Subject} header.@item B r@kindex B r @r{(Summary)}@findex gnus-summary-respool-articleRespool the mail article (@code{gnus-summary-respool-article}).@code{gnus-summary-respool-default-method} will be used as the defaultselect method when respooling. This variable is @code{nil} by default,which means that the current group select method will be used instead.Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil}(which is the default).@item B w@itemx e@kindex B w @r{(Summary)}@kindex e @r{(Summary)}@findex gnus-summary-edit-article@kindex C-c C-c @r{(Article)}Edit the current article (@code{gnus-summary-edit-article}). To finishediting and make the changes permanent, type @kbd{C-c C-c}(@kbd{gnus-summary-edit-article-done}). If you give a prefix to the@kbd{C-c C-c} command, Gnus won't re-highlight the article.@item B q@kindex B q @r{(Summary)}@findex gnus-summary-respool-queryIf you want to re-spool an article, you might be curious as to what groupthe article will end up in before you do the re-spooling. This commandwill tell you (@code{gnus-summary-respool-query}).@item B t@kindex B t @r{(Summary)}@findex gnus-summary-respool-traceSimilarly, this command will display all fancy splitting patterns usedwhen repooling, if any (@code{gnus-summary-respool-trace}).@item B p@kindex B p @r{(Summary)}@findex gnus-summary-article-posted-pSome people have a tendency to send you "courtesy" copies when theyfollow up to articles you have posted. These usually have a@code{Newsgroups} header in them, but not always. This command(@code{gnus-summary-article-posted-p}) will try to fetch the currentarticle from your news server (or rather, from@code{gnus-refer-article-method} or @code{gnus-select-method}) and willreport back whether it found the article or not. Even if it says thatit didn't find the article, it may have been posted anyway---mailpropagation is much faster than news propagation, and the news copy mayjust not have arrived yet.@end table@vindex gnus-move-split-methods@cindex moving articlesIf you move (or copy) articles regularly, you might wish to have Gnussuggest where to put the articles. @code{gnus-move-split-methods} is avariable that uses the same syntax as @code{gnus-split-methods}(@pxref{Saving Articles}). You may customize that variable to createsuggestions you find reasonable. (Note that@code{gnus-move-split-methods} uses group names where@code{gnus-split-methods} uses file names.)@lisp(setq gnus-move-split-methods '(("^From:.*Lars Magne" "nnml:junk") ("^Subject:.*gnus" "nnfolder:important") (".*" "nnml:misc")))@end lisp@node Various Summary Stuff@section Various Summary Stuff@menu* Summary Group Information:: Information oriented commands.* Searching for Articles:: Multiple article commands.* Summary Generation Commands:: (Re)generating the summary buffer.* Really Various Summary Commands:: Those pesky non-conformant commands.@end menu@table @code@vindex gnus-summary-mode-hook@item gnus-summary-mode-hookThis hook is called when creating a summary mode buffer.@vindex gnus-summary-generate-hook@item gnus-summary-generate-hookThis is called as the last thing before doing the threading and thegeneration of the summary buffer. It's quite convenient for customizingthe threading variables based on what data the newsgroup has. This hookis called from the summary buffer after most summary buffer variableshave been set.@vindex gnus-summary-prepare-hook@item gnus-summary-prepare-hookIt is called after the summary buffer has been generated. You might useit to, for instance, highlight lines or modify the look of the buffer insome other ungodly manner. I don't care.@vindex gnus-summary-prepared-hook@item gnus-summary-prepared-hookA hook called as the very last thing after the summary buffer has beengenerated.@vindex gnus-summary-ignore-duplicates@item gnus-summary-ignore-duplicatesWhen Gnus discovers two articles that have the same @code{Message-ID},it has to do something drastic. No articles are allowed to have thesame @code{Message-ID}, but this may happen when reading mail from somesources. Gnus allows you to customize what happens with this variable.If it is @code{nil} (which is the default), Gnus will rename the@code{Message-ID} (for display purposes only) and display the article asany other article. If this variable is @code{t}, it won't display thearticle---it'll be as if it never existed.@vindex gnus-alter-articles-to-read-function@item gnus-alter-articles-to-read-functionThis function, which takes two parameters (the group name and the listof articles to be selected), is called to allow the user to alter thelist of articles to be selected.For instance, the following function adds the list of cached articles tothe list in one particular group:@lisp(defun my-add-cached-articles (group articles) (if (string= group "some.group") (append gnus-newsgroup-cached articles) articles))@end lisp@end table@node Summary Group Information@subsection Summary Group Information@table @kbd@item H f@kindex H f @r{(Summary)}@findex gnus-summary-fetch-faq@vindex gnus-group-faq-directoryTry to fetch the FAQ (list of frequently asked questions) for thecurrent group (@code{gnus-summary-fetch-faq}). Gnus will try to get theFAQ from @code{gnus-group-faq-directory}, which is usually a directoryon a remote machine. This variable can also be a list of directories.In that case, giving a prefix to this command will allow you to choosebetween the various sites. @code{ange-ftp} or @code{efs} will probablybe used for fetching the file.@item H d@kindex H d @r{(Summary)}@findex gnus-summary-describe-groupGive a brief description of the current group(@code{gnus-summary-describe-group}). If given a prefix, forcerereading the description from the server.@item H h@kindex H h @r{(Summary)}@findex gnus-summary-describe-brieflyGive an extremely brief description of the most important summarykeystrokes (@code{gnus-summary-describe-briefly}).@item H i@kindex H i @r{(Summary)}@findex gnus-info-find-nodeGo to the Gnus info node (@code{gnus-info-find-node}).@end table@node Searching for Articles@subsection Searching for Articles@table @kbd@item M-s@kindex M-s @r{(Summary)}@findex gnus-summary-search-article-forwardSearch through all subsequent articles for a regexp(@code{gnus-summary-search-article-forward}).@item M-r@kindex M-r @r{(Summary)}@findex gnus-summary-search-article-backwardSearch through all previous articles for a regexp(@code{gnus-summary-search-article-backward}).@item &@kindex & @r{(Summary)}@findex gnus-summary-execute-commandThis command will prompt you for a header, a regular expression to matchon this field, and a command to be executed if the match is made(@code{gnus-summary-execute-command}). If the header is an emptystring, the match is done on the entire article. If given a prefix,search backward instead.For instance, @kbd{& @key{RET} some.*string #} will put the process mark onall articles that have heads or bodies that match @samp{some.*string}.@item M-&@kindex M-& @r{(Summary)}@findex gnus-summary-universal-argumentPerform any operation on all articles that have been marked withthe process mark (@code{gnus-summary-universal-argument}).@end table@node Summary Generation Commands@subsection Summary Generation Commands@table @kbd@item Y g@kindex Y g @r{(Summary)}@findex gnus-summary-prepareRegenerate the current summary buffer (@code{gnus-summary-prepare}).@item Y c@kindex Y c @r{(Summary)}@findex gnus-summary-insert-cached-articlesPull all cached articles (for the current group) into the summary buffer(@code{gnus-summary-insert-cached-articles}).@end table@node Really Various Summary Commands@subsection Really Various Summary Commands@table @kbd@item A D@itemx C-d@kindex C-d @r{(Summary)}@kindex A D @r{(Summary)}@findex gnus-summary-enter-digest-groupIf the current article is a collection of other articles (for instance,a digest), you might use this command to enter a group based on the thatarticle (@code{gnus-summary-enter-digest-group}). Gnus will try toguess what article type is currently displayed unless you give a prefixto this command, which forces a ``digest'' interpretation. Basically,whenever you see a message that is a collection of other messages ofsome format, you @kbd{C-d} and read these messages in a more convenientfashion.@item C-M-d@kindex C-M-d @r{(Summary)}@findex gnus-summary-read-documentThis command is very similar to the one above, but lets you gatherseveral documents into one biiig group(@code{gnus-summary-read-document}). It does this by opening several@code{nndoc} groups for each document, and then opening an@code{nnvirtual} group on top of these @code{nndoc} groups. Thiscommand understands the process/prefix convention(@pxref{Process/Prefix}).@item C-t@kindex C-t @r{(Summary)}@findex gnus-summary-toggle-truncationToggle truncation of summary lines(@code{gnus-summary-toggle-truncation}). This will probably confuse theline centering function in the summary buffer, so it's not a good ideato have truncation switched off while reading articles.@item =@kindex = @r{(Summary)}@findex gnus-summary-expand-windowExpand the summary buffer window (@code{gnus-summary-expand-window}).If given a prefix, force an @code{article} window configuration.@item C-M-e@kindex C-M-e @r{(Summary)}@findex gnus-summary-edit-parametersEdit the group parameters (@pxref{Group Parameters}) of the currentgroup (@code{gnus-summary-edit-parameters}).@item C-M-a@kindex C-M-a @r{(Summary)}@findex gnus-summary-customize-parametersCustomize the group parameters (@pxref{Group Parameters}) of the currentgroup (@code{gnus-summary-customize-parameters}).@end table@node Exiting the Summary Buffer@section Exiting the Summary Buffer@cindex summary exit@cindex exiting groupsExiting from the summary buffer will normally update all info on thegroup and return you to the group buffer.@table @kbd@item Z Z@itemx q@kindex Z Z @r{(Summary)}@kindex q @r{(Summary)}@findex gnus-summary-exit@vindex gnus-summary-exit-hook@vindex gnus-summary-prepare-exit-hook@c @icon{gnus-summary-exit}Exit the current group and update all information on the group(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} iscalled before doing much of the exiting, which calls@code{gnus-summary-expire-articles} by default.@code{gnus-summary-exit-hook} is called after finishing the exitprocess. @code{gnus-group-no-more-groups-hook} is run when returning togroup mode having no more (unread) groups.@item Z E@itemx Q@kindex Z E @r{(Summary)}@kindex Q @r{(Summary)}@findex gnus-summary-exit-no-updateExit the current group without updating any information on the group(@code{gnus-summary-exit-no-update}).@item Z c@itemx c@kindex Z c @r{(Summary)}@kindex c @r{(Summary)}@findex gnus-summary-catchup-and-exit@c @icon{gnus-summary-catchup-and-exit}Mark all unticked articles in the group as read and then exit(@code{gnus-summary-catchup-and-exit}).@item Z C@kindex Z C @r{(Summary)}@findex gnus-summary-catchup-all-and-exitMark all articles, even the ticked ones, as read and then exit(@code{gnus-summary-catchup-all-and-exit}).@item Z n@kindex Z n @r{(Summary)}@findex gnus-summary-catchup-and-goto-next-groupMark all articles as read and go to the next group(@code{gnus-summary-catchup-and-goto-next-group}).@item Z R@kindex Z R @r{(Summary)}@findex gnus-summary-reselect-current-groupExit this group, and then enter it again(@code{gnus-summary-reselect-current-group}). If given a prefix, selectall articles, both read and unread.@item Z G@itemx M-g@kindex Z G @r{(Summary)}@kindex M-g @r{(Summary)}@findex gnus-summary-rescan-group@c @icon{gnus-summary-mail-get}Exit the group, check for new articles in the group, and select thegroup (@code{gnus-summary-rescan-group}). If given a prefix, select allarticles, both read and unread.@item Z N@kindex Z N @r{(Summary)}@findex gnus-summary-next-groupExit the group and go to the next group(@code{gnus-summary-next-group}).@item Z P@kindex Z P @r{(Summary)}@findex gnus-summary-prev-groupExit the group and go to the previous group(@code{gnus-summary-prev-group}).@item Z s@kindex Z s @r{(Summary)}@findex gnus-summary-save-newsrcSave the current number of read/marked articles in the dribble bufferand then save the dribble buffer (@code{gnus-summary-save-newsrc}). Ifgiven a prefix, also save the @file{.newsrc} file(s). Using thiscommand will make exit without updating (the @kbd{Q} command) worthless.@end table@vindex gnus-exit-group-hook@code{gnus-exit-group-hook} is called when you exit the current groupwith an ``updating'' exit. For instance @kbd{Q}(@code{gnus-summary-exit-no-update}) does not call this hook.@findex gnus-summary-wake-up-the-dead@findex gnus-dead-summary-mode@vindex gnus-kill-summary-on-exitIf you're in the habit of exiting groups, and then changing your mindabout it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.If you do that, Gnus won't kill the summary buffer when you exit it.(Quelle surprise!) Instead it will change the name of the buffer tosomething like @samp{*Dead Summary ... *} and install a minor modecalled @code{gnus-dead-summary-mode}. Now, if you switch back to thisbuffer, you'll find that all keys are mapped to a function called@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a deadsummary buffer will result in a live, normal summary buffer.There will never be more than one dead summary buffer at any one time.@vindex gnus-use-cross-referenceThe data on the current group will be updated (which articles you haveread, which articles you have replied to, etc.) when you exit thesummary buffer. If the @code{gnus-use-cross-reference} variable is@code{t} (which is the default), articles that are cross-referenced tothis group and are marked as read, will also be marked as read in theother subscribed groups they were cross-posted to. If this variable isneither @code{nil} nor @code{t}, the article will be marked as read inboth subscribed and unsubscribed groups (@pxref{Crosspost Handling}).@node Crosspost Handling@section Crosspost Handling@cindex velveeta@cindex spammingMarking cross-posted articles as read ensures that you'll never have toread the same article more than once. Unless, of course, somebody hasposted it to several groups separately. Posting the same article toseveral groups (not cross-posting) is called @dfn{spamming}, and you areby law required to send nasty-grams to anyone who perpetrates such aheinous crime. You may want to try NoCeM handling to filter out spam(@pxref{NoCeM}).Remember: Cross-posting is kinda ok, but posting the same articleseparately to several groups is not. Massive cross-posting (aka.@dfn{velveeta}) is to be avoided at all costs, and you can even use the@code{gnus-summary-mail-crosspost-complaint} command to complain aboutexcessive crossposting (@pxref{Summary Mail Commands}).@cindex cross-posting@cindex Xref@cindex @sc{nov}One thing that may cause Gnus to not do the cross-posting thingcorrectly is if you use an @sc{nntp} server that supports @sc{xover}(which is very nice, because it speeds things up considerably) whichdoes not include the @code{Xref} header in its @sc{nov} lines. This isEvil, but all too common, alas, alack. Gnus tries to Do The Right Thingeven with @sc{xover} by registering the @code{Xref} lines of allarticles you actually read, but if you kill the articles, or just markthem as read without reading them, Gnus will not get a chance to snoopthe @code{Xref} lines out of these articles, and will be unable to usethe cross reference mechanism.@cindex LIST overview.fmt@cindex overview.fmtTo check whether your @sc{nntp} server includes the @code{Xref} headerin its overview files, try @samp{telnet your.nntp.server nntp},@samp{MODE READER} on @code{inn} servers, and then say @samp{LISToverview.fmt}. This may not work, but if it does, and the last line youget does not read @samp{Xref:full}, then you should shout and whine atyour news admin until she includes the @code{Xref} header in theoverview files.@vindex gnus-nov-is-evilIf you want Gnus to get the @code{Xref}s right all the time, you have toset @code{gnus-nov-is-evil} to @code{t}, which slows things downconsiderably.C'est la vie.For an alternative approach, @pxref{Duplicate Suppression}.@node Duplicate Suppression@section Duplicate SuppressionBy default, Gnus tries to make sure that you don't have to read the samearticle more than once by utilizing the crossposting mechanism(@pxref{Crosspost Handling}). However, that simple and efficientapproach may not work satisfactory for some users for variousreasons.@enumerate@itemThe @sc{nntp} server may fail to generate the @code{Xref} header. Thisis evil and not very common.@itemThe @sc{nntp} server may fail to include the @code{Xref} header in the@file{.overview} data bases. This is evil and all too common, alas.@itemYou may be reading the same group (or several related groups) fromdifferent @sc{nntp} servers.@itemYou may be getting mail that duplicates articles posted to groups.@end enumerateI'm sure there are other situations where @code{Xref} handling fails aswell, but these four are the most common situations.If, and only if, @code{Xref} handling fails for you, then you mayconsider switching on @dfn{duplicate suppression}. If you do so, Gnuswill remember the @code{Message-ID}s of all articles you have read orotherwise marked as read, and then, as if by magic, mark them as readall subsequent times you see them---in @emph{all} groups. Using thismechanism is quite likely to be somewhat inefficient, but not overlyso. It's certainly preferable to reading the same articles more thanonce.Duplicate suppression is not a very subtle instrument. It's more like asledge hammer than anything else. It works in a very simplefashion---if you have marked an article as read, it adds this Message-IDto a cache. The next time it sees this Message-ID, it will mark thearticle as read with the @samp{M} mark. It doesn't care what group itsaw the article in.@table @code@item gnus-suppress-duplicates@vindex gnus-suppress-duplicatesIf non-@code{nil}, suppress duplicates.@item gnus-save-duplicate-list@vindex gnus-save-duplicate-listIf non-@code{nil}, save the list of duplicates to a file. This willmake startup and shutdown take longer, so the default is @code{nil}.However, this means that only duplicate articles read in a single Gnussession are suppressed.@item gnus-duplicate-list-length@vindex gnus-duplicate-list-lengthThis variable says how many @code{Message-ID}s to keep in the duplicatesuppression list. The default is 10000.@item gnus-duplicate-file@vindex gnus-duplicate-fileThe name of the file to store the duplicate suppression list in. Thedefault is @file{~/News/suppression}.@end tableIf you have a tendency to stop and start Gnus often, setting@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. Ifyou leave Gnus running for weeks on end, you may have it @code{nil}. Onthe other hand, saving the list makes startup and shutdown much slower,so that means that if you stop and start Gnus often, you should set@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this upto you to figure out, I think.@node The Article Buffer@chapter The Article Buffer@cindex article bufferThe articles are displayed in the article buffer, of which there is onlyone. All the summary buffers share the same article buffer unless youtell Gnus otherwise.@menu* Hiding Headers:: Deciding what headers should be displayed.* Using MIME:: Pushing articles through @sc{mime} before reading them.* Customizing Articles:: Tailoring the look of the articles.* Article Keymap:: Keystrokes available in the article buffer.* Misc Article:: Other stuff.@end menu@node Hiding Headers@section Hiding Headers@cindex hiding headers@cindex deleting headersThe top section of each article is the @dfn{head}. (The rest is the@dfn{body}, but you may have guessed that already.)@vindex gnus-show-all-headersThere is a lot of useful information in the head: the name of the personwho wrote the article, the date it was written and the subject of thearticle. That's well and nice, but there's also lots of informationmost people do not want to see---what systems the article has passedthrough before reaching you, the @code{Message-ID}, the@code{References}, etc. ad nauseum---and you'll probably want to get ridof some of those lines. If you want to keep all those lines in thearticle buffer, you can set @code{gnus-show-all-headers} to @code{t}.Gnus provides you with two variables for sifting headers:@table @code@item gnus-visible-headers@vindex gnus-visible-headersIf this variable is non-@code{nil}, it should be a regular expressionthat says what headers you wish to keep in the article buffer. Allheaders that do not match this variable will be hidden.For instance, if you only want to see the name of the person who wrotethe article and the subject, you'd say:@lisp(setq gnus-visible-headers "^From:\\|^Subject:")@end lispThis variable can also be a list of regexps to match headers toremain visible.@item gnus-ignored-headers@vindex gnus-ignored-headersThis variable is the reverse of @code{gnus-visible-headers}. If thisvariable is set (and @code{gnus-visible-headers} is @code{nil}), itshould be a regular expression that matches all lines that you want tohide. All lines that do not match this variable will remain visible.For instance, if you just want to get rid of the @code{References} lineand the @code{Xref} line, you might say:@lisp(setq gnus-ignored-headers "^References:\\|^Xref:")@end lispThis variable can also be a list of regexps to match headers tobe removed.Note that if @code{gnus-visible-headers} is non-@code{nil}, thisvariable will have no effect.@end table@vindex gnus-sorted-header-listGnus can also sort the headers for you. (It does this by default.) Youcan control the sorting by setting the @code{gnus-sorted-header-list}variable. It is a list of regular expressions that says in what orderthe headers are to be displayed.For instance, if you want the name of the author of the article first,and then the subject, you might say something like:@lisp(setq gnus-sorted-header-list '("^From:" "^Subject:"))@end lispAny headers that are to remain visible, but are not listed in thisvariable, will be displayed in random order after all the headers listed in this variable.@findex gnus-article-hide-boring-headers@vindex gnus-boring-article-headersYou can hide further boring headers by setting@code{gnus-treat-hide-boring-header} to @code{head}. What this functiondoes depends on the @code{gnus-boring-article-headers} variable. It's alist, but this list doesn't actually contain header names. Instead islists various @dfn{boring conditions} that Gnus can check and removefrom sight.These conditions are:@table @code@item emptyRemove all empty headers.@item followup-toRemove the @code{Followup-To} header if it is identical to the@code{Newsgroups} header.@item reply-toRemove the @code{Reply-To} header if it lists the same address as the@code{From} header.@item newsgroupsRemove the @code{Newsgroups} header if it only contains the current groupname.@item dateRemove the @code{Date} header if the article is less than three daysold.@item long-toRemove the @code{To} header if it is very long.@item many-toRemove all @code{To} headers if there are more than one.@end tableTo include the four three elements, you could say something like;@lisp(setq gnus-boring-article-headers '(empty followup-to reply-to))@end lispThis is also the default value for this variable.@node Using MIME@section Using @sc{mime}@cindex @sc{mime}Mime is a standard for waving your hands through the air, aimlessly,while people stand around yawning.@sc{mime}, however, is a standard for encoding your articles, aimlessly,while all newsreaders die of fear.@sc{mime} may specify what character set the article uses, the encodingof the characters, and it also makes it possible to embed pictures andother naughty stuff in innocent-looking articles.@vindex gnus-display-mime-function@findex gnus-display-mimeGnus pushes @sc{mime} articles through @code{gnus-display-mime-function}to display the @sc{mime} parts. This is @code{gnus-display-mime} bydefault, which creates a bundle of clickable buttons that can be used todisplay, save and manipulate the @sc{mime} objects.The following commands are available when you have placed point over a@sc{mime} button:@table @kbd@findex gnus-article-press-button@item @key{RET} @r{(Article)}@itemx Mouse-2 @r{(Article)}Toggle displaying of the @sc{mime} object(@code{gnus-article-press-button}).@findex gnus-mime-view-part@item M-@key{RET} @r{(Article)}@itemx v @r{(Article)}Prompt for a method, and then view the @sc{mime} object using thismethod (@code{gnus-mime-view-part}).@findex gnus-mime-save-part@item o @r{(Article)}Prompt for a file name, and then save the @sc{mime} object(@code{gnus-mime-save-part}).@findex gnus-mime-copy-part@item c @r{(Article)}Copy the @sc{mime} object to a fresh buffer and display this buffer(@code{gnus-mime-copy-part}).@findex gnus-mime-view-part-as-type@item t @r{(Article)}View the @sc{mime} object as if it were a different @sc{mime} media type(@code{gnus-mime-view-part-as-type}).@findex gnus-mime-pipe-part@item | @r{(Article)}Output the @sc{mime} object to a process (@code{gnus-mime-pipe-part}).@findex gnus-mime-inline-part@item i @r{(Article)}Insert the contents of the @sc{mime} object into the buffer(@code{gnus-mime-inline-part}) as text/plain. If given a prefix, insertthe raw contents without decoding. If given a numerical prefix, you cando semi-manual charset stuff (see@code{gnus-summary-show-article-charset-alist} in @pxref{Paging theArticle}).@findex gnus-mime-action-on-part@item . @r{(Article)}Interactively run an action on the @sc{mime} object(@code{gnus-mime-action-on-part}).@end tableGnus will display some @sc{mime} objects automatically. The way Gnusdetermines which parts to do this with is described in the Emacs MIMEmanual.It might be best to just use the toggling functions from the articlebuffer to avoid getting nasty surprises. (For instance, you enter thegroup @samp{alt.sing-a-long} and, before you know it, @sc{mime} hasdecoded the sound file in the article and some horrible sing-a-long songcomes screaming out your speakers, and you can't find the volume button,because there isn't one, and people are starting to look at you, and youtry to stop the program, but you can't, and you can't find the programto control the volume, and everybody else in the room suddenly decidesto look at you disdainfully, and you'll feel rather stupid.)Any similarity to real events and people is purely coincidental. Ahem.Also see @pxref{MIME Commands}.@node Customizing Articles@section Customizing Articles@cindex article customizationA slew of functions for customizing how the articles are to look likeexist. You can call these functions interactively, or you can have themcalled automatically when you select the articles.To have them called automatically, you should set the corresponding``treatment'' variable. For instance, to have headers hidden, you'd set@code{gnus-treat-hide-headers}. Below is a list of variables that canbe set, but first we discuss the values these variables can have.Note: Some values, while valid, make little sense. Check the list belowfor sensible values.@enumerate@item@code{nil}: Don't do this treatment.@item@code{t}: Do this treatment on all body parts.@item@code{head}: Do the treatment on the headers.@item@code{last}: Do this treatment on the last part.@itemAn integer: Do this treatment on all body parts that have a length lessthan this number.@itemA list of strings: Do this treatment on all body parts that are inarticles that are read in groups that have names that match one of theregexps in the list.@itemA list where the first element is not a string:The list is evaluated recursively. The first element of the list is apredicate. The following predicates are recognized: @code{or},@code{and}, @code{not} and @code{typep}. Here's an example:@lisp(or last (typep "text/x-vcard"))@end lisp@end enumerateYou may have noticed that the word @dfn{part} is used here. This refersto the fact that some messages are @sc{mime} multipart articles that maybe divided into several parts. Articles that are not multiparts areconsidered to contain just a single part.@vindex gnus-article-treat-typesAre the treatments applied to all sorts of multipart parts? Yes, if youwant to, but by default, only @samp{text/plain} parts are given thetreatment. This is controlled by the @code{gnus-article-treat-types}variable, which is a list of regular expressions that are matched to thetype of the part. This variable is ignored if the value of thecontrolling variable is a predicate list, as described above.The following treatment options are available. The easiest way tocustomize this is to examine the @code{gnus-article-treat} customizationgroup. Values in parenthesis are suggested sensible values. Others arepossible but those listed are probably sufficient for most people.@table @code@item gnus-treat-highlight-signature (t, last)@item gnus-treat-buttonize (t, integer)@item gnus-treat-buttonize-head (head)@item gnus-treat-emphasize (t, head, integer)@item gnus-treat-fill-article (t, integer)@item gnus-treat-strip-cr (t, integer)@item gnus-treat-hide-headers (head)@item gnus-treat-hide-boring-headers (head)@item gnus-treat-hide-signature (t, last)@item gnus-treat-hide-citation (t, integer)@item gnus-treat-strip-pgp (t, last, integer)@item gnus-treat-strip-pem (t, last, integer)@item gnus-treat-highlight-headers (head)@item gnus-treat-highlight-citation (t, integer)@item gnus-treat-highlight-signature (t, last, integer)@item gnus-treat-date-ut (head)@item gnus-treat-date-local (head)@item gnus-treat-date-lapsed (head)@item gnus-treat-date-original (head)@item gnus-treat-strip-headers-in-body (t, integer)@item gnus-treat-strip-trailing-blank-lines (t, last, integer)@item gnus-treat-strip-leading-blank-lines (t, integer)@item gnus-treat-strip-multiple-blank-lines (t, integer)@item gnus-treat-overstrike (t, integer)@item gnus-treat-display-xface (head)@item gnus-treat-display-smileys (t, integer)@item gnus-treat-display-picons (head)@item gnus-treat-capitalize-sentences (t, integer)@item gnus-treat-fill-long-lines (t, integer)@item gnus-treat-play-sounds@item gnus-treat-translate@end table@vindex gnus-part-display-hookYou can, of course, write your own functions to be called from@code{gnus-part-display-hook}. The functions are called narrowed to thepart, and you can do anything you like, pretty much. There is noinformation that you have to keep in the buffer---you can changeeverything.@node Article Keymap@section Article KeymapMost of the keystrokes in the summary buffer can also be used in thearticle buffer. They should behave as if you typed them in the summarybuffer, which means that you don't actually have to have a summarybuffer displayed while reading. You can do it all from the articlebuffer.A few additional keystrokes are available:@table @kbd@item @key{SPC}@kindex @key{SPC} @r{(Article)}@findex gnus-article-next-pageScroll forwards one page (@code{gnus-article-next-page}).@item @key{DEL}@kindex @key{DEL} @r{(Article)}@findex gnus-article-prev-pageScroll backwards one page (@code{gnus-article-prev-page}).@item C-c ^@kindex C-c ^ @r{(Article)}@findex gnus-article-refer-articleIf point is in the neighborhood of a @code{Message-ID} and you press@kbd{C-c ^}, Gnus will try to get that article from the server(@code{gnus-article-refer-article}).@item C-c C-m@kindex C-c C-m @r{(Article)}@findex gnus-article-mailSend a reply to the address near point (@code{gnus-article-mail}). Ifgiven a prefix, include the mail.@item s@kindex s @r{(Article)}@findex gnus-article-show-summaryReconfigure the buffers so that the summary buffer becomes visible(@code{gnus-article-show-summary}).@item ?@kindex ? @r{(Article)}@findex gnus-article-describe-brieflyGive a very brief description of the available keystrokes(@code{gnus-article-describe-briefly}).@item TAB@kindex TAB @r{(Article)}@findex gnus-article-next-buttonGo to the next button, if any (@code{gnus-article-next-button}). Thisonly makes sense if you have buttonizing turned on.@item M-TAB@kindex M-TAB @r{(Article)}@findex gnus-article-prev-buttonGo to the previous button, if any (@code{gnus-article-prev-button}).@end table@node Misc Article@section Misc Article@table @code@item gnus-single-article-buffer@vindex gnus-single-article-bufferIf non-@code{nil}, use the same article buffer for all the groups.(This is the default.) If @code{nil}, each group will have its ownarticle buffer.@vindex gnus-article-decode-hook@item gnus-article-decode-hook@cindex MIMEHook used to decode @sc{mime} articles. The default value is@code{(article-decode-charset article-decode-encoded-words)}@vindex gnus-article-prepare-hook@item gnus-article-prepare-hookThis hook is called right after the article has been inserted into thearticle buffer. It is mainly intended for functions that do somethingdepending on the contents; it should probably not be used for changingthe contents of the article buffer.@item gnus-article-mode-hook@vindex gnus-article-mode-hookHook called in article mode buffers.@item gnus-article-mode-syntax-table@vindex gnus-article-mode-syntax-tableSyntax table used in article buffers. It is initialized from@code{text-mode-syntax-table}.@vindex gnus-article-mode-line-format@item gnus-article-mode-line-formatThis variable is a format string along the same lines as@code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}). Itaccepts the same format specifications as that variable, with twoextensions:@table @samp@item wThe @dfn{wash status} of the article. This is a short string with onecharacter for each possible article wash operation that may have beenperformed.@item mThe number of @sc{mime} parts in the article.@end table@vindex gnus-break-pages@item gnus-break-pagesControls whether @dfn{page breaking} is to take place. If this variableis non-@code{nil}, the articles will be divided into pages whenever apage delimiter appears in the article. If this variable is @code{nil},paging will not be done.@item gnus-page-delimiter@vindex gnus-page-delimiterThis is the delimiter mentioned above. By default, it is @samp{^L}(formfeed).@end table@node Composing Messages@chapter Composing Messages@cindex composing messages@cindex messages@cindex mail@cindex sending mail@cindex reply@cindex followup@cindex post@kindex C-c C-c (Post)All commands for posting and mailing will put you in a message bufferwhere you can edit the article all you like, before you send thearticle by pressing @kbd{C-c C-c}. @xref{Top, , Top, message, TheMessage Manual}. Where the message will be posted/mailed to dependson your setup (@pxref{Posting Server}).@menu* Mail:: Mailing and replying.* Posting Server:: What server should you post via?* Mail and Post:: Mailing and posting at the same time.* Archived Messages:: Where Gnus stores the messages you've sent.* Posting Styles:: An easier way to specify who you are.* Drafts:: Postponing messages and rejected messages.* Rejected Articles:: What happens if the server doesn't like your article?@end menuAlso see @pxref{Canceling and Superseding} for information on how toremove articles you shouldn't have posted.@node Mail@section MailVariables for customizing outgoing mail:@table @code@item gnus-uu-digest-headers@vindex gnus-uu-digest-headersList of regexps to match headers included in digested messages. Theheaders will be included in the sequence they are matched.@item gnus-add-to-list@vindex gnus-add-to-listIf non-@code{nil}, add a @code{to-list} group parameter to mail groupsthat have none when you do a @kbd{a}.@end table@node Posting Server@section Posting ServerWhen you press those magical @kbd{C-c C-c} keys to ship off your latest(extremely intelligent, of course) article, where does it go?Thank you for asking. I hate you.@vindex gnus-post-methodIt can be quite complicated. Normally, Gnus will use the same nativeserver. However. If your native server doesn't allow posting, justreading, you probably want to use some other server to post your(extremely intelligent and fabulously interesting) articles. You canthen set the @code{gnus-post-method} to some other method:@lisp(setq gnus-post-method '(nnspool ""))@end lispNow, if you've done this, and then this server rejects your article, orthis server is down, what do you do then? To override this variable youcan use a non-zero prefix to the @kbd{C-c C-c} command to force usingthe ``current'' server for posting.If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,Gnus will prompt you for what method to use for posting.You can also set @code{gnus-post-method} to a list of select methods.If that's the case, Gnus will always prompt you for what method to usefor posting.Finally, if you want to always post using the same select method asyou're reading from (which might be convenient if you're reading lots ofgroups from different private servers), you can set this variable to@code{current}.@node Mail and Post@section Mail and PostHere's a list of variables relevant to both mailing andposting:@table @code@item gnus-mailing-list-groups@findex gnus-mailing-list-groups@cindex mailing listsIf your news server offers groups that are really mailing listsgatewayed to the @sc{nntp} server, you can read those groups withoutproblems, but you can't post/followup to them without some difficulty.One solution is to add a @code{to-address} to the group parameters(@pxref{Group Parameters}). An easier thing to do is set the@code{gnus-mailing-list-groups} to a regexp that matches the groups thatreally are mailing lists. Then, at least, followups to the mailinglists will work most of the time. Posting to these groups (@kbd{a}) isstill a pain, though.@end tableYou may want to do spell-checking on messages that you send out. Or, ifyou don't want to spell-check by hand, you could add automaticspell-checking via the @code{ispell} package:@cindex ispell@findex ispell-message@lisp(add-hook 'message-send-hook 'ispell-message)@end lispIf you want to change the @code{ispell} dictionary based on what groupyou're in, you could say something like the following:@lisp(add-hook 'gnus-select-group-hook (lambda () (cond ((string-match "^de\\." gnus-newsgroup-name) (ispell-change-dictionary "deutsch")) (t (ispell-change-dictionary "english")))))@end lispModify to suit your needs.@node Archived Messages@section Archived Messages@cindex archived messages@cindex sent messagesGnus provides a few different methods for storing the mail and news yousend. The default method is to use the @dfn{archive virtual server} tostore the messages. If you want to disable this completely, the@code{gnus-message-archive-group} variable should be @code{nil}, whichis the default.@vindex gnus-message-archive-method@code{gnus-message-archive-method} says what virtual server Gnus is touse to store sent messages. The default is:@lisp(nnfolder "archive" (nnfolder-directory "~/Mail/archive") (nnfolder-active-file "~/Mail/archive/active") (nnfolder-get-new-mail nil) (nnfolder-inhibit-expiry t))@end lispYou can, however, use any mail select method (@code{nnml},@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select methodfor doing this sort of thing, though. If you don't like the defaultdirectory chosen, you could say something like:@lisp(setq gnus-message-archive-method '(nnfolder "archive" (nnfolder-inhibit-expiry t) (nnfolder-active-file "~/News/sent-mail/active") (nnfolder-directory "~/News/sent-mail/")))@end lisp@vindex gnus-message-archive-group@cindex GccGnus will insert @code{Gcc} headers in all outgoing messages that pointto one or more group(s) on that server. Which group to use isdetermined by the @code{gnus-message-archive-group} variable.This variable can be used to do the following:@itemize @bullet@item a stringMessages will be saved in that group.Note that you can include a select method in the group name, then themessage will not be stored in the select method given by@code{gnus-message-archive-method}, but in the select method specifiedby the group name, instead. Suppose @code{gnus-message-archive-method}has the default value shown above. Then setting@code{gnus-message-archive-group} to @code{"foo"} means that outgoingmessages are stored in @samp{nnfolder+archive:foo}, but if you use thevalue @code{"nnml:foo"}, then outgoing messages will be stored in@samp{nnml:foo}.@item a list of stringsMessages will be saved in all those groups.@item an alist of regexps, functions and formsWhen a key ``matches'', the result is used.@item @code{nil}No message archiving will take place. This is the default.@end itemizeLet's illustrate:Just saving to a single group called @samp{MisK}:@lisp(setq gnus-message-archive-group "MisK")@end lispSaving to two groups, @samp{MisK} and @samp{safe}:@lisp(setq gnus-message-archive-group '("MisK" "safe"))@end lispSave to different groups based on what group you are in:@lisp(setq gnus-message-archive-group '(("^alt" "sent-to-alt") ("mail" "sent-to-mail") (".*" "sent-to-misc")))@end lispMore complex stuff:@lisp(setq gnus-message-archive-group '((if (message-news-p) "misc-news" "misc-mail")))@end lispHow about storing all news messages in one file, but storing all mailmessages in one file per month:@lisp(setq gnus-message-archive-group '((if (message-news-p) "misc-news" (concat "mail." (format-time-string "%Y-%m")))))@end lisp(XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have touse a different value for @code{gnus-message-archive-group} there.)Now, when you send a message off, it will be stored in the appropriategroup. (If you want to disable storing for just one particular message,you can just remove the @code{Gcc} header that has been inserted.) Thearchive group will appear in the group buffer the next time you startGnus, or the next time you press @kbd{F} in the group buffer. You canenter it and read the articles in it just like you'd read any othergroup. If the group gets really big and annoying, you can simply renameif (using @kbd{G r} in the group buffer) to somethingnice---@samp{misc-mail-september-1995}, or whatever. New messages willcontinue to be stored in the old (now empty) group.That's the default method of archiving sent messages. Gnus offers adifferent way for the people who don't like the default method. In thatcase you should set @code{gnus-message-archive-group} to @code{nil};this will disable archiving.@table @code@item gnus-outgoing-message-group@vindex gnus-outgoing-message-groupAll outgoing messages will be put in this group. If you want to storeall your outgoing mail and articles in the group @samp{nnml:archive},you set this variable to that value. This variable can also be a list ofgroup names.If you want to have greater control over what group to put eachmessage in, you can set this variable to a function that checks thecurrent newsgroup name and then returns a suitable group name (or listof names).This variable can be used instead of @code{gnus-message-archive-group},but the latter is the preferred method.@end table@node Posting Styles@section Posting Styles@cindex posting styles@cindex stylesAll them variables, they make my head swim.So what if you want a different @code{Organization} and signature basedon what groups you post to? And you post both from your home machineand your work machine, and you want different @code{From} lines, and soon?@vindex gnus-posting-stylesOne way to do stuff like that is to write clever hooks that change thevariables you need to have changed. That's a bit boring, so somebodycame up with the bright idea of letting the user specify these things ina handy alist. Here's an example of a @code{gnus-posting-styles}variable:@lisp((".*" (signature "Peace and happiness") (organization "What me?")) ("^comp" (signature "Death to everybody")) ("comp.emacs.i-love-it" (organization "Emacs is it")))@end lispAs you might surmise from this example, this alist consists of several@dfn{styles}. Each style will be applicable if the first element``matches'', in some form or other. The entire alist will be iteratedover, from the beginning towards the end, and each match will beapplied, which means that attributes in later styles that match overridethe same attributes in earlier matching styles. So@samp{comp.programming.literate} will have the @samp{Death to everybody}signature and the @samp{What me?} @code{Organization} header.The first element in each style is called the @code{match}. If it's astring, then Gnus will try to regexp match it against the group name.If it is the symbol @code{header}, then Gnus will look for header thatmatch the next element in the match, and compare that to the last headerin the match. If it's a function symbol, that function will be calledwith no arguments. If it's a variable symbol, then the variable will bereferenced. If it's a list, then that list will be @code{eval}ed. Inany case, if this returns a non-@code{nil} value, then the style is saidto @dfn{match}.Each style may contain a arbitrary amount of @dfn{attributes}. Eachattribute consists of a @code{(@var{name} . @var{value})} pair. Theattribute name can be one of @code{signature}, @code{signature-file},@code{organization}, @code{address}, @code{name} or @code{body}. Theattribute name can also be a string. In that case, this will be used asa header name, and the value will be inserted in the headers of thearticle; if the value is @code{nil}, the header name will be removed.If the attribute name is @code{eval}, the form is evaluated, and theresult is thrown away.The attribute value can be a string (used verbatim), a function withzero arguments (the return value will be used), a variable (its valuewill be used) or a list (it will be @code{eval}ed and the return valuewill be used). The functions and sexps are called/@code{eval}ed in themessage buffer that is being set up. The headers of the current articleare available through the @code{message-reply-headers} variable.If you wish to check whether the message you are about to compose ismeant to be a news article or a mail message, you can check the valuesof the @code{message-news-p} and @code{message-mail-p} functions.@findex message-mail-p@findex message-news-pSo here's a new example:@lisp(setq gnus-posting-styles '((".*" (signature-file "~/.signature") (name "User Name") ("X-Home-Page" (getenv "WWW_HOME")) (organization "People's Front Against MWM")) ("^rec.humor" (signature my-funny-signature-randomizer)) ((equal (system-name) "gnarly") (signature my-quote-randomizer)) ((message-news-p) (signature my-news-signature)) (header "From\\|To" "larsi.*org" (Organization "Somewhere, Inc.")) ((posting-from-work-p) (signature-file "~/.work-signature") (address "user@@bar.foo") (body "You are fired.\n\nSincerely, your boss.") (organization "Important Work, Inc")) ("nnml:.*" (From (save-excursion (set-buffer gnus-article-buffer) (message-fetch-field "to")))) ("^nn.+:" (signature-file "~/.mail-signature"))))@end lispThe @samp{nnml:.*} rule means that you use the @code{To} address as the@code{From} address in all your outgoing replies, which might be handyif you fill many roles.@node Drafts@section Drafts@cindex draftsIf you are writing a message (mail or news) and suddenly remember thatyou have a steak in the oven (or some pesto in the food processor, youcraaazy vegetarians), you'll probably wish there was a method to savethe message you are writing so that you can continue editing it someother day, and send it when you feel its finished.Well, don't worry about it. Whenever you start composing a message ofsome sort using the Gnus mail and post commands, the buffer you get willautomatically associate to an article in a special @dfn{draft} group.If you save the buffer the normal way (@kbd{C-x C-s}, for instance), thearticle will be saved there. (Auto-save files also go to the draftgroup.)@cindex nndraft@vindex nndraft-directoryThe draft group is a special group (which is implemented as an@code{nndraft} group, if you absolutely have to know) called@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where@code{nndraft} is to store its files. What makes this group special isthat you can't tick any articles in it or mark any articles asread---all articles in the group are permanently unread.If the group doesn't exist, it will be created and you'll be subscribedto it. The only way to make it disappear from the Group buffer is tounsubscribe it.@c @findex gnus-dissociate-buffer-from-draft@c @kindex C-c M-d (Mail)@c @kindex C-c M-d (Post)@c @findex gnus-associate-buffer-with-draft@c @kindex C-c C-d (Mail)@c @kindex C-c C-d (Post)@c If you're writing some super-secret message that you later want to@c encode with PGP before sending, you may wish to turn the auto-saving@c (and association with the draft group) off. You never know who might be@c interested in reading all your extremely valuable and terribly horrible@c and interesting secrets. The @kbd{C-c M-d}@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.@c If you change your mind and want to turn the auto-saving back on again,@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.@c@c @vindex gnus-use-draft@c To leave association with the draft group off by default, set@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.@findex gnus-draft-edit-message@kindex D e (Draft)When you want to continue editing the article, you simply enter thedraft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to dothat. You will be placed in a buffer where you left off.Rejected articles will also be put in this draft group (@pxref{RejectedArticles}).@findex gnus-draft-send-all-messages@findex gnus-draft-send-messageIf you have lots of rejected messages you want to post (or mail) withoutdoing further editing, you can use the @kbd{D s} command(@code{gnus-draft-send-message}). This command understands theprocess/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}command (@code{gnus-draft-send-all-messages}) will ship off all messagesin the buffer.If you have some messages that you wish not to send, you can use the@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the messageas unsendable. This is a toggling command.@node Rejected Articles@section Rejected Articles@cindex rejected articlesSometimes a news server will reject an article. Perhaps the serverdoesn't like your face. Perhaps it just feels miserable. Perhaps@emph{there be demons}. Perhaps you have included too much cited text.Perhaps the disk is full. Perhaps the server is down.These situations are, of course, totally beyond the control of Gnus.(Gnus, of course, loves the way you look, always feels great, has angelsfluttering around inside of it, doesn't care about how much cited textyou include, never runs full and never goes down.) So Gnus saves thesearticles until some later time when the server feels better.The rejected articles will automatically be put in a special draft group(@pxref{Drafts}). When the server comes back up again, you'd thentypically enter that group and send all the articles off.@node Select Methods@chapter Select Methods@cindex foreign groups@cindex select methodsA @dfn{foreign group} is a group not read by the usual (ordefault) means. It could be, for instance, a group from a different@sc{nntp} server, it could be a virtual group, or it could be your ownpersonal mail group.A foreign group (or any group, really) is specified by a @dfn{name} anda @dfn{select method}. To take the latter first, a select method is alist where the first element says what back end to use (e.g. @code{nntp},@code{nnspool}, @code{nnml}) and the second element is the @dfn{servername}. There may be additional elements in the select method, where thevalue may have special meaning for the back end in question.One could say that a select method defines a @dfn{virtual server}---sowe do just that (@pxref{The Server Buffer}).The @dfn{name} of the group is the name the back end will recognize thegroup as.For instance, the group @samp{soc.motss} on the @sc{nntp} server@samp{some.where.edu} will have the name @samp{soc.motss} and selectmethod @code{(nntp "some.where.edu")}. Gnus will call this group@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}back end just knows this group as @samp{soc.motss}.The different methods all have their peculiarities, of course.@menu* The Server Buffer:: Making and editing virtual servers.* Getting News:: Reading USENET news with Gnus.* Getting Mail:: Reading your personal mail with Gnus.* Browsing the Web:: Getting messages from a plethora of Web sources.* Other Sources:: Reading directories, files, SOUP packets.* Combined Groups:: Combining groups into one group.* Gnus Unplugged:: Reading news and mail offline.@end menu@node The Server Buffer@section The Server BufferTraditionally, a @dfn{server} is a machine or a piece of software thatone connects to, and then requests information from. Gnus does notconnect directly to any real servers, but does all transactions throughone back end or other. But that's just putting one layer more betweenthe actual media and Gnus, so we might just as well say that eachback end represents a virtual server.For instance, the @code{nntp} back end may be used to connect to severaldifferent actual @sc{nntp} servers, or, perhaps, to many different portson the same actual @sc{nntp} server. You tell Gnus which back end touse, and what parameters to set by specifying a @dfn{select method}.These select method specifications can sometimes become quitecomplicated---say, for instance, that you want to read from the@sc{nntp} server @samp{news.funet.fi} on port number 13, whichhangs if queried for @sc{nov} headers and has a buggy select. Ahem.Anyway, if you had to specify that for each group that used thisserver, that would be too much work, so Gnus offers a way of namingselect methods, which is what you do in the server buffer.To enter the server buffer, use the @kbd{^}(@code{gnus-group-enter-server-mode}) command in the group buffer.@menu* Server Buffer Format:: You can customize the look of this buffer.* Server Commands:: Commands to manipulate servers.* Example Methods:: Examples server specifications.* Creating a Virtual Server:: An example session.* Server Variables:: Which variables to set.* Servers and Methods:: You can use server names as select methods.* Unavailable Servers:: Some servers you try to contact may be down.@end menu@vindex gnus-server-mode-hook@code{gnus-server-mode-hook} is run when creating the server buffer.@node Server Buffer Format@subsection Server Buffer Format@cindex server buffer format@vindex gnus-server-line-formatYou can change the look of the server buffer lines by changing the@code{gnus-server-line-format} variable. This is a @code{format}-likevariable, with some simple extensions:@table @samp@item hHow the news is fetched---the back end name.@item nThe name of this server.@item wWhere the news is to be fetched from---the address.@item sThe opened/closed/denied status of the server.@end table@vindex gnus-server-mode-line-formatThe mode line can also be customized by using the@code{gnus-server-mode-line-format} variable (@pxref{Mode LineFormatting}). The following specs are understood:@table @samp@item SServer name.@item MServer method.@end tableAlso @pxref{Formatting Variables}.@node Server Commands@subsection Server Commands@cindex server commands@table @kbd@item a@kindex a (Server)@findex gnus-server-add-serverAdd a new server (@code{gnus-server-add-server}).@item e@kindex e (Server)@findex gnus-server-edit-serverEdit a server (@code{gnus-server-edit-server}).@item @key{SPC}@kindex @key{SPC} (Server)@findex gnus-server-read-serverBrowse the current server (@code{gnus-server-read-server}).@item q@kindex q (Server)@findex gnus-server-exitReturn to the group buffer (@code{gnus-server-exit}).@item k@kindex k (Server)@findex gnus-server-kill-serverKill the current server (@code{gnus-server-kill-server}).@item y@kindex y (Server)@findex gnus-server-yank-serverYank the previously killed server (@code{gnus-server-yank-server}).@item c@kindex c (Server)@findex gnus-server-copy-serverCopy the current server (@code{gnus-server-copy-server}).@item l@kindex l (Server)@findex gnus-server-list-serversList all servers (@code{gnus-server-list-servers}).@item s@kindex s (Server)@findex gnus-server-scan-serverRequest that the server scan its sources for new articles(@code{gnus-server-scan-server}). This is mainly sensible with mailservers.@item g@kindex g (Server)@findex gnus-server-regenerate-serverRequest that the server regenerate all its data structures(@code{gnus-server-regenerate-server}). This can be useful if you havea mail back end that has gotten out of sync.@end table@node Example Methods@subsection Example MethodsMost select methods are pretty simple and self-explanatory:@lisp(nntp "news.funet.fi")@end lispReading directly from the spool is even simpler:@lisp(nnspool "")@end lispAs you can see, the first element in a select method is the name of theback end, and the second is the @dfn{address}, or @dfn{name}, if youwill.After these two elements, there may be an arbitrary number of@code{(@var{variable} @var{form})} pairs.To go back to the first example---imagine that you want to read fromport 15 on that machine. This is what the select method shouldlook like then:@lisp(nntp "news.funet.fi" (nntp-port-number 15))@end lispYou should read the documentation to each back end to find out whatvariables are relevant, but here's an @code{nnmh} example:@code{nnmh} is a mail back end that reads a spool-like structure. Sayyou have two structures that you wish to access: One is your privatemail spool, and the other is a public one. Here's the possible spec foryour private mail:@lisp(nnmh "private" (nnmh-directory "~/private/mail/"))@end lisp(This server is then called @samp{private}, but you may have guessedthat.)Here's the method for a public spool:@lisp(nnmh "public" (nnmh-directory "/usr/information/spool/") (nnmh-get-new-mail nil))@end lisp@cindex proxy@cindex firewallIf you are behind a firewall and only have access to the @sc{nntp}server from the firewall machine, you can instruct Gnus to @code{rlogin}on the firewall machine and telnet from there to the @sc{nntp} server.Doing this can be rather fiddly, but your virtual server definitionshould probably look something like this:@lisp(nntp "firewall" (nntp-address "the.firewall.machine") (nntp-open-connection-function nntp-open-rlogin) (nntp-end-of-line "\n") (nntp-rlogin-parameters ("telnet" "the.real.nntp.host" "nntp")))@end lispIf you want to use the wonderful @code{ssh} program to provide acompressed connection over the modem line, you could create a virtualserver that would look something like this:@lisp(nntp "news" (nntp-address "copper.uio.no") (nntp-rlogin-program "ssh") (nntp-open-connection-function nntp-open-rlogin) (nntp-end-of-line "\n") (nntp-rlogin-parameters ("telnet" "news.uio.no" "nntp")))@end lispThis means that you have to have set up @code{ssh-agent} correctly toprovide automatic authorization, of course. And to get a compressedconnection, you have to have the @samp{Compression} option in the@code{ssh} @file{config} file.@node Creating a Virtual Server@subsection Creating a Virtual ServerIf you're saving lots of articles in the cache by using persistentarticles, you may want to create a virtual server to read the cache.First you need to add a new server. The @kbd{a} command does that. Itwould probably be best to use @code{nnspool} to read the cache. Youcould also use @code{nnml} or @code{nnmh}, though.Type @kbd{a nnspool @key{RET} cache @key{RET}}.You should now have a brand new @code{nnspool} virtual server called@samp{cache}. You now need to edit it to have the right definitions.Type @kbd{e} to edit the server. You'll be entered into a buffer thatwill contain the following:@lisp(nnspool "cache")@end lispChange that to:@lisp(nnspool "cache" (nnspool-spool-directory "~/News/cache/") (nnspool-nov-directory "~/News/cache/") (nnspool-active-file "~/News/cache/active"))@end lispType @kbd{C-c C-c} to return to the server buffer. If you now press@key{RET} over this virtual server, you should be entered into a browsebuffer, and you should be able to enter any of the groups displayed.@node Server Variables@subsection Server VariablesOne sticky point when defining variables (both on back ends and in Emacsin general) is that some variables are typically initialized from othervariables when the definition of the variables is being loaded. If youchange the "base" variable after the variables have been loaded, youwon't change the "derived" variables.This typically affects directory and file variables. For instance,@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}directory variables are initialized from that variable, so@code{nnml-active-file} will be @file{~/Mail/active}. If you define anew virtual @code{nnml} server, it will @emph{not} suffice to set just@code{nnml-directory}---you have to explicitly set all the filevariables to be what you want them to be. For a complete list ofvariables for each back end, see each back end's section later in thismanual, but here's an example @code{nnml} definition:@lisp(nnml "public" (nnml-directory "~/my-mail/") (nnml-active-file "~/my-mail/active") (nnml-newsgroups-file "~/my-mail/newsgroups"))@end lisp@node Servers and Methods@subsection Servers and MethodsWherever you would normally use a select method(e.g. @code{gnus-secondary-select-method}, in the group select method,when browsing a foreign server) you can use a virtual server nameinstead. This could potentially save lots of typing. And it's nice allover.@node Unavailable Servers@subsection Unavailable ServersIf a server seems to be unreachable, Gnus will mark that server as@code{denied}. That means that any subsequent attempt to make contactwith that server will just be ignored. ``It can't be opened,'' Gnuswill tell you, without making the least effort to see whether that isactually the case or not.That might seem quite naughty, but it does make sense most of the time.Let's say you have 10 groups subscribed to on server@samp{nephelococcygia.com}. This server is located somewhere quite faraway from you and the machine is quite slow, so it takes 1 minute justto find out that it refuses connection to you today. If Gnus were toattempt to do that 10 times, you'd be quite annoyed, so Gnus won'tattempt to do that. Once it has gotten a single ``connection refused'',it will regard that server as ``down''.So, what happens if the machine was only feeling unwell temporarily?How do you test to see whether the machine has come up again?You jump to the server buffer (@pxref{The Server Buffer}) and poke itwith the following commands:@table @kbd@item O@kindex O (Server)@findex gnus-server-open-serverTry to establish connection to the server on the current line(@code{gnus-server-open-server}).@item C@kindex C (Server)@findex gnus-server-close-serverClose the connection (if any) to the server(@code{gnus-server-close-server}).@item D@kindex D (Server)@findex gnus-server-deny-serverMark the current server as unreachable(@code{gnus-server-deny-server}).@item M-o@kindex M-o (Server)@findex gnus-server-open-all-serversOpen the connections to all servers in the buffer(@code{gnus-server-open-all-servers}).@item M-c@kindex M-c (Server)@findex gnus-server-close-all-serversClose the connections to all servers in the buffer(@code{gnus-server-close-all-servers}).@item R@kindex R (Server)@findex gnus-server-remove-denialsRemove all marks to whether Gnus was denied connection from any servers(@code{gnus-server-remove-denials}).@end table@node Getting News@section Getting News@cindex reading news@cindex news back endsA newsreader is normally used for reading news. Gnus currently providesonly two methods of getting news---it can read from an @sc{nntp} server,or it can read from a local spool.@menu* NNTP:: Reading news from an @sc{nntp} server.* News Spool:: Reading news from the local spool.@end menu@node NNTP@subsection @sc{nntp}@cindex nntpSubscribing to a foreign group from an @sc{nntp} server is rather easy.You just specify @code{nntp} as method and the address of the @sc{nntp}server as the, uhm, address.If the @sc{nntp} server is located at a non-standard port, setting thethird element of the select method to this port number should allow youto connect to the right port. You'll have to edit the group info forthat (@pxref{Foreign Groups}).The name of the foreign group can be the same as a native group. Infact, you can subscribe to the same group from as many different serversyou feel like. There will be no name collisions.The following variables can be used to create a virtual @code{nntp}server:@table @code@item nntp-server-opened-hook@vindex nntp-server-opened-hook@cindex @sc{mode reader}@cindex authinfo@cindex authentication@cindex nntp authentication@findex nntp-send-authinfo@findex nntp-send-mode-readeris run after a connection has been made. It can be used to sendcommands to the @sc{nntp} server after it has been contacted. Bydefault it sends the command @code{MODE READER} to the server with the@code{nntp-send-mode-reader} function. This function should always bepresent in this hook.@item nntp-authinfo-function@vindex nntp-authinfo-function@findex nntp-send-authinfo@vindex nntp-authinfo-fileThis function will be used to send @samp{AUTHINFO} to the @sc{nntp}server. The default function is @code{nntp-send-authinfo}, which looksthrough your @file{~/.authinfo} (or whatever you've set the@code{nntp-authinfo-file} variable to) for applicable entries. If noneare found, it will prompt you for a login name and a password. Theformat of the @file{~/.authinfo} file is (almost) the same as the@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}manual page, but here are the salient facts:@enumerate@itemThe file contains one or more line, each of which define one server.@itemEach line may contain an arbitrary number of token/value pairs.The valid tokens include @samp{machine}, @samp{login}, @samp{password},@samp{default}. In addition Gnus introduces two new tokens, not presentin the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and@samp{force}. (This is the only way the @file{.authinfo} file formatdeviates from the @file{.netrc} file format.) @samp{port} is used toindicate what port on the server the credentials apply to and@samp{force} is explained below.@end enumerateHere's an example file:@examplemachine news.uio.no login larsi password geheimnismachine nntp.ifi.uio.no login larsi force yes@end exampleThe token/value pairs may appear in any order; @samp{machine} doesn'thave to be first, for instance.In this example, both login name and password have been supplied for theformer server, while the latter has only the login name listed, and theuser will be prompted for the password. The latter also has the@samp{force} tag, which means that the authinfo will be sent to the@var{nntp} server upon connection; the default (i.e., when there is not@samp{force} tag) is to not send authinfo to the @var{nntp} serveruntil the @var{nntp} server asks for it.You can also add @samp{default} lines that will apply to all serversthat don't have matching @samp{machine} lines.@exampledefault force yes@end exampleThis will force sending @samp{AUTHINFO} commands to all servers notpreviously mentioned.Remember to not leave the @file{~/.authinfo} file world-readable.@item nntp-server-action-alist@vindex nntp-server-action-alistThis is a list of regexps to match on server types and actions to betaken when matches are made. For instance, if you want Gnus to beepevery time you connect to innd, you could say something like:@lisp(setq nntp-server-action-alist '(("innd" (ding))))@end lispYou probably don't want to do that, though.The default value is@lisp'(("nntpd 1\\.5\\.11t" (remove-hook 'nntp-server-opened-hook 'nntp-send-mode-reader)))@end lispThis ensures that Gnus doesn't send the @code{MODE READER} command tonntpd 1.5.11t, since that command chokes that server, I've been told.@item nntp-maximum-request@vindex nntp-maximum-requestIf the @sc{nntp} server doesn't support @sc{nov} headers, this back endwill collect headers by sending a series of @code{head} commands. Tospeed things up, the back end sends lots of these commands withoutwaiting for reply, and then reads all the replies. This is controlledby the @code{nntp-maximum-request} variable, and is 400 by default. Ifyour network is buggy, you should set this to 1.@item nntp-connection-timeout@vindex nntp-connection-timeoutIf you have lots of foreign @code{nntp} groups that you connect toregularly, you're sure to have problems with @sc{nntp} servers notresponding properly, or being too loaded to reply within reasonabletime. This is can lead to awkward problems, which can be helpedsomewhat by setting @code{nntp-connection-timeout}. This is an integerthat says how many seconds the @code{nntp} back end should wait for aconnection before giving up. If it is @code{nil}, which is the default,no timeouts are done.@c @item nntp-command-timeout@c @vindex nntp-command-timeout@c @cindex PPP connections@c @cindex dynamic IP addresses@c If you're running Gnus on a machine that has a dynamically assigned@c address, Gnus may become confused. If the address of your machine@c changes after connecting to the @sc{nntp} server, Gnus will simply sit@c waiting forever for replies from the server. To help with this@c unfortunate problem, you can set this command to a number. Gnus will@c then, if it sits waiting for a reply from the server longer than that@c number of seconds, shut down the connection, start a new one, and resend@c the command. This should hopefully be transparent to the user. A@c likely number is 30 seconds.@c@c @item nntp-retry-on-break@c @vindex nntp-retry-on-break@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus@c hangs. This will have much the same effect as the command timeout@c described above.@item nntp-server-hook@vindex nntp-server-hookThis hook is run as the last step when connecting to an @sc{nntp}server.@findex nntp-open-rlogin@findex nntp-open-telnet@findex nntp-open-network-stream@item nntp-open-connection-function@vindex nntp-open-connection-functionThis function is used to connect to the remote system. Four pre-madefunctions are supplied:@table @code@item nntp-open-network-streamThis is the default, and simply connects to some port or other on theremote system.@item nntp-open-rloginDoes an @samp{rlogin} on theremote system, and then does a @samp{telnet} to the @sc{nntp} serveravailable there.@code{nntp-open-rlogin}-related variables:@table @code@item nntp-rlogin-program@vindex nntp-rlogin-programProgram used to log in on remote machines. The default is @samp{rsh},but @samp{ssh} is a popular alternative.@item nntp-rlogin-parameters@vindex nntp-rlogin-parametersThis list will be used as the parameter list given to @code{rsh}.@item nntp-rlogin-user-name@vindex nntp-rlogin-user-nameUser name on the remote system.@end table@item nntp-open-telnetDoes a @samp{telnet} to the remote system and then another @samp{telnet}to get to the @sc{nntp} server.@code{nntp-open-telnet}-related variables:@table @code@item nntp-telnet-command@vindex nntp-telnet-commandCommand used to start @code{telnet}.@item nntp-telnet-switches@vindex nntp-telnet-switchesList of strings to be used as the switches to the @code{telnet} command.@item nntp-telnet-user-name@vindex nntp-telnet-user-nameUser name for log in on the remote system.@item nntp-telnet-passwd@vindex nntp-telnet-passwdPassword to use when logging in.@item nntp-telnet-parameters@vindex nntp-telnet-parametersA list of strings executed as a command after logging invia @code{telnet}.@item nntp-telnet-shell-prompt@vindex nntp-telnet-shell-promptRegexp matching the shell prompt on the remote machine. The default is@samp{bash\\|\$ *\r?$\\|> *\r?}.@item nntp-open-telnet-envuser@vindex nntp-open-telnet-envuserIf non-@code{nil}, the @code{telnet} session (client and server both)will support the @code{ENVIRON} option and not prompt for login name.This works for Solaris @code{telnet}, for instance.@end table@findex nntp-open-ssl-stream@item nntp-open-ssl-streamOpens a connection to a server over a @dfn{secure} channel. To use thisyou must have SSLeay installed(@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need@file{ssl.el} (from the W3 distribution, for instance). You thendefine a server as follows:@lisp;; Type `C-c C-c' after you've finished editing.;;;; "snews" is port 563 and is predefined;; in our /etc/services;;(nntp "snews.bar.com" (nntp-open-connection-function nntp-open-ssl-stream) (nntp-port-number "snews") (nntp-address "snews.bar.com"))@end lisp@end table@item nntp-end-of-line@vindex nntp-end-of-lineString to use as end-of-line marker when talking to the @sc{nntp}server. This is @samp{\r\n} by default, but should be @samp{\n} whenusing @code{rlogin} to talk to the server.@item nntp-rlogin-user-name@vindex nntp-rlogin-user-nameUser name on the remote system when using the @code{rlogin} connectfunction.@item nntp-address@vindex nntp-addressThe address of the remote system running the @sc{nntp} server.@item nntp-port-number@vindex nntp-port-numberPort number to connect to when using the @code{nntp-open-network-stream}connect function.@item nntp-buggy-select@vindex nntp-buggy-selectSet this to non-@code{nil} if your select routine is buggy.@item nntp-nov-is-evil@vindex nntp-nov-is-evilIf the @sc{nntp} server does not support @sc{nov}, you could set thisvariable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov}can be used.@item nntp-xover-commands@vindex nntp-xover-commands@cindex nov@cindex XOVERList of strings used as commands to fetch @sc{nov} lines from aserver. The default value of this variable is @code{("XOVER""XOVERVIEW")}.@item nntp-nov-gap@vindex nntp-nov-gap@code{nntp} normally sends just one big request for @sc{nov} lines tothe server. The server responds with one huge list of lines. However,if you have read articles 2-5000 in the group, and only want to readarticle 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}lines that you will not need. This variable says howbig a gap between two consecutive articles is allowed to be before the@code{XOVER} request is split into several request. Note that if yournetwork is fast, setting this variable to a really small number meansthat fetching will probably be slower. If this variable is @code{nil},@code{nntp} will never split requests. The default is 5.@item nntp-prepare-server-hook@vindex nntp-prepare-server-hookA hook run before attempting to connect to an @sc{nntp} server.@item nntp-warn-about-losing-connection@vindex nntp-warn-about-losing-connectionIf this variable is non-@code{nil}, some noise will be made when aserver closes connection.@item nntp-record-commands@vindex nntp-record-commandsIf non-@code{nil}, @code{nntp} will log all commands it sends to the@sc{nntp} server (along with a timestamp) in the @samp{*nntp-log*}buffer. This is useful if you are debugging a Gnus/@sc{nntp} connectionthat doesn't seem to work.@end table@node News Spool@subsection News Spool@cindex nnspool@cindex news spoolSubscribing to a foreign group from the local spool is extremely easy,and might be useful, for instance, to speed up reading groups thatcontain very big articles---@samp{alt.binaries.pictures.furniture}, forinstance.Anyway, you just specify @code{nnspool} as the method and @code{""} (oranything else) as the address.If you have access to a local spool, you should probably use that as thenative select method (@pxref{Finding the News}). It is normally fasterthan using an @code{nntp} select method, but might not be. It depends.You just have to try to find out what's best at your site.@table @code@item nnspool-inews-program@vindex nnspool-inews-programProgram used to post an article.@item nnspool-inews-switches@vindex nnspool-inews-switchesParameters given to the inews program when posting an article.@item nnspool-spool-directory@vindex nnspool-spool-directoryWhere @code{nnspool} looks for the articles. This is normally@file{/usr/spool/news/}.@item nnspool-nov-directory@vindex nnspool-nov-directoryWhere @code{nnspool} will look for @sc{nov} files. This is normally@file{/usr/spool/news/over.view/}.@item nnspool-lib-dir@vindex nnspool-lib-dirWhere the news lib dir is (@file{/usr/lib/news/} by default).@item nnspool-active-file@vindex nnspool-active-fileThe name of the active file.@item nnspool-newsgroups-file@vindex nnspool-newsgroups-fileThe name of the group descriptions file.@item nnspool-history-file@vindex nnspool-history-fileThe name of the news history file.@item nnspool-active-times-file@vindex nnspool-active-times-fileThe name of the active date file.@item nnspool-nov-is-evil@vindex nnspool-nov-is-evilIf non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} filesthat it finds.@item nnspool-sift-nov-with-sed@vindex nnspool-sift-nov-with-sed@cindex sedIf non-@code{nil}, which is the default, use @code{sed} to get therelevant portion from the overview file. If nil, @code{nnspool} willload the entire file into a buffer and process it there.@end table@node Getting Mail@section Getting Mail@cindex reading mail@cindex mailReading mail with a newsreader---isn't that just plain WeIrD? But ofcourse.@menu* Mail in a Newsreader:: Important introductory notes.* Getting Started Reading Mail:: A simple cookbook example.* Splitting Mail:: How to create mail groups.* Mail Sources:: How to tell Gnus where to get mail from.* Mail Back End Variables:: Variables for customizing mail handling.* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.* Group Mail Splitting:: Use group customize to drive mail splitting.* Incorporating Old Mail:: What about the old mail you have?* Expiring Mail:: Getting rid of unwanted mail.* Washing Mail:: Removing gruft from the mail you get.* Duplicates:: Dealing with duplicated mail.* Not Reading Mail:: Using mail back ends for reading other files.* Choosing a Mail Back End:: Gnus can read a variety of mail formats.@end menu@node Mail in a Newsreader@subsection Mail in a NewsreaderIf you are used to traditional mail readers, but have decided to switchto reading mail with Gnus, you may find yourself experiencing somethingof a culture shock.Gnus does not behave like traditional mail readers. If you want to makeit behave that way, you can, but it's an uphill battle.Gnus, by default, handles all its groups using the same approach. Thisapproach is very newsreaderly---you enter a group, see the new/unreadmessages, and when you read the messages, they get marked as read, andyou don't see them any more. (Unless you explicitly ask for them.)In particular, you do not do anything explicitly to delete messages.Does this mean that all the messages that have been marked as read aredeleted? How awful!But, no, it means that old messages are @dfn{expired} according to somescheme or other. For news messages, the expire process is controlled bythe news administrator; for mail, the expire process is controlled byyou. The expire process for mail is covered in depth in @pxref{ExpiringMail}.What many Gnus users find, after using it a while for both news andmail, is that the transport mechanism has very little to do with howthey want to treat a message.Many people subscribe to several mailing lists. These are transportedvia SMTP, and are therefore mail. But we might go for weeks withoutanswering, or even reading these messages very carefully. We may notneed to save them because if we should need to read one again, they arearchived somewhere else.Some people have local news groups which have only a handful of readers.These are transported via @sc{nntp}, and are therefore news. But we may needto read and answer a large fraction of the messages very carefully inorder to do our work. And there may not be an archive, so we may needto save the interesting messages the same way we would personal mail.The important distinction turns out to be not the transport mechanism,but other factors such as how interested we are in the subject matter,or how easy it is to retrieve the message if we need to read it again.Gnus provides many options for sorting mail into ``groups'' which behavelike newsgroups, and for treating each group (whether mail or news)differently.Some users never get comfortable using the Gnus (ahem) paradigm and wishthat Gnus should grow up and be a male, er, mail reader. It is possibleto whip Gnus into a more mailreaderly being, but, as said before, it'snot easy. People who prefer proper mail readers should try @sc{vm}instead, which is an excellent, and proper, mail reader.I don't mean to scare anybody off, but I want to make it clear that youmay be required to learn a new way of thinking about messages. Afteryou've been subjected to The Gnus Way, you will come to love it. I canguarantee it. (At least the guy who sold me the Emacs SubliminalBrain-Washing Functions that I've put into Gnus did guarantee it. YouWill Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.You Do.)@node Getting Started Reading Mail@subsection Getting Started Reading MailIt's quite easy to use Gnus to read your new mail. You just plonk themail back end of your choice into @code{gnus-secondary-select-methods},and things will happen automatically.For instance, if you want to use @code{nnml} (which is a "one file permail" back end), you could put the following in your @file{.gnus} file:@lisp(setq gnus-secondary-select-methods '((nnml "private")))@end lispNow, the next time you start Gnus, this back end will be queried for newarticles, and it will move all the messages in your spool file to itsdirectory, which is @code{~/Mail/} by default. The new group that willbe created (@samp{mail.misc}) will be subscribed, and you can read itlike any other group.You will probably want to split the mail into several groups, though:@lisp(setq nnmail-split-methods '(("junk" "^From:.*Lars Ingebrigtsen") ("crazy" "^Subject:.*die\\|^Organization:.*flabby") ("other" "")))@end lispThis will result in three new @code{nnml} mail groups being created:@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All themail that doesn't fit into the first two groups will be placed in thelast group.This should be sufficient for reading mail with Gnus. You might want togive the other sections in this part of the manual a perusal, though.Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.@node Splitting Mail@subsection Splitting Mail@cindex splitting mail@cindex mail splitting@vindex nnmail-split-methodsThe @code{nnmail-split-methods} variable says how the incoming mail isto be split into groups.@lisp(setq nnmail-split-methods '(("mail.junk" "^From:.*Lars Ingebrigtsen") ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby") ("mail.other" "")))@end lispThis variable is a list of lists, where the first element of each ofthese lists is the name of the mail group (they do not have to be calledsomething beginning with @samp{mail}, by the way), and the secondelement is a regular expression used on the header of each mail todetermine if it belongs in this mail group. The first string maycontain @samp{\\1} forms, like the ones used by @code{replace-match} toinsert sub-expressions from the matched text. For instance:@lisp("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")@end lispThe second element can also be a function. In that case, it will becalled narrowed to the headers with the first element of the rule as theargument. It should return a non-@code{nil} value if it thinks that themail belongs in that group.The last of these groups should always be a general one, and the regularexpression should @emph{always} be @samp{} so that it matches any mailsthat haven't been matched by any of the other regexps. (These rules areprocessed from the beginning of the alist toward the end. The firstrule to make a match will "win", unless you have crossposting enabled.In that case, all matching rules will "win".)If you like to tinker with this yourself, you can set this variable to afunction of your choice. This function will be called without anyarguments in a buffer narrowed to the headers of an incoming mailmessage. The function should return a list of group names that itthinks should carry this mail message.Note that the mail back ends are free to maul the poor, innocent,incoming headers all they want to. They all add @code{Lines} headers;some add @code{X-Gnus-Group} headers; most rename the Unix mbox@samp{From } line to something else.@vindex nnmail-crosspostThe mail back ends all support cross-posting. If several regexps match,the mail will be ``cross-posted'' to all those groups.@code{nnmail-crosspost} says whether to use this mechanism or not. Notethat no articles are crossposted to the general (@samp{}) group.@vindex nnmail-crosspost-link-function@cindex crosspost@cindex links@code{nnmh} and @code{nnml} makes crossposts by creating hard links tothe crossposted articles. However, not all file systems support hardlinks. If that's the case for you, set@code{nnmail-crosspost-link-function} to @code{copy-file}. (Thisvariable is @code{add-name-to-file} by default.)@kindex M-x nnmail-split-history@kindex nnmail-split-historyIf you wish to see where the previous mail split put the messages, youcan use the @kbd{M-x nnmail-split-history} command. If you wish to seewhere re-spooling messages would put the messages, you can use@code{gnus-summary-respool-trace} and related commands (@pxref{MailGroup Commands}).Gnus gives you all the opportunity you could possibly want for shootingyourself in the foot. Let's say you create a group that will containall the mail you get from your boss. And then you accidentallyunsubscribe from the group. Gnus will still put all the mail from yourboss in the unsubscribed group, and so, when your boss mails you ``Havethat report ready by Monday or you're fired!'', you'll never see it and,come Tuesday, you'll still believe that you're gainfully employed whileyou really should be out collecting empty bottles to save up for nextmonth's rent money.@node Mail Sources@subsection Mail SourcesMail can be gotten from many different sources---the mail spool, from aPOP mail server, from a procmail directory, or from a maildir, forinstance.@menu* Mail Source Specifiers:: How to specify what a mail source is.* Mail Source Customization:: Some variables that influence things.* Fetching Mail:: Using the mail source specifiers.@end menu@node Mail Source Specifiers@subsubsection Mail Source Specifiers@cindex POP@cindex mail server@cindex procmail@cindex mail spool@cindex mail sourceYou tell Gnus how to fetch mail by setting @code{mail-sources}(@pxref{Fetching Mail}) to a @dfn{mail source specifier}.Here's an example:@lisp(pop :server "pop3.mailserver.com" :user "myname")@end lispAs can be observed, a mail source specifier is a list where the firstelement is a @dfn{mail source type}, followed by an arbitrary number of@dfn{keywords}. Keywords that are not explicitly specified are givendefault values.The following mail source types are available:@table @code@item fileGet mail from a single file; typically from the mail spool.Keywords:@table @code@item :pathThe file name. Defaults to the value of the @code{MAIL}environment variable or @file{/usr/mail/spool/user-name}.@end tableAn example file mail source:@lisp(file :path "/usr/spool/mail/user-name")@end lispOr using the default file name:@lisp(file)@end lispIf the mail spool file is not located on the local machine, it's best touse POP or @sc{imap} or the like to fetch the mail. You can not use ange-ftpfile names here---it has no way to lock the mail spool while moving themail.If it's impossible to set up a proper server, you can use ssh instead.@lisp(setq mail-sources '((file :prescript "ssh host bin/getmail >%t")))@end lispThe @samp{getmail} script would look something like the following:@example#!/bin/sh# getmail - move mail from spool to stdout# flu@@iki.fiMOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemailTMP=$HOME/Mail/tmprm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP@end exampleAlter this script to fit find the @samp{movemail} you want to use.@item directoryGet mail from several files in a directory. This is typically used whenyou have procmail split the incoming mail into several files. Setting@code{nnmail-scan-directory-mail-source-once} to non-nil force Gnus toscan the mail source only once.Keywords:@table @code@item :pathThe name of the directory where the files are. There is no defaultvalue.@item :suffixOnly files ending with this suffix are used. The default is@samp{.spool}.@item :predicateOnly files that have this predicate return non-@code{nil} are returned.The default is @code{identity}. This is used as an additionalfilter---only files that have the right suffix @emph{and} satisfy thispredicate are considered.@item :prescript@itemx :postscriptScript run before/after fetching mail.@end tableAn example directory mail source:@lisp(directory :path "/home/user-name/procmail-dir/" :suffix ".prcml")@end lisp@item popGet mail from a POP server.Keywords:@table @code@item :serverThe name of the POP server. The default is taken from the@code{MAILHOST} environment variable.@item :portThe port number of the POP server. This can be a number (e.g.@:@samp{:port 110}) or a string (e.g.@: @samp{:port "pop3"}). If it is astring, it should be a service name as listed in @file{/etc/services} onUnix systems. The default is @samp{"pop3"}. On some systems you mightneed to specify it as @samp{"pop-3"} instead.@item :userThe user name to give to the POP server. The default is the loginname.@item :passwordThe password to give to the POP server. If not specified, the user isprompted.@item :programThe program to use to fetch mail from the POP server. This should bea @code{format}-like string. Here's an example:@examplefetchmail %u@@%s -P %p %t@end exampleThe valid format specifier characters are:@table @samp@item tThe name of the file the mail is to be moved to. This must always beincluded in this string.@item sThe name of the server.@item PThe port number of the server.@item uThe user name to use.@item pThe password to use.@end tableThe values used for these specs are taken from the values you give thecorresponding keywords.@item :prescriptA script to be run before fetching the mail. The syntax is the same asthe @code{:program} keyword. This can also be a function to be run.@item :postscriptA script to be run after fetching the mail. The syntax is the same asthe @code{:program} keyword. This can also be a function to be run.@item :functionThe function to use to fetch mail from the POP server. The function iscalled with one parameter---the name of the file where the mail shouldbe moved to.@item :authenticationThis can be either the symbol @code{password} or the symbol @code{apop}and says what authentication scheme to use. The default is@code{password}.@end tableIf the @code{:program} and @code{:function} keywords aren't specified,@code{pop3-movemail} will be used.Here are some examples. Fetch from the default POP server, using thedefault user name, and default fetcher:@lisp(pop)@end lispFetch from a named server with a named user and password:@lisp(pop :server "my.pop.server" :user "user-name" :password "secret")@end lispUse @samp{movemail} to move the mail:@lisp(pop :program "movemail po:%u %t %p")@end lisp@item maildirGet mail from a maildir. This is a type of mailbox that is supported byat least qmail and postfix, where each file in a special directorycontains exactly one mail.Keywords:@table @code@item :pathThe name of the directory where the mails are stored. The default istaken from the @code{MAILDIR} environment variable or@samp{~/Maildir/}.@item :subdirsThe subdirectories of the Maildir. The default is@samp{("new" "cur")}.@c If you sometimes look at your mail through a pop3 daemon before fetching@c them with Gnus, you may also have to fetch your mails from the@c @code{cur} directory inside the maildir, like in the first example@c below.You can also get mails from remote hosts (because maildirs don't sufferfrom locking problems).@end tableTwo example maildir mail sources:@lisp(maildir :path "/home/user-name/Maildir/" :subdirs ("cur" "new"))@end lisp@lisp(maildir :path "/user@@remotehost.org:~/Maildir/" :subdirs ("new"))@end lisp@item imapGet mail from a @sc{imap} server. If you don't want to use @sc{imap}as intended, as a network mail reading protocol (ie with nnimap), forsome reason or other, Gnus let you treat it similar to a POP serverand fetches articles from a given @sc{imap} mailbox. @xref{IMAP}, formore information.Keywords:@table @code@item :serverThe name of the @sc{imap} server. The default is taken from the@code{MAILHOST} environment variable.@item :portThe port number of the @sc{imap} server. The default is @samp{143}, or@samp{993} for SSL connections.@item :userThe user name to give to the @sc{imap} server. The default is the loginname.@item :passwordThe password to give to the @sc{imap} server. If not specified, the user isprompted.@item :streamWhat stream to use for connecting to the server, this is one of thesymbols in @code{imap-stream-alist}. Right now, this means@samp{kerberos4}, @samp{ssl} or the default @samp{network}.@item :authenticationWhich authenticator to use for authenticating to the server, this is oneof the symbols in @code{imap-authenticator-alist}. Right now, thismeans @samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} or the default@samp{login}.@item :programWhen using the `shell' :stream, the contents of this variable ismapped into the `imap-shell-program' variable. This should be a@code{format}-like string (or list of strings). Here's an example:@examplessh %s imapd@end exampleThe valid format specifier characters are:@table @samp@item sThe name of the server.@item lUser name from `imap-default-user'.@item pThe port number of the server.@end tableThe values used for these specs are taken from the values you give thecorresponding keywords.@item :mailboxThe name of the mailbox to get mail from. The default is @samp{INBOX}which normally is the mailbox which receive incoming mail.@item :predicateThe predicate used to find articles to fetch. The default, @samp{UNSEENUNDELETED}, is probably the best choice for most people, but if yousometimes peek in your mailbox with a @sc{imap} client and mark somearticles as read (or; SEEN) you might want to set this to @samp{nil}.Then all articles in the mailbox is fetched, no matter what. For acomplete list of predicates, see RFC 2060 �6.4.4.@item :fetchflagHow to flag fetched articles on the server, the default @samp{\Deleted}will mark them as deleted, an alternative would be @samp{\Seen} whichwould simply mark them as read. These are the two most likely choices,but more flags are defined in RFC 2060 �2.3.2.@item :dontexpungeIf non-nil, don't remove all articles marked as deleted in the mailboxafter finishing the fetch.@end tableAn example @sc{imap} mail source:@lisp(imap :server "mail.mycorp.com" :stream kerberos4 :fetchflag "\\Seen")@end lisp@item webmailGet mail from a webmail server, such as www.hotmail.com,webmail.netscape.com, www.netaddress.com, www.my-deja.com.NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail sourceis suggested.NOTE: Webmail largely depends cookies. A "one-line-cookie" patch isrequired for url "4.0pre.46".WARNING: Mails may lost. NO WARRANTY.Keywords:@table @code@item :subtypeThe type of the webmail server. The default is @code{hotmail}. Thealternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.@item :userThe user name to give to the webmail server. The default is the loginname.@item :passwordThe password to give to the webmail server. If not specified, the user isprompted.@item :dontexpungeIf non-nil, only fetch unread articles and don't move them to trashfolder after finishing the fetch.@end tableAn example webmail source:@lisp(webmail :subtype 'hotmail :user "user-name" :password "secret")@end lisp@end table@table @dfn@item Common KeywordsCommon keywords can be used in any type of mail source.Keywords:@table @code@item :pluggedIf non-nil, fetch the mail even when Gnus is unplugged. If you usedirectory source to get mail, you can specify it as in this example:@lisp(setq mail-sources '((directory :path "/home/pavel/.Spool/" :suffix "" :plugged t)))@end lispGnus will then fetch your mail even when you are unplugged. This isuseful when you use local mail and news.@end table@end table@subsubsection Function InterfaceSome of the above keywords specify a Lisp function to be executed.For each keyword @code{:foo}, the Lisp variable @code{foo} is bound tothe value of the keyword while the function is executing. For example,consider the following mail-source setting:@lisp(setq mail-sources '((pop :user "jrl" :server "pophost" :function fetchfunc)))@end lispWhile the function @code{fetchfunc} is executing, the symbol @code{user}is bound to @code{"jrl"}, and the symbol @code{server} is bound to@code{"pophost"}. The symbols @code{port}, @code{password},@code{program}, @code{prescript}, @code{postscript}, @code{function},and @code{authentication} are also bound (to their default values).See above for a list of keywords for each type of mail source.@node Mail Source Customization@subsubsection Mail Source CustomizationThe following is a list of variables that influence how the mail isfetched. You would normally not need to set or change any of thesevariables.@table @code@item mail-source-crash-box@vindex mail-source-crash-boxFile where mail will be stored while processing it. The default is@file{~/.emacs-mail-crash-box}.@item mail-source-delete-incoming@vindex mail-source-delete-incomingIf non-@code{nil}, delete incoming files after handling them.@item mail-source-directory@vindex mail-source-directoryDirectory where files (if any) will be stored. The default is@file{~/Mail/}. At present, the only thing this is used for is to saywhere the incoming files will be stored if the previous variable is@code{nil}.@item mail-source-incoming-file-prefix@vindex mail-source-incoming-file-prefixPrefix for file name for storing incoming mail. The default is@file{Incoming}, in which case files will end up with names like@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really onlyrelevant if @code{mail-source-delete-incoming} is @code{nil}.@item mail-source-default-file-modes@vindex mail-source-default-file-modesAll new mail files will get this file mode. The default is 384.@end table@node Fetching Mail@subsubsection Fetching Mail@vindex mail-sources@vindex nnmail-spool-fileThe way to actually tell Gnus where to get new mail from is to set@code{mail-sources} to a list of mail source specifiers(@pxref{Mail Source Specifiers}).If this variable (and the obsolescent @code{nnmail-spool-file}) is@code{nil}, the mail back ends will never attempt to fetch mail bythemselves.If you want to fetch mail both from your local spool as well as a POPmail server, you'd say something like:@lisp(setq mail-sources '((file) (pop :server "pop3.mail.server" :password "secret")))@end lispOr, if you don't want to use any of the keyword defaults:@lisp(setq mail-sources '((file :path "/var/spool/mail/user-name") (pop :server "pop3.mail.server" :user "user-name" :port "pop3" :password "secret")))@end lispWhen you use a mail back end, Gnus will slurp all your mail from yourinbox and plonk it down in your home directory. Gnus doesn't move anymail if you're not using a mail back end---you have to do a lot of magicinvocations first. At the time when you have finished drawing thepentagram, lightened the candles, and sacrificed the goat, you reallyshouldn't be too surprised when Gnus moves your mail.@node Mail Back End Variables@subsection Mail Back End VariablesThese variables are (for the most part) pertinent to all the variousmail back ends.@table @code@vindex nnmail-read-incoming-hook@item nnmail-read-incoming-hookThe mail back ends all call this hook after reading new mail. You canuse this hook to notify any mail watch programs, if you want to.@vindex nnmail-split-hook@item nnmail-split-hook@findex article-decode-encoded-words@findex RFC 1522 decoding@findex RFC 2047 decodingHook run in the buffer where the mail headers of each message is keptjust before the splitting based on these headers is done. The hook isfree to modify the buffer contents in any way it sees fit---the bufferis discarded after the splitting has been done, and no changes performedin the buffer will show up in any files.@code{gnus-article-decode-encoded-words} is one likely function to addto this hook.@vindex nnmail-pre-get-new-mail-hook@vindex nnmail-post-get-new-mail-hook@item nnmail-pre-get-new-mail-hook@itemx nnmail-post-get-new-mail-hookThese are two useful hooks executed when treating new incomingmail---@code{nnmail-pre-get-new-mail-hook} (is called just beforestarting to handle the new mail) and@code{nnmail-post-get-new-mail-hook} (is called when the mail handlingis done). Here's and example of using these two hooks to change thedefault file modes the new mail files get:@lisp(add-hook 'gnus-pre-get-new-mail-hook (lambda () (set-default-file-modes 511)))(add-hook 'gnus-post-get-new-mail-hook (lambda () (set-default-file-modes 551)))@end lisp@item nnmail-use-long-file-names@vindex nnmail-use-long-file-namesIf non-@code{nil}, the mail back ends will use long file and directorynames. Groups like @samp{mail.misc} will end up in directories(assuming use of @code{nnml} back end) or files (assuming use of@code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},the same group will end up in @file{mail/misc}.@item nnmail-delete-file-function@vindex nnmail-delete-file-function@findex delete-fileFunction called to delete files. It is @code{delete-file} by default.@item nnmail-cache-accepted-message-ids@vindex nnmail-cache-accepted-message-idsIf non-@code{nil}, put the @code{Message-ID}s of articles imported intothe back end (via @code{Gcc}, for instance) into the mail duplicationdiscovery cache. The default is @code{nil}.@end table@node Fancy Mail Splitting@subsection Fancy Mail Splitting@cindex mail splitting@cindex fancy mail splitting@vindex nnmail-split-fancy@findex nnmail-split-fancyIf the rather simple, standard method for specifying how to split maildoesn't allow you to do what you want, you can set@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you canplay with the @code{nnmail-split-fancy} variable.Let's look at an example value of this variable first:@lisp;; Messages from the mailer daemon are not crossposted to any of;; the ordinary groups. Warnings are put in a separate group;; from real errors.(| ("from" mail (| ("subject" "warn.*" "mail.warning") "mail.misc")) ;; Non-error messages are crossposted to all relevant ;; groups, but we don't crosspost between the group for the ;; (ding) list and the group for other (ding) related mail. (& (| (any "ding@@ifi\\.uio\\.no" "ding.list") ("subject" "ding" "ding.misc")) ;; Other mailing lists... (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") ;; Both lists below have the same suffix, so prevent ;; cross-posting to mkpkg.list of messages posted only to ;; the bugs- list, but allow cross-posting when the ;; message was really cross-posted. (any "bugs-mypackage@@somewhere" "mypkg.bugs") (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list") ;; People... (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) ;; Unmatched mail goes to the catch all group. "misc.misc")@end lispThis variable has the format of a @dfn{split}. A split is a (possibly)recursive structure where each split may contain other splits. Here arethe five possible split syntaxes:@enumerate@item@samp{group}: If the split is a string, that will be taken as a groupname. Normal regexp match expansion will be done. See below forexamples.@item@code{(@var{field} @var{value} @code{[-} @var{restrict}@code{[@dots{}]}@code{]} @var{split})}: If the split is a list, thefirst element of which is a string, then store the message asspecified by @var{split}, if header @var{field} (a regexp) contains@var{value} (also a regexp). If @var{restrict} (yet another regexp)matches some string after @var{field} and before the end of thematched @var{value}, the @var{split} is ignored. If none of the@var{restrict} clauses match, @var{split} is processed.@item@code{(| @var{split}@dots{})}: If the split is a list, and the firstelement is @code{|} (vertical bar), then process each @var{split} untilone of them matches. A @var{split} is said to match if it will causethe mail message to be stored in one or more groups.@item@code{(& @var{split}@dots{})}: If the split is a list, and the firstelement is @code{&}, then process all @var{split}s in the list.@item@code{junk}: If the split is the symbol @code{junk}, then don't savethis message. Use with extreme caution.@item@code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: If the split isa list, and the first element is @code{:}, then the second element willbe called as a function with @var{args} given as arguments. Thefunction should return a @var{split}.For instance, the following function could be used to split based on thebody of the messages:@lisp(defun split-on-body () (save-excursion (set-buffer " *nnmail incoming*") (goto-char (point-min)) (when (re-search-forward "Some.*string" nil t) "string.group")))@end lisp@item@code{(! @var{func} @var{split})}: If the split is a list, and the firstelement is @code{!}, then SPLIT will be processed, and FUNC will becalled as a function with the result of SPLIT as argument. FUNC shouldreturn a split.@item@code{nil}: If the split is @code{nil}, it is ignored.@end enumerateIn these splits, @var{field} must match a complete field name.@var{value} must match a complete word according to the fundamental modesyntax table. You can use @code{.*} in the regexps to match partialfield names or words. In other words, all @var{value}'s are wrapped in@samp{\<} and @samp{\>} pairs.@vindex nnmail-split-abbrev-alist@var{field} and @var{value} can also be lisp symbols, in that case theyare expanded as specified by the variable@code{nnmail-split-abbrev-alist}. This is an alist of cons cells, wherethe @code{car} of a cell contains the key, and the @code{cdr} contains the associatedvalue.@vindex nnmail-split-fancy-syntax-table@code{nnmail-split-fancy-syntax-table} is the syntax table in effectwhen all this splitting is performed.If you want to have Gnus create groups dynamically based on someinformation in the headers (i.e., do @code{replace-match}-likesubstitutions in the group names), you can say things like:@example(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")@end exampleIn this example, messages sent to @samp{debian-foo@@lists.debian.org}will be filed in @samp{mail.debian.foo}.If the string contains the element @samp{\&}, then the previouslymatched string will be substituted. Similarly, the elements @samp{\\1}up to @samp{\\9} will be substituted with the text matched by thegroupings 1 through 9.@findex nnmail-split-fancy-with-parent@code{nnmail-split-fancy-with-parent} is a function which allows you tosplit followups into the same groups their parents are in. Sometimesyou can't make splitting rules for all your mail. For example, yourboss might send you personal mail regarding different projects you areworking on, and as you can't tell your boss to put a distinguishingstring into the subject line, you have to resort to manually moving themessages into the right group. With this function, you only have to doit once per thread.To use this feature, you have to set @code{nnmail-treat-duplicates} to anon-nil value. And then you can include@code{nnmail-split-fancy-with-parent} using the colon feature, like so:@lisp(setq nnmail-split-fancy '(| (: nnmail-split-fancy-with-parent) ;; other splits go here ))@end lispThis feature works as follows: when @code{nnmail-treat-duplicates} isnon-nil, Gnus records the message id of every message it sees in thefile specified by the variable @code{nnmail-message-id-cache-file},together with the group it is in (the group is omitted for non-mailmessages). When mail splitting is invoked, the function@code{nnmail-split-fancy-with-parent} then looks at the References (andIn-Reply-To) header of each message to split and searches the filespecified by @code{nnmail-message-id-cache-file} for the message ids.When it has found a parent, it returns the corresponding group name. Itis recommended that you set @code{nnmail-message-id-cache-length} to asomewhat higher number than the default so that the message ids arestill in the cache. (A value of 5000 appears to create a file some 300kBytes in size.)@vindex nnmail-cache-accepted-message-idsWhen @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnusalso records the message ids of moved articles, so that the followupmessages goes into the new group.@node Group Mail Splitting@subsection Group Mail Splitting@cindex mail splitting@cindex group mail splitting@findex gnus-group-splitIf you subscribe to dozens of mailing lists but you don't want tomaintain mail splitting rules manually, group mail splitting is for you.You just have to set @var{to-list} and/or @var{to-address} in groupparameters or group customization and set @code{nnmail-split-methods} to@code{gnus-group-split}. This splitting function will scan all groupsfor those parameters and split mail accordingly, i.e., messages postedfrom or to the addresses specified in the parameters @var{to-list} or@var{to-address} of a mail group will be stored in that group.Sometimes, mailing lists have multiple addresses, and you may want mailsplitting to recognize them all: just set the @var{extra-aliases} groupparameter to the list of additional addresses and it's done. If you'drather use a regular expression, set @var{split-regexp}.All these parameters in a group will be used to create an@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},the @var{value} is a single regular expression that matches@var{to-list}, @var{to-address}, all of @var{extra-aliases} and allmatches of @var{split-regexp}, and the @var{split} is the name of thegroup. @var{restrict}s are also supported: just set the@var{split-exclude} parameter to a list of regular expressions.If you can't get the right split to be generated using all theseparameters, or you just need something fancier, you can set theparameter @var{split-spec} to an @code{nnmail-split-fancy} split. Inthis case, all other aforementioned parameters will be ignored by@code{gnus-group-split}. In particular, @var{split-spec} may be set to@code{nil}, in which case the group will be ignored by@code{gnus-group-split}.@vindex gnus-group-split-default-catch-all-group@code{gnus-group-split} will do cross-posting on all groups that match,by defining a single @code{&} fancy split containing one split for eachgroup. If a message doesn't match any split, it will be stored in thegroup named in @code{gnus-group-split-default-catch-all-group}, unlesssome group has @var{split-spec} set to @code{catch-all}, in which casethat group is used as the catch-all group. Even though this variable isoften used just to name a group, it may also be set to an arbitrarilycomplex fancy split (after all, a group name is a fancy split), and thismay be useful to split mail that doesn't go to any mailing list topersonal mail folders. Note that this fancy split is added as the lastelement of a @code{|} split list that also contains a @code{&} splitwith the rules extracted from group parameters.It's time for an example. Assume the following group parameters havebeen defined:@examplennml:mail.bar:((to-address . "bar@@femail.com") (split-regexp . ".*@@femail\\.com"))nnml:mail.foo:((to-list . "foo@@nowhere.gov") (extra-aliases "foo@@localhost" "foo-redist@@home") (split-exclude "bugs-foo" "rambling-foo") (admin-address . "foo-request@@nowhere.gov"))nnml:mail.others:((split-spec . catch-all))@end exampleSetting @code{nnmail-split-methods} to @code{gnus-group-split} willbehave as if @code{nnmail-split-fancy} had been selected and variable@code{nnmail-split-fancy} had been set as follows:@lisp(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar") (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)" - "bugs-foo" - "rambling-foo" "mail.foo")) "mail.others")@end lisp@findex gnus-group-split-fancyIf you'd rather not use group splitting for all your mail groups, youmay use it for only some of them, by using @code{nnmail-split-fancy}splits like this:@lisp(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL)@end lisp@var{groups} may be a regular expression or a list of group names whoseparameters will be scanned to generate the output split.@var{no-crosspost} can be used to disable cross-posting; in this case, asingle @code{|} split will be output. @var{catch-all} is the fallbackfancy split, used like @var{gnus-group-split-default-catch-all-group}.If @var{catch-all} is @code{nil}, or if @var{split-regexp} matches theempty string in any selected group, no catch-all split will be issued.Otherwise, if some group has @var{split-spec} set to @code{catch-all},this group will override the value of the @var{catch-all} argument.@findex gnus-group-split-setupUnfortunately, scanning all groups and their parameters can be quiteslow, especially considering that it has to be done for every message.But don't despair! The function @code{gnus-group-split-setup} can beused to enable @code{gnus-group-split} in a much more efficient way. Itsets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets@code{nnmail-split-fancy} to the split produced by@code{gnus-group-split-fancy}. Thus, the group parameters are onlyscanned once, no matter how many messages are split.@findex gnus-group-split-updateHowever, if you change group parameters, you have to update@code{nnmail-split-fancy} manually. You can do it by running@code{gnus-group-split-update}. If you'd rather have it updatedautomatically, just tell @code{gnus-group-split-setup} to do it foryou. For example, add to your @file{.gnus}:@lisp(gnus-group-split-setup AUTO-UPDATE CATCH-ALL)@end lispIf @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't everhave to worry about updating @code{nnmail-split-fancy} again. If youdon't omit @var{catch-all} (it's optional, equivalent to @code{nil}),@code{gnus-group-split-default-catch-all-group} will be set to itsvalue.@vindex gnus-group-split-updated-hookBecause you may want to change @code{nnmail-split-fancy} after it is setby @code{gnus-group-split-update}, this function will run@code{gnus-group-split-updated-hook} just before finishing.@node Incorporating Old Mail@subsection Incorporating Old MailMost people have lots of old mail stored in various file formats. Ifyou have set up Gnus to read mail using one of the spiffy Gnus mailback ends, you'll probably wish to have that old mail incorporated intoyour mail groups.Doing so can be quite easy.To take an example: You're reading mail using @code{nnml}(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to asatisfactory value (@pxref{Splitting Mail}). You have an old Unix mboxfile filled with important, but old, mail. You want to move it intoyour @code{nnml} groups.Here's how:@enumerate@itemGo to the group buffer.@itemType @kbd{G f} and give the name of the mbox file when prompted to create an@code{nndoc} group from the mbox file (@pxref{Foreign Groups}).@itemType @key{SPC} to enter the newly created group.@itemType @kbd{M P b} to process-mark all articles in this group's buffer(@pxref{Setting Process Marks}).@itemType @kbd{B r} to respool all the process-marked articles, and answer@samp{nnml} when prompted (@pxref{Mail Group Commands}).@end enumerateAll the mail messages in the mbox file will now also be spread out overall your @code{nnml} groups. Try entering them and check whether thingshave gone without a glitch. If things look ok, you may considerdeleting the mbox file, but I wouldn't do that unless I was absolutelysure that all the mail has ended up where it should be.Respooling is also a handy thing to do if you're switching from one mailback end to another. Just respool all the mail in the old mail groupsusing the new mail back end.@node Expiring Mail@subsection Expiring Mail@cindex article expiryTraditional mail readers have a tendency to remove mail articles whenyou mark them as read, in some way. Gnus takes a fundamentallydifferent approach to mail reading.Gnus basically considers mail just to be news that has been received ina rather peculiar manner. It does not think that it has the power toactually change the mail, or delete any mail messages. If you enter amail group, and mark articles as ``read'', or kill them in some otherfashion, the mail articles will still exist on the system. I repeat:Gnus will not delete your old, read mail. Unless you ask it to, ofcourse.To make Gnus get rid of your unwanted mail, you have to mark thearticles as @dfn{expirable}. This does not mean that the articles willdisappear right away, however. In general, a mail article will bedeleted from your system if, 1) it is marked as expirable, AND 2) it ismore than one week old. If you do not mark an article as expirable, itwill remain on your system until hell freezes over. This bearsrepeating one more time, with some spurious capitalizations: IF you doNOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.@vindex gnus-auto-expirable-newsgroupsYou do not have to mark articles as expirable by hand. Groups thatmatch the regular expression @code{gnus-auto-expirable-newsgroups} willhave all articles that you read marked as expirable automatically. Allarticles marked as expirable have an @samp{E} in the firstcolumn in the summary buffer.By default, if you have auto expiry switched on, Gnus will mark all thearticles you read as expirable, no matter if they were read or unreadbefore. To avoid having articles marked as read marked as expirableautomatically, you can put something like the following in your@file{.gnus} file:@vindex gnus-mark-article-hook@lisp(remove-hook 'gnus-mark-article-hook 'gnus-summary-mark-read-and-unread-as-read)(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)@end lispNote that making a group auto-expirable doesn't mean that all readarticles are expired---only the articles marked as expirablewill be expired. Also note that using the @kbd{d} command won't makegroups expirable---only semi-automatic marking of articles as read willmark the articles as expirable in auto-expirable groups.Let's say you subscribe to a couple of mailing lists, and you want thearticles you have read to disappear after a while:@lisp(setq gnus-auto-expirable-newsgroups "mail.nonsense-list\\|mail.nice-list")@end lispAnother way to have auto-expiry happen is to have the element@code{auto-expire} in the group parameters of the group.If you use adaptive scoring (@pxref{Adaptive Scoring}) andauto-expiring, you'll have problems. Auto-expiring and adaptive scoringdon't really mix very well.@vindex nnmail-expiry-waitThe @code{nnmail-expiry-wait} variable supplies the default time anexpirable article has to live. Gnus starts counting days from when themessage @emph{arrived}, not from when it was sent. The default is sevendays.Gnus also supplies a function that lets you fine-tune how long articlesare to live, based on what group they are in. Let's say you want tohave one month expiry period in the @samp{mail.private} group, a one dayexpiry period in the @samp{mail.junk} group, and a six day expiry periodeverywhere else:@vindex nnmail-expiry-wait-function@lisp(setq nnmail-expiry-wait-function (lambda (group) (cond ((string= group "mail.private") 31) ((string= group "mail.junk") 1) ((string= group "important") 'never) (t 6))))@end lispThe group names this function is fed are ``unadorned'' groupnames---no @samp{nnml:} prefixes and the like.The @code{nnmail-expiry-wait} variable and@code{nnmail-expiry-wait-function} function can either be a number (notnecessarily an integer) or one of the symbols @code{immediate} or@code{never}.You can also use the @code{expiry-wait} group parameter to selectivelychange the expiry period (@pxref{Group Parameters}).@vindex nnmail-expiry-targetThe normal action taken when expiring articles is to delete them.However, in some circumstances it might make more sense to move them toother groups instead of deleting them. The variable @code{nnmail-expiry-target}(and the @code{expiry-target} group parameter) controls this. Thevariable supplies a default value for all groups, which can beoverridden for specific groups by the group parameter.default value is @code{delete}, but this can also be a string (whichshould be the name of the group the message should be moved to), or afunction (which will be called in a buffer narrowed to the message inquestion, and with the name of the group being moved from as itsparameter) which should return a target -- either a group name or@code{delete}.Here's an example for specifying a group name:@lisp(setq nnmail-expiry-target "nnml:expired")@end lisp@vindex nnmail-keep-last-articleIf @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will neverexpire the final article in a mail newsgroup. This is to make lifeeasier for procmail users.@vindex gnus-total-expirable-newsgroupsBy the way: That line up there, about Gnus never expiring non-expirablearticles, is a lie. If you put @code{total-expire} in the groupparameters, articles will not be marked as expirable, but all readarticles will be put through the expiry process. Use with extremecaution. Even more dangerous is the@code{gnus-total-expirable-newsgroups} variable. All groups that matchthis regexp will have all read articles put through the expiry process,which means that @emph{all} old mail articles in the groups in questionwill be deleted after a while. Use with extreme caution, and don't comecrying to me when you discover that the regexp you used matched thewrong group and all your important mail has disappeared. Be a@emph{man}! Or a @emph{woman}! Whatever you feel more comfortablewith! So there!Most people make most of their mail groups total-expirable, though.@vindex gnus-inhibit-user-auto-expireIf @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user markingcommands will not mark an article as expirable, even if the group hasauto-expire turned on.@node Washing Mail@subsection Washing Mail@cindex mail washing@cindex list server brain damage@cindex incoming mail treatmentMailers and list servers are notorious for doing all sorts of really,really stupid things with mail. ``Hey, RFC 822 doesn't explicitlyprohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to theend of all lines passing through our server, so let's do that!!!!1!''Yes, but RFC 822 wasn't designed to be read by morons. Things that wereconsidered to be self-evident were not discussed. So. Here we are.Case in point: The German version of Microsoft Exchange adds @samp{AW:} to the subjects of replies instead of @samp{Re: }. I could pretend tobe shocked and dismayed by this, but I haven't got the energy. It is tolaugh.Gnus provides a plethora of functions for washing articles whiledisplaying them, but it might be nicer to do the filtering beforestoring the mail to disc. For that purpose, we have three hooks andvarious functions that can be put in these hooks.@table @code@item nnmail-prepare-incoming-hook@vindex nnmail-prepare-incoming-hookThis hook is called before doing anything with the mail and is meant forgrand, sweeping gestures. It is called in a buffer that contains allthe new, incoming mail. Functions to be used include:@table @code@item nnheader-ms-strip-cr@findex nnheader-ms-strip-crRemove trailing carriage returns from each line. This is default onEmacs running on MS machines.@end table@item nnmail-prepare-incoming-header-hook@vindex nnmail-prepare-incoming-header-hookThis hook is called narrowed to each header. It can be used whencleaning up the headers. Functions that can be used include:@table @code@item nnmail-remove-leading-whitespace@findex nnmail-remove-leading-whitespaceClear leading white space that ``helpful'' listservs have added to theheaders to make them look nice. Aaah.@item nnmail-remove-list-identifiers@findex nnmail-remove-list-identifiersSome list servers add an identifier---for example, @samp{(idm)}---to thebeginning of all @code{Subject} headers. I'm sure that's nice forpeople who use stone age mail readers. This function will removestrings that match the @code{nnmail-list-identifiers} regexp, which canalso be a list of regexp. @code{nnmail-list-identifiers} may not contain@code{\\(..\\)}.For instance, if you want to remove the @samp{(idm)} and the@samp{nagnagnag} identifiers:@lisp(setq nnmail-list-identifiers '("(idm)" "nagnagnag"))@end lispThis can also be done non-destructively with@code{gnus-list-identifiers}, @xref{Article Hiding}.@item nnmail-remove-tabs@findex nnmail-remove-tabsTranslate all tab characters into space characters.@item nnmail-fix-eudora-headers@findex nnmail-fix-eudora-headers@cindex EudoraEudora produces broken @code{References} headers, but OK@code{In-Reply-To} headers. This function will get rid of the@code{References} headers.@end table@item nnmail-prepare-incoming-message-hook@vindex nnmail-prepare-incoming-message-hookThis hook is called narrowed to each message. Functions to be usedinclude:@table @code@item article-de-quoted-unreadable@findex article-de-quoted-unreadableDecode Quoted Readable encoding.@end table@end table@node Duplicates@subsection Duplicates@vindex nnmail-treat-duplicates@vindex nnmail-message-id-cache-length@vindex nnmail-message-id-cache-file@cindex duplicate mailsIf you are a member of a couple of mailing lists, you will sometimesreceive two copies of the same mail. This can be quite annoying, so@code{nnmail} checks for and treats any duplicates it might find. To dothis, it keeps a cache of old @code{Message-ID}s---@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} bydefault. The approximate maximum number of @code{Message-ID}s storedthere is controlled by the @code{nnmail-message-id-cache-length}variable, which is 1000 by default. (So 1000 @code{Message-ID}s will bestored.) If all this sounds scary to you, you can set@code{nnmail-treat-duplicates} to @code{warn} (which is what it is bydefault), and @code{nnmail} won't delete duplicate mails. Instead itwill insert a warning into the head of the mail saying that it thinksthat this is a duplicate of a different message.This variable can also be a function. If that's the case, the functionwill be called from a buffer narrowed to the message in question withthe @code{Message-ID} as a parameter. The function must return either@code{nil}, @code{warn}, or @code{delete}.You can turn this feature off completely by setting the variable to@code{nil}.If you want all the duplicate mails to be put into a special@dfn{duplicates} group, you could do that using the normal mail splitmethods:@lisp(setq nnmail-split-fancy '(| ;; Messages duplicates go to a separate group. ("gnus-warning" "duplication of message" "duplicate") ;; Message from daemons, postmaster, and the like to another. (any mail "mail.misc") ;; Other rules. [ ... ] ))@end lispOr something like:@lisp(setq nnmail-split-methods '(("duplicates" "^Gnus-Warning:") ;; Other rules. [...]))@end lispHere's a neat feature: If you know that the recipient reads her mailwith Gnus, and that she has @code{nnmail-treat-duplicates} set to@code{delete}, you can send her as many insults as you like, just byusing a @code{Message-ID} of a mail that you know that she's alreadyreceived. Think of all the fun! She'll never see any of it! Whee!@node Not Reading Mail@subsection Not Reading MailIf you start using any of the mail back ends, they have the annoyinghabit of assuming that you want to read mail with them. This might notbe unreasonable, but it might not be what you want.If you set @code{mail-sources} and @code{nnmail-spool-file} to@code{nil}, none of the back ends will ever attempt to read incomingmail, which should help.@vindex nnbabyl-get-new-mail@vindex nnmbox-get-new-mail@vindex nnml-get-new-mail@vindex nnmh-get-new-mail@vindex nnfolder-get-new-mailThis might be too much, if, for instance, you are reading mail quitehappily with @code{nnml} and just want to peek at some old @sc{rmail}file you have stashed away with @code{nnbabyl}. All back ends havevariables called back-end-@code{get-new-mail}. If you want to disablethe @code{nnbabyl} mail reading, you edit the virtual server for thegroup to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}narrowed to the article to be saved before saving it when readingincoming mail.@node Choosing a Mail Back End@subsection Choosing a Mail Back EndGnus will read the mail spool when you activate a mail group. The mailfile is first copied to your home directory. What happens after thatdepends on what format you want to store your mail in.There are five different mail back ends in the standard Gnus, and moreback ends are available separately. The mail back end most people use(because it is the fastest and most flexible) is @code{nnml}(@pxref{Mail Spool}).@menu* Unix Mail Box:: Using the (quite) standard Un*x mbox.* Rmail Babyl:: Emacs programs use the rmail babyl format.* Mail Spool:: Store your mail in a private spool?* MH Spool:: An mhspool-like back end.* Mail Folders:: Having one file for each group.* Comparing Mail Back Ends:: An in-depth looks at pros and cons.@end menu@node Unix Mail Box@subsubsection Unix Mail Box@cindex nnmbox@cindex unix mail box@vindex nnmbox-active-file@vindex nnmbox-mbox-fileThe @dfn{nnmbox} back end will use the standard Un*x mbox file to storemail. @code{nnmbox} will add extra headers to each mail article to saywhich group it belongs in.Virtual server settings:@table @code@item nnmbox-mbox-file@vindex nnmbox-mbox-fileThe name of the mail box in the user's home directory.@item nnmbox-active-file@vindex nnmbox-active-fileThe name of the active file for the mail box.@item nnmbox-get-new-mail@vindex nnmbox-get-new-mailIf non-@code{nil}, @code{nnmbox} will read incoming mail and split itinto groups.@end table@node Rmail Babyl@subsubsection Rmail Babyl@cindex nnbabyl@cindex rmail mbox@vindex nnbabyl-active-file@vindex nnbabyl-mbox-fileThe @dfn{nnbabyl} back end will use a babyl mail box (aka. @dfn{rmailmbox}) to store mail. @code{nnbabyl} will add extra headers to eachmail article to say which group it belongs in.Virtual server settings:@table @code@item nnbabyl-mbox-file@vindex nnbabyl-mbox-fileThe name of the rmail mbox file.@item nnbabyl-active-file@vindex nnbabyl-active-fileThe name of the active file for the rmail box.@item nnbabyl-get-new-mail@vindex nnbabyl-get-new-mailIf non-@code{nil}, @code{nnbabyl} will read incoming mail.@end table@node Mail Spool@subsubsection Mail Spool@cindex nnml@cindex mail @sc{nov} spoolThe @dfn{nnml} spool mail format isn't compatible with any other knownformat. It should be used with some caution.@vindex nnml-directoryIf you use this back end, Gnus will split all incoming mail into files,one file for each mail, and put the articles into the correspondingdirectories under the directory specified by the @code{nnml-directory}variable. The default value is @file{~/Mail/}.You do not have to create any directories beforehand; Gnus will takecare of all that.If you have a strict limit as to how many files you are allowed to storein your account, you should not use this back end. As each mail gets itsown file, you might very well occupy thousands of inodes within a fewweeks. If this is no problem for you, and it isn't a problem for youhaving your friendly systems administrator walking around, madly,shouting ``Who is eating all my inodes?! Who? Who!?!'', then you shouldknow that this is probably the fastest format to use. You do not haveto trudge through a big mbox file just to read your new mail.@code{nnml} is probably the slowest back end when it comes to articlesplitting. It has to create lots of files, and it also generates@sc{nov} databases for the incoming mails. This makes it the fastestback end when it comes to reading mail.Virtual server settings:@table @code@item nnml-directory@vindex nnml-directoryAll @code{nnml} directories will be placed under this directory.@item nnml-active-file@vindex nnml-active-fileThe active file for the @code{nnml} server.@item nnml-newsgroups-file@vindex nnml-newsgroups-fileThe @code{nnml} group descriptions file. @xref{Newsgroups FileFormat}.@item nnml-get-new-mail@vindex nnml-get-new-mailIf non-@code{nil}, @code{nnml} will read incoming mail.@item nnml-nov-is-evil@vindex nnml-nov-is-evilIf non-@code{nil}, this back end will ignore any @sc{nov} files.@item nnml-nov-file-name@vindex nnml-nov-file-nameThe name of the @sc{nov} files. The default is @file{.overview}.@item nnml-prepare-save-mail-hook@vindex nnml-prepare-save-mail-hookHook run narrowed to an article before saving.@end table@findex nnml-generate-nov-databasesIf your @code{nnml} groups and @sc{nov} files get totally out of whack,you can do a complete update by typing @kbd{M-xnnml-generate-nov-databases}. This command will trawl through theentire @code{nnml} hierarchy, looking at each and every article, so itmight take a while to complete. A better interface to thisfunctionality can be found in the server buffer (@pxref{ServerCommands}).@node MH Spool@subsubsection MH Spool@cindex nnmh@cindex mh-e mail spool@code{nnmh} is just like @code{nnml}, except that is doesn't generate@sc{nov} databases and it doesn't keep an active file. This makes@code{nnmh} a @emph{much} slower back end than @code{nnml}, but it alsomakes it easier to write procmail scripts for.Virtual server settings:@table @code@item nnmh-directory@vindex nnmh-directoryAll @code{nnmh} directories will be located under this directory.@item nnmh-get-new-mail@vindex nnmh-get-new-mailIf non-@code{nil}, @code{nnmh} will read incoming mail.@item nnmh-be-safe@vindex nnmh-be-safeIf non-@code{nil}, @code{nnmh} will go to ridiculous lengths to makesure that the articles in the folder are actually what Gnus thinks theyare. It will check date stamps and stat everything in sight, sosetting this to @code{t} will mean a serious slow-down. If you neveruse anything but Gnus to read the @code{nnmh} articles, you do not haveto set this variable to @code{t}.@end table@node Mail Folders@subsubsection Mail Folders@cindex nnfolder@cindex mbox folders@cindex mail folders@code{nnfolder} is a back end for storing each mail group in a separatefile. Each file is in the standard Un*x mbox format. @code{nnfolder}will add extra headers to keep track of article numbers and arrivaldates.Virtual server settings:@table @code@item nnfolder-directory@vindex nnfolder-directoryAll the @code{nnfolder} mail boxes will be stored under this directory.@item nnfolder-active-file@vindex nnfolder-active-fileThe name of the active file.@item nnfolder-newsgroups-file@vindex nnfolder-newsgroups-fileThe name of the group descriptions file. @xref{Newsgroups File Format}.@item nnfolder-get-new-mail@vindex nnfolder-get-new-mailIf non-@code{nil}, @code{nnfolder} will read incoming mail.@item nnfolder-save-buffer-hook@vindex nnfolder-save-buffer-hook@cindex backup filesHook run before saving the folders. Note that Emacs does the normalbackup renaming of files even with the @code{nnfolder} buffers. If youwish to switch this off, you could say something like the following inyour @file{.emacs} file:@lisp(defun turn-off-backup () (set (make-local-variable 'backup-inhibited) t))(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)@end lisp@item nnfolder-delete-mail-hook@vindex nnfolder-delete-mail-hookHook run in a buffer narrowed to the message that is to be deleted.This function can be used to copy the message to somewhere else, or toextract some information from it before removing it.@end table@findex nnfolder-generate-active-file@kindex M-x nnfolder-generate-active-fileIf you have lots of @code{nnfolder}-like files you'd like to read with@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}command to make @code{nnfolder} aware of all likely files in@code{nnfolder-directory}. This only works if you use long file names,though.@node Comparing Mail Back Ends@subsubsection Comparing Mail Back EndsFirst, just for terminology, the @dfn{back end} is the common word for alow-level access method---a transport, if you will, by which somethingis acquired. The sense is that one's mail has to come from somewhere,and so selection of a suitable back end is required in order to get thatmail within spitting distance of Gnus.The same concept exists for Usenet itself: Though access to articles istypically done by @sc{nntp} these days, once upon a midnight dreary, everyonein the world got at Usenet by running a reader on the machine where thearticles lay (the machine which today we call an @sc{nntp} server), andaccess was by the reader stepping into the articles' directory spoolarea directly. One can still select between either the @code{nntp} or@code{nnspool} back ends, to select between these methods, if one happensactually to live on the server (or can see its spool directly, anyway,via NFS).The goal in selecting a mail back end is to pick one whichsimultaneously represents a suitable way of dealing with the originalformat plus leaving mail in a form that is convenient to use in thefuture. Here are some high and low points on each:@table @code@item nnmboxUNIX systems have historically had a single, very common, and well-defined format. All messages arrive in a single @dfn{spool file}, andthey are delineated by a line whose regular expression matches@samp{^From_}. (My notational use of @samp{_} is to indicate a space,to make it clear in this instance that this is not the RFC-specified@samp{From:} header.) Because Emacs and therefore Gnus emanatehistorically from the Unix environment, it is simplest if one does notmess a great deal with the original mailbox format, so if one choosesthis back end, Gnus' primary activity in getting mail from the real spoolarea to Gnus' preferred directory is simply to copy it, with no(appreciable) format change in the process. It is the ``dumbest'' wayto move mail into availability in the Gnus environment. This makes itfast to move into place, but slow to parse, when Gnus has to look atwhat's where.@item nnbabylOnce upon a time, there was the DEC-10 and DEC-20, running operatingsystems called TOPS and related things, and the usual (only?) mailreading environment was a thing called Babyl. I don't know what formatwas used for mail landing on the system, but Babyl had its own internalformat to which mail was converted, primarily involving creating aspool-file-like entity with a scheme for inserting Babyl-specificheaders and status bits above the top of each message in the file.RMAIL was Emacs' first mail reader, it was written by Richard Stallman,and Stallman came out of that TOPS/Babyl environment, so he wrote RMAILto understand the mail files folks already had in existence. Gnus (andVM, for that matter) continue to support this format because it'sperceived as having some good qualities in those mailer-specificheaders/status bits stuff. RMAIL itself still exists as well, ofcourse, and is still maintained by Stallman.Both of the above forms leave your mail in a single file on yourfilesystem, and they must parse that entire file each time you take alook at your mail.@item nnml@code{nnml} is the back end which smells the most as though you wereactually operating with an @code{nnspool}-accessed Usenet system. (Infact, I believe @code{nnml} actually derived from @code{nnspool} code,lo these years ago.) One's mail is taken from the original spool file,and is then cut up into individual message files, 1:1. It maintains aUsenet-style active file (analogous to what one finds in an INN- orCNews-based news system in (for instance) @file{/var/lib/news/active},or what is returned via the @samp{NNTP LIST} verb) and also creates@dfn{overview} files for efficient group entry, as has been defined for@sc{nntp} servers for some years now. It is slower in mail-splitting,due to the creation of lots of files, updates to the @code{nnml} activefile, and additions to overview files on a per-message basis, but it isextremely fast on access because of what amounts to the indexing supportprovided by the active file and overviews.@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up theresource which defines available places in the filesystem to put newfiles. Sysadmins take a dim view of heavy inode occupation withintight, shared filesystems. But if you live on a personal machine wherethe filesystem is your own and space is not at a premium, @code{nnml}wins big.It is also problematic using this back end if you are living in aFAT16-based Windows world, since much space will be wasted on all thesetiny files.@item nnmhThe Rand MH mail-reading system has been around UNIX systems for a verylong time; it operates by splitting one's spool file of messages intoindividual files, but with little or no indexing support -- @code{nnmh}is considered to be semantically equivalent to ``@code{nnml} withoutactive file or overviews''. This is arguably the worst choice, becauseone gets the slowness of individual file creation married to theslowness of access parsing when learning what's new in one's groups.@item nnfolderBasically the effect of @code{nnfolder} is @code{nnmbox} (the firstmethod described above) on a per-group basis. That is, @code{nnmbox}itself puts *all* one's mail in one file; @code{nnfolder} provides alittle bit of optimization to this so that each of one's mail groups hasa Unix mail box file. It's faster than @code{nnmbox} because each groupcan be parsed separately, and still provides the simple Unix mail boxformat requiring minimal effort in moving the mail around. In addition,it maintains an ``active'' file making it much faster for Gnus to figureout how many messages there are in each separate group.If you have groups that are expected to have a massive amount ofmessages, @code{nnfolder} is not the best choice, but if you receiveonly a moderate amount of mail, @code{nnfolder} is probably the mostfriendly mail back end all over.@end table@node Browsing the Web@section Browsing the Web@cindex web@cindex browsing the web@cindex www@cindex httpWeb-based discussion forums are getting more and more popular. On manysubjects, the web-based forums have become the most important forums,eclipsing the importance of mailing lists and news groups. The reasonis easy to understand---they are friendly to new users; you just pointand click, and there's the discussion. With mailing lists, you have togo through a cumbersome subscription procedure, and most people don'teven know what a news group is.The problem with this scenario is that web browsers are not very good atbeing newsreaders. They do not keep track of what articles you've read;they do not allow you to score on subjects you're interested in; they donot allow off-line browsing; they require you to click around and driveyou mad in the end.So---if web browsers suck at reading discussion forums, why not use Gnusto do it instead?Gnus has been getting a bit of a collection of back ends for providinginterfaces to these sources.@menu* Web Searches:: Creating groups from articles that match a string.* Slashdot:: Reading the Slashdot comments.* Ultimate:: The Ultimate Bulletin Board systems.* Web Archive:: Reading mailing list archived on web.* Customizing w3:: Doing stuff to Emacs/w3 from Gnus.@end menuAll the web sources require Emacs/w3 and the url library to work.The main caveat with all these web sources is that they probably won'twork for a very long time. Gleaning information from the @sc{html} datais guesswork at best, and when the layout is altered, the Gnus back endwill fail. If you have reasonably new versions of these back ends,though, you should be ok.One thing all these Web methods have in common is that the Web sourcesare often down, unavailable or just plain too slow to be fun. In thosecases, it makes a lot of sense to let the Gnus Agent (@pxref{GnusUnplugged}) handle downloading articles, and then you can read them atleisure from your local disk. No more World Wide Wait for you.@node Web Searches@subsection Web Searches@cindex nnweb@cindex DejaNews@cindex Alta Vista@cindex InReference@cindex Usenet searches@cindex searching the UsenetIt's, like, too neat to search the Usenet for articles that match astring, but it, like, totally @emph{sucks}, like, totally, to use one ofthose, like, Web browsers, and you, like, have to, rilly, like, look atthe commercials, so, like, with Gnus you can do @emph{rad}, rilly,searches without having to use a browser.The @code{nnweb} back end allows an easy interface to the mighty searchengine. You create an @code{nnweb} group, enter a search pattern, andthen enter the group and read the articles like you would any normalgroup. The @kbd{G w} command in the group buffer (@pxref{ForeignGroups}) will do this in an easy-to-use fashion.@code{nnweb} groups don't really lend themselves to being solidgroups---they have a very fleeting idea of article numbers. In fact,each time you enter an @code{nnweb} group (not even changing the searchpattern), you are likely to get the articles ordered in a differentmanner. Not even using duplicate suppression (@pxref{DuplicateSuppression}) will help, since @code{nnweb} doesn't even know the@code{Message-ID} of the articles before reading them using some searchengines (DejaNews, for instance). The only possible way to keep trackof which articles you've read is by scoring on the @code{Date}header---mark all articles posted before the last date you read thegroup as read.If the search engine changes its output substantially, @code{nnweb}won't be able to parse it and will fail. One could hardly fault the Webproviders if they were to do this---their @emph{raison d'�tre} is tomake money off of advertisements, not to provide services to thecommunity. Since @code{nnweb} washes the ads off all the articles, onemight think that the providers might be somewhat miffed. We'll see.You must have the @code{url} and @code{w3} package installed to be ableto use @code{nnweb}.Virtual server variables:@table @code@item nnweb-type@vindex nnweb-typeWhat search engine type is being used. The currently supported typesare @code{dejanews}, @code{dejanewsold}, @code{altavista} and@code{reference}.@item nnweb-search@vindex nnweb-searchThe search string to feed to the search engine.@item nnweb-max-hits@vindex nnweb-max-hitsAdvisory maximum number of hits per search to display. The default is100.@item nnweb-type-definition@vindex nnweb-type-definitionType-to-definition alist. This alist says what @code{nnweb} should dowith the various search engine types. The following elements must bepresent:@table @code@item articleFunction to decode the article and provide something that Gnusunderstands.@item mapFunction to create an article number to message header and URL alist.@item searchFunction to send the search string to the search engine.@item addressThe address the aforementioned function should send the search stringto.@item idFormat string URL to fetch an article by @code{Message-ID}.@end table@end table@node Slashdot@subsection Slashdot@cindex Slashdot@cindex nnslashdotSlashdot (@uref{http://slashdot.org/}) is a popular news site, withlively discussion following the news articles. @code{nnslashdot} willlet you read this forum in a convenient manner.The easiest way to read this source is to put something like thefollowing in your @file{.gnus.el} file:@lisp(setq gnus-secondary-select-methods '((nnslashdot "")))@end lispThis will make Gnus query the @code{nnslashdot} back end for new commentsand groups. The @kbd{F} command will subscribe each new news article asa new Gnus group, and you can read the comments by entering thesegroups. (Note that the default subscription method is to subscribe newgroups as zombies. Other methods are available (@pxref{SubscriptionMethods}).If you want to remove an old @code{nnslashdot} group, the @kbd{G @key{DEL}}command is the most handy tool (@pxref{Foreign Groups}).When following up to @code{nnslashdot} comments (or posting newcomments), some light @sc{html}izations will be performed. Inparticular, text quoted with @samp{> } will be quoted with@code{blockquote} instead, and signatures will have @code{br} added tothe end of each line. Other than that, you can just write @sc{html}directly into the message buffer. Note that Slashdot filters out some@sc{html} forms.The following variables can be altered to change its behavior:@table @code@item nnslashdot-threadedWhether @code{nnslashdot} should display threaded groups or not. Thedefault is @code{t}. To be able to display threads, @code{nnslashdot}has to retrieve absolutely all comments in a group upon entry. If athreaded display is not required, @code{nnslashdot} will only retrievethe comments that are actually wanted by the user. Threading is nicer,but much, much slower than untreaded.@item nnslashdot-login-name@vindex nnslashdot-login-nameThe login name to use when posting.@item nnslashdot-password@vindex nnslashdot-passwordThe password to use when posting.@item nnslashdot-directory@vindex nnslashdot-directoryWhere @code{nnslashdot} will store its files. The default is@samp{~/News/slashdot/}.@item nnslashdot-active-url@vindex nnslashdot-active-urlThe @sc{url} format string that will be used to fetch the information onnews articles and comments. Default:@samp{http://slashdot.org/search.pl?section=&min=%d}.@item nnslashdot-comments-url@vindex nnslashdot-comments-urlThe @sc{url} format string that will be used to fetch comments. Thedefault is@samp{http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d}.@item nnslashdot-article-url@vindex nnslashdot-article-urlThe @sc{url} format string that will be used to fetch the news article. Thedefault is@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.@item nnslashdot-threshold@vindex nnslashdot-thresholdThe score threshold. The default is -1.@item nnslashdot-group-number@vindex nnslashdot-group-numberThe number of old groups, in addition to the ten latest, to keepupdated. The default is 0.@end table@node Ultimate@subsection Ultimate@cindex nnultimate@cindex Ultimate Bulletin BoardThe Ultimate Bulletin Board (@uref{http://www.ultimatebb.com/}) isprobably the most popular Web bulletin board system used. It has aquite regular and nice interface, and it's possible to get theinformation Gnus needs to keep groups updated.The easiest way to get started with @code{nnultimate} is to saysomething like the following in the group buffer: @kbd{B nnultimate @key{RET}http://www.tcj.com/messboard/ubbcgi/ @key{RET}}. (Substitute the @sc{url}(not including @samp{Ultimate.cgi} or the like at the end) for a forumyou're interested in; there's quite a list of them on the Ultimate website.) Then subscribe to the groups you're interested in from theserver buffer, and read them from the group buffer.The following @code{nnultimate} variables can be altered:@table @code@item nnultimate-directory@vindex nnultimate-directoryThe directory where @code{nnultimate} stores its files. The default is@samp{~/News/ultimate/}.@end table@node Web Archive@subsection Web Archive@cindex nnwarchive@cindex Web ArchiveSome mailing lists only have archives on Web servers, such as@uref{http://www.egroups.com/} and@uref{http://www.mail-archive.com/}. It has a quite regular and niceinterface, and it's possible to get the information Gnus needs to keepgroups updated.The easiest way to get started with @code{nnwarchive} is to saysomething like the following in the group buffer: @kbd{M-xgnus-group-make-warchive-group @key{RET} an_egroup @key{RET} egroups @key{RET}www.egroups.com @key{RET} your@@email.address @key{RET}}. (Substitute the@sc{an_egroup} with the mailing list you subscribed, the@sc{your@@email.address} with your email address.), or to browse theback end by @kbd{B nnwarchive @key{RET} mail-archive @key{RET}}.The following @code{nnwarchive} variables can be altered:@table @code@item nnwarchive-directory@vindex nnwarchive-directoryThe directory where @code{nnwarchive} stores its files. The default is@samp{~/News/warchive/}.@item nnwarchive-login@vindex nnwarchive-loginThe account name on the web server.@item nnwarchive-passwd@vindex nnwarchive-passwdThe password for your account on the web server.@end table@node Customizing w3@subsection Customizing w3@cindex w3@cindex html@cindex url@cindex NetscapeGnus uses the url library to fetch web pages and Emacs/w3 to display webpages. Emacs/w3 is documented in its own manual, but there are somethings that may be more relevant for Gnus users.For instance, a common question is how to make Emacs/w3 follow linksusing the @code{browse-url} functions (which will call some external webbrowser like Netscape). Here's one way:@lisp(eval-after-load "w3" '(progn (fset 'w3-fetch-orig (symbol-function 'w3-fetch)) (defun w3-fetch (&optional url target) (interactive (list (w3-read-url-with-default))) (if (eq major-mode 'gnus-article-mode) (browse-url url) (w3-fetch-orig url target)))))@end lispPut that in your @file{.emacs} file, and hitting links in w3-rendered@sc{html} in the Gnus article buffers will use @code{browse-url} tofollow the link.@node Other Sources@section Other SourcesGnus can do more than just read news or mail. The methods describedbelow allow Gnus to view directories and files as if they werenewsgroups.@menu* Directory Groups:: You can read a directory as if it was a newsgroup.* Anything Groups:: Dired? Who needs dired?* Document Groups:: Single files can be the basis of a group.* SOUP:: Reading @sc{soup} packets ``offline''.* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.* IMAP:: Using Gnus as a @sc{imap} client.@end menu@node Directory Groups@subsection Directory Groups@cindex nndir@cindex directory groupsIf you have a directory that has lots of articles in separate files init, you might treat it as a newsgroup. The files have to have numericalnames, of course.This might be an opportune moment to mention @code{ange-ftp} (and itssuccessor @code{efs}), that most wonderful of all wonderful Emacspackages. When I wrote @code{nndir}, I didn't think much about it---aback end to read directories. Big deal.@code{ange-ftp} changes that picture dramatically. For instance, if youenter the @code{ange-ftp} file name@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,@code{ange-ftp} or @code{efs} will actually allow you to read thisdirectory over at @samp{sina} as a newsgroup. Distributed news ahoy!@code{nndir} will use @sc{nov} files if they are present.@code{nndir} is a ``read-only'' back end---you can't delete or expirearticles with this method. You can use @code{nnmh} or @code{nnml} forwhatever you use @code{nndir} for, so you could switch to any of thosemethods if you feel the need to have a non-read-only @code{nndir}.@node Anything Groups@subsection Anything Groups@cindex nneethingFrom the @code{nndir} back end (which reads a single spool-likedirectory), it's just a hop and a skip to @code{nneething}, whichpretends that any arbitrary directory is a newsgroup. Strange, buttrue.When @code{nneething} is presented with a directory, it will scan thisdirectory and assign article numbers to each file. When you enter sucha group, @code{nneething} must create ``headers'' that Gnus can use.After all, Gnus is a newsreader, in case you're forgetting.@code{nneething} does this in a two-step process. First, it snoops eachfile in question. If the file looks like an article (i.e., the firstfew lines look like headers), it will use this as the head. If this isjust some arbitrary file without a head (e.g. a C source file),@code{nneething} will cobble up a header out of thin air. It will usefile ownership, name and date and do whatever it can with theseelements.All this should happen automatically for you, and you will be presentedwith something that looks very much like a newsgroup. Totally like anewsgroup, to be precise. If you select an article, it will be displayedin the article buffer, just as usual.If you select a line that represents a directory, Gnus will pop you intoa new summary buffer for this @code{nneething} group. And so on. You cantraverse the entire disk this way, if you feel like, but remember thatGnus is not dired, really, and does not intend to be, either.There are two overall modes to this action---ephemeral or solid. Whendoing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnuswill not store information on what files you have read, and what filesare new, and so on. If you create a solid @code{nneething} group thenormal way with @kbd{G m}, Gnus will store a mapping table betweenarticle numbers and file names, and you can treat this group like anyother groups. When you activate a solid @code{nneething} group, you willbe told how many unread articles it contains, etc., etc.Some variables:@table @code@item nneething-map-file-directory@vindex nneething-map-file-directoryAll the mapping files for solid @code{nneething} groups will be storedin this directory, which defaults to @file{~/.nneething/}.@item nneething-exclude-files@vindex nneething-exclude-filesAll files that match this regexp will be ignored. Nice to use to excludeauto-save files and the like, which is what it does by default.@item nneething-include-files@vindex nneething-include-filesRegexp saying what files to include in the group. If this variable isnon-@code{nil}, only files matching this regexp will be included.@item nneething-map-file@vindex nneething-map-fileName of the map files.@end table@node Document Groups@subsection Document Groups@cindex nndoc@cindex documentation group@cindex help group@code{nndoc} is a cute little thing that will let you read a single fileas a newsgroup. Several files types are supported:@table @code@cindex babyl@cindex rmail mbox@item babylThe babyl (rmail) mail box.@cindex mbox@cindex Unix mbox@item mboxThe standard Unix mbox file.@cindex MMDF mail box@item mmdfThe MMDF mail box format.@item newsSeveral news articles appended into a file.@item rnews@cindex rnews batch filesThe rnews batch transport format.@cindex forwarded messages@item forwardForwarded articles.@item nsmailNetscape mail boxes.@item mime-partsMIME multipart messages.@item standard-digestThe standard (RFC 1153) digest format.@item slack-digestNon-standard digest format---matches most things, but does it badly.@end tableYou can also use the special ``file type'' @code{guess}, which meansthat @code{nndoc} will try to guess what file type it is looking at.@code{digest} means that @code{nndoc} should guess what digest type thefile is.@code{nndoc} will not try to change the file or insert any extra headers intoit---it will simply, like, let you use the file as the basis for agroup. And that's it.If you have some old archived articles that you want to insert into yournew & spiffy Gnus mail back end, @code{nndoc} can probably help you withthat. Say you have an old @file{RMAIL} file with mail that you now wantto split into your new @code{nnml} groups. You look at that file using@code{nndoc} (using the @kbd{G f} command in the group buffer(@pxref{Foreign Groups})), set the process mark on all the articles inthe buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}file is now also stored in lots of @code{nnml} directories, and you candelete that pesky @file{RMAIL} file. If you have the guts!Virtual server variables:@table @code@item nndoc-article-type@vindex nndoc-article-typeThis should be one of @code{mbox}, @code{babyl}, @code{digest},@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},@code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}.@item nndoc-post-type@vindex nndoc-post-typeThis variable says whether Gnus is to consider the group a news group ora mail group. There are two valid values: @code{mail} (the default)and @code{news}.@end table@menu* Document Server Internals:: How to add your own document types.@end menu@node Document Server Internals@subsubsection Document Server InternalsAdding new document types to be recognized by @code{nndoc} isn'tdifficult. You just have to whip up a definition of what the documentlooks like, write a predicate function to recognize that document type,and then hook into @code{nndoc}.First, here's an example document type definition:@example(mmdf (article-begin . "^\^A\^A\^A\^A\n") (body-end . "^\^A\^A\^A\^A\n"))@end exampleThe definition is simply a unique @dfn{name} followed by a series ofregexp pseudo-variable settings. Below are the possiblevariables---don't be daunted by the number of variables; most documenttypes can be defined with very few settings:@table @code@item first-articleIf present, @code{nndoc} will skip past all text until it findssomething that match this regexp. All text before this will betotally ignored.@item article-beginThis setting has to be present in all document type definitions. Itsays what the beginning of each article looks like.@item head-begin-functionIf present, this should be a function that moves point to the head ofthe article.@item nndoc-head-beginIf present, this should be a regexp that matches the head of thearticle.@item nndoc-head-endThis should match the end of the head of the article. It defaults to@samp{^$}---the empty line.@item body-begin-functionIf present, this function should move point to the beginning of the bodyof the article.@item body-beginThis should match the beginning of the body of the article. It defaultsto @samp{^\n}.@item body-end-functionIf present, this function should move point to the end of the body ofthe article.@item body-endIf present, this should match the end of the body of the article.@item file-endIf present, this should match the end of the file. All text after thisregexp will be totally ignored.@end tableSo, using these variables @code{nndoc} is able to dissect a documentfile into a series of articles, each with a head and a body. However, afew more variables are needed since not all document types are all thatnews-like---variables needed to transform the head or the body intosomething that's palatable for Gnus:@table @code@item prepare-body-functionIf present, this function will be called when requesting an article. Itwill be called with point at the start of the body, and is useful if thedocument has encoded some parts of its contents.@item article-transform-functionIf present, this function is called when requesting an article. It'smeant to be used for more wide-ranging transformation of both head andbody of the article.@item generate-head-functionIf present, this function is called to generate a head that Gnus canunderstand. It is called with the article number as a parameter, and isexpected to generate a nice head for the article in question. It iscalled when requesting the headers of all articles.@end tableLet's look at the most complicated example I can come up with---standarddigests:@example(standard-digest (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+")) (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+")) (prepare-body-function . nndoc-unquote-dashes) (body-end-function . nndoc-digest-body-end) (head-end . "^ ?$") (body-begin . "^ ?\n") (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") (subtype digest guess))@end exampleWe see that all text before a 70-width line of dashes is ignored; alltext after a line that starts with that @samp{^End of} is also ignored;each article begins with a 30-width line of dashes; the line separatingthe head from the body may contain a single space; and that the body isrun through @code{nndoc-unquote-dashes} before being delivered.To hook your own document definition into @code{nndoc}, use the@code{nndoc-add-type} function. It takes two parameters---the first isthe definition itself and the second (optional) parameter says where inthe document type definition alist to put this definition. The alist istraversed sequentially, and @code{nndoc-TYPE-type-p} is called for a given type @code{TYPE}. So @code{nndoc-mmdf-type-p} is called to see whether a documentis of @code{mmdf} type, and so on. These type predicates should return@code{nil} if the document is not of the correct type; @code{t} if it isof the correct type; and a number if the document might be of thecorrect type. A high number means high probability; a low number meanslow probability with @samp{0} being the lowest valid number.@node SOUP@subsection SOUP@cindex SOUP@cindex offlineIn the PC world people often talk about ``offline'' newsreaders. Theseare thingies that are combined reader/news transport monstrosities.With built-in modem programs. Yecchh!Of course, us Unix Weenie types of human beans use things like@code{uucp} and, like, @code{nntpd} and set up proper news and mailtransport things like Ghod intended. And then we just use normalnewsreaders.However, it can sometimes be convenient to do something that's a biteasier on the brain if you have a very slow modem, and you're not reallythat interested in doing things properly.A file format called @sc{soup} has been developed for transporting newsand mail from servers to home machines and back again. It can be a bitfiddly.First some terminology:@table @dfn@item serverThis is the machine that is connected to the outside world and where youget news and/or mail from.@item home machineThis is the machine that you want to do the actual reading and respondingon. It is typically not connected to the rest of the world in any way.@item packetSomething that contains messages and/or commands. There are two kindsof packets:@table @dfn@item message packetsThese are packets made at the server, and typically contain lots ofmessages for you to read. These are called @file{SoupoutX.tgz} bydefault, where @var{x} is a number.@item response packetsThese are packets made at the home machine, and typically containsreplies that you've written. These are called @file{SoupinX.tgz} bydefault, where @var{x} is a number.@end table@end table@enumerate@itemYou log in on the server and create a @sc{soup} packet. You can eitheruse a dedicated @sc{soup} thingie (like the @code{awk} program), or youcan use Gnus to create the packet with its @sc{soup} commands (@kbd{Os} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).@itemYou transfer the packet home. Rail, boat, car or modem will do fine.@itemYou put the packet in your home directory.@itemYou fire up Gnus on your home machine using the @code{nnsoup} back end asthe native or secondary server.@itemYou read articles and mail and answer and followup to the things youwant (@pxref{SOUP Replies}).@itemYou do the @kbd{G s r} command to pack these replies into a @sc{soup}packet.@itemYou transfer this packet to the server.@itemYou use Gnus to mail this packet out with the @kbd{G s s} command.@itemYou then repeat until you die.@end enumerateSo you basically have a bipartite system---you use @code{nnsoup} forreading and Gnus for packing/sending these @sc{soup} packets.@menu* SOUP Commands:: Commands for creating and sending @sc{soup} packets* SOUP Groups:: A back end for reading @sc{soup} packets.* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.@end menu@node SOUP Commands@subsubsection SOUP CommandsThese are commands for creating and manipulating @sc{soup} packets.@table @kbd@item G s b@kindex G s b @r{(Group)}@findex gnus-group-brew-soupPack all unread articles in the current group(@code{gnus-group-brew-soup}). This command understands theprocess/prefix convention.@item G s w@kindex G s w @r{(Group)}@findex gnus-soup-save-areasSave all @sc{soup} data files (@code{gnus-soup-save-areas}).@item G s s@kindex G s s @r{(Group)}@findex gnus-soup-send-repliesSend all replies from the replies packet(@code{gnus-soup-send-replies}).@item G s p@kindex G s p @r{(Group)}@findex gnus-soup-pack-packetPack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).@item G s r@kindex G s r @r{(Group)}@findex nnsoup-pack-repliesPack all replies into a replies packet (@code{nnsoup-pack-replies}).@item O s@kindex O s @r{(Summary)}@findex gnus-soup-add-articleThis summary-mode command adds the current article to a @sc{soup} packet(@code{gnus-soup-add-article}). It understands the process/prefixconvention (@pxref{Process/Prefix}).@end tableThere are a few variables to customize where Gnus will put all thesethingies:@table @code@item gnus-soup-directory@vindex gnus-soup-directoryDirectory where Gnus will save intermediate files while composing@sc{soup} packets. The default is @file{~/SoupBrew/}.@item gnus-soup-replies-directory@vindex gnus-soup-replies-directoryThis is what Gnus will use as a temporary directory while sending ourreply packets. @file{~/SoupBrew/SoupReplies/} is the default.@item gnus-soup-prefix-file@vindex gnus-soup-prefix-fileName of the file where Gnus stores the last used prefix. The default is@samp{gnus-prefix}.@item gnus-soup-packer@vindex gnus-soup-packerA format string command for packing a @sc{soup} packet. The default is@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.@item gnus-soup-unpacker@vindex gnus-soup-unpackerFormat string command for unpacking a @sc{soup} packet. The default is@samp{gunzip -c %s | tar xvf -}.@item gnus-soup-packet-directory@vindex gnus-soup-packet-directoryWhere Gnus will look for reply packets. The default is @file{~/}.@item gnus-soup-packet-regexp@vindex gnus-soup-packet-regexpRegular expression matching @sc{soup} reply packets in@code{gnus-soup-packet-directory}.@end table@node SOUP Groups@subsubsection @sc{soup} Groups@cindex nnsoup@code{nnsoup} is the back end for reading @sc{soup} packets. It willread incoming packets, unpack them, and put them in a directory whereyou can read them at leisure.These are the variables you can use to customize its behavior:@table @code@item nnsoup-tmp-directory@vindex nnsoup-tmp-directoryWhen @code{nnsoup} unpacks a @sc{soup} packet, it does it in thisdirectory. (@file{/tmp/} by default.)@item nnsoup-directory@vindex nnsoup-directory@code{nnsoup} then moves each message and index file to this directory.The default is @file{~/SOUP/}.@item nnsoup-replies-directory@vindex nnsoup-replies-directoryAll replies will be stored in this directory before being packed into areply packet. The default is @file{~/SOUP/replies/"}.@item nnsoup-replies-format-type@vindex nnsoup-replies-format-typeThe @sc{soup} format of the replies packets. The default is @samp{?n}(rnews), and I don't think you should touch that variable. I probablyshouldn't even have documented it. Drats! Too late!@item nnsoup-replies-index-type@vindex nnsoup-replies-index-typeThe index type of the replies packet. The default is @samp{?n}, whichmeans ``none''. Don't fiddle with this one either!@item nnsoup-active-file@vindex nnsoup-active-fileWhere @code{nnsoup} stores lots of information. This is not an ``activefile'' in the @code{nntp} sense; it's an Emacs Lisp file. If you losethis file or mess it up in any way, you're dead. The default is@file{~/SOUP/active}.@item nnsoup-packer@vindex nnsoup-packerFormat string command for packing a reply @sc{soup} packet. The defaultis @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.@item nnsoup-unpacker@vindex nnsoup-unpackerFormat string command for unpacking incoming @sc{soup} packets. Thedefault is @samp{gunzip -c %s | tar xvf -}.@item nnsoup-packet-directory@vindex nnsoup-packet-directoryWhere @code{nnsoup} will look for incoming packets. The default is@file{~/}.@item nnsoup-packet-regexp@vindex nnsoup-packet-regexpRegular expression matching incoming @sc{soup} packets. The default is@samp{Soupout}.@item nnsoup-always-save@vindex nnsoup-always-saveIf non-@code{nil}, save the replies buffer after each posted message.@end table@node SOUP Replies@subsubsection SOUP RepliesJust using @code{nnsoup} won't mean that your postings and mailings endup in @sc{soup} reply packets automagically. You have to work a bitmore for that to happen.@findex nnsoup-set-variablesThe @code{nnsoup-set-variables} command will set the appropriatevariables to ensure that all your followups and replies end up in the@sc{soup} system.In specific, this is what it does:@lisp(setq message-send-news-function 'nnsoup-request-post)(setq message-send-mail-function 'nnsoup-request-mail)@end lispAnd that's it, really. If you only want news to go into the @sc{soup}system you just use the first line. If you only want mail to be@sc{soup}ed you use the second.@node Mail-To-News Gateways@subsection Mail-To-News Gateways@cindex mail-to-news gateways@cindex gatewaysIf your local @code{nntp} server doesn't allow posting, for some reasonor other, you can post using one of the numerous mail-to-news gateways.The @code{nngateway} back end provides the interface.Note that you can't read anything from this back end---it can only beused to post with.Server variables:@table @code@item nngateway-address@vindex nngateway-addressThis is the address of the mail-to-news gateway.@item nngateway-header-transformation@vindex nngateway-header-transformationNews headers often have to be transformed in some odd way or otherfor the mail-to-news gateway to accept it. This variable says whattransformation should be called, and defaults to@code{nngateway-simple-header-transformation}. The function is callednarrowed to the headers to be transformed and with one parameter---thegateway address.This default function just inserts a new @code{To} header based on the@code{Newsgroups} header and the gateway address.For instance, an article with this @code{Newsgroups} header:@exampleNewsgroups: alt.religion.emacs@end examplewill get this @code{From} header inserted:@exampleTo: alt-religion-emacs@@GATEWAY@end exampleThe following pre-defined functions exist:@findex nngateway-simple-header-transformation@table @code@item nngateway-simple-header-transformationCreates a @code{To} header that looks like@var{newsgroup}@@@code{nngateway-address}.@findex nngateway-mail2news-header-transformation@item nngateway-mail2news-header-transformationCreates a @code{To} header that looks like@code{nngateway-address}.Here's an example:@lisp(setq gnus-post-method '(nngateway "mail2news@@replay.com" (nngateway-header-transformation nngateway-mail2news-header-transformation)))@end lisp@end table@end tableSo, to use this, simply say something like:@lisp(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))@end lisp@node IMAP@subsection @sc{imap}@cindex nnimap@cindex @sc{imap}@sc{imap} is a network protocol for reading mail (or news, or@dots{}),think of it as a modernized @sc{nntp}. Connecting to a @sc{imap}server is much similar to connecting to a news server, you justspecify the network address of the server.@sc{imap} has two properties. First, @sc{imap} can do everything thatPOP can, it can hence be viewed as POP++. Secondly, @sc{imap} is amail storage protocol, similar to @sc{nntp} being a news storageprotocol. (@sc{imap} offers more features than @sc{nntp} because newsis more or less read-only whereas mail is read-write.)If you want to use @sc{imap} as POP++, use an imap entry inmail-sources. With this, Gnus will fetch mails from the @sc{imap}server and store them on the local disk. This is not the usagedescribed in this section. @xref{Mail Sources}.If you want to use @sc{imap} as a mail storage protocol, use an nnimapentry in gnus-secondary-select-methods. With this, Gnus willmanipulate mails stored on the @sc{imap} server. This is the kind ofusage explained in this section.A server configuration in @code{~/.gnus} with a few @sc{imap} serversmight look something like this:@lisp(setq gnus-secondary-select-methods '((nnimap "simpleserver") ; no special configuration ; perhaps a ssh port forwarded server: (nnimap "dolk" (nnimap-address "localhost") (nnimap-server-port 1430)) ; a UW server running on localhost (nnimap "barbar" (nnimap-server-port 143) (nnimap-address "localhost") (nnimap-list-pattern ("INBOX" "mail/*"))) ; anonymous public cyrus server: (nnimap "cyrus.andrew.cmu.edu" (nnimap-authenticator anonymous) (nnimap-list-pattern "archive.*") (nnimap-stream network)) ; a ssl server on a non-standard port: (nnimap "vic20" (nnimap-address "vic20.somewhere.com") (nnimap-server-port 9930) (nnimap-stream ssl))))@end lispThe following variables can be used to create a virtual @code{nnimap}server:@table @code@item nnimap-address@vindex nnimap-addressThe address of the remote @sc{imap} server. Defaults to the virtualserver name if not specified.@item nnimap-server-port@vindex nnimap-server-portPort on server to contact. Defaults to port 143, or 993 for SSL.Note that this should be a integer, example server specification:@lisp(nnimap "mail.server.com" (nnimap-server-port 4711))@end lisp@item nnimap-list-pattern@vindex nnimap-list-patternString or list of strings of mailboxes to limit available groups to.This is used when the server has very many mailboxes and you're onlyinterested in a few -- some servers export your home directory via@sc{imap}, you'll probably want to limit the mailboxes to those in@file{~/Mail/*} then.The string can also be a cons of REFERENCE and the string as above, whatREFERENCE is used for is server specific, but on the University ofWashington server it's a directory that will be concatenated with themailbox.Example server specification:@lisp(nnimap "mail.server.com" (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*" ("~friend/Mail/" . "list/*"))))@end lisp@item nnimap-stream@vindex nnimap-streamThe type of stream used to connect to your server. By default, nnimapwill detect and automatically use all of the below, with the exceptionof SSL. (SSL is being replaced by STARTTLS, which can be automaticallydetected, but it's not widely deployed yet).Example server specification:@lisp(nnimap "mail.server.com" (nnimap-stream ssl))@end lispPlease note that the value of @code{nnimap-stream} is a symbol!@itemize @bullet@item@dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the@command{imtest} program.@item@dfn{kerberos4:} Connect with Kerberos 4. Requires the@command{imtest} program.@item@dfn{starttls:} Connect via the STARTTLS extension (similar toSSL)@. Requires the library @file{starttls.el} and program@command{starttls}.@item@dfn{ssl:} Connect through SSL@. Requires OpenSSL (theprogram @command{openssl}) or SSLeay (@command{s_client}).@item@dfn{shell:} Use a shell command to start an @sc{imap} connection.@item@dfn{network:} Plain, TCP/IP network connection.@end itemize@vindex imap-kerberos4-programThe @command{imtest} program is shipped with Cyrus IMAPD@. Nnimap supportsboth @command{imtest} version 1.5.x and version 1.6.x. The variable@code{imap-kerberos4-program} contains parameters to pass to the@command{imtest} program.@vindex imap-ssl-programFor SSL connections, the OpenSSL program is available from@uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,and nnimap supports it too. However, the most recent versions ofSSLeay, 0.9.x, are known to have serious bugs making ituseless. Earlier versions, especially 0.8.x, of SSLeay are known towork. The variable @code{imap-ssl-program} contains parameters to passto OpenSSL/SSLeay.@vindex imap-shell-program@vindex imap-shell-hostFor @sc{imap} connections using the @code{shell} stream, the variable@code{imap-shell-program} specifies what program to call.@item nnimap-authenticator@vindex nnimap-authenticatorThe authenticator used to connect to the server. By default, nnimapwill use the most secure authenticator your server supports.Example server specification:@lisp(nnimap "mail.server.com" (nnimap-authenticator anonymous))@end lispPlease note that the value of @code{nnimap-authenticator} is a symbol!@itemize @bullet@item@dfn{gssapi:} GSSAPI (usually Kerberos 5) authentication. Requires theexternal program @command{imtest}.@item@dfn{kerberos4:} Kerberos authentication. Requires the external program@command{imtest}.@item@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5@. Requiresexternal library @command{digest-md5.el}.@item@dfn{cram-md5:} Encrypted username/password via CRAM-MD5.@item@dfn{login:} Plain-text username/password via LOGIN.@item@dfn{anonymous:} Login as `anonymous', supplying your email address aspassword.@end itemize@item nnimap-expunge-on-close@cindex Expunging@vindex nnimap-expunge-on-closeUnlike Parmenides, the @sc{imap} designers decided that things thatdon't exist actually do exist. More specifically, @sc{imap} hasthe concept of marking articles @code{Deleted} which doesn't actuallydelete them, and this (marking them @code{Deleted}, that is) is whatnnimap does when you delete a article in Gnus (with @kbd{G @key{DEL}} orsimilar).Since the articles aren't really removed when we mark them with the@code{Deleted} flag we'll need a way to actually delete them. Feel likerunning in circles yet?Traditionally, nnimap has removed all articles marked as @code{Deleted}when closing a mailbox but this is now configurable by this servervariable.The possible options are:@table @code@item alwaysThe default behavior, delete all articles marked as "Deleted" whenclosing a mailbox.@item neverNever actually delete articles. Currently there is no way of showingthe articles marked for deletion in nnimap, but other @sc{imap} clientsmay allow you to do this. If you ever want to run the EXPUNGE commandmanually, @xref{Expunging mailboxes}.@item askWhen closing mailboxes, nnimap will ask if you wish to expunge deletedarticles or not.@end table@item nnimap-authinfo-file@vindex nnimap-authinfo-fileA file containing credentials used to log in on servers. The formatis (almost) the same as the @code{ftp} @file{~/.netrc} file. See`nntp-authinfo-file' for exact syntax.A file containing credentials used to log in on servers. The format is(almost) the same as the @code{ftp} @file{~/.netrc} file. See thevariable @code{nntp-authinfo-file} for exact syntax; also see@xref{NNTP}.@end table@menu* Splitting in IMAP:: Splitting mail with nnimap.* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.* Expunging mailboxes:: Equivalent of a "compress mailbox" button.@end menu@node Splitting in IMAP@subsubsection Splitting in @sc{imap}@cindex splitting imap mailSplitting is something Gnus users have loved and used for years, and nowthe rest of the world is catching up. Yeah, dream on; not many@sc{imap} servers have server side splitting and those that have splittingseem to use some non-standard protocol. This means that @sc{imap}support for Gnus has to do its own splitting.And it does.Here are the variables of interest:@table @code@item nnimap-split-crosspost@cindex splitting, crosspost@cindex crosspost@vindex nnimap-split-crosspostIf non-nil, do crossposting if several split methods match the mail. Ifnil, the first match in @code{nnimap-split-rule} found will be used.Nnmail equivalent: @code{nnmail-crosspost}.@item nnimap-split-inbox@cindex splitting, inbox@cindex inbox@vindex nnimap-split-inboxA string or a list of strings that gives the name(s) of @sc{imap}mailboxes to split from. Defaults to @code{nil}, which means thatsplitting is disabled!@lisp(setq nnimap-split-inbox '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))@end lispNo nnmail equivalent.@item nnimap-split-rule@cindex Splitting, rules@vindex nnimap-split-ruleNew mail found in @code{nnimap-split-inbox} will be split according tothis variable.This variable contains a list of lists, where the first element in thesublist gives the name of the @sc{imap} mailbox to move articlesmatching the regexp in the second element in the sublist. Got that?Neither did I, we need examples.@lisp(setq nnimap-split-rule '(("INBOX.nnimap" "^Sender: owner-nnimap@@vic20.globalcom.se") ("INBOX.junk" "^Subject:.*MAKE MONEY") ("INBOX.private" "")))@end lispThis will put all articles from the nnimap mailing list into mailboxINBOX.nnimap, all articles containing MAKE MONEY in the Subject: lineinto INBOX.spam and everything else in INBOX.private.The first string may contain @samp{\\@var{digit}} forms, like the ones used byreplace-match to insert sub-expressions from the matched text. Forinstance:@lisp("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@")@end lispThe second element can also be a function. In that case, it will becalled with the first element of the rule as the argument, in a buffercontaining the headers of the article. It should return a non-nil valueif it thinks that the mail belongs in that group.Nnmail users might recollect that the last regexp had to be empty tomatch all articles (like in the example above). This is not required innnimap. Articles not matching any of the regexps will not be moved outof your inbox. (This might affect performance if you keep lots ofunread articles in your inbox, since the splitting code would go overthem every time you fetch new mail.)These rules are processed from the beginning of the alist toward theend. The first rule to make a match will `win', unless you havecrossposting enabled. In that case, all matching rules will `win'.This variable can also have a function as its value, the function willbe called with the headers narrowed and should return a group to whereit thinks the article should be split. See @code{nnimap-split-fancy}.The splitting code tries to create mailboxes if it needs too.To allow for different split rules on different virtual servers, andeven different split rules in different inboxes on the same server,the syntax of this variable has been extended along the lines of:@lisp(setq nnimap-split-rule '(("my1server" (".*" (("ding" "ding@@gnus.org") ("junk" "From:.*Simon"))) ("my2server" ("INBOX" nnimap-split-fancy)) ("my[34]server" (".*" (("private" "To:.*Simon") ("junk" my-junk-func)))))@end lispThe virtual server name is in fact a regexp, so that the same rulesmay apply to several servers. In the example, the servers@code{my3server} and @code{my4server} both use the same rules.Similarly, the inbox string is also a regexp. The actual splittingrules are as before, either a function, or a list with group/regexp orgroup/function elements.Nnmail equivalent: @code{nnmail-split-methods}.@item nnimap-split-predicate@cindex splitting@vindex nnimap-split-predicateMail matching this predicate in @code{nnimap-split-inbox} will besplit; it is a string and the default is @samp{UNSEEN UNDELETED}.This might be useful if you use another @sc{imap} client to read mail inyour inbox but would like Gnus to split all articles in the inboxregardless of readedness. Then you might change this to@samp{UNDELETED}.@item nnimap-split-fancy@cindex splitting, fancy@findex nnimap-split-fancy@vindex nnimap-split-fancyIt's possible to set @code{nnimap-split-rule} to@code{nnmail-split-fancy} if you want to use fancysplitting. @xref{Fancy Mail Splitting}.However, to be able to have different fancy split rules for nnmail andnnimap back ends you can set @code{nnimap-split-rule} to@code{nnimap-split-fancy} and define the nnimap specific fancy splitrule in @code{nnimap-split-fancy}.Example:@lisp(setq nnimap-split-rule 'nnimap-split-fancy nnimap-split-fancy ...)@end lispNnmail equivalent: @code{nnmail-split-fancy}.@end table@node Editing IMAP ACLs@subsubsection Editing @sc{imap} ACLs@cindex editing imap acls@cindex Access Control Lists@cindex Editing @sc{imap} ACLs@kindex G l@findex gnus-group-nnimap-edit-aclACL stands for Access Control List. ACLs are used in @sc{imap} forlimiting (or enabling) other users access to your mail boxes. Not all@sc{imap} servers support this, this function will give an error if itdoesn't.To edit a ACL for a mailbox, type @kbd{G l}(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with a ACLediting window with detailed instructions.Some possible uses:@itemize @bullet@itemGiving "anyone" the "lrs" rights (lookup, read, keep seen/unseen flags)on your mailing list mailboxes enables other users on the same server tofollow the list without subscribing to it.@itemAt least with the Cyrus server, you are required to give the user"anyone" posting ("p") capabilities to have "plussing" work (that is,mail sent to user+mailbox@@domain ending up in the @sc{imap} mailboxINBOX.mailbox).@end itemize@node Expunging mailboxes@subsubsection Expunging mailboxes@cindex expunging@cindex Expunge@cindex Manual expunging@kindex G x@findex gnus-group-nnimap-expungeIf you're using the @code{never} setting of @code{nnimap-expunge-close},you may want the option of expunging all deleted articles in a mailboxmanually. This is exactly what @kbd{G x} does.Currently there is no way of showing deleted articles, you can justdelete them.@node Combined Groups@section Combined GroupsGnus allows combining a mixture of all the other group types into biggergroups.@menu* Virtual Groups:: Combining articles from many groups.* Kibozed Groups:: Looking through parts of the newsfeed for articles.@end menu@node Virtual Groups@subsection Virtual Groups@cindex nnvirtual@cindex virtual groups@cindex merging groupsAn @dfn{nnvirtual group} is really nothing more than a collection ofother groups.For instance, if you are tired of reading many small groups, you canput them all in one big group, and then grow tired of reading onebig, unwieldy group. The joys of computing!You specify @code{nnvirtual} as the method. The address should be aregexp to match component groups.All marks in the virtual group will stick to the articles in thecomponent groups. So if you tick an article in a virtual group, thearticle will also be ticked in the component group from whence it came.(And vice versa---marks from the component groups will also be shown inthe virtual group.)Here's an example @code{nnvirtual} method that collects all Andrea Dworkinnewsgroups into one, big, happy newsgroup:@lisp(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")@end lispThe component groups can be native or foreign; everything should worksmoothly, but if your computer explodes, it was probably my fault.Collecting the same group from several servers might actually be a goodidea if users have set the Distribution header to limit distribution.If you would like to read @samp{soc.motss} both from a server in Japanand a server in Norway, you could use the following as the group regexp:@example"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"@end example(Remember, though, that if you're creating the group with @kbd{G m}, youshouldn't double the backslashes, and you should leave off the quotecharacters at the beginning and the end of the string.)This should work kinda smoothly---all articles from both groups shouldend up in this one, and there should be no duplicates. Threading (andthe rest) will still work as usual, but there might be problems with thesequence of articles. Sorting on date might be an option here(@pxref{Selecting a Group}).One limitation, however---all groups included in a virtualgroup have to be alive (i.e., subscribed or unsubscribed). Killed orzombie groups can't be component groups for @code{nnvirtual} groups.@vindex nnvirtual-always-rescanIf the @code{nnvirtual-always-rescan} is non-@code{nil},@code{nnvirtual} will always scan groups for unread articles whenentering a virtual group. If this variable is @code{nil} (which is thedefault) and you read articles in a component group after the virtualgroup has been activated, the read articles from the component groupwill show up when you enter the virtual group. You'll also see thiseffect if you have two virtual groups that have a component group incommon. If that's the case, you should set this variable to @code{t}.Or you can just tap @code{M-g} on the virtual group every time beforeyou enter it---it'll have much the same effect.@code{nnvirtual} can have both mail and news groups as component groups.When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}has to ask the back end of the component group the article comes fromwhether it is a news or mail back end. However, when you do a @kbd{^},there is typically no sure way for the component back end to know this,and in that case @code{nnvirtual} tells Gnus that the article came from anot-news back end. (Just to be on the safe side.)@kbd{C-c C-t} in the message buffer will insert the @code{Newsgroups}line from the article you respond to in these cases.@node Kibozed Groups@subsection Kibozed Groups@cindex nnkiboze@cindex kibozing@dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)the news feed''. @code{nnkiboze} is a back end that will do this foryou. Oh joy! Now you can grind any @sc{nntp} server down to a haltwith useless requests! Oh happiness!@kindex G k @r{(Group)}To create a kibozed group, use the @kbd{G k} command in the groupbuffer.The address field of the @code{nnkiboze} method is, as with@code{nnvirtual}, a regexp to match groups to be ``included'' in the@code{nnkiboze} group. That's where most similarities between @code{nnkiboze}and @code{nnvirtual} end.In addition to this regexp detailing component groups, an @code{nnkiboze} groupmust have a score file to say what articles are to be included inthe group (@pxref{Scoring}).@kindex M-x nnkiboze-generate-groups@findex nnkiboze-generate-groupsYou must run @kbd{M-x nnkiboze-generate-groups} after creating the@code{nnkiboze} groups you want to have. This command will take time. Lots oftime. Oodles and oodles of time. Gnus has to fetch the headers fromall the articles in all the component groups and run them through thescoring process to determine if there are any articles in the groupsthat are to be part of the @code{nnkiboze} groups.Please limit the number of component groups by using restrictiveregexps. Otherwise your sysadmin may become annoyed with you, and the@sc{nntp} site may throw you off and never let you back in again.Stranger things have happened.@code{nnkiboze} component groups do not have to be alive---they can be dead,and they can be foreign. No restrictions.@vindex nnkiboze-directoryThe generation of an @code{nnkiboze} group means writing two files in@code{nnkiboze-directory}, which is @file{~/News/} by default. Onecontains the @sc{nov} header lines for all the articles in the group,and the other is an additional @file{.newsrc} file to store informationon what groups have been searched through to find component articles.Articles marked as read in the @code{nnkiboze} group will havetheir @sc{nov} lines removed from the @sc{nov} file.@node Gnus Unplugged@section Gnus Unplugged@cindex offline@cindex unplugged@cindex Agent@cindex Gnus Agent@cindex Gnus UnpluggedIn olden times (ca. February '88), people used to run their newsreaderson big machines with permanent connections to the net. News transportwas dealt with by news servers, and all the newsreaders had to do was toread news. Believe it or not.Nowadays most people read news and mail at home, and use some sort ofmodem to connect to the net. To avoid running up huge phone bills, itwould be nice to have a way to slurp down all the news and mail, hang upthe phone, read for several hours, and then upload any responses youhave to make. And then you repeat the procedure.Of course, you can use news servers for doing this as well. I've used@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}for some years, but doing that's a bore. Moving the news serverfunctionality up to the newsreader makes sense if you're the only personreading news on a machine.Using Gnus as an ``offline'' newsreader is quite simple.@itemize @bullet@itemFirst, set up Gnus as you would do if you were running it on a machinethat has full connection to the net. Go ahead. I'll still be waitinghere.@itemThen, put the following magical incantation at the end of your@file{.gnus.el} file:@lisp(gnus-agentize)@end lisp@end itemizeThat's it. Gnus is now an ``offline'' newsreader.Of course, to use it as such, you have to learn a few new commands.@menu* Agent Basics:: How it all is supposed to work.* Agent Categories:: How to tell the Gnus Agent what to download.* Agent Commands:: New commands for all the buffers.* Agent Expiry:: How to make old articles go away.* Agent and IMAP:: How to use the Agent with IMAP.* Outgoing Messages:: What happens when you post/mail something?* Agent Variables:: Customizing is fun.* Example Setup:: An example @file{.gnus.el} file for offline people.* Batching Agents:: How to fetch news from a @code{cron} job.* Agent Caveats:: What you think it'll do and what it does.@end menu@node Agent Basics@subsection Agent BasicsFirst, let's get some terminology out of the way.The Gnus Agent is said to be @dfn{unplugged} when you have severed theconnection to the net (and notified the Agent that this is the case).When the connection to the net is up again (and Gnus knows this), theAgent is @dfn{plugged}.The @dfn{local} machine is the one you're running on, and which isn'tconnected to the net continuously.@dfn{Downloading} means fetching things from the net to your localmachine. @dfn{Uploading} is doing the opposite.Let's take a typical Gnus session using the Agent.@itemize @bullet@itemYou start Gnus with @code{gnus-unplugged}. This brings up the GnusAgent in a disconnected state. You can read all the news that you havealready fetched while in this mode.@itemYou then decide to see whether any new news has arrived. You connectyour machine to the net (using PPP or whatever), and then hit @kbd{J j}to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mailas usual. To check for new mail in unplugged mode, see (@pxref{MailSource Specifiers}).@itemYou can then read the new news immediately, or you can download the newsonto your local machine. If you want to do the latter, you press @kbd{g}to check if there are any new news and then @kbd{Js} to fetch all the eligible articles in all the groups. (To let Gnusknow which articles you want to download, @pxref{Agent Categories}.)@itemAfter fetching the articles, you press @kbd{J j} to make Gnus becomeunplugged again, and you shut down the PPP thing (or whatever). Andthen you read the news offline.@itemAnd then you go to step 2.@end itemizeHere are some things you should do the first time (or so) that you usethe Agent.@itemize @bullet@itemDecide which servers should be covered by the Agent. If you have a mailback end, it would probably be nonsensical to have it covered by theAgent. Go to the server buffer (@kbd{^} in the group buffer) and press@kbd{J a} the server (or servers) that you wish to have covered by theAgent (@pxref{Server Agent Commands}). This will typically be only theprimary select method, which is listed on the bottom in the buffer.@itemDecide on download policy. @xref{Agent Categories}.@itemUhm... that's it.@end itemize@node Agent Categories@subsection Agent CategoriesOne of the main reasons to integrate the news transport layer into thenewsreader is to allow greater control over what articles to download.There's not much point in downloading huge amounts of articles, just tofind out that you're not interested in reading any of them. It's betterto be somewhat more conservative in choosing what to download, and thenmark the articles for downloading manually if it should turn out thatyou're interested in the articles anyway.The main way to control what is to be downloaded is to create a@dfn{category} and then assign some (or all) groups to this category.Groups that do not belong in any other category belong to the@code{default} category. Gnus has its own buffer for creating andmanaging categories.@menu* Category Syntax:: What a category looks like.* The Category Buffer:: A buffer for maintaining categories.* Category Variables:: Customize'r'Us.@end menu@node Category Syntax@subsubsection Category SyntaxA category consists of two things.@enumerate@itemA predicate which (generally) gives a rough outline of which articlesare eligible for downloading; and@itema score rule which (generally) gives you a finer granularity whendeciding what articles to download. (Note that this @dfn{downloadscore} is not necessarily related to normal scores.)@end enumerateA predicate in its simplest form can be a single predicate such as@code{true} or @code{false}. These two will download every availablearticle or nothing respectively. In the case of these two specialpredicates an additional score rule is superfluous.Predicates of @code{high} or @code{low} download articles in respect oftheir scores in relationship to @code{gnus-agent-high-score} and@code{gnus-agent-low-score} as described below.To gain even finer control of what is to be regarded eligible fordownload a predicate can consist of a number of predicates with logicaloperators sprinkled in between.Perhaps some examples are in order.Here's a simple predicate. (It's the default predicate, in fact, usedfor all groups that don't belong to any other category.)@lispshort@end lispQuite simple, eh? This predicate is true if and only if the article isshort (for some value of ``short'').Here's a more complex predicate:@lisp(or high (and (not low) (not long)))@end lispThis means that an article should be downloaded if it has a high score,or if the score is not low and the article is not long. You get thedrift.The available logical operators are @code{or}, @code{and} and@code{not}. (If you prefer, you can use the more ``C''-ish operators@samp{|}, @code{&} and @code{!} instead.)The following predicates are pre-defined, but if none of these fit whatyou want to do, you can write your own.@table @code@item shortTrue iff the article is shorter than @code{gnus-agent-short-article}lines; default 100.@item longTrue iff the article is longer than @code{gnus-agent-long-article}lines; default 200.@item lowTrue iff the article has a download score less than@code{gnus-agent-low-score}; default 0.@item highTrue iff the article has a download score greater than@code{gnus-agent-high-score}; default 0.@item spamTrue iff the Gnus Agent guesses that the article is spam. Theheuristics may change over time, but at present it just computes achecksum and sees whether articles match.@item trueAlways true.@item falseAlways false.@end tableIf you want to create your own predicate function, here's what you haveto know: The functions are called with no parameters, but the@code{gnus-headers} and @code{gnus-score} dynamic variables are bound touseful values.For example, you could decide that you don't want to download articlesthat were posted more than a certain number of days ago (e.g. postedmore than @code{gnus-agent-expire-days} ago) you might write a functionsomething along the lines of the following:@lisp(defun my-article-old-p () "Say whether an article is old." (< (time-to-days (date-to-time (mail-header-date gnus-headers))) (- (time-to-days (current-time)) gnus-agent-expire-days)))@end lispwith the predicate then defined as:@lisp(not my-article-old-p)@end lispor you could append your predicate to the predefined@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} orwherever. (Note: this would have to be at a point *after*@code{gnus-agent} has been loaded via @code{(gnus-agentize)})@lisp(setq gnus-category-predicate-alist (append gnus-category-predicate-alist '((old . my-article-old-p))))@end lispand simply specify your predicate as:@lisp(not old)@end lispIf/when using something like the above, be aware that there are manymisconfigured systems/mailers out there and so an article's date is notalways a reliable indication of when it was posted. Hell, some peoplejust don't give a damn.The above predicates apply to *all* the groups which belong to thecategory. However, if you wish to have a specific predicate for anindividual group within a category, or you're just too lazy to set up anew category, you can enter a group's individual predicate in it's groupparameters like so:@lisp(agent-predicate . short)@end lispThis is the group parameter equivalent of the agent category default.Note that when specifying a single word predicate like this, the@code{agent-predicate} specification must be in dotted pair notation.The equivalent of the longer example from above would be:@lisp(agent-predicate or high (and (not low) (not long)))@end lispThe outer parenthesis required in the category specification are notentered here as, not being in dotted pair notation, the value of thepredicate is assumed to be a list.Now, the syntax of the download score is the same as the syntax ofnormal score files, except that all elements that require actuallyseeing the article itself are verboten. This means that only thefollowing headers can be scored on: @code{Subject}, @code{From},@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},@code{Lines}, and @code{Xref}.As with predicates, the specification of the @code{download score rule}to use in respect of a group can be in either the category definition ifit's to be applicable to all groups in therein, or a group's parametersif it's to be specific to that group.In both of these places the @code{download score rule} can take one ofthree forms:@enumerate@itemScore ruleThis has the same syntax as a normal gnus score file except only asubset of scoring keywords are available as mentioned above.example:@itemize @bullet@itemCategory specification@lisp(("from" ("Lars Ingebrigtsen" 1000000 nil s))("lines" (500 -100 nil <)))@end lisp@itemGroup Parameter specification@lisp(agent-score ("from" ("Lars Ingebrigtsen" 1000000 nil s)) ("lines" (500 -100 nil <)))@end lispAgain, note the omission of the outermost parenthesis here.@end itemize@itemAgent score fileThese score files must *only* contain the permitted scoring keywordsstated above.example:@itemize @bullet@itemCategory specification@lisp("~/News/agent.SCORE")@end lispor perhaps@lisp("~/News/agent.SCORE" "~/News/agent.group.SCORE")@end lisp@itemGroup Parameter specification@lisp(agent-score "~/News/agent.SCORE")@end lispAdditional score files can be specified as above. Need I say anythingabout parenthesis?@end itemize@itemUse @code{normal} score filesIf you don't want to maintain two sets of scoring rules for a group, andyour desired @code{downloading} criteria for a group are the same as your@code{reading} criteria then you can tell the agent to refer to your@code{normal} score files when deciding what to download.These directives in either the category definition or a group'sparameters will cause the agent to read in all the applicable scorefiles for a group, *filtering out* those sections that do notrelate to one of the permitted subset of scoring keywords.@itemize @bullet@itemCategory Specification@lispfile@end lisp@itemGroup Parameter specification@lisp(agent-score . file)@end lisp@end itemize@end enumerate@node The Category Buffer@subsubsection The Category BufferYou'd normally do all category maintenance from the category buffer.When you enter it for the first time (with the @kbd{J c} command fromthe group buffer), you'll only see the @code{default} category.The following commands are available in this buffer:@table @kbd@item q@kindex q (Category)@findex gnus-category-exitReturn to the group buffer (@code{gnus-category-exit}).@item k@kindex k (Category)@findex gnus-category-killKill the current category (@code{gnus-category-kill}).@item c@kindex c (Category)@findex gnus-category-copyCopy the current category (@code{gnus-category-copy}).@item a@kindex a (Category)@findex gnus-category-addAdd a new category (@code{gnus-category-add}).@item p@kindex p (Category)@findex gnus-category-edit-predicateEdit the predicate of the current category(@code{gnus-category-edit-predicate}).@item g@kindex g (Category)@findex gnus-category-edit-groupsEdit the list of groups belonging to the current category(@code{gnus-category-edit-groups}).@item s@kindex s (Category)@findex gnus-category-edit-scoreEdit the download score rule of the current category(@code{gnus-category-edit-score}).@item l@kindex l (Category)@findex gnus-category-listList all the categories (@code{gnus-category-list}).@end table@node Category Variables@subsubsection Category Variables@table @code@item gnus-category-mode-hook@vindex gnus-category-mode-hookHook run in category buffers.@item gnus-category-line-format@vindex gnus-category-line-formatFormat of the lines in the category buffer (@pxref{FormattingVariables}). Valid elements are:@table @samp@item cThe name of the category.@item gThe number of groups in the category.@end table@item gnus-category-mode-line-format@vindex gnus-category-mode-line-formatFormat of the category mode line (@pxref{Mode Line Formatting}).@item gnus-agent-short-article@vindex gnus-agent-short-articleArticles that have fewer lines than this are short. Default 100.@item gnus-agent-long-article@vindex gnus-agent-long-articleArticles that have more lines than this are long. Default 200.@item gnus-agent-low-score@vindex gnus-agent-low-scoreArticles that have a score lower than this have a low score. Default0.@item gnus-agent-high-score@vindex gnus-agent-high-scoreArticles that have a score higher than this have a high score. Default0.@end table@node Agent Commands@subsection Agent CommandsAll the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}(@code{gnus-agent-toggle-plugged} command works in all modes, andtoggles the plugged/unplugged state of the Gnus Agent.@menu* Group Agent Commands::* Summary Agent Commands::* Server Agent Commands::@end menuYou can run a complete batch fetch from the command line with thefollowing incantation:@cindex gnus-agent-batch-fetch@example$ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch@end example@node Group Agent Commands@subsubsection Group Agent Commands@table @kbd@item J u@kindex J u (Agent Group)@findex gnus-agent-fetch-groupsFetch all eligible articles in the current group(@code{gnus-agent-fetch-groups}).@item J c@kindex J c (Agent Group)@findex gnus-enter-category-bufferEnter the Agent category buffer (@code{gnus-enter-category-buffer}).@item J s@kindex J s (Agent Group)@findex gnus-agent-fetch-sessionFetch all eligible articles in all groups(@code{gnus-agent-fetch-session}).@item J S@kindex J S (Agent Group)@findex gnus-group-send-draftsSend all sendable messages in the draft group(@code{gnus-group-send-drafts}). @xref{Drafts}.@item J a@kindex J a (Agent Group)@findex gnus-agent-add-groupAdd the current group to an Agent category(@code{gnus-agent-add-group}). This command understands theprocess/prefix convention (@pxref{Process/Prefix}).@item J r@kindex J r (Agent Group)@findex gnus-agent-remove-groupRemove the current group from its category, if any(@code{gnus-agent-remove-group}). This command understands theprocess/prefix convention (@pxref{Process/Prefix}).@item J Y@kindex J Y (Agent Group)@findex gnus-agent-synchronize-flagsSynchronize flags changed while unplugged with remote server, if any.@end table@node Summary Agent Commands@subsubsection Summary Agent Commands@table @kbd@item J #@kindex J # (Agent Summary)@findex gnus-agent-mark-articleMark the article for downloading (@code{gnus-agent-mark-article}).@item J M-#@kindex J M-# (Agent Summary)@findex gnus-agent-unmark-articleRemove the downloading mark from the article(@code{gnus-agent-unmark-article}).@item @@@kindex @@ (Agent Summary)@findex gnus-agent-toggle-markToggle whether to download the article (@code{gnus-agent-toggle-mark}).@item J c@kindex J c (Agent Summary)@findex gnus-agent-catchupMark all undownloaded articles as read (@code{gnus-agent-catchup}).@end table@node Server Agent Commands@subsubsection Server Agent Commands@table @kbd@item J a@kindex J a (Agent Server)@findex gnus-agent-add-serverAdd the current server to the list of servers covered by the Gnus Agent(@code{gnus-agent-add-server}).@item J r@kindex J r (Agent Server)@findex gnus-agent-remove-serverRemove the current server from the list of servers covered by the GnusAgent (@code{gnus-agent-remove-server}).@end table@node Agent Expiry@subsection Agent Expiry@vindex gnus-agent-expire-days@findex gnus-agent-expire@kindex M-x gnus-agent-expire@cindex Agent expiry@cindex Gnus Agent expiry@cindex expiry@code{nnagent} doesn't handle expiry. Instead, there's a special@code{gnus-agent-expire} command that will expire all read articles thatare older than @code{gnus-agent-expire-days} days. It can be runwhenever you feel that you're running out of space. It's notparticularly fast or efficient, and it's not a particularly good idea tointerrupt it (with @kbd{C-g} or anything else) once you've started it.@vindex gnus-agent-expire-allif @code{gnus-agent-expire-all} is non-@code{nil}, this command willexpire all articles---unread, read, ticked and dormant. If @code{nil}(which is the default), only read articles are eligible for expiry, andunread, ticked and dormant articles will be kept indefinitely.@node Agent and IMAP@subsection Agent and IMAPThe Agent work with any Gnus back end, including nnimap. However,since there are some conceptual differences between @sc{nntp} and@sc{imap}, this section (should) provide you with some information tomake Gnus Agent work smoother as a @sc{imap} Disconnected Mode client.The first thing to keep in mind is that all flags (read, ticked, etc)are kept on the @sc{imap} server, rather than in @file{.newsrc} as is thecase for nntp. Thus Gnus need to remember flag changes whendisconnected, and synchronize these flags when you plug back in.Gnus keep track of flag changes when reading nnimap groups under theAgent by default. When you plug back in, by default Gnus will check ifyou have any changed any flags and ask if you wish to synchronize thesewith the server. This behavior is customizable with@code{gnus-agent-synchronize-flags}.@vindex gnus-agent-synchronize-flagsIf @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent willnever automatically synchronize flags. If it is @code{ask}, thedefault, the Agent will check if you made any changes and if so ask ifyou wish to synchronize these when you re-connect. If it has any othervalue, all flags will be synchronized automatically.If you do not wish to automatically synchronize flags when youre-connect, this can be done manually with the@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}in the group buffer by default.Some things are currently not implemented in the Agent that you'd mightexpect from a disconnected @sc{imap} client, including:@itemize @bullet@itemCopying/moving articles into nnimap groups when unplugged.@itemCreating/deleting nnimap groups when unplugged.@end itemizeTechnical note: the synchronization algorithm does not work by "pushing"all local flags to the server, but rather incrementally update theserver view of flags by changing only those flags that were changed bythe user. Thus, if you set one flag on a article, quit the group andre-select the group and remove the flag; the flag will be set andremoved from the server when you "synchronize". The queued flagoperations can be found in the per-server @code{flags} file in the Agentdirectory. It's emptied when you synchronize flags.@node Outgoing Messages@subsection Outgoing MessagesWhen Gnus is unplugged, all outgoing messages (both mail and news) arestored in the draft groups (@pxref{Drafts}). You can view them thereafter posting, and edit them at will.When Gnus is plugged again, you can send the messages either from thedraft group with the special commands available there, or you can usethe @kbd{J S} command in the group buffer to send all the sendablemessages in the draft group.@node Agent Variables@subsection Agent Variables@table @code@item gnus-agent-directory@vindex gnus-agent-directoryWhere the Gnus Agent will store its files. The default is@file{~/News/agent/}.@item gnus-agent-handle-level@vindex gnus-agent-handle-levelGroups on levels (@pxref{Group Levels}) higher than this variable willbe ignored by the Agent. The default is @code{gnus-level-subscribed},which means that only subscribed group will be considered by the Agentby default.@item gnus-agent-plugged-hook@vindex gnus-agent-plugged-hookHook run when connecting to the network.@item gnus-agent-unplugged-hook@vindex gnus-agent-unplugged-hookHook run when disconnecting from the network.@end table@node Example Setup@subsection Example SetupIf you don't want to read this manual, and you have a fairly standardsetup, you may be able to use something like the following as your@file{.gnus.el} file to get started.@lisp;;; Define how Gnus is to fetch news. We do this over @sc{nntp};;; from your ISP's server.(setq gnus-select-method '(nntp "news.your-isp.com"));;; Define how Gnus is to read your mail. We read mail from;;; your ISP's POP server.(setq mail-sources '((pop :server "pop.your-isp.com")));;; Say how Gnus is to store the mail. We use nnml groups.(setq gnus-secondary-select-methods '((nnml "")));;; Make Gnus into an offline newsreader.(gnus-agentize)@end lispThat should be it, basically. Put that in your @file{~/.gnus.el} file,edit to suit your needs, start up PPP (or whatever), and type @kbd{M-xgnus}.If this is the first time you've run Gnus, you will be subscribedautomatically to a few default newsgroups. You'll probably want tosubscribe to more groups, and to do that, you have to query the@sc{nntp} server for a complete list of groups with the @kbd{A A}command. This usually takes quite a while, but you only have to do itonce.After reading and parsing a while, you'll be presented with a list ofgroups. Subscribe to the ones you want to read with the @kbd{u}command. @kbd{l} to make all the killed groups disappear after you'vesubscribe to all the groups you want to read. (@kbd{A k} will bringback all the killed groups.)You can now read the groups at once, or you can download the articleswith the @kbd{J s} command. And then read the rest of this manual tofind out which of the other gazillion things you want to customize.@node Batching Agents@subsection Batching AgentsHaving the Gnus Agent fetch articles (and post whatever messages you'vewritten) is quite easy once you've gotten things set up properly. Thefollowing shell script will do everything that is necessary:@example#!/bin/shemacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null@end example@node Agent Caveats@subsection Agent CaveatsThe Gnus Agent doesn't seem to work like most other offlinenewsreaders. Here are some common questions that some imaginary peoplemay ask:@table @dfn@item If I read an article while plugged, do they get entered into theAgent?@strong{No.}@item If I read an article while plugged, and the article already existsin the Agent, will it get downloaded once more?@strong{Yes.}@end tableIn short, when Gnus is unplugged, it only looks into the locally storedarticles; when it's plugged, it only talks to your ISP.@node Scoring@chapter Scoring@cindex scoringOther people use @dfn{kill files}, but we here at Gnus Towers likescoring better than killing, so we'd rather switch than fight. They dosomething completely different as well, so sit up straight and payattention!@vindex gnus-summary-mark-belowAll articles have a default score (@code{gnus-summary-default-score}),which is 0 by default. This score may be raised or lowered eitherinteractively or by score files. Articles that have a score lower than@code{gnus-summary-mark-below} are marked as read.Gnus will read any @dfn{score files} that apply to the current groupbefore generating the summary buffer.There are several commands in the summary buffer that insert scoreentries based on the current article. You can, for instance, ask Gnus tolower or increase the score of all articles with a certain subject.There are two sorts of scoring entries: Permanent and temporary.Temporary score entries are self-expiring entries. Any entries that aretemporary and have not been used for, say, a week, will be removedsilently to help keep the sizes of the score files down.@menu* Summary Score Commands:: Adding score entries for the current group.* Group Score Commands:: General score commands.* Score Variables:: Customize your scoring. (My, what terminology).* Score File Format:: What a score file may contain.* Score File Editing:: You can edit score files by hand as well.* Adaptive Scoring:: Big Sister Gnus knows what you read.* Home Score File:: How to say where new score entries are to go.* Followups To Yourself:: Having Gnus notice when people answer you.* Scoring Tips:: How to score effectively.* Reverse Scoring:: That problem child of old is not problem.* Global Score Files:: Earth-spanning, ear-splitting score files.* Kill Files:: They are still here, but they can be ignored.* Converting Kill Files:: Translating kill files to score files.* GroupLens:: Getting predictions on what you like to read.* Advanced Scoring:: Using logical expressions to build score rules.* Score Decays:: It can be useful to let scores wither away.@end menu@node Summary Score Commands@section Summary Score Commands@cindex score commandsThe score commands that alter score entries do not actually modify realscore files. That would be too inefficient. Gnus maintains a cache ofpreviously loaded score files, one of which is considered the@dfn{current score file alist}. The score commands simply insertentries into this list, and upon group exit, this list is saved.The current score file is by default the group's local score file, evenif no such score file actually exists. To insert score commands intosome other score file (e.g. @file{all.SCORE}), you must first make thisscore file the current one.General score commands that don't actually change the score file:@table @kbd@item V s@kindex V s @r{(Summary)}@findex gnus-summary-set-scoreSet the score of the current article (@code{gnus-summary-set-score}).@item V S@kindex V S @r{(Summary)}@findex gnus-summary-current-scoreDisplay the score of the current article(@code{gnus-summary-current-score}).@item V t@kindex V t @r{(Summary)}@findex gnus-score-find-traceDisplay all score rules that have been used on the current article(@code{gnus-score-find-trace}).@item V R@kindex V R @r{(Summary)}@findex gnus-summary-rescoreRun the current summary through the scoring process(@code{gnus-summary-rescore}). This might be useful if you're playingaround with your score files behind Gnus' back and want to see theeffect you're having.@item V c@kindex V c @r{(Summary)}@findex gnus-score-change-score-fileMake a different score file the current(@code{gnus-score-change-score-file}).@item V e@kindex V e @r{(Summary)}@findex gnus-score-edit-current-scoresEdit the current score file (@code{gnus-score-edit-current-scores}).You will be popped into a @code{gnus-score-mode} buffer (@pxref{ScoreFile Editing}).@item V f@kindex V f @r{(Summary)}@findex gnus-score-edit-fileEdit a score file and make this score file the current one(@code{gnus-score-edit-file}).@item V F@kindex V F @r{(Summary)}@findex gnus-score-flush-cacheFlush the score cache (@code{gnus-score-flush-cache}). This is usefulafter editing score files.@item V C@kindex V C @r{(Summary)}@findex gnus-score-customizeCustomize a score file in a visually pleasing manner(@code{gnus-score-customize}).@end tableThe rest of these commands modify the local score file.@table @kbd@item V m@kindex V m @r{(Summary)}@findex gnus-score-set-mark-belowPrompt for a score, and mark all articles with a score below this asread (@code{gnus-score-set-mark-below}).@item V x@kindex V x @r{(Summary)}@findex gnus-score-set-expunge-belowPrompt for a score, and add a score rule to the current score file toexpunge all articles below this score(@code{gnus-score-set-expunge-below}).@end tableThe keystrokes for actually making score entries follow a very regularpattern, so there's no need to list all the commands. (Hundreds ofthem.)@findex gnus-summary-increase-score@findex gnus-summary-lower-score@enumerate@itemThe first key is either @kbd{I} (upper case i) for increasing the scoreor @kbd{L} for lowering the score.@itemThe second key says what header you want to score on. The followingkeys are available:@table @kbd@item aScore on the author name.@item sScore on the subject line.@item xScore on the @code{Xref} line---i.e., the cross-posting line.@item rScore on the @code{References} line.@item dScore on the date.@item lScore on the number of lines.@item iScore on the @code{Message-ID} header.@item fScore on followups---this matches the author name, and adds scores tothe followups to this author.@item bScore on the body.@item hScore on the head.@item tScore on thread.@end table@itemThe third key is the match type. Which match types are valid depends onwhat headers you are scoring on.@table @code@item strings@table @kbd@item eExact matching.@item sSubstring matching.@item fFuzzy matching (@pxref{Fuzzy Matching}).@item rRegexp matching@end table@item date@table @kbd@item bBefore date.@item aAfter date.@item nThis date.@end table@item number@table @kbd@item <Less than number.@item =Equal to number.@item >Greater than number.@end table@end table@itemThe fourth and final key says whether this is a temporary (i.e., expiring)score entry, or a permanent (i.e., non-expiring) score entry, or whetherit is to be done immediately, without adding to the score file.@table @kbd@item tTemporary score entry.@item pPermanent score entry.@item iImmediately scoring.@end table@end enumerateSo, let's say you want to increase the score on the current author withexact matching permanently: @kbd{I a e p}. If you want to lower thescore based on the subject line, using substring matching, and make atemporary score entry: @kbd{L s s t}. Pretty easy.To make things a bit more complicated, there are shortcuts. If you usea capital letter on either the second or third keys, Gnus will usedefaults for the remaining one or two keystrokes. The defaults are``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a st}, and @kbd{I a R} is the same as @kbd{I a r t}.These functions take both the numerical prefix and the symbolic prefix(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower(or increase) the score of the article. A symbolic prefix of @code{a}says to use the @file{all.SCORE} file for the command instead of thecurrent score file.@vindex gnus-score-mimic-keymapThe @code{gnus-score-mimic-keymap} says whether these commands willpretend they are keymaps or not.@node Group Score Commands@section Group Score Commands@cindex group score commandsThere aren't many of these as yet, I'm afraid.@table @kbd@item W f@kindex W f @r{(Group)}@findex gnus-score-flush-cacheGnus maintains a cache of score alists to avoid having to reload themall the time. This command will flush the cache(@code{gnus-score-flush-cache}).@end tableYou can do scoring from the command line by saying something like:@findex gnus-batch-score@cindex batch scoring@example$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score@end example@node Score Variables@section Score Variables@cindex score variables@table @code@item gnus-use-scoring@vindex gnus-use-scoringIf @code{nil}, Gnus will not check for score files, and will not, ingeneral, do any score-related work. This is @code{t} by default.@item gnus-kill-killed@vindex gnus-kill-killedIf this variable is @code{nil}, Gnus will never apply score files toarticles that have already been through the kill process. While thismay save you lots of time, it also means that if you apply a kill fileto a group, and then change the kill file and want to run it over yougroup again to kill more articles, it won't work. You have to set thisvariable to @code{t} to do that. (It is @code{t} by default.)@item gnus-kill-files-directory@vindex gnus-kill-files-directoryAll kill and score files will be stored in this directory, which isinitialized from the @code{SAVEDIR} environment variable by default.This is @file{~/News/} by default.@item gnus-score-file-suffix@vindex gnus-score-file-suffixSuffix to add to the group name to arrive at the score file name(@samp{SCORE} by default.)@item gnus-score-uncacheable-files@vindex gnus-score-uncacheable-files@cindex score cacheAll score files are normally cached to avoid excessive re-loading ofscore files. However, if this might make your Emacs grow big andbloated, so this regexp can be used to weed out score files unlikely to be needed again. It would be a bad idea to deny caching of@file{all.SCORE}, while it might be a good idea to not cache@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, thisvariable is @samp{ADAPT$} by default, so no adaptive score files willbe cached.@item gnus-save-score@vindex gnus-save-scoreIf you have really complicated score files, and do lots of batchscoring, then you might set this variable to @code{t}. This will makeGnus save the scores into the @file{.newsrc.eld} file.If you do not set this to @code{t}, then manual scores (like those setwith @kbd{V s} (@code{gnus-summary-set-score})) will not be preservedacross group visits.@item gnus-score-interactive-default-score@vindex gnus-score-interactive-default-scoreScore used by all the interactive raise/lower commands to raise/lowerscore with. Default is 1000, which may seem excessive, but this is toensure that the adaptive scoring scheme gets enough room to play with.We don't want the small changes from the adaptive scoring to overwritemanually entered data.@item gnus-summary-default-score@vindex gnus-summary-default-scoreDefault score of an article, which is 0 by default.@item gnus-summary-expunge-below@vindex gnus-summary-expunge-belowDon't display the summary lines of articles that have scores lower thanthis variable. This is @code{nil} by default, which means that noarticles will be hidden. This variable is local to the summary buffers,and has to be set from @code{gnus-summary-mode-hook}.@item gnus-score-over-mark@vindex gnus-score-over-markMark (in the third column) used for articles with a score over thedefault. Default is @samp{+}.@item gnus-score-below-mark@vindex gnus-score-below-markMark (in the third column) used for articles with a score below thedefault. Default is @samp{-}.@item gnus-score-find-score-files-function@vindex gnus-score-find-score-files-functionFunction used to find score files for the current group. This functionis called with the name of the group as the argument.Predefined functions available are:@table @code@item gnus-score-find-single@findex gnus-score-find-singleOnly apply the group's own score file.@item gnus-score-find-bnews@findex gnus-score-find-bnewsApply all score files that match, using bnews syntax. This is thedefault. If the current group is @samp{gnu.emacs.gnus}, for instance,@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and@file{gnu.all.SCORE} would all apply. In short, the instances of@samp{all} in the score file names are translated into @samp{.*}, andthen a regexp match is done.This means that if you have some score entries that you want to apply toall groups, then you put those entries in the @file{all.SCORE} file.The score files are applied in a semi-random order, although Gnus willtry to apply the more general score files before the more specific scorefiles. It does this by looking at the number of elements in the scorefile names---discarding the @samp{all} elements.@item gnus-score-find-hierarchical@findex gnus-score-find-hierarchicalApply all score files from all the parent groups. This means that youcan't have score files like @file{all.SCORE}, but you can have@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for eachserver.@end tableThis variable can also be a list of functions. In that case, all thesefunctions will be called with the group name as argument, and all thereturned lists of score files will be applied. These functions can alsoreturn lists of score alists directly. In that case, the functions thatreturn these non-file score alists should probably be placed before the``real'' score file functions, to ensure that the last score filereturned is the local score file. Phu.For example, to do hierarchical scoring but use a non-server-specificoverall score file, you could use the value@example(list (lambda (group) ("all.SCORE")) 'gnus-score-find-hierarchical)@end example@item gnus-score-expiry-days@vindex gnus-score-expiry-daysThis variable says how many days should pass before an unused score fileentry is expired. If this variable is @code{nil}, no score file entriesare expired. It's 7 by default.@item gnus-update-score-entry-dates@vindex gnus-update-score-entry-datesIf this variable is non-@code{nil}, matching score entries will havetheir dates updated. (This is how Gnus controls expiry---allnon-matching entries will become too old while matching entries willstay fresh and young.) However, if you set this variable to @code{nil},even matching entries will grow old and will have to face that oh-sogrim reaper.@item gnus-score-after-write-file-function@vindex gnus-score-after-write-file-functionFunction called with the name of the score file just written.@item gnus-score-thread-simplify@vindex gnus-score-thread-simplifyIf this variable is non-@code{nil}, article subjects will be simplifiedfor subject scoring purposes in the same manner as withthreading---according to the current value ofgnus-simplify-subject-functions. If the scoring entry uses@code{substring} or @code{exact} matching, the match will also besimplified in this manner.@end table@node Score File Format@section Score File Format@cindex score file formatA score file is an @code{emacs-lisp} file that normally contains just asingle form. Casual users are not expected to edit these files;everything can be changed from the summary buffer.Anyway, if you'd like to dig into it yourself, here's an example:@lisp(("from" ("Lars Ingebrigtsen" -10000) ("Per Abrahamsen") ("larsi\\|lmi" -50000 nil R)) ("subject" ("Ding is Badd" nil 728373)) ("xref" ("alt.politics" -1000 728372 s)) ("lines" (2 -100 nil <)) (mark 0) (expunge -1000) (mark-and-expunge -10) (read-only nil) (orphan -10) (adapt t) (files "/hom/larsi/News/gnu.SCORE") (exclude-files "all.SCORE") (local (gnus-newsgroup-auto-expire t) (gnus-summary-make-false-root empty)) (eval (ding)))@end lispThis example demonstrates most score file elements. For a differentapproach, see @pxref{Advanced Scoring}.Even though this looks much like lisp code, nothing here is actually@code{eval}ed. The lisp reader is used to read this form, though, so ithas to be valid syntactically, if not semantically.Six keys are supported by this alist:@table @code@item STRINGIf the key is a string, it is the name of the header to perform thematch on. Scoring can only be performed on these eight headers:@code{From}, @code{Subject}, @code{References}, @code{Message-ID},@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition tothese headers, there are three strings to tell Gnus to fetch the entirearticle and do the match on larger parts of the article: @code{Body}will perform the match on the body of the article, @code{Head} willperform the match on the head of the article, and @code{All} willperform the match on the entire article. Note that using any of theselast three keys will slow down group entry @emph{considerably}. Thefinal ``header'' you can score on is @code{Followup}. These scoreentries will result in new score entries being added for all follow-upsto articles that matches these score entries.Following this key is a arbitrary number of score entries, where eachscore entry has one to four elements.@enumerate@itemThe first element is the @dfn{match element}. On most headers this willbe a string, but on the Lines and Chars headers, this must be aninteger.@itemIf the second element is present, it should be a number---the @dfn{scoreelement}. This number should be an integer in the neginf to posinfinterval. This number is added to the score of the article if the matchis successful. If this element is not present, the@code{gnus-score-interactive-default-score} number will be usedinstead. This is 1000 by default.@itemIf the third element is present, it should be a number---the @dfn{dateelement}. This date says when the last time this score entry matched,which provides a mechanism for expiring the score entries. It thiselement is not present, the score entry is permanent. The date isrepresented by the number of days since December 31, 1 BCE.@itemIf the fourth element is present, it should be a symbol---the @dfn{typeelement}. This element specifies what function should be used to seewhether this score entry matches the article. What match types that canbe used depends on what header you wish to perform the match on.@table @dfn@item From, Subject, References, Xref, Message-IDFor most header types, there are the @code{r} and @code{R} (regexp), aswell as @code{s} and @code{S} (substring) types, and @code{e} and@code{E} (exact match), and @code{w} (word match) types. If thiselement is not present, Gnus will assume that substring matching shouldbe used. @code{R}, @code{S}, and @code{E} differ from the others inthat the matches will be done in a case-sensitive manner. All theseone-letter types are really just abbreviations for the @code{regexp},@code{string}, @code{exact}, and @code{word} types, which you can useinstead, if you feel like.@item Lines, CharsThese two headers use different match types: @code{<}, @code{>},@code{=}, @code{>=} and @code{<=}.These predicates are true if@example(PREDICATE HEADER MATCH)@end exampleevaluates to non-@code{nil}. For instance, the advanced match@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in thefollowing form:@lisp(< header-value 4)@end lispOr to put it another way: When using @code{<} on @code{Lines} with 4 asthe match, we get the score added if the article has less than 4 lines.(It's easy to get confused and think it's the other way around. Butit's not. I think.)When matching on @code{Lines}, be careful because some back ends (like@code{nndir}) do not generate @code{Lines} header, so every article endsup being marked as having 0 lines. This can lead to strange results ifyou happen to lower score of the articles with few lines.@item DateFor the Date header we have three kinda silly match types:@code{before}, @code{at} and @code{after}. I can't really imagine thisever being useful, but, like, it would feel kinda silly not to providethis function. Just in case. You never know. Better safe than sorry.Once burnt, twice shy. Don't judge a book by its cover. Never not havesex on a first date. (I have been told that at least one person, and Iquote, ``found this function indispensable'', however.)@cindex ISO8601@cindex dateA more useful match type is @code{regexp}. With it, you can match thedate string using a regular expression. The date is normalized toISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. Ifyou want to match all articles that have been posted on April 1st inevery year, you could use @samp{....0401.........} as a match string,for instance. (Note that the date is kept in its original time zone, sothis will match articles that were posted when it was April 1st wherethe article was posted from. Time zones are such wholesome fun for thewhole family, eh?)@item Head, Body, AllThese three match keys use the same match types as the @code{From} (etc)header uses.@item FollowupThis match key is somewhat special, in that it will match the@code{From} header, and affect the score of not only the matchingarticles, but also all followups to the matching articles. This allowsyou e.g. increase the score of followups to your own articles, ordecrease the score of followups to the articles of some knowntrouble-maker. Uses the same match types as the @code{From} headeruses. (Using this match key will lead to creation of @file{ADAPT}files.)@item ThreadThis match key works along the same lines as the @code{Followup} matchkey. If you say that you want to score on a (sub-)thread started by anarticle with a @code{Message-ID} @var{x}, then you add a @samp{thread}match. This will add a new @samp{thread} match for each article thathas @var{x} in its @code{References} header. (These new @samp{thread}matches will use the @code{Message-ID}s of these matching articles.)This will ensure that you can raise/lower the score of an entire thread,even though some articles in the thread may not have complete@code{References} headers. Note that using this may lead toundeterministic scores of the articles in the thread. (Using this matchkey will lead to creation of @file{ADAPT} files.)@end table@end enumerate@cindex Score File Atoms@item markThe value of this entry should be a number. Any articles with a scorelower than this number will be marked as read.@item expungeThe value of this entry should be a number. Any articles with a scorelower than this number will be removed from the summary buffer.@item mark-and-expungeThe value of this entry should be a number. Any articles with a scorelower than this number will be marked as read and removed from thesummary buffer.@item thread-mark-and-expungeThe value of this entry should be a number. All articles that belong toa thread that has a total score below this number will be marked as readand removed from the summary buffer. @code{gnus-thread-score-function}says how to compute the total score for a thread.@item filesThe value of this entry should be any number of file names. These filesare assumed to be score files as well, and will be loaded the same waythis one was.@item exclude-filesThe clue of this entry should be any number of files. These files willnot be loaded, even though they would normally be so, for some reason orother.@item evalThe value of this entry will be @code{eval}el. This element will beignored when handling global score files.@item read-onlyRead-only score files will not be updated or saved. Global score filesshould feature this atom (@pxref{Global Score Files}). (Note:@dfn{Global} here really means @dfn{global}; not your personalapply-to-all-groups score files.)@item orphanThe value of this entry should be a number. Articles that do not haveparents will get this number added to their scores. Imagine you followsome high-volume newsgroup, like @samp{comp.lang.c}. Most likely youwill only follow a few of the threads, also want to see any new threads.You can do this with the following two score file entries:@example (orphan -500) (mark-and-expunge -100)@end exampleWhen you enter the group the first time, you will only see the newthreads. You then raise the score of the threads that you findinteresting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) therest. Next time you enter the group, you will see new articles in theinteresting threads, plus any new threads.I.e.---the orphan score atom is for high-volume groups where thereexist a few interesting threads which can't be found automatically byordinary scoring rules.@item adaptThis entry controls the adaptive scoring. If it is @code{t}, thedefault adaptive scoring rules will be used. If it is @code{ignore}, noadaptive scoring will be performed on this group. If it is a list, thislist will be used as the adaptive scoring rules. If it isn't present,or is something other than @code{t} or @code{ignore}, the defaultadaptive scoring rules will be used. If you want to use adaptivescoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to@code{t}, and insert an @code{(adapt ignore)} in the groups where you donot want adaptive scoring. If you only want adaptive scoring in a fewgroups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, andinsert @code{(adapt t)} in the score files of the groups where you wantit.@item adapt-fileAll adaptive score entries will go to the file named by this entry. Itwill also be applied when entering the group. This atom might be handyif you want to adapt on several groups at once, using the same adaptivefile for a number of groups.@item local@cindex local variablesThe value of this entry should be a list of @code{(VAR VALUE)} pairs.Each @var{var} will be made buffer-local to the current summary buffer,and set to the value specified. This is a convenient, if somewhatstrange, way of setting variables in some groups if you don't like hooksmuch. Note that the @var{value} won't be evaluated.@end table@node Score File Editing@section Score File EditingYou normally enter all scoring commands from the summary buffer, but youmight feel the urge to edit them by hand as well, so we've supplied youwith a mode for that.It's simply a slightly customized @code{emacs-lisp} mode, with theseadditional commands:@table @kbd@item C-c C-c@kindex C-c C-c (Score)@findex gnus-score-edit-doneSave the changes you have made and return to the summary buffer(@code{gnus-score-edit-done}).@item C-c C-d@kindex C-c C-d (Score)@findex gnus-score-edit-insert-dateInsert the current date in numerical format(@code{gnus-score-edit-insert-date}). This is really the day number, ifyou were wondering.@item C-c C-p@kindex C-c C-p (Score)@findex gnus-score-pretty-printThe adaptive score files are saved in an unformatted fashion. If youintend to read one of these files, you want to @dfn{pretty print} itfirst. This command (@code{gnus-score-pretty-print}) does that foryou.@end tableType @kbd{M-x gnus-score-mode} to use this mode.@vindex gnus-score-mode-hook@code{gnus-score-menu-hook} is run in score mode buffers.In the summary buffer you can use commands like @kbd{V f} and @kbd{Ve} to begin editing score files.@node Adaptive Scoring@section Adaptive Scoring@cindex adaptive scoringIf all this scoring is getting you down, Gnus has a way of making it allhappen automatically---as if by magic. Or rather, as if by artificialstupidity, to be precise.@vindex gnus-use-adaptive-scoringWhen you read an article, or mark an article as read, or kill anarticle, you leave marks behind. On exit from the group, Gnus can sniffthese marks and add score elements depending on what marks it finds.You turn on this ability by setting @code{gnus-use-adaptive-scoring} to@code{t} or @code{(line)}. If you want score adaptively on separatewords appearing in the subjects, you should set this variable to@code{(word)}. If you want to use both adaptive methods, set thisvariable to @code{(word line)}.@vindex gnus-default-adaptive-score-alistTo give you complete control over the scoring process, you can customizethe @code{gnus-default-adaptive-score-alist} variable. For instance, itmight look something like this:@lisp(setq gnus-default-adaptive-score-alist '((gnus-unread-mark) (gnus-ticked-mark (from 4)) (gnus-dormant-mark (from 5)) (gnus-del-mark (from -4) (subject -1)) (gnus-read-mark (from 4) (subject 2)) (gnus-expirable-mark (from -1) (subject -1)) (gnus-killed-mark (from -1) (subject -3)) (gnus-kill-file-mark) (gnus-ancient-mark) (gnus-low-score-mark) (gnus-catchup-mark (from -1) (subject -1))))@end lispAs you see, each element in this alist has a mark as a key (either avariable name or a ``real'' mark---a character). Following this key isa arbitrary number of header/score pairs. If there are no header/scorepairs following the key, no adaptive scoring will be done on articlesthat have that key as the article mark. For instance, articles with@code{gnus-unread-mark} in the example above will not get adaptive scoreentries.Each article can have only one mark, so just a single of these ruleswill be applied to each article.To take @code{gnus-del-mark} as an example---this alist says that allarticles that have that mark (i.e., are marked with @samp{D}) will have ascore entry added to lower based on the @code{From} header by -4, andlowered by @code{Subject} by -1. Change this to fit your prejudices.If you have marked 10 articles with the same subject with@code{gnus-del-mark}, the rule for that mark will be applied ten times.That means that that subject will get a score of ten times -1, whichshould be, unless I'm much mistaken, -10.If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), allthe read articles will be marked with the @samp{E} mark. This'llprobably make adaptive scoring slightly impossible, so auto-expiring andadaptive scoring doesn't really mix very well.The headers you can score on are @code{from}, @code{subject},@code{message-id}, @code{references}, @code{xref}, @code{lines},@code{chars} and @code{date}. In addition, you can score on@code{followup}, which will create an adaptive score entry that matcheson the @code{References} header using the @code{Message-ID} of thecurrent article, thereby matching the following thread.You can also score on @code{thread}, which will try to score allarticles that appear in a thread. @code{thread} matches uses a@code{Message-ID} to match on the @code{References} header of thearticle. If the match is made, the @code{Message-ID} of the article isadded to the @code{thread} rule. (Think about it. I'd recommend twoaspirins afterwards.)If you use this scheme, you should set the score file atom @code{mark}to something small---like -300, perhaps, to avoid having small randomchanges result in articles getting marked as read.After using adaptive scoring for a week or so, Gnus should start tobecome properly trained and enhance the authors you like best, and killthe authors you like least, without you having to say so explicitly.You can control what groups the adaptive scoring is to be performed onby using the score files (@pxref{Score File Format}). This will alsolet you use different rules in different groups.@vindex gnus-adaptive-file-suffixThe adaptive score entries will be put into a file where the name is thegroup name with @code{gnus-adaptive-file-suffix} appended. The defaultis @samp{ADAPT}.@vindex gnus-score-exact-adapt-limitWhen doing adaptive scoring, substring or fuzzy matching would probablygive you the best results in most cases. However, if the header onematches is short, the possibility for false positives is great, so ifthe length of the match is less than@code{gnus-score-exact-adapt-limit}, exact matching will be used. Ifthis variable is @code{nil}, exact matching will always be used to avoidthis problem.@vindex gnus-default-adaptive-word-score-alistAs mentioned above, you can adapt either on individual words or entireheaders. If you adapt on words, the@code{gnus-default-adaptive-word-score-alist} variable says what scoreeach instance of a word should add given a mark.@lisp(setq gnus-default-adaptive-word-score-alist `((,gnus-read-mark . 30) (,gnus-catchup-mark . -10) (,gnus-killed-mark . -20) (,gnus-del-mark . -15)))@end lispThis is the default value. If you adapt on words, everyword that appears in subjects of articles marked with@code{gnus-read-mark} will result in a score rule that increase thescore with 30 points.@vindex gnus-default-ignored-adaptive-words@vindex gnus-ignored-adaptive-wordsWords that appear in the @code{gnus-default-ignored-adaptive-words} listwill be ignored. If you wish to add more words to be ignored, use the@code{gnus-ignored-adaptive-words} list instead.@vindex gnus-adaptive-word-syntax-tableWhen the scoring is done, @code{gnus-adaptive-word-syntax-table} is thesyntax table in effect. It is similar to the standard syntax table, butit considers numbers to be non-word-constituent characters.@vindex gnus-adaptive-word-minimumIf @code{gnus-adaptive-word-minimum} is set to a number, the adaptiveword scoring process will never bring down the score of an article tobelow this number. The default is @code{nil}.@vindex gnus-adaptive-word-no-group-wordsIf @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnuswon't adaptively word score any of the words in the group name. Usefulfor groups like @samp{comp.editors.emacs}, where most of the subjectlines contain the word @samp{emacs}.After using this scheme for a while, it might be nice to write a@code{gnus-psychoanalyze-user} command to go through the rules and seewhat words you like and what words you don't like. Or perhaps not.Note that the adaptive word scoring thing is highly experimental and islikely to change in the future. Initial impressions seem to indicatethat it's totally useless as it stands. Some more work (involving morerigorous statistical methods) will have to be done to make this useful.@node Home Score File@section Home Score FileThe score file where new score file entries will go is called the@dfn{home score file}. This is normally (and by default) the score filefor the group itself. For instance, the home score file for@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.However, this may not be what you want. It is often convenient to sharea common home score file among many groups---all @samp{emacs} groupscould perhaps use the same home score file.@vindex gnus-home-score-fileThe variable that controls this is @code{gnus-home-score-file}. It canbe:@enumerate@itemA string. Then this file will be used as the home score file for allgroups.@itemA function. The result of this function will be used as the home scorefile. The function will be called with the name of the group as theparameter.@itemA list. The elements in this list can be:@enumerate@item@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches thegroup name, the @var{file-name} will be used as the home score file.@itemA function. If the function returns non-nil, the result will be used asthe home score file.@itemA string. Use the string as the home score file.@end enumerateThe list will be traversed from the beginning towards the end lookingfor matches.@end enumerateSo, if you want to use just a single score file, you could say:@lisp(setq gnus-home-score-file "my-total-score-file.SCORE")@end lispIf you want to use @file{gnu.SCORE} for all @samp{gnu} groups and@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:@findex gnus-hierarchial-home-score-file@lisp(setq gnus-home-score-file 'gnus-hierarchial-home-score-file)@end lispThis is a ready-made function provided for your convenience.Other functions include@table @code@item gnus-current-home-score-file@findex gnus-current-home-score-fileReturn the ``current'' regular score file. This will make scoringcommands add entry to the ``innermost'' matching score file.@end tableIf you want to have one score file for the @samp{emacs} groups andanother for the @samp{comp} groups, while letting all other groups usetheir own home score files:@lisp(setq gnus-home-score-file ;; All groups that match the regexp "\\.emacs" '(("\\.emacs" "emacs.SCORE") ;; All the comp groups in one score file ("^comp" "comp.SCORE")))@end lisp@vindex gnus-home-adapt-file@code{gnus-home-adapt-file} works exactly the same way as@code{gnus-home-score-file}, but says what the home adaptive score fileis instead. All new adaptive file entries will go into the filespecified by this variable, and the same syntax is allowed.In addition to using @code{gnus-home-score-file} and@code{gnus-home-adapt-file}, you can also use group parameters(@pxref{Group Parameters}) and topic parameters (@pxref{TopicParameters}) to achieve much the same. Group and topic parameters takeprecedence over this variable.@node Followups To Yourself@section Followups To YourselfGnus offers two commands for picking out the @code{Message-ID} header inthe current buffer. Gnus will then add a score rule that scores usingthis @code{Message-ID} on the @code{References} header of otherarticles. This will, in effect, increase the score of all articles thatrespond to the article in the current buffer. Quite useful if you wantto easily note when people answer what you've said.@table @code@item gnus-score-followup-article@findex gnus-score-followup-articleThis will add a score to articles that directly follow up your ownarticle.@item gnus-score-followup-thread@findex gnus-score-followup-threadThis will add a score to all articles that appear in a thread ``below''your own article.@end table@vindex message-sent-hookThese two functions are both primarily meant to be used in hooks like@code{message-sent-hook}, like this:@lisp(add-hook 'message-sent-hook 'gnus-score-followup-thread)@end lispIf you look closely at your own @code{Message-ID}, you'll notice thatthe first two or three characters are always the same. Here's two ofmine:@example<x6u3u47icf.fsf@@eyesore.no><x6sp9o7ibw.fsf@@eyesore.no>@end exampleSo ``my'' ident on this machine is @samp{x6}. This can beexploited---the following rule will raise the score on all followups tomyself:@lisp("references" ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>" 1000 nil r))@end lispWhether it's the first two or first three characters that are ``yours''is system-dependent.@node Scoring Tips@section Scoring Tips@cindex scoring tips@table @dfn@item Crossposts@cindex crossposts@cindex scoring crosspostsIf you want to lower the score of crossposts, the line to match on isthe @code{Xref} header.@lisp("xref" (" talk.politics.misc:" -1000))@end lisp@item Multiple crosspostsIf you want to lower the score of articles that have been crossposted tomore than, say, 3 groups:@lisp("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r))@end lisp@item Matching on the bodyThis is generally not a very good idea---it takes a very long time.Gnus actually has to fetch each individual article from the server. Butyou might want to anyway, I guess. Even though there are three matchkeys (@code{Head}, @code{Body} and @code{All}), you should choose oneand stick with it in each score file. If you use any two, each articlewill be fetched @emph{twice}. If you want to match a bit on the@code{Head} and a bit on the @code{Body}, just use @code{All} for allthe matches.@item Marking as readYou will probably want to mark articles that have scores below a certainnumber as read. This is most easily achieved by putting the followingin your @file{all.SCORE} file:@lisp((mark -100))@end lispYou may also consider doing something similar with @code{expunge}.@item Negated character classesIf you say stuff like @code{[^abcd]*}, you may get unexpected results.That will match newlines, which might lead to, well, The Unknown. Say@code{[^abcd\n]*} instead.@end table@node Reverse Scoring@section Reverse Scoring@cindex reverse scoringIf you want to keep just articles that have @samp{Sex with Emacs} in thesubject header, and expunge all other articles, you could put somethinglike this in your score file:@lisp(("subject" ("Sex with Emacs" 2)) (mark 1) (expunge 1))@end lispSo, you raise all articles that match @samp{Sex with Emacs} and mark therest as read, and expunge them to boot.@node Global Score Files@section Global Score Files@cindex global score filesSure, other newsreaders have ``global kill files''. These are usuallynothing more than a single kill file that applies to all groups, storedin the user's home directory. Bah! Puny, weak newsreaders!What I'm talking about here are Global Score Files. Score files fromall over the world, from users everywhere, uniting all nations in onebig, happy score file union! Ange-score! New and untested!@vindex gnus-global-score-filesAll you have to do to use other people's score files is to set the@code{gnus-global-score-files} variable. One entry for each score file,or each score file directory. Gnus will decide by itself what scorefiles are applicable to which group.To use the score file@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} andall score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,say this:@lisp(setq gnus-global-score-files '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE" "/ftp@@ftp.some-where:/pub/score/"))@end lisp@findex gnus-score-search-global-directories@noindentSimple, eh? Directory names must end with a @samp{/}. Thesedirectories are typically scanned only once during each Gnus session.If you feel the need to manually re-scan the remote directories, you canuse the @code{gnus-score-search-global-directories} command.Note that, at present, using this option will slow down group entrysomewhat. (That is---a lot.)If you want to start maintaining score files for other people to use,just put your score file up for anonymous ftp and announce it to theworld. Become a retro-moderator! Participate in the retro-moderatorwars sure to ensue, where retro-moderators battle it out for thesympathy of the people, luring them to use their score files on falsepremises! Yay! The net is saved!Here are some tips for the would-be retro-moderator, off the top of myhead:@itemize @bullet@itemArticles heavily crossposted are probably junk.@itemTo lower a single inappropriate article, lower by @code{Message-ID}.@itemParticularly brilliant authors can be raised on a permanent basis.@itemAuthors that repeatedly post off-charter for the group can safely belowered out of existence.@itemSet the @code{mark} and @code{expunge} atoms to obliterate the nastiestarticles completely.@itemUse expiring score entries to keep the size of the file down. Youshould probably have a long expiry period, though, as some sites keepold articles for a long time.@end itemize... I wonder whether other newsreaders will support global score filesin the future. @emph{Snicker}. Yup, any day now, newsreaders like BlueWave, xrn and 1stReader are bound to implement scoring. Should we startholding our breath yet?@node Kill Files@section Kill Files@cindex kill filesGnus still supports those pesky old kill files. In fact, the kill fileentries can now be expiring, which is something I wrote before DanielQuinlan thought of doing score files, so I've left the code in there.In short, kill processing is a lot slower (and I do mean @emph{a lot})than score processing, so it might be a good idea to rewrite your killfiles into score files.Anyway, a kill file is a normal @code{emacs-lisp} file. You can put anyforms into this file, which means that you can use kill files as somesort of primitive hook function to be run on group entry, even thoughthat isn't a very good idea.Normal kill files look like this:@lisp(gnus-kill "From" "Lars Ingebrigtsen")(gnus-kill "Subject" "ding")(gnus-expunge "X")@end lispThis will mark every article written by me as read, and remove themarked articles from the summary buffer. Very useful, you'll agree.Other programs use a totally different kill file syntax. If Gnusencounters what looks like a @code{rn} kill file, it will take a stab atinterpreting it.Two summary functions for editing a GNUS kill file:@table @kbd@item M-k@kindex M-k @r{(Summary)}@findex gnus-summary-edit-local-killEdit this group's kill file (@code{gnus-summary-edit-local-kill}).@item M-K@kindex M-K @r{(Summary)}@findex gnus-summary-edit-global-killEdit the general kill file (@code{gnus-summary-edit-global-kill}).@end tableTwo group mode functions for editing the kill files:@table @kbd@item M-k@kindex M-k @r{(Group)}@findex gnus-group-edit-local-killEdit this group's kill file (@code{gnus-group-edit-local-kill}).@item M-K@kindex M-K @r{(Group)}@findex gnus-group-edit-global-killEdit the general kill file (@code{gnus-group-edit-global-kill}).@end tableKill file variables:@table @code@item gnus-kill-file-name@vindex gnus-kill-file-nameA kill file for the group @samp{soc.motss} is normally called@file{soc.motss.KILL}. The suffix appended to the group name to getthis file name is detailed by the @code{gnus-kill-file-name} variable.The ``global'' kill file (not in the score file sense of ``global'', ofcourse) is just called @file{KILL}.@vindex gnus-kill-save-kill-file@item gnus-kill-save-kill-fileIf this variable is non-@code{nil}, Gnus will save thekill file after processing, which is necessary if you use expiringkills.@item gnus-apply-kill-hook@vindex gnus-apply-kill-hook@findex gnus-apply-kill-file-unless-scored@findex gnus-apply-kill-fileA hook called to apply kill files to a group. It is@code{(gnus-apply-kill-file)} by default. If you want to ignore thekill file if you have a score file for the same group, you can set thishook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't wantkill files to be processed, you should set this variable to @code{nil}.@item gnus-kill-file-mode-hook@vindex gnus-kill-file-mode-hookA hook called in kill-file mode buffers.@end table@node Converting Kill Files@section Converting Kill Files@cindex kill files@cindex converting kill filesIf you have loads of old kill files, you may want to convert them intoscore files. If they are ``regular'', you can usethe @file{gnus-kill-to-score.el} package; if not, you'll have to do itby hand.The kill to score conversion package isn't included in Gnus by default.You can fetch it from@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.If your old kill files are very complex---if they contain morenon-@code{gnus-kill} forms than not, you'll have to convert them byhand. Or just let them be as they are. Gnus will still use them asbefore.@node GroupLens@section GroupLens@cindex GroupLensGroupLens is a collaborative filtering system that helps you worktogether with other people to find the quality news articles out of thehuge volume of news articles generated every day.To accomplish this the GroupLens system combines your opinions aboutarticles you have already read with the opinions of others who have donelikewise and gives you a personalized prediction for each unread newsarticle. Think of GroupLens as a matchmaker. GroupLens watches how yourate articles, and finds other people that rate articles the same way.Once it has found some people you agree with it tells you, in the formof a prediction, what they thought of the article. You can use thisprediction to help you decide whether or not you want to read thearticle.@menu* Using GroupLens:: How to make Gnus use GroupLens.* Rating Articles:: Letting GroupLens know how you rate articles.* Displaying Predictions:: Displaying predictions given by GroupLens.* GroupLens Variables:: Customizing GroupLens.@end menu@node Using GroupLens@subsection Using GroupLensTo use GroupLens you must register a pseudonym with your local BetterBit Bureau (BBB).@uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the onlybetter bit in town at the moment.Once you have registered you'll need to set a couple of variables.@table @code@item gnus-use-grouplens@vindex gnus-use-grouplensSetting this variable to a non-@code{nil} value will make Gnus hook intoall the relevant GroupLens functions.@item grouplens-pseudonym@vindex grouplens-pseudonymThis variable should be set to the pseudonym you got when registeringwith the Better Bit Bureau.@item grouplens-newsgroups@vindex grouplens-newsgroupsA list of groups that you want to get GroupLens predictions for.@end tableThat's the minimum of what you need to get up and running with GroupLens.Once you've registered, GroupLens will start giving you scores forarticles based on the average of what other people think. But, to getthe real benefit of GroupLens you need to start rating articlesyourself. Then the scores GroupLens gives you will be personalized foryou, based on how the people you usually agree with have already rated.@node Rating Articles@subsection Rating ArticlesIn GroupLens, an article is rated on a scale from 1 to 5, inclusive.Where 1 means something like this article is a waste of bandwidth and 5means that the article was really good. The basic question to askyourself is, "on a scale from 1 to 5 would I like to see more articleslike this one?"There are four ways to enter a rating for an article in GroupLens.@table @kbd@item r@kindex r (GroupLens)@findex bbb-summary-rate-articleThis function will prompt you for a rating on a scale of one to five.@item k@kindex k (GroupLens)@findex grouplens-score-threadThis function will prompt you for a rating, and rate all the articles inthe thread. This is really useful for some of those long running giantthreads in rec.humor.@end tableThe next two commands, @kbd{n} and @kbd{,} take a numerical prefix to bethe score of the article you're reading.@table @kbd@item 1-5 n@kindex n (GroupLens)@findex grouplens-next-unread-articleRate the article and go to the next unread article.@item 1-5 ,@kindex , (GroupLens)@findex grouplens-best-unread-articleRate the article and go to the next unread article with the highest score.@end tableIf you want to give the current article a score of 4 and then go to thenext article, just type @kbd{4 n}.@node Displaying Predictions@subsection Displaying PredictionsGroupLens makes a prediction for you about how much you will like anews article. The predictions from GroupLens are on a scale from 1 to5, where 1 is the worst and 5 is the best. You can use the predictionsfrom GroupLens in one of three ways controlled by the variable@code{gnus-grouplens-override-scoring}.@vindex gnus-grouplens-override-scoringThere are three ways to display predictions in grouplens. You maychoose to have the GroupLens scores contribute to, or override theregular gnus scoring mechanism. override is the default; however, somepeople prefer to see the Gnus scores plus the grouplens scores. To getthe separate scoring behavior you need to set@code{gnus-grouplens-override-scoring} to @code{'separate}. To have theGroupLens predictions combined with the grouplens scores set it to@code{'override} and to combine the scores set@code{gnus-grouplens-override-scoring} to @code{'combine}. When you usethe combine option you will also want to set the values for@code{grouplens-prediction-offset} and@code{grouplens-score-scale-factor}.@vindex grouplens-prediction-displayIn either case, GroupLens gives you a few choices for how you would liketo see your predictions displayed. The display of predictions iscontrolled by the @code{grouplens-prediction-display} variable.The following are valid values for that variable.@table @code@item prediction-spotThe higher the prediction, the further to the right an @samp{*} isdisplayed.@item confidence-intervalA numeric confidence interval.@item prediction-barThe higher the prediction, the longer the bar.@item confidence-barNumerical confidence.@item confidence-spotThe spot gets bigger with more confidence.@item prediction-numPlain-old numeric value.@item confidence-plus-minusPrediction +/- confidence.@end table@node GroupLens Variables@subsection GroupLens Variables@table @code@item gnus-summary-grouplens-line-formatThe summary line format used in GroupLens-enhanced summary buffers. Itaccepts the same specs as the normal summary line format (@pxref{SummaryBuffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%)%s\n}.@item grouplens-bbb-hostHost running the bbbd server. @samp{grouplens.cs.umn.edu} is thedefault.@item grouplens-bbb-portPort of the host running the bbbd server. The default is 9000.@item grouplens-score-offsetOffset the prediction by this value. In other words, subtract theprediction value by this number to arrive at the effective score. Thedefault is 0.@item grouplens-score-scale-factorThis variable allows the user to magnify the effect of GroupLens scores.The scale factor is applied after the offset. The default is 1.@end table@node Advanced Scoring@section Advanced ScoringScoring on Subjects and From headers is nice enough, but what if you'rereally interested in what a person has to say only when she's talkingabout a particular subject? Or what if you really don't want toread what person A has to say when she's following up to person B, butwant to read what she says when she's following up to person C?By using advanced scoring rules you may create arbitrarily complexscoring patterns.@menu* Advanced Scoring Syntax:: A definition.* Advanced Scoring Examples:: What they look like.* Advanced Scoring Tips:: Getting the most out of it.@end menu@node Advanced Scoring Syntax@subsection Advanced Scoring SyntaxOrdinary scoring rules have a string as the first element in the rule.Advanced scoring rules have a list as the first element. The secondelement is the score to be applied if the first element evaluated to anon-@code{nil} value.These lists may consist of three logical operators, one redirectionoperator, and various match operators.Logical operators:@table @code@item &@itemx andThis logical operator will evaluate each of its arguments until it findsone that evaluates to @code{false}, and then it'll stop. If all argumentsevaluate to @code{true} values, then this operator will return@code{true}.@item |@itemx orThis logical operator will evaluate each of its arguments until it findsone that evaluates to @code{true}. If no arguments are @code{true},then this operator will return @code{false}.@item !@itemx not@itemx �This logical operator only takes a single argument. It returns thelogical negation of the value of its argument.@end tableThere is an @dfn{indirection operator} that will make its argumentsapply to the ancestors of the current article being scored. Forinstance, @code{1-} will make score rules apply to the parent of thecurrent article. @code{2-} will make score rules apply to thegrandparent of the current article. Alternatively, you can write@code{^^}, where the number of @code{^}s (carets) says how far back intothe ancestry you want to go.Finally, we have the match operators. These are the ones that do thereal work. Match operators are header name strings followed by a matchand a match type. A typical match operator looks like @samp{("from""Lars Ingebrigtsen" s)}. The header names are the same as when usingsimple scoring, and the match types are also the same.@node Advanced Scoring Examples@subsection Advanced Scoring ExamplesLet's say you want to increase the score of articles written by Larswhen he's talking about Gnus:@example((& ("from" "Lars Ingebrigtsen") ("subject" "Gnus")) 1000)@end exampleQuite simple, huh?When he writes long articles, he sometimes has something nice to say:@example((& ("from" "Lars Ingebrigtsen") (| ("subject" "Gnus") ("lines" 100 >))) 1000)@end exampleHowever, when he responds to things written by Reig Eigil Logge, youreally don't want to read what he's written:@example((& ("from" "Lars Ingebrigtsen") (1- ("from" "Reig Eigir Logge"))) -100000)@end exampleEverybody that follows up Redmondo when he writes about disappearingsocks should have their scores raised, but only when they talk aboutwhite socks. However, when Lars talks about socks, it's usually notvery interesting:@example((& (1- (& ("from" "redmondo@@.*no" r) ("body" "disappearing.*socks" t))) (! ("from" "Lars Ingebrigtsen")) ("body" "white.*socks")) 1000)@end exampleThe possibilities are endless.@node Advanced Scoring Tips@subsection Advanced Scoring TipsThe @code{&} and @code{|} logical operators do short-circuit logic.That is, they stop processing their arguments when it's clear what theresult of the operation will be. For instance, if one of the argumentsof an @code{&} evaluates to @code{false}, there's no point in evaluatingthe rest of the arguments. This means that you should put slow matches(@samp{body}, @samp{header}) last and quick matches (@samp{from},@samp{subject}) first.The indirection arguments (@code{1-} and so on) will make theirarguments work on previous generations of the thread. If you saysomething like:@example...(1- (1- ("from" "lars")))...@end exampleThen that means "score on the from header of the grandparent of thecurrent article". An indirection is quite fast, but it's better to say:@example(1- (& ("from" "Lars") ("subject" "Gnus")))@end examplethan it is to say:@example(& (1- ("from" "Lars")) (1- ("subject" "Gnus")))@end example@node Score Decays@section Score Decays@cindex score decays@cindex decaysYou may find that your scores have a tendency to grow withoutbounds, especially if you're using adaptive scoring. If scores get toobig, they lose all meaning---they simply max out and it's difficult touse them in any sensible way.@vindex gnus-decay-scores@findex gnus-decay-score@vindex gnus-decay-score-functionGnus provides a mechanism for decaying scores to help with this problem.When score files are loaded and @code{gnus-decay-scores} isnon-@code{nil}, Gnus will run the score files through the decayingmechanism thereby lowering the scores of all non-permanent score rules.The decay itself if performed by the @code{gnus-decay-score-function}function, which is @code{gnus-decay-score} by default. Here's thedefinition of that function:@lisp(defun gnus-decay-score (score) "Decay SCORE.This is done according to `gnus-score-decay-constant'and `gnus-score-decay-scale'." (floor (- score (* (if (< score 0) 1 -1) (min (abs score) (max gnus-score-decay-constant (* (abs score) gnus-score-decay-scale)))))))@end lisp@vindex gnus-score-decay-scale@vindex gnus-score-decay-constant@code{gnus-score-decay-constant} is 3 by default and@code{gnus-score-decay-scale} is 0.05. This should cause the following:@enumerate@itemScores between -3 and 3 will be set to 0 when this function is called.@itemScores with magnitudes between 3 and 60 will be shrunk by 3.@itemScores with magnitudes greater than 60 will be shrunk by 5% of thescore.@end enumerateIf you don't like this decay function, write your own. It is calledwith the score to be decayed as its only parameter, and it should returnthe new score, which should be an integer.Gnus will try to decay scores once a day. If you haven't run Gnus forfour days, Gnus will decay the scores four times, for instance.@node Various@chapter Various@menu* Process/Prefix:: A convention used by many treatment commands.* Interactive:: Making Gnus ask you many questions.* Symbolic Prefixes:: How to supply some Gnus functions with options.* Formatting Variables:: You can specify what buffers should look like.* Windows Configuration:: Configuring the Gnus buffer windows.* Faces and Fonts:: How to change how faces look.* Compilation:: How to speed Gnus up.* Mode Lines:: Displaying information in the mode lines.* Highlighting and Menus:: Making buffers look all nice and cozy.* Buttons:: Get tendinitis in ten easy steps!* Daemons:: Gnus can do things behind your back.* NoCeM:: How to avoid spam and other fatty foods.* Undo:: Some actions can be undone.* Moderation:: What to do if you're a moderator.* Emacs Enhancements:: There can be more pictures and stuff under Emacs 21.* XEmacs Enhancements:: There are more pictures and stuff under XEmacs.* Fuzzy Matching:: What's the big fuzz?* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.* Various Various:: Things that are really various.@end menu@node Process/Prefix@section Process/Prefix@cindex process/prefix conventionMany functions, among them functions for moving, decoding and savingarticles, use what is known as the @dfn{Process/Prefix convention}.This is a method for figuring out what articles the user wants thecommand to be performed on.It goes like this:If the numeric prefix is N, perform the operation on the next Narticles, starting with the current one. If the numeric prefix isnegative, perform the operation on the previous N articles, startingwith the current one.@vindex transient-mark-modeIf @code{transient-mark-mode} in non-@code{nil} and the region isactive, all articles in the region will be worked upon.If there is no numeric prefix, but some articles are marked with theprocess mark, perform the operation on the articles marked withthe process mark.If there is neither a numeric prefix nor any articles marked with theprocess mark, just perform the operation on the current article.Quite simple, really, but it needs to be made clear so that surprisesare avoided.Commands that react to the process mark will push the current list ofprocess marked articles onto a stack and will then clear all processmarked articles. You can restore the previous configuration with the@kbd{M P y} command (@pxref{Setting Process Marks}).@vindex gnus-summary-goto-unreadOne thing that seems to shock & horrify lots of people is that, forinstance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.Since each @kbd{d} (which marks the current article as read) by defaultgoes to the next unread article after marking, this means that @kbd{3 d}will mark the next three unread articles as read, no matter what thesummary buffer looks like. Set @code{gnus-summary-goto-unread} to@code{nil} for a more straightforward action.Many commands do not use the process/prefix convention. All commandsthat do explicitly say so in this manual. To apply the process/prefixconvention to commands that do not use it, you can use the @kbd{M-&}command. For instance, to mark all the articles in the group asexpirable, you could say @kbd{M P b M-& E}.@node Interactive@section Interactive@cindex interaction@table @code@item gnus-novice-user@vindex gnus-novice-userIf this variable is non-@code{nil}, you are either a newcomer to theWorld of Usenet, or you are very cautious, which is a nice thing to be,really. You will be given questions of the type ``Are you sure you wantto do this?'' before doing anything dangerous. This is @code{t} bydefault.@item gnus-expert-user@vindex gnus-expert-userIf this variable is non-@code{nil}, you will seldom be asked anyquestions by Gnus. It will simply assume you know what you're doing, nomatter how strange.@item gnus-interactive-catchup@vindex gnus-interactive-catchupRequire confirmation before catching up a group if non-@code{nil}. Itis @code{t} by default.@item gnus-interactive-exit@vindex gnus-interactive-exitRequire confirmation before exiting Gnus. This variable is @code{t} bydefault.@end table@node Symbolic Prefixes@section Symbolic Prefixes@cindex symbolic prefixesQuite a lot of Emacs commands react to the (numeric) prefix. Forinstance, @kbd{C-u 4 C-f} moves point four characters forward, and@kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring scorerule of 900 to the current article.This is all nice and well, but what if you want to give a command someadditional information? Well, what most commands do is interpret the``raw'' prefix in some special way. @kbd{C-u 0 C-x C-s} means that onedoesn't want a backup file to be created when saving the current buffer,for instance. But what if you want to save without making a backupfile, and you want Emacs to flash lights and play a nice tune at thesame time? You can't, and you're probably perfectly happy that way.@kindex M-i @r{(Summary)}@findex gnus-symbolic-argumentI'm not, so I've added a second prefix---the @dfn{symbolic prefix}. Theprefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the nextcharacter typed in is the value. You can stack as many @kbd{M-i}prefixes as you want. @kbd{M-i a C-M-u} means ``feed the @kbd{C-M-u}command the symbolic prefix @code{a}''. @kbd{M-i a M-i b C-M-u} means``feed the @kbd{C-M-u} command the symbolic prefixes @code{a} and@code{b}''. You get the drift.Typing in symbolic prefixes to commands that don't accept them doesn'thurt, but it doesn't do any good either. Currently not many Gnusfunctions make use of the symbolic prefix.If you're interested in how Gnus implements this, @pxref{ExtendedInteractive}.@node Formatting Variables@section Formatting Variables@cindex formatting variablesThroughout this manual you've probably noticed lots of variables calledthings like @code{gnus-group-line-format} and@code{gnus-summary-mode-line-format}. These control how Gnus is tooutput lines in the various buffers. There's quite a lot of them.Fortunately, they all use the same syntax, so there's not that much tobe annoyed by.Here's an example format spec (from the group buffer): @samp{%M%S%5y:%(%g%)\n}. We see that it is indeed extremely ugly, and that there arelots of percentages everywhere.@menu* Formatting Basics:: A formatting variable is basically a format string.* Mode Line Formatting:: Some rules about mode line formatting variables.* Advanced Formatting:: Modifying output in various ways.* User-Defined Specs:: Having Gnus call your own functions.* Formatting Fonts:: Making the formatting look colorful and nice.@end menuCurrently Gnus uses the following formatting variables:@code{gnus-group-line-format}, @code{gnus-summary-line-format},@code{gnus-server-line-format}, @code{gnus-topic-line-format},@code{gnus-group-mode-line-format},@code{gnus-summary-mode-line-format},@code{gnus-article-mode-line-format},@code{gnus-server-mode-line-format}, and@code{gnus-summary-pick-line-format}.All these format variables can also be arbitrary elisp forms. In thatcase, they will be @code{eval}ed to insert the required lines.@kindex M-x gnus-update-format@findex gnus-update-formatGnus includes a command to help you while creating your own formatspecs. @kbd{M-x gnus-update-format} will @code{eval} the current form,update the spec in question and pop you to a buffer where you canexamine the resulting lisp code to be run to generate the line.@node Formatting Basics@subsection Formatting BasicsEach @samp{%} element will be replaced by some string or other when thebuffer in question is generated. @samp{%5y} means ``insert the @samp{y}spec, and pad with spaces to get a 5-character field''.As with normal C and Emacs Lisp formatting strings, the numericalmodifier between the @samp{%} and the formatting type character will@dfn{pad} the output so that it is always at least that long.@samp{%5y} will make the field always (at least) five characters wide bypadding with spaces to the left. If you say @samp{%-5y}, it will pad tothe right instead.You may also wish to limit the length of the field to protect againstparticularly wide values. For that you can say @samp{%4,6y}, whichmeans that the field will never be more than 6 characters wide and neverless than 4 characters wide.@node Mode Line Formatting@subsection Mode Line FormattingMode line formatting variables (e.g.,@code{gnus-summary-mode-line-format}) follow the same rules as other,buffer line oriented formatting variables (@pxref{Formatting Basics})with the following two differences:@enumerate@itemThere must be no newline (@samp{\n}) at the end.@itemThe special @samp{%%b} spec can be used to display the buffer name.Well, it's no spec at all, really---@samp{%%} is just a way to quote@samp{%} to allow it to pass through the formatting machinery unmangled,so that Emacs receives @samp{%b}, which is something the Emacs mode linedisplay interprets to mean ``show the buffer name''. For a full list ofmode line specs Emacs understands, see the documentation of the@code{mode-line-format} variable.@end enumerate@node Advanced Formatting@subsection Advanced FormattingIt is frequently useful to post-process the fields in some way.Padding, limiting, cutting off parts and suppressing certain values canbe achieved by using @dfn{tilde modifiers}. A typical tilde spec mightlook like @samp{%~(cut 3)~(ignore "0")y}.These are the valid modifiers:@table @code@item pad@itemx pad-leftPad the field to the left with spaces until it reaches the requiredlength.@item pad-rightPad the field to the right with spaces until it reaches the requiredlength.@item max@itemx max-leftCut off characters from the left until it reaches the specified length.@item max-rightCut off characters from the right until it reaches the specifiedlength.@item cut@itemx cut-leftCut off the specified number of characters from the left.@item cut-rightCut off the specified number of characters from the right.@item ignoreReturn an empty string if the field is equal to the specified value.@item formUse the specified form as the field value when the @samp{@@} spec isused.@end tableLet's take an example. The @samp{%o} spec in the summary mode lineswill return a date in compact ISO8601 format---@samp{19960809T230410}.This is quite a mouthful, so we want to shave off the century number andthe time, leaving us with a six-character date. That would be@samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}. (Cutting is done beforemaxing, and we need the padding to ensure that the date is never lessthan 6 characters to make it look nice in columns.)Ignoring is done first; then cutting; then maxing; and then as the verylast operation, padding.If you use lots of these advanced thingies, you'll find that Gnus getsquite slow. This can be helped enormously by running @kbd{M-xgnus-compile} when you are satisfied with the look of your lines.@xref{Compilation}.@node User-Defined Specs@subsection User-Defined SpecsAll the specs allow for inserting user defined specifiers---@samp{u}.The next character in the format string should be a letter. Gnuswill call the function @code{gnus-user-format-function-}@samp{X}, where@samp{X} is the letter following @samp{%u}. The function will be passeda single parameter---what the parameter means depends on what bufferit's being called from. The function should return a string, which willbe inserted into the buffer just like information from any otherspecifier. This function may also be called with dummy values, so itshould protect against that.You can also use tilde modifiers (@pxref{Advanced Formatting} to achievemuch the same without defining new functions. Here's an example:@samp{%~(form (count-lines (point-min) (point)))@@}. The formgiven here will be evaluated to yield the current line number, and theninserted.@node Formatting Fonts@subsection Formatting FontsThere are specs for highlighting, and these are shared by all the formatvariables. Text inside the @samp{%(} and @samp{%)} specifiers will getthe special @code{mouse-face} property set, which means that it will behighlighted (with @code{gnus-mouse-face}) when you put the mouse pointerover it.Text inside the @samp{%@{} and @samp{%@}} specifiers will have theirnormal faces set using @code{gnus-face-0}, which is @code{bold} bydefault. If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead,and so on. Create as many faces as you wish. The same goes for the@code{mouse-face} specs---you can say @samp{%3(hello%)} to have@samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.Text inside the @samp{%<} and @samp{%>} specifiers will get the special@code{balloon-help} property set to @code{gnus-balloon-face-0}. If yousay @samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The@code{gnus-balloon-face-*} variables should be either strings or symbolsnaming functions that return a string. Under @code{balloon-help-mode},when the mouse passes over text with this property set, a balloon windowwill appear and display the string. Please refer to the doc string of@code{balloon-help-mode} for more information on this.Here's an alternative recipe for the group buffer:@lisp;; Create three face types.(setq gnus-face-1 'bold)(setq gnus-face-3 'italic);; We want the article count to be in;; a bold and green face. So we create;; a new face called `my-green-bold'.(copy-face 'bold 'my-green-bold);; Set the color.(set-face-foreground 'my-green-bold "ForestGreen")(setq gnus-face-2 'my-green-bold);; Set the new & fancy format.(setq gnus-group-line-format "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")@end lispI'm sure you'll be able to use this scheme to create totally unreadableand extremely vulgar displays. Have fun!Note that the @samp{%(} specs (and friends) do not make any sense on themode-line variables.@node Windows Configuration@section Windows Configuration@cindex windows configurationNo, there's nothing here about X, so be quiet.@vindex gnus-use-full-windowIf @code{gnus-use-full-window} non-@code{nil}, Gnus will delete allother windows and occupy the entire Emacs screen by itself. It is@code{t} by default.Setting this variable to @code{nil} kinda works, but there areglitches. Use at your own peril.@vindex gnus-buffer-configuration@code{gnus-buffer-configuration} describes how much space each Gnusbuffer should be given. Here's an excerpt of this variable:@lisp((group (vertical 1.0 (group 1.0 point) (if gnus-carpal (group-carpal 4)))) (article (vertical 1.0 (summary 0.25 point) (article 1.0))))@end lispThis is an alist. The @dfn{key} is a symbol that names some action orother. For instance, when displaying the group buffer, the windowconfiguration function will use @code{group} as the key. A full list ofpossible names is listed below.The @dfn{value} (i.e., the @dfn{split}) says how much space each buffershould occupy. To take the @code{article} split as an example -@lisp(article (vertical 1.0 (summary 0.25 point) (article 1.0)))@end lispThis @dfn{split} says that the summary buffer should occupy 25% of upperhalf of the screen, and that it is placed over the article buffer. Asyou may have noticed, 100% + 25% is actually 125% (yup, I saw y'allreaching for that calculator there). However, the special number@code{1.0} is used to signal that this buffer should soak up all therest of the space available after the rest of the buffers have takenwhatever they need. There should be only one buffer with the @code{1.0}size spec per split.Point will be put in the buffer that has the optional third element@code{point}. In a @code{frame} split, the last subsplit having a leafsplit where the tag @code{frame-focus} is a member (i.e. is the third orfourth element in the list, depending on whether the @code{point} tag ispresent) gets focus.Here's a more complicated example:@lisp(article (vertical 1.0 (group 4) (summary 0.25 point) (if gnus-carpal (summary-carpal 4)) (article 1.0)))@end lispIf the size spec is an integer instead of a floating point number,then that number will be used to say how many lines a buffer shouldoccupy, not a percentage.If the @dfn{split} looks like something that can be @code{eval}ed (to beprecise---if the @code{car} of the split is a function or a subr), thissplit will be @code{eval}ed. If the result is non-@code{nil}, it willbe used as a split. This means that there will be three buffers if@code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}is non-@code{nil}.Not complicated enough for you? Well, try this on for size:@lisp(article (horizontal 1.0 (vertical 0.5 (group 1.0) (gnus-carpal 4)) (vertical 1.0 (summary 0.25 point) (summary-carpal 4) (article 1.0))))@end lispWhoops. Two buffers with the mystery 100% tag. And what's that@code{horizontal} thingie?If the first element in one of the split is @code{horizontal}, Gnus willsplit the window horizontally, giving you two windows side-by-side.Inside each of these strips you may carry on all you like in the normalfashion. The number following @code{horizontal} says what percentage ofthe screen is to be given to this strip.For each split, there @emph{must} be one element that has the 100% tag.The splitting is never accurate, and this buffer will eat any leftoverlines from the splits.To be slightly more formal, here's a definition of what a valid splitmay look like:@examplesplit = frame | horizontal | vertical | buffer | formframe = "(frame " size *split ")"horizontal = "(horizontal " size *split ")"vertical = "(vertical " size *split ")"buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")"size = number | frame-paramsbuf-name = group | article | summary ...@end exampleThe limitations are that the @code{frame} split can only appear as thetop-level split. @var{form} should be an Emacs Lisp form that shouldreturn a valid split. We see that each split is fully recursive, andmay contain any number of @code{vertical} and @code{horizontal} splits.@vindex gnus-window-min-width@vindex gnus-window-min-height@cindex window height@cindex window widthFinding the right sizes can be a bit complicated. No window may be lessthan @code{gnus-window-min-height} (default 1) characters high, and allwindows must be at least @code{gnus-window-min-width} (default 1)characters wide. Gnus will try to enforce this before applying thesplits. If you want to use the normal Emacs window width/height limit,you can just set these two variables to @code{nil}.If you're not familiar with Emacs terminology, @code{horizontal} and@code{vertical} splits may work the opposite way of what you'd expect.Windows inside a @code{horizontal} split are shown side-by-side, andwindows within a @code{vertical} split are shown above each other.@findex gnus-configure-frameIf you want to experiment with window placement, a good tip is to call@code{gnus-configure-frame} directly with a split. This is the functionthat does all the real work when splitting buffers. Below is a prettynonsensical configuration with 5 windows; two for the group buffer andthree for the article buffer. (I said it was nonsensical.) If you@code{eval} the statement below, you can get an idea of how that wouldlook straight away, without going through the normal Gnus channels.Play with it until you're satisfied, and then use@code{gnus-add-configuration} to add your new creation to the bufferconfiguration list.@lisp(gnus-configure-frame '(horizontal 1.0 (vertical 10 (group 1.0) (article 0.3 point)) (vertical 1.0 (article 1.0) (horizontal 4 (group 1.0) (article 10)))))@end lispYou might want to have several frames as well. No prob---just use the@code{frame} split:@lisp(gnus-configure-frame '(frame 1.0 (vertical 1.0 (summary 0.25 point frame-focus) (article 1.0)) (vertical ((height . 5) (width . 15) (user-position . t) (left . -1) (top . 1)) (picon 1.0))))@end lispThis split will result in the familiar summary/article windowconfiguration in the first (or ``main'') frame, while a small additionalframe will be created where picons will be shown. As you can see,instead of the normal @code{1.0} top-level spec, each additional splitshould have a frame parameter alist as the size spec.@xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs LispReference Manual}. Under XEmacs, a frame property list will beaccepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}is such a plist.The list of all possible keys for @code{gnus-buffer-configuration} canbe found in its default value.Note that the @code{message} key is used for both@code{gnus-group-mail} and @code{gnus-summary-mail-other-window}. Ifit is desirable to distinguish between the two, something like thismight be used:@lisp(message (horizontal 1.0 (vertical 1.0 (message 1.0 point)) (vertical 0.24 (if (buffer-live-p gnus-summary-buffer) '(summary 0.5)) (group 1.0)))))@end lispOne common desire for a multiple frame split is to have a separate framefor composing mail and news while leaving the original frame intact. Toaccomplish that, something like the following can be done:@lisp(message (frame 1.0 (if (not (buffer-live-p gnus-summary-buffer)) (car (cdr (assoc 'group gnus-buffer-configuration))) (car (cdr (assoc 'summary gnus-buffer-configuration)))) (vertical ((user-position . t) (top . 1) (left . 1) (name . "Message")) (message 1.0 point))))@end lisp@findex gnus-add-configurationSince the @code{gnus-buffer-configuration} variable is so long andcomplicated, there's a function you can use to ease changing the configof a single setting: @code{gnus-add-configuration}. If, for instance,you want to change the @code{article} setting, you could say:@lisp(gnus-add-configuration '(article (vertical 1.0 (group 4) (summary .25 point) (article 1.0))))@end lispYou'd typically stick these @code{gnus-add-configuration} calls in your@file{.gnus.el} file or in some startup hook---they should be run afterGnus has been loaded.@vindex gnus-always-force-window-configurationIf all windows mentioned in the configuration are already visible, Gnuswon't change the window configuration. If you always want to force the``right'' window configuration, you can set@code{gnus-always-force-window-configuration} to non-@code{nil}.If you're using tree displays (@pxref{Tree Display}), and the treewindow is displayed vertically next to another window, you may also wantto fiddle with @code{gnus-tree-minimize-window} to avoid having thewindows resized.@subsection Example Window Configurations@itemize @bullet@itemNarrow left hand side occupied by group buffer. Right hand side splitbetween summary buffer (top one-sixth) and article buffer (bottom).@ifinfo@example+---+---------+| G | Summary || r +---------+| o | || u | Article || p | |+---+---------+@end example@end ifinfo@lisp(gnus-add-configuration '(article (horizontal 1.0 (vertical 25 (group 1.0)) (vertical 1.0 (summary 0.16 point) (article 1.0)))))(gnus-add-configuration '(summary (horizontal 1.0 (vertical 25 (group 1.0)) (vertical 1.0 (summary 1.0 point)))))@end lisp@end itemize@node Faces and Fonts@section Faces and Fonts@cindex faces@cindex fonts@cindex colorsFiddling with fonts and faces used to be very difficult, but these daysit is very simple. You simply say @kbd{M-x customize-face}, pick outthe face you want to alter, and alter it via the standard Customizeinterface.@node Compilation@section Compilation@cindex compilation@cindex byte-compilation@findex gnus-compileRemember all those line format specification variables?@code{gnus-summary-line-format}, @code{gnus-group-line-format}, and soon. Now, Gnus will of course heed whatever these variables are, but,unfortunately, changing them will mean a quite significant slow-down.(The default values of these variables have byte-compiled functionsassociated with them, while the user-generated versions do not, ofcourse.)To help with this, you can run @kbd{M-x gnus-compile} after you'vefiddled around with the variables and feel that you're (kind of)satisfied. This will result in the new specs being byte-compiled, andyou'll get top speed again. Gnus will save these compiled specs in the@file{.newsrc.eld} file. (User-defined functions aren't compiled bythis function, though---you should compile them yourself by stickingthem into the @code{.gnus.el} file and byte-compiling that file.)@node Mode Lines@section Mode Lines@cindex mode lines@vindex gnus-updated-mode-lines@code{gnus-updated-mode-lines} says what buffers should keep their modelines updated. It is a list of symbols. Supported symbols include@code{group}, @code{article}, @code{summary}, @code{server},@code{browse}, and @code{tree}. If the corresponding symbol is present,Gnus will keep that mode line updated with information that may bepertinent. If this variable is @code{nil}, screen refresh may bequicker.@cindex display-time@vindex gnus-mode-non-string-lengthBy default, Gnus displays information on the current article in the modelines of the summary and article buffers. The information Gnus wishesto display (e.g. the subject of the article) is often longer than themode lines, and therefore have to be cut off at some point. The@code{gnus-mode-non-string-length} variable says how long the otherelements on the line is (i.e., the non-info part). If you putadditional elements on the mode line (e.g. a clock), you should modifythis variable:@c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>@lisp(add-hook 'display-time-hook (lambda () (setq gnus-mode-non-string-length (+ 21 (if line-number-mode 5 0) (if column-number-mode 4 0) (length display-time-string)))))@end lispIf this variable is @code{nil} (which is the default), the mode linestrings won't be chopped off, and they won't be padded either. Notethat the default is unlikely to be desirable, as even the percentagecomplete in the buffer may be crowded off the mode line; the user shouldconfigure this variable appropriately for her configuration.@node Highlighting and Menus@section Highlighting and Menus@cindex visual@cindex highlighting@cindex menus@vindex gnus-visualThe @code{gnus-visual} variable controls most of the Gnus-prettifyingaspects. If @code{nil}, Gnus won't attempt to create menus or use fancycolors or fonts. This will also inhibit loading the @file{gnus-vis.el}file.This variable can be a list of visual properties that are enabled. Thefollowing elements are valid, and are all included by default:@table @code@item group-highlightDo highlights in the group buffer.@item summary-highlightDo highlights in the summary buffer.@item article-highlightDo highlights in the article buffer.@item highlightTurn on highlighting in all buffers.@item group-menuCreate menus in the group buffer.@item summary-menuCreate menus in the summary buffers.@item article-menuCreate menus in the article buffer.@item browse-menuCreate menus in the browse buffer.@item server-menuCreate menus in the server buffer.@item score-menuCreate menus in the score buffers.@item menuCreate menus in all buffers.@end tableSo if you only want highlighting in the article buffer and menus in allbuffers, you could say something like:@lisp(setq gnus-visual '(article-highlight menu))@end lispIf you want highlighting only and no menus whatsoever, you'd say:@lisp(setq gnus-visual '(highlight))@end lispIf @code{gnus-visual} is @code{t}, highlighting and menus will be usedin all Gnus buffers.Other general variables that influence the look of all buffers include:@table @code@item gnus-mouse-face@vindex gnus-mouse-faceThis is the face (i.e., font) used for mouse highlighting in Gnus. Nomouse highlights will be done if @code{gnus-visual} is @code{nil}.@end tableThere are hooks associated with the creation of all the different menus:@table @code@item gnus-article-menu-hook@vindex gnus-article-menu-hookHook called after creating the article mode menu.@item gnus-group-menu-hook@vindex gnus-group-menu-hookHook called after creating the group mode menu.@item gnus-summary-menu-hook@vindex gnus-summary-menu-hookHook called after creating the summary mode menu.@item gnus-server-menu-hook@vindex gnus-server-menu-hookHook called after creating the server mode menu.@item gnus-browse-menu-hook@vindex gnus-browse-menu-hookHook called after creating the browse mode menu.@item gnus-score-menu-hook@vindex gnus-score-menu-hookHook called after creating the score mode menu.@end table@node Buttons@section Buttons@cindex buttons@cindex mouse@cindex clickThose new-fangled @dfn{mouse} contraptions are very popular with theyoung, hep kids who don't want to learn the proper way to do thingsthese days. Why, I remember way back in the summer of '89, when I wasusing Emacs on a Tops 20 system. Three hundred users on one singlemachine, and every user was running Simula compilers. Bah!Right.@vindex gnus-carpalWell, you can make Gnus display buffers full of buttons you can click todo anything by setting @code{gnus-carpal} to @code{t}. Pretty simple,really. Tell the chiropractor I sent you.@table @code@item gnus-carpal-mode-hook@vindex gnus-carpal-mode-hookHook run in all carpal mode buffers.@item gnus-carpal-button-face@vindex gnus-carpal-button-faceFace used on buttons.@item gnus-carpal-header-face@vindex gnus-carpal-header-faceFace used on carpal buffer headers.@item gnus-carpal-group-buffer-buttons@vindex gnus-carpal-group-buffer-buttonsButtons in the group buffer.@item gnus-carpal-summary-buffer-buttons@vindex gnus-carpal-summary-buffer-buttonsButtons in the summary buffer.@item gnus-carpal-server-buffer-buttons@vindex gnus-carpal-server-buffer-buttonsButtons in the server buffer.@item gnus-carpal-browse-buffer-buttons@vindex gnus-carpal-browse-buffer-buttonsButtons in the browse buffer.@end tableAll the @code{buttons} variables are lists. The elements in these listare either cons cells where the @code{car} contains a text to be displayed andthe @code{cdr} contains a function symbol, or a simple string.@node Daemons@section Daemons@cindex demons@cindex daemonsGnus, being larger than any program ever written (allegedly), does lotsof strange stuff that you may wish to have done while you're notpresent. For instance, you may want it to check for new mail once in awhile. Or you may want it to close down all connections to all serverswhen you leave Emacs idle. And stuff like that.Gnus will let you do stuff like that by defining various@dfn{handlers}. Each handler consists of three elements: A@var{function}, a @var{time}, and an @var{idle} parameter.Here's an example of a handler that closes connections when Emacs hasbeen idle for thirty minutes:@lisp(gnus-demon-close-connections nil 30)@end lispHere's a handler that scans for PGP headers every hour when Emacs isidle:@lisp(gnus-demon-scan-pgp 60 t)@end lispThis @var{time} parameter and than @var{idle} parameter work togetherin a strange, but wonderful fashion. Basically, if @var{idle} is@code{nil}, then the function will be called every @var{time} minutes.If @var{idle} is @code{t}, then the function will be called after@var{time} minutes only if Emacs is idle. So if Emacs is never idle,the function will never be called. But once Emacs goes idle, thefunction will be called every @var{time} minutes.If @var{idle} is a number and @var{time} is a number, the function willbe called every @var{time} minutes only when Emacs has been idle for@var{idle} minutes.If @var{idle} is a number and @var{time} is @code{nil}, the functionwill be called once every time Emacs has been idle for @var{idle}minutes.And if @var{time} is a string, it should look like @samp{07:31}, andthe function will then be called once every day somewhere near thattime. Modified by the @var{idle} parameter, of course.@vindex gnus-demon-timestep(When I say ``minute'' here, I really mean @code{gnus-demon-timestep}seconds. This is 60 by default. If you change that variable,all the timings in the handlers will be affected.)So, if you want to add a handler, you could put something like this inyour @file{.gnus} file:@findex gnus-demon-add-handler@lisp(gnus-demon-add-handler 'gnus-demon-close-connections 30 t)@end lisp@findex gnus-demon-add-nocem@findex gnus-demon-add-scanmail@findex gnus-demon-add-rescan@findex gnus-demon-add-scan-timestamps@findex gnus-demon-add-disconnectionSome ready-made functions to do this have been created:@code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},@code{gnus-demon-add-nntp-close-connection},@code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and@code{gnus-demon-add-scanmail}. Just put those functions in your@file{.gnus} if you want those abilities.@findex gnus-demon-init@findex gnus-demon-cancel@vindex gnus-demon-handlersIf you add handlers to @code{gnus-demon-handlers} directly, you shouldrun @code{gnus-demon-init} to make the changes take hold. To cancel alldaemons, you can use the @code{gnus-demon-cancel} function.Note that adding daemons can be pretty naughty if you over do it. Addingfunctions that scan all news and mail from all servers every two secondsis a sure-fire way of getting booted off any respectable system. Sobehave.@node NoCeM@section NoCeM@cindex nocem@cindex spam@dfn{Spamming} is posting the same article lots and lots of times.Spamming is bad. Spamming is evil.Spamming is usually canceled within a day or so by various anti-spammingagencies. These agencies usually also send out @dfn{NoCeM} messages.NoCeM is pronounced ``no see-'em'', and means what the nameimplies---these are messages that make the offending articles, like, goaway.What use are these NoCeM messages if the articles are canceled anyway?Some sites do not honor cancel messages and some sites just honor cancelsfrom a select few people. Then you may wish to make use of the NoCeMmessages, which are distributed in the @samp{alt.nocem.misc} newsgroup.Gnus can read and parse the messages in this group automatically, andthis will make spam disappear.There are some variables to customize, of course:@table @code@item gnus-use-nocem@vindex gnus-use-nocemSet this variable to @code{t} to set the ball rolling. It is @code{nil}by default.@item gnus-nocem-groups@vindex gnus-nocem-groupsGnus will look for NoCeM messages in the groups in this list. Thedefault is @code{("news.lists.filters" "news.admin.net-abuse.bulletins""alt.nocem.misc" "news.admin.net-abuse.announce")}.@item gnus-nocem-issuers@vindex gnus-nocem-issuersThere are many people issuing NoCeM messages. This list says whatpeople you want to listen to. The default is @code{("Automoose-1""clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo""hweede@@snafu.de")}; fine, upstanding citizens all of them.Known despammers that you can put in this list are listed at@uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}.You do not have to heed NoCeM messages from all these people---just theones you want to listen to. You also don't have to accept all NoCeMmessages from the people you like. Each NoCeM message has a @dfn{type}header that gives the message a (more or less, usually less) rigorousdefinition. Common types are @samp{spam}, @samp{spew}, @samp{mmf},@samp{binary}, and @samp{troll}. To specify this, you have to use@code{(@var{issuer} @var{conditions} @dots{})} elements in the list.Each condition is either a string (which is a regexp that matches typesyou want to use) or a list on the form @code{(not @var{string})}, where@var{string} is a regexp that matches types you don't want to use.For instance, if you want all NoCeM messages from Chris Lewis except his@samp{troll} messages, you'd say:@lisp("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))@end lispOn the other hand, if you just want nothing but his @samp{spam} and@samp{spew} messages, you'd say:@lisp("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")@end lispThe specs are applied left-to-right.@item gnus-nocem-verifyer@vindex gnus-nocem-verifyer@findex mc-verifyThis should be a function for verifying that the NoCeM issuer is who shesays she is. The default is @code{mc-verify}, which is a Mailcryptfunction. If this is too slow and you don't care for verification(which may be dangerous), you can set this variable to @code{nil}.If you want signed NoCeM messages to be verified and unsigned messagesnot to be verified (but used anyway), you could do something like:@lisp(setq gnus-nocem-verifyer 'my-gnus-mc-verify)(defun my-gnus-mc-verify () (not (eq 'forged (ignore-errors (if (mc-verify) t 'forged)))))@end lispThis might be dangerous, though.@item gnus-nocem-directory@vindex gnus-nocem-directoryThis is where Gnus will store its NoCeM cache files. The default is@file{~/News/NoCeM/}.@item gnus-nocem-expiry-wait@vindex gnus-nocem-expiry-waitThe number of days before removing old NoCeM entries from the cache.The default is 15. If you make it shorter Gnus will be faster, but youmight then see old spam.@item gnus-nocem-check-from@vindex gnus-nocem-check-fromNon-@code{nil} means check for valid issuers in message bodies.Otherwise don't bother fetching articles unless their author matches avalid issuer; that is much faster if you are selective about theissuers.@item gnus-nocem-check-article-limit@vindex gnus-nocem-check-article-limitIf non-@code{nil}, the maximum number of articles to check in any NoCeMgroup. NoCeM groups can be huge and very slow to process.@end tableUsing NoCeM could potentially be a memory hog. If you have many living(i. e., subscribed or unsubscribed groups), your Emacs process will growbig. If this is a problem, you should kill off all (or most) of yourunsubscribed groups (@pxref{Subscription Commands}).@node Undo@section Undo@cindex undoIt is very useful to be able to undo actions one has done. In normalEmacs buffers, it's easy enough---you just push the @code{undo} button.In Gnus buffers, however, it isn't that simple.The things Gnus displays in its buffer is of no value whatsoever toGnus---it's all just data designed to look nice to the user.Killing a group in the group buffer with @kbd{C-k} makes the linedisappear, but that's just a side-effect of the real action---theremoval of the group in question from the internal Gnus structures.Undoing something like that can't be done by the normal Emacs@code{undo} function.Gnus tries to remedy this somewhat by keeping track of what the userdoes and coming up with actions that would reverse the actions the usertakes. When the user then presses the @code{undo} key, Gnus will runthe code to reverse the previous action, or the previous actions.However, not all actions are easily reversible, so Gnus currently offersa few key functions to be undoable. These include killing groups,yanking groups, and changing the list of read articles of groups.That's it, really. More functions may be added in the future, but eachadded function means an increase in data to be stored, so Gnus willnever be totally undoable.@findex gnus-undo-mode@vindex gnus-use-undo@findex gnus-undoThe undoability is provided by the @code{gnus-undo-mode} minor mode. Itis used if @code{gnus-use-undo} is non-@code{nil}, which is thedefault. The @kbd{C-M-_} key performs the @code{gnus-undo}command, which should feel kinda like the normal Emacs @code{undo}command.@node Moderation@section Moderation@cindex moderationIf you are a moderator, you can use the @file{gnus-mdrtn.el} package.It is not included in the standard Gnus package. Write a mail to@samp{larsi@@gnus.org} and state what group you moderate, and you'llget a copy.The moderation package is implemented as a minor mode for summarybuffers. Put@lisp(add-hook 'gnus-summary-mode-hook 'gnus-moderate)@end lispin your @file{.gnus.el} file.If you are the moderator of @samp{rec.zoofle}, this is how it'ssupposed to work:@enumerate@itemYou split your incoming mail by matching on@samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-postedarticles in some mail group---for instance, @samp{nnml:rec.zoofle}.@itemYou enter that group once in a while and post articles using the @kbd{e}(edit-and-post) or @kbd{s} (just send unedited) commands.@itemIf, while reading the @samp{rec.zoofle} newsgroup, you happen upon somearticles that weren't approved by you, you can cancel them with the@kbd{c} command.@end enumerateTo use moderation mode in these two groups, say:@lisp(setq gnus-moderated-list "^nnml:rec.zoofle$\\|^rec.zoofle$")@end lisp@node Emacs Enhancements@section Emacs Enhancements@cindex Emacs 21Starting with version 21, Emacs is able to display pictures and stuff,so Gnus has taken advantage of that.Gnus-specific tool bars will be used if Tool Bar mode is on. Currentlythe group, summary and message buffers have tool bars defined.MIME image types may be displayed internally if Emacs was built withappropriate support (see variable @code{image-types}). `X-Face' headersmay be rendered as images internally if you have appropriate supportprograms (@pxref{X-Face}). You can play sounds internally if Emacs wasbuilt with suitable audio support; otherwise Gnus will attempt to playsounds externally.@vindex gnus-treat-display-smileysA simplified version of the XEmacs Smiley support for @dfn{emoticons}(@pxref{Smileys}) is available on graphical displays under the controlof @code{gnus-treat-display-smileys}. Text `smiley' faces---@samp{:-)},@samp{:-/}, @samp{:-(} and the like---are mapped to pictures which aredisplayed instead. The mapping is controlled by a list of regexps@vindex smiley-regexp-alist@code{smiley-regexp-alist} mapping matched text to image file names. Itcontains matches for `smiley', `wry' and `frowny' by default.There is currently no Emacs support for `Picons' (@pxref{Picons}), butthere is no reason why it couldn't be added.@node XEmacs Enhancements@section XEmacs Enhancements@cindex XEmacsXEmacs is able to display pictures and stuff, so Gnus has takenadvantage of that.@menu* Picons:: How to display pictures of what your reading.* Smileys:: Show all those happy faces the way they were meant to be shown.* Toolbar:: Click'n'drool.* XVarious:: Other XEmacsy Gnusey variables.@end menu@node Picons@subsection Picons@iftex@iflatex\include{picons}@end iflatex@end iftexSo@dots{} You want to slow down your news reader even more! This is agood way to do so. Its also a great way to impress people staringover your shoulder as you read news.@menu* Picon Basics:: What are picons and How do I get them.* Picon Requirements:: Don't go further if you aren't using XEmacs.* Easy Picons:: Displaying Picons---the easy way.* Hard Picons:: The way you should do it. You'll learn something.* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.@end menu@node Picon Basics@subsubsection Picon BasicsWhat are Picons? To quote directly from the Picons Web site:@iftex@iflatex\margindex{}@end iflatex@end iftex@quotation@dfn{Picons} is short for ``personal icons''. They're small,constrained images used to represent users and domains on the net,organized into databases so that the appropriate image for a givene-mail address can be found. Besides users and domains, there are picondatabases for Usenet newsgroups and weather forecasts. The picons arein either monochrome @code{XBM} format or color @code{XPM} and@code{GIF} formats.@end quotation@vindex gnus-picons-piconsearch-urlIf you have a permanent connection to the Internet you can use SteveKinzler's Picons Search engine by setting@code{gnus-picons-piconsearch-url} to the string @*@uref{http://www.cs.indiana.edu/picons/search.html}.@vindex gnus-picons-databaseOtherwise you need a local copy of his database. For instructions onobtaining and installing the picons databases, point your Web browser at @*@uref{http://www.cs.indiana.edu/picons/ftp/index.html}. Gnus expectspicons to be installed into a location pointed to by@code{gnus-picons-database}.@node Picon Requirements@subsubsection Picon RequirementsTo have Gnus display Picons for you, you must be running XEmacs19.13 or greater since all other versions of Emacs aren't yet able todisplay images.Additionally, you must have @code{x} support compiled into XEmacs. Todisplay color picons which are much nicer than the black & white one,you also need one of @code{xpm} or @code{gif} compiled into XEmacs.@vindex gnus-picons-convert-x-faceIf you want to display faces from @code{X-Face} headers, you should havethe @code{xface} support compiled into XEmacs. Otherwise you must havethe @code{netpbm} utilities installed, or munge the@code{gnus-picons-convert-x-face} variable to use something else.@node Easy Picons@subsubsection Easy PiconsTo enable displaying picons, simply put the following line in your@file{~/.gnus} file and start Gnus.@lisp(setq gnus-use-picons t)(setq gnus-treat-display-picons t)@end lispand make sure @code{gnus-picons-database} points to the directorycontaining the Picons databases.Alternatively if you want to use the web piconsearch engine add this:@lisp(setq gnus-picons-piconsearch-url "http://www.cs.indiana.edu:800/piconsearch")@end lisp@node Hard Picons@subsubsection Hard Picons@iftex@iflatex\margindex{}@end iflatex@end iftexGnus can display picons for you as you enter and leave groups andarticles. It knows how to interact with three sections of the piconsdatabase. Namely, it can display the picons newsgroup pictures,author's face picture(s), and the authors domain. To enable thisfeature, you need to select where to get the picons from, and where todisplay them.@table @code@item gnus-picons-database@vindex gnus-picons-databaseThe location of the picons database. Should point to a directorycontaining the @file{news}, @file{domains}, @file{users} (and so on)subdirectories. This is only useful if@code{gnus-picons-piconsearch-url} is @code{nil}. Defaults to@file{/usr/local/faces/}.@item gnus-picons-piconsearch-url@vindex gnus-picons-piconsearch-urlThe URL for the web picons search engine. The only currently knownengine is @uref{http://www.cs.indiana.edu:800/piconsearch}. Toworkaround network delays, icons will be fetched in the background. Ifthis is @code{nil} 'the default), then picons are fetched from localdatabase indicated by @code{gnus-picons-database}.@item gnus-picons-display-where@vindex gnus-picons-display-whereWhere the picon images should be displayed. It is @code{picons} bydefault (which by default maps to the buffer @samp{*Picons*}). Othervalid places could be @code{article}, @code{summary}, or@samp{*scratch*} for all I care. Just make sure that you've made thebuffer visible using the standard Gnus window configurationroutines---@pxref{Windows Configuration}.@item gnus-picons-group-excluded-groups@vindex gnus-picons-group-excluded-groupsGroups that are matched by this regexp won't have their group iconsdisplayed.@end tableNote: If you set @code{gnus-use-picons} to @code{t}, it will set up yourwindow configuration for you to include the @code{picons} buffer.Now that you've made those decision, you need to add the followingfunctions to the appropriate hooks so these pictures will get displayedat the right time.@vindex gnus-picons-display-where@table @code@item gnus-article-display-picons@findex gnus-article-display-piconsLooks up and displays the picons for the author and the author's domainin the @code{gnus-picons-display-where} buffer.@item gnus-picons-article-display-x-face@findex gnus-article-display-piconsDecodes and displays the X-Face header if present.@end table@node Picon Useless Configuration@subsubsection Picon Useless Configuration@iftex@iflatex\margindex{}@end iflatex@end iftexThe following variables offer further control over how things aredone, where things are located, and other useless stuff you reallydon't need to worry about.@table @code@item gnus-picons-news-directories@vindex gnus-picons-news-directoriesList of subdirectories to search in @code{gnus-picons-database} fornewsgroups faces. @code{("news")} is the default.@item gnus-picons-user-directories@vindex gnus-picons-user-directoriesList of subdirectories to search in @code{gnus-picons-database} for userfaces. @code{("local" "users" "usenix" "misc")} is the default.@item gnus-picons-domain-directories@vindex gnus-picons-domain-directoriesList of subdirectories to search in @code{gnus-picons-database} fordomain name faces. Defaults to @code{("domains")}. Some people maywant to add @samp{"unknown"} to this list.@item gnus-picons-convert-x-face@vindex gnus-picons-convert-x-faceIf you don't have @code{xface} support builtin XEmacs, this is thecommand to use to convert the @code{X-Face} header to an X bitmap(@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48,Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"gnus-picons-x-face-file-name)}@item gnus-picons-x-face-file-name@vindex gnus-picons-x-face-file-nameNames a temporary file to store the @code{X-Face} bitmap in. Defaultsto @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.@item gnus-picons-has-modeline-p@vindex gnus-picons-has-modeline-pIf you have set @code{gnus-picons-display-where} to @code{picons}, yourXEmacs frame will become really cluttered. To alleviate this a bit youcan set @code{gnus-picons-has-modeline-p} to @code{nil}; this willremove the mode line from the Picons buffer. This is only useful if@code{gnus-picons-display-where} is @code{picons}.@item gnus-picons-refresh-before-display@vindex gnus-picons-refresh-before-displayIf non-nil, display the article buffer before computing the picons.Defaults to @code{nil}.@item gnus-picons-display-as-address@vindex gnus-picons-display-as-addressIf @code{t} display textual email addresses along with pictures.Defaults to @code{t}.@item gnus-picons-file-suffixes@vindex gnus-picons-file-suffixesOrdered list of suffixes on picon file names to try. Defaults to@code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs.@item gnus-picons-setup-hook@vindex gnus-picons-setup-hookHook run in the picon buffer, if that is displayed.@item gnus-picons-display-article-move-p@vindex gnus-picons-display-article-move-pWhether to move point to first empty line when displaying picons. Thishas only an effect if `gnus-picons-display-where' has value `article'.If @code{nil}, display the picons in the @code{From} and@code{Newsgroups} lines. This is the default.@item gnus-picons-clear-cache-on-shutdown@vindex gnus-picons-clear-cache-on-shutdownWhether to clear the picons cache when exiting gnus. Gnus caches everypicons it finds while it is running. This saves some time in the searchprocess but eats some memory. If this variable is set to @code{nil},Gnus will never clear the cache itself; you will have to manually call@code{gnus-picons-clear-cache} to clear it. Otherwise the cache will becleared every time you exit Gnus. Defaults to @code{t}.@iftex@iflatex\margindex{}@end iflatex@end iftex@end table@node Smileys@subsection Smileys@cindex smileys@iftex@iflatex\gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}}\input{smiley}@end iflatex@end iftex@dfn{Smiley} is a package separate from Gnus, but since Gnus iscurrently the only package that uses Smiley, it is documented here.In short---to use Smiley in Gnus, put the following in your@file{.gnus.el} file:@lisp(setq gnus-treat-display-smileys t)@end lispSmiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} andthe like---to pictures and displays those instead of the text smileyfaces. The conversion is controlled by a list of regexps that matchestext and maps that to file names.@vindex smiley-nosey-regexp-alist@vindex smiley-deformed-regexp-alistSmiley supplies two example conversion alists by default:@code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(}and so on), and @code{smiley-nosey-regexp-alist} (which matches@samp{:-)}, @samp{:-(} and so on).The alist used is specified by the @code{smiley-regexp-alist} variable,which defaults to the value of @code{smiley-deformed-regexp-alist}.The first item in each element is the regexp to be matched; the secondelement is the regexp match group that is to be replaced by the picture;and the third element is the name of the file to be displayed.The following variables customize where Smiley will look for thesefiles, as well as the color to be used and stuff:@table @code@item smiley-data-directory@vindex smiley-data-directoryWhere Smiley will look for smiley faces files.@item smiley-flesh-color@vindex smiley-flesh-colorSkin color. The default is @samp{yellow}, which is really racist.@item smiley-features-color@vindex smiley-features-colorColor of the features of the face. The default is @samp{black}.@item smiley-tongue-color@vindex smiley-tongue-colorColor of the tongue. The default is @samp{red}.@item smiley-circle-color@vindex smiley-circle-colorColor of the circle around the face. The default is @samp{black}.@item smiley-mouse-face@vindex smiley-mouse-faceFace used for mouse highlighting over the smiley face.@end table@node Toolbar@subsection Toolbar@table @code@iftex@iflatex\margindex{}@end iflatex@end iftex@item gnus-use-toolbar@vindex gnus-use-toolbarIf @code{nil}, don't display toolbars. If non-@code{nil}, it should beone of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},@code{right-toolbar}, or @code{left-toolbar}.@item gnus-group-toolbar@vindex gnus-group-toolbarThe toolbar in the group buffer.@item gnus-summary-toolbar@vindex gnus-summary-toolbarThe toolbar in the summary buffer.@item gnus-summary-mail-toolbar@vindex gnus-summary-mail-toolbarThe toolbar in the summary buffer of mail groups.@end table@node XVarious@subsection Various XEmacs Variables@table @code@item gnus-xmas-glyph-directory@vindex gnus-xmas-glyph-directoryThis is where Gnus will look for pictures. Gnus will normallyauto-detect this directory, but you may set it manually if you have anunusual directory structure.@item gnus-xmas-logo-color-alist@vindex gnus-xmas-logo-color-alistThis is an alist where the key is a type symbol and the values are theforeground and background color of the splash page glyph.@item gnus-xmas-logo-color-style@vindex gnus-xmas-logo-color-styleThis is the key used to look up the color in the alist described above.Valid values include @code{flame}, @code{pine}, @code{moss},@code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},@code{labia}, @code{berry}, @code{neutral}, and @code{september}.@item gnus-xmas-modeline-glyph@vindex gnus-xmas-modeline-glyphA glyph displayed in all Gnus mode lines. It is a tiny gnu head bydefault.@iftex@iflatex\margindex{}@end iflatex@end iftex@end table@node Fuzzy Matching@section Fuzzy Matching@cindex fuzzy matchingGnus provides @dfn{fuzzy matching} of @code{Subject} lines when doingthings like scoring, thread gathering and thread comparison.As opposed to regular expression matching, fuzzy matching is very fuzzy.It's so fuzzy that there's not even a definition of what @dfn{fuzziness}means, and the implementation has changed over time.Basically, it tries to remove all noise from lines before comparing.@samp{Re: }, parenthetical remarks, white space, and so on, are filteredout of the strings before comparing the results. This often leads toadequate results---even when faced with strings generated by textmanglers masquerading as newsreaders.@node Thwarting Email Spam@section Thwarting Email Spam@cindex email spam@cindex spam@cindex UCE@cindex unsolicited commercial emailIn these last days of the Usenet, commercial vultures are hanging aboutand grepping through news like crazy to find email addresses they canfoist off their scams and products to. As a reaction to this, manypeople have started putting nonsense addresses into their @code{From}lines. I think this is counterproductive---it makes it difficult forpeople to send you legitimate mail in response to things you write, aswell as making it difficult to see who wrote what. This rewriting mayperhaps be a bigger menace than the unsolicited commercial email itselfin the end.The biggest problem I have with email spam is that it comes in underfalse pretenses. I press @kbd{g} and Gnus merrily informs me that Ihave 10 new emails. I say ``Golly gee! Happy is me!'' and select themail group, only to find two pyramid schemes, seven advertisements(``New! Miracle tonic for growing full, lustrous hair on your toes!'')and one mail asking me to repent and find some god.This is annoying.The way to deal with this is having Gnus split out all spam into a@samp{spam} mail group (@pxref{Splitting Mail}).First, pick one (1) valid mail address that you can be reached at, andput it in your @code{From} header of all your news articles. (I'vechosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form@samp{larsi+usenet@@ifi.uio.no} will be a better choice. Ask yoursysadmin whether your sendmail installation accepts keywords in the localpart of the mail address.)@lisp(setq message-default-news-headers "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")@end lispThen put the following split rule in @code{nnmail-split-fancy}(@pxref{Fancy Mail Splitting}):@lisp( ... (to "larsi@@trym.ifi.uio.no" (| ("subject" "re:.*" "misc") ("references" ".*@@.*" "misc") "spam")) ...)@end lispThis says that all mail to this address is suspect, but if it has a@code{Subject} that starts with a @samp{Re:} or has a @code{References}header, it's probably ok. All the rest goes to the @samp{spam} group.(This idea probably comes from Tim Pierce.)In addition, many mail spammers talk directly to your @code{smtp} serverand do not include your email address explicitly in the @code{To}header. Why they do this is unknown---perhaps it's to thwart thisthwarting scheme? In any case, this is trivial to deal with---you justput anything not addressed to you in the @samp{spam} group by endingyour fancy split rule in this way:@lisp( ... (to "larsi" "misc") "spam")@end lispIn my experience, this will sort virtually everything into the rightgroup. You still have to check the @samp{spam} group from time to time tocheck for legitimate mail, though. If you feel like being a good netcitizen, you can even send off complaints to the proper authorities oneach unsolicited commercial email---at your leisure.If you are also a lazy net citizen, you will probably prefercomplaining automatically with the @file{gnus-junk.el} package,available as free software at @*@uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html}. Since moste-mail spam is sent automatically, this may reconcile the cosmicbalance somewhat.This works for me. It allows people an easy way to contact me (they canjust press @kbd{r} in the usual way), and I'm not bothered at all withspam. It's a win-win situation. Forging @code{From} headers to pointto non-existent domains is yucky, in my opinion.@node Various Various@section Various Various@cindex mode lines@cindex highlights@table @code@item gnus-home-directoryAll Gnus file and directory variables will be initialized from thisvariable, which defaults to @file{~/}.@item gnus-directory@vindex gnus-directoryMost Gnus storage file and directory variables will be initialized fromthis variable, which defaults to the @samp{SAVEDIR} environmentvariable, or @file{~/News/} if that variable isn't set.Note that Gnus is mostly loaded when the @file{.gnus.el} file is read.This means that other directory variables that are initialized from thisvariable won't be set properly if you set this variable in@file{.gnus.el}. Set this variable in @file{.emacs} instead.@item gnus-default-directory@vindex gnus-default-directoryNot related to the above variable at all---this variable says what thedefault directory of all Gnus buffers should be. If you issue commandslike @kbd{C-x C-f}, the prompt you'll get starts in the current buffer'sdefault directory. If this variable is @code{nil} (which is thedefault), the default directory will be the default directory of thebuffer you were in when you started Gnus.@item gnus-verbose@vindex gnus-verboseThis variable is an integer between zero and ten. The higher the value,the more messages will be displayed. If this variable is zero, Gnuswill never flash any messages, if it is seven (which is the default),most important messages will be shown, and if it is ten, Gnus won't evershut up, but will flash so many messages it will make your head swim.@item gnus-verbose-backends@vindex gnus-verbose-backendsThis variable works the same way as @code{gnus-verbose}, but it appliesto the Gnus back ends instead of Gnus proper.@item nnheader-max-head-length@vindex nnheader-max-head-lengthWhen the back ends read straight heads of articles, they all try to readas little as possible. This variable (default 4096) specifiesthe absolute max length the back ends will try to read before giving upon finding a separator line between the head and the body. If thisvariable is @code{nil}, there is no upper read bound. If it is@code{t}, the back ends won't try to read the articles piece by piece,but read the entire articles. This makes sense with some versions of@code{ange-ftp} or @code{efs}.@item nnheader-head-chop-length@vindex nnheader-head-chop-lengthThis variable (default 2048) says how big a piece of each article toread when doing the operation described above.@item nnheader-file-name-translation-alist@vindex nnheader-file-name-translation-alist@cindex file names@cindex invalid characters in file names@cindex characters in file namesThis is an alist that says how to translate characters in file names.For instance, if @samp{:} is invalid as a file character in file nameson your system (you OS/2 user you), you could say something like:@lisp(setq nnheader-file-name-translation-alist '((?: . ?_)))@end lispIn fact, this is the default value for this variable on OS/2 and MSWindows (phooey) systems.@item gnus-hidden-properties@vindex gnus-hidden-propertiesThis is a list of properties to use to hide ``invisible'' text. It is@code{(invisible t intangible t)} by default on most systems, whichmakes invisible text invisible and intangible.@item gnus-parse-headers-hook@vindex gnus-parse-headers-hookA hook called before parsing headers. It can be used, for instance, togather statistics on the headers fetched, or perhaps you'd like to prunesome headers. I don't see why you'd want that, though.@item gnus-shell-command-separator@vindex gnus-shell-command-separatorString used to separate two shell commands. The default is @samp{;}.@item gnus-invalid-group-regexp@vindex gnus-invalid-group-regexpRegexp to match ``invalid'' group names when querying user for a groupname. The default value catches some @strong{really} invalid groupnames who could possibly mess up Gnus internally (like allowing@samp{:} in a group name, which is normally used to delimit method andgroup).@sc{imap} users might want to allow @samp{/} in group names though.@end table@node The End@chapter The EndWell, that's the manual---you can get on with your life now. Keep intouch. Say hello to your cats from me.My @strong{ghod}---I just can't stand goodbyes. Sniffle.Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:@quotation@strong{Te Deum}@sp 1Not because of victories @*I sing,@*having none,@*but for the common sunshine,@*the breeze,@*the largess of the spring.@sp 1Not for victory@*but for the day's work done@*as well as I was able;@*not for a seat upon the dais@*but at the common table.@*@end quotation@node Appendices@chapter Appendices@menu* History:: How Gnus got where it is today.* On Writing Manuals:: Why this is not a beginner's guide.* Terminology:: We use really difficult, like, words here.* Customization:: Tailoring Gnus to your needs.* Troubleshooting:: What you might try if things do not work.* Gnus Reference Guide:: Rilly, rilly technical stuff.* Emacs for Heathens:: A short introduction to Emacsian terms.* Frequently Asked Questions:: A question-and-answer session.@end menu@node History@section History@cindex history@sc{gnus} was written by Masanobu @sc{Umeda}. When autumn crept up in'94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.If you want to investigate the person responsible for this outrage,you can point your (feh!) web browser to@uref{http://quimby.gnus.org/}. This is also the primarydistribution point for the new and spiffy versions of Gnus, and isknown as The Site That Destroys Newsrcs And Drives People Mad.During the first extended alpha period of development, the new Gnus wascalled ``(ding) Gnus''. @dfn{(ding)} is, of course, short for@dfn{ding is not Gnus}, which is a total and utter lie, but who cares?(Besides, the ``Gnus'' in this abbreviation should probably bepronounced ``news'' as @sc{Umeda} intended, which makes it a moreappropriate name, don't you think?)In any case, after spending all that energy on coming up with a new andspunky name, we decided that the name was @emph{too} spunky, so werenamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs.``@sc{gnus}''. New vs. old.@menu* Gnus Versions:: What Gnus versions have been released.* Other Gnus Versions:: Other Gnus versions that also have been released.* Why?:: What's the point of Gnus?* Compatibility:: Just how compatible is Gnus with @sc{gnus}?* Conformity:: Gnus tries to conform to all standards.* Emacsen:: Gnus can be run on a few modern Emacsen.* Gnus Development:: How Gnus is developed.* Contributors:: Oodles of people.* New Features:: Pointers to some of the new stuff in Gnus.@end menu@node Gnus Versions@subsection Gnus Versions@cindex Pterodactyl Gnus@cindex ding Gnus@cindex September Gnus@cindex Quassia GnusThe first ``proper'' release of Gnus 5 was done in November 1995 when itwas included in the Emacs 19.30 distribution (132 (ding) Gnus releasesplus 15 Gnus 5.0 releases).In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99releases)) was released under the name ``Gnus 5.2'' (40 releases).On July 28th 1996 work on Red Gnus was begun, and it was released onJanuary 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).On September 13th 1997, Quassia Gnus was started and lasted 37 releases.If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd1999.If you happen upon a version of Gnus that has a prefixed name --``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' --don't panic. Don't let it know that you're frightened. Back away.Slowly. Whatever you do, don't run. Walk away, calmly, until you'reout of its reach. Find a proper released version of Gnus and snuggle upto that instead.@node Other Gnus Versions@subsection Other Gnus Versions@cindex Semi-gnusIn addition to the versions of Gnus which have had their releasescoordinated by Lars, one major development has been Semi-gnus fromJapan. It's based on a library called @sc{semi}, which provides@sc{mime} capabilities.These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus.Collectively, they are called ``Semi-gnus'', and different strains arecalled T-gnus, ET-gnus, Nana-gnus and Chaos. These provide powerful@sc{mime} and multilingualization things, especially important forJapanese users.@node Why?@subsection Why?What's the point of Gnus?I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''newsreader, that lets you do anything you can think of. That was myoriginal motivation, but while working on Gnus, it has become clear tome that this generation of newsreaders really belong in the stone age.Newsreaders haven't developed much since the infancy of the net. If thevolume continues to rise with the current rate of increase, all currentnewsreaders will be pretty much useless. How do you deal withnewsgroups that have thousands of new articles each day? How do youkeep track of millions of people who post?Gnus offers no real solutions to these questions, but I would very muchlike to see Gnus being used as a testing ground for new methods ofreading and fetching news. Expanding on @sc{Umeda}-san's wise decisionto separate the newsreader from the back ends, Gnus now offers a simpleinterface for anybody who wants to write new back ends for fetching mailand news from different sources. I have added hooks for customizationseverywhere I could imagine it being useful. By doing so, I'm invitingevery one of you to explore and invent.May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and@kbd{C-u 100 M-x all-hail-xemacs}.@node Compatibility@subsection Compatibility@cindex compatibilityGnus was designed to be fully compatible with @sc{gnus}. Almost all keybindings have been kept. More key bindings have been added, of course,but only in one or two obscure cases have old bindings been changed.Our motto is:@quotation@cartouche@center In a cloud bones of steel.@end cartouche@end quotationAll commands have kept their names. Some internal functions have changedtheir names.The @code{gnus-uu} package has changed drastically. @xref{DecodingArticles}.One major compatibility question is the presence of several summarybuffers. All variables relevant while reading a group arebuffer-local to the summary buffer they belong in. Although manyimportant variables have their values copied into their globalcounterparts whenever a command is executed in the summary buffer, thischange might lead to incorrect values being used unless you are careful.All code that relies on knowledge of @sc{gnus} internals will probablyfail. To take two examples: Sorting @code{gnus-newsrc-alist} (orchanging it in any way, as a matter of fact) is strictly verboten. Gnusmaintains a hash table that points to the entries in this alist (whichspeeds up many functions), and changing the alist directly will lead topeculiar results.@cindex hilit19@cindex highlightingOld hilit19 code does not work at all. In fact, you should probablyremove all hilit code from all Gnus hooks(@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).Gnus provides various integrated functions for highlighting. These arefaster and more accurate. To make life easier for everybody, Gnus willby default remove all hilit calls from all hilit hooks. Uncleanliness!Away!Packages like @code{expire-kill} will no longer work. As a matter offact, you should probably remove all old @sc{gnus} packages (and othercode) when you start using Gnus. More likely than not, Gnus alreadydoes what you have written code to make @sc{gnus} do. (Snicker.)Even though old methods of doing things are still supported, only thenew methods are documented in this manual. If you detect a new method ofdoing something while reading this manual, that does not mean you haveto stop doing it the old way.Gnus understands all @sc{gnus} startup files.@kindex M-x gnus-bug@findex gnus-bug@cindex reporting bugs@cindex bugsOverall, a casual user who hasn't written much code that depends on@sc{gnus} internals should suffer no problems. If problems occur,please let me know by issuing that magic command @kbd{M-x gnus-bug}.@vindex gnus-bug-create-help-bufferIf you are in the habit of sending bug reports @emph{very} often, youmay find the helpful help buffer annoying after a while. If so, set@code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it popup at you.@node Conformity@subsection ConformityNo rebels without a clue here, ma'am. We conform to all standards knownto (wo)man. Except for those standards and/or conventions we disagreewith, of course.@table @strong@item RFC 822@cindex RFC 822There are no known breaches of this standard.@item RFC 1036@cindex RFC 1036There are no known breaches of this standard, either.@item Son-of-RFC 1036@cindex Son-of-RFC 1036We do have some breaches to this one.@table @emph@item X-Newsreader@itemx User-AgentThese are considered to be ``vanity headers'', while I consider themto be consumer information. After seeing so many badly formattedarticles coming from @code{tin} and @code{Netscape} I know not to useeither of those for posting articles. I would not have known that ifit wasn't for the @code{X-Newsreader} header.@end table@item USEFOR@cindex USEFORUSEFOR is an IETF working group writing a successor to RFC 1036, basedon Son-of-RFC 1036. They have produced a number of drafts proposingvarious changes to the format of news articles. The Gnus towers willlook into implementing the changes when the draft is accepted as an RFC.@end tableIf you ever notice Gnus acting non-compliant with regards to the textsmentioned above, don't hesitate to drop a note to Gnus Towers and let usknow.@node Emacsen@subsection Emacsen@cindex Emacsen@cindex XEmacs@cindex Mule@cindex EmacsGnus should work on :@itemize @bullet@itemEmacs 20.3 and up.@itemXEmacs 20.4 and up.@end itemizeThis Gnus version will absolutely not work on any Emacsen older thanthat. Not reliably, at least. Older versions of Gnus may work on olderEmacs versions.There are some vague differences between Gnus on the variousplatforms---XEmacs features more graphics (a logo and a toolbar)---butother than that, things should look pretty much the same under allEmacsen.@node Gnus Development@subsection Gnus DevelopmentGnus is developed in a two-phased cycle. The first phase involves muchdiscussion on the @samp{ding@@gnus.org} mailing list, where peoplepropose changes and new features, post patches and new back ends. Thisphase is called the @dfn{alpha} phase, since the Gnusae released in thisphase are @dfn{alpha releases}, or (perhaps more commonly in othercircles) @dfn{snapshots}. During this phase, Gnus is assumed to beunstable and should not be used by casual users. Gnus alpha releaseshave names like ``Red Gnus'' and ``Quassia Gnus''.After futzing around for 50-100 alpha releases, Gnus is declared@dfn{frozen}, and only bug fixes are applied. Gnus loses the prefix,and is called things like ``Gnus 5.6.32'' instead. Normal people aresupposed to be able to use these, and these are mostly discussed on the@samp{gnu.emacs.gnus} newsgroup.@cindex Incoming*@vindex mail-source-delete-incomingSome variable defaults differ between alpha Gnusae and released Gnusae.In particular, @code{mail-source-delete-incoming} defaults to @code{nil} inalpha Gnusae and @code{t} in released Gnusae. This is to preventlossage of mail if an alpha release hiccups while handling the mail.The division of discussion between the ding mailing list and the Gnusnewsgroup is not purely based on publicity concerns. It's true thathaving people write about the horrible things that an alpha Gnus releasecan do (sometimes) in a public forum may scare people off, but moreimportantly, talking about new experimental features that have beenintroduced may confuse casual users. New features are frequentlyintroduced, fiddled with, and judged to be found wanting, and theneither discarded or totally rewritten. People reading the mailing listusually keep up with these rapid changes, while people on the newsgroupcan't be assumed to do so.@node Contributors@subsection Contributors@cindex contributorsThe new Gnus version couldn't have been done without the help of all thepeople on the (ding) mailing list. Every day for over a year I havegotten billions of nice bug reports from them, filling me with joy,every single one of them. Smooches. The people on the list have beentried beyond endurance, what with my ``oh, that's a neat idea <typetype>, yup, I'll release it right away <ship off> no wait, that doesn'twork at all <type type>, yup, I'll ship that one off right away <shipoff> no, wait, that absolutely does not work'' policy for releases.Micro$oft---bah. Amateurs. I'm @emph{much} worse. (Or is that``worser''? ``much worser''? ``worsest''?)I would like to take this opportunity to thank the Academy for... oops,wrong show.@itemize @bullet@itemMasanobu @sc{Umeda}---the writer of the original @sc{gnus}.@itemShenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el,nnwarchive and many, many other things connected with @sc{mime} andother types of en/decoding, as well as general bug fixing, newfunctionality and stuff.@itemPer Abrahamsen---custom, scoring, highlighting and @sc{soup} code (aswell as numerous other things).@itemLuis Fernandes---design and graphics.@itemJustin Sheehy--the FAQ maintainer.@itemErik Naggum---help, ideas, support, code and stuff.@itemWes Hardaker---@file{gnus-picon.el} and the manual section on@dfn{picons} (@pxref{Picons}).@itemKim-Minh Kaplan---further work on the picon code.@itemBrad Miller---@file{gnus-gl.el} and the GroupLens manual section(@pxref{GroupLens}).@itemSudish Joseph---innumerable bug fixes.@itemIlja Weis---@file{gnus-topic.el}.@itemSteven L. Baur---lots and lots and lots of bugs detections and fixes.@itemVladimir Alexiev---the refcard and reference booklets.@itemFelix Lee & Jamie Zawinski---I stole some pieces from the XGnusdistribution by Felix Lee and JWZ.@itemScott Byer---@file{nnfolder.el} enhancements & rewrite.@itemPeter Mutsaers---orphan article scoring code.@itemKen Raeburn---POP mail support.@itemHallvard B Furuseth---various bits and pieces, especially dealing with.newsrc files.@itemBrian Edmonds---@file{gnus-bbdb.el}.@itemDavid Moore---rewrite of @file{nnvirtual.el} and many other things.@itemKevin Davidson---came up with the name @dfn{ding}, so blame him.@itemFran�ois Pinard---many, many interesting and thorough bug reports, aswell as autoconf support.@end itemizeThis manual was proof-read by Adrian Aichner, with Ricardo Nassif, MarkBorges, and Jost Krieger proof-reading parts of the manual.The following people have contributed many patches and suggestions:Christopher Davis,Andrew Eskilsson,Kai Grossjohann,David K�gedal,Richard Pieri,Fabrice Popineau,Daniel Quinlan,Jason L. Tibbitts, III,andJack Vinson.Also thanks to the following for patches and stuff:Jari Aalto,Adrian Aichner,Vladimir Alexiev,Russ Allbery,Peter Arius,Matt Armstrong,Marc Auslander,Miles Bader,Alexei V. Barantsev,Frank Bennett,Robert Bihlmeyer,Chris Bone,Mark Borges,Mark Boyns,Lance A. Brown,Rob Browning,Kees de Bruin,Martin Buchholz,Joe Buehler,Kevin Buhr,Alastair Burt,Joao Cachopo,Zlatko Calusic,Massimo Campostrini,Castor,David Charlap,Dan Christensen,Kevin Christian,Jae-you Chung, @c ?James H. Cloos, Jr.,Laura Conrad,Michael R. Cook,Glenn Coombs,Andrew J. Cosgriff,Neil Crellin,Frank D. Cringle,Geoffrey T. Dairiki,Andre Deparade,Ulrik Dickow,Dave Disser,Rui-Tao Dong, @c ?Joev Dubach,Michael Welsh Duggan,Dave Edmondson,Paul Eggert,Mark W. Eichin,Karl Eichwalder,Enami Tsugutomo, @c EnamiMichael Ernst,Luc Van Eycken,Sam Falkner,Nelson Jose dos Santos Ferreira,Sigbjorn Finne,Sven Fischer,Paul Fisher,Decklin Foster,Gary D. Foster,Paul Franklin,Guy Geens,Arne Georg Gleditsch,David S. Goldberg,Michelangelo Grigni,Dale Hagglund,D. Hall,Magnus Hammerin,Kenichi Handa, @c HandaRaja R. Harinath,Yoshiki Hayashi, @c ?P. E. Jareth Hein,Hisashige Kenji, @c HisashigeScott Hofmann,Marc Horowitz,Gunnar Horrigmo,Richard Hoskins,Brad Howes,Miguel de Icaza,Fran�ois Felix Ingrand,Tatsuya Ichikawa, @c ?Ishikawa Ichiro, @c IshikawaLee Iverson,Iwamuro Motonori, @c IwamuroRajappa Iyer,Andreas Jaeger,Adam P. Jenkins,Randell Jesup,Fred Johansen,Gareth Jones,Simon Josefsson,Greg Klanderman,Karl Kleinpaste,Michael Klingbeil,Peter Skov Knudsen,Shuhei Kobayashi, @c KobayashiPetr Konecny,Koseki Yoshinori, @c KosekiThor Kristoffersen,Jens Lautenbacher,Martin Larose,Seokchan Lee, @c LeeJoerg Lenneis,Carsten Leonhardt,James LewisMoss,Christian Limpach,Markus Linnala,Dave Love,Mike McEwan,Tonny Madsen,Shlomo Mahlab,Nat Makarevitch,Istvan Marko,David Martin,Jason R. Mastaler,Gordon Matzigkeit,Timo Metzemakers,Richard Mlynarik,Lantz Moore,Morioka Tomohiko, @c MoriokaErik Toubro Nielsen,Hrvoje Niksic,Andy Norman,Fred Oberhauser,C. R. Oldham,Alexandre Oliva,Ken Olstad,Masaharu Onishi, @c OnishiHideki Ono, @c OnoEttore Perazzoli,William Perry,Stephen Peters,Jens-Ulrik Holger Petersen,Ulrich Pfeifer,Matt Pharr,Andy Piper,John McClary Prevost,Bill Pringlemeir,Mike Pullen,Jim Radford,Colin Rafferty,Lasse Rasinen,Lars Balker Rasmussen,Joe Reiss,Renaud Rioboo,Roland B. Roberts,Bart Robinson,Christian von Roques,Markus Rost,Jason Rumney,Wolfgang Rupprecht,Jay Sachs,Dewey M. Sasser,Conrad Sauerwald,Loren Schall,Dan Schmidt,Ralph Schleicher,Philippe Schnoebelen,Andreas Schwab,Randal L. Schwartz,Danny Siu,Matt Simmons,Paul D. Smith,Jeff Sparkes,Toby Speight,Michael Sperber,Darren Stalder,Richard Stallman,Greg Stark,Sam Steingold,Paul Stevenson,Jonas Steverud,Paul Stodghill,Kiyokazu Suto, @c SutoKurt Swanson,Samuel Tardieu,Teddy,Chuck Thompson,Tozawa Akihiko, @c TozawaPhilippe Troin,James Troup,Trung Tran-Duc,Jack Twilley,Aaron M. Ucko,Aki Vehtari,Didier Verna,Vladimir Volovich,Jan Vroonhof,Stefan Waldherr,Pete Ware,Barry A. Warsaw,Christoph Wedler,Joe Wells,Lee Willis,Katsumi Yamaoka @c YamaokaandLloyd Zusman.For a full overview of what each person has done, the ChangeLogsincluded in the Gnus alpha distributions should give ample reading(550kB and counting).Apologies to everybody that I've forgotten, of which there are many, I'msure.Gee, that's quite a list of people. I guess that must mean that thereactually are people who are using Gnus. Who'd'a thunk it!@node New Features@subsection New Features@cindex new features@menu* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.* Red Gnus:: Third time best---Gnus 5.4/5.5.* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.@end menuThese lists are, of course, just @emph{short} overviews of the@emph{most} important new features. No, really. There are tons more.Yes, we have feeping creaturism in full effect.@node ding Gnus@subsubsection (ding) GnusNew features in Gnus 5.0/5.1:@itemize @bullet@itemThe look of all buffers can be changed by setting format-like variables(@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}).@itemLocal spool and several @sc{nntp} servers can be used at once(@pxref{Select Methods}).@itemYou can combine groups into virtual groups (@pxref{Virtual Groups}).@itemYou can read a number of different mail formats (@pxref{Getting Mail}).All the mail back ends implement a convenient mail expiry scheme(@pxref{Expiring Mail}).@itemGnus can use various strategies for gathering threads that have losttheir roots (thereby gathering loose sub-threads into one thread) or itcan go back and retrieve enough headers to build a complete thread(@pxref{Customizing Threading}).@itemKilled groups can be displayed in the group buffer, and you can readthem as well (@pxref{Listing Groups}).@itemGnus can do partial group updates---you do not have to retrieve theentire active file just to check for new articles in a few groups(@pxref{The Active File}).@itemGnus implements a sliding scale of subscribedness to groups(@pxref{Group Levels}).@itemYou can score articles according to any number of criteria(@pxref{Scoring}). You can even get Gnus to find out how to scorearticles for you (@pxref{Adaptive Scoring}).@itemGnus maintains a dribble buffer that is auto-saved the normal Emacsmanner, so it should be difficult to lose much data on what you haveread if your machine should go down (@pxref{Auto Save}).@itemGnus now has its own startup file (@file{.gnus}) to avoid cluttering upthe @file{.emacs} file.@itemYou can set the process mark on both groups and articles and performoperations on all the marked items (@pxref{Process/Prefix}).@itemYou can grep through a subset of groups and create a group from theresults (@pxref{Kibozed Groups}).@itemYou can list subsets of groups according to, well, anything(@pxref{Listing Groups}).@itemYou can browse foreign servers and subscribe to groups from thoseservers (@pxref{Browse Foreign Server}).@itemGnus can fetch articles, asynchronously, on a second connection to theserver (@pxref{Asynchronous Fetching}).@itemYou can cache articles locally (@pxref{Article Caching}).@itemThe uudecode functions have been expanded and generalized(@pxref{Decoding Articles}).@itemYou can still post uuencoded articles, which was a little-known featureof @sc{gnus}' past (@pxref{Uuencoding and Posting}).@itemFetching parents (and other articles) now actually works withoutglitches (@pxref{Finding the Parent}).@itemGnus can fetch FAQs and group descriptions (@pxref{Group Information}).@itemDigests (and other files) can be used as the basis for groups(@pxref{Document Groups}).@itemArticles can be highlighted and customized (@pxref{CustomizingArticles}).@itemURLs and other external references can be buttonized (@pxref{ArticleButtons}).@itemYou can do lots of strange stuff with the Gnus window & frameconfiguration (@pxref{Windows Configuration}).@itemYou can click on buttons instead of using the keyboard(@pxref{Buttons}).@end itemize@node September Gnus@subsubsection September Gnus@iftex@iflatex\gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}}@end iflatex@end iftexNew features in Gnus 5.2/5.3:@itemize @bullet@itemA new message composition mode is used. All old customization variablesfor @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} arenow obsolete.@itemGnus is now able to generate @dfn{sparse} threads---threads wheremissing articles are represented by empty nodes (@pxref{CustomizingThreading}).@lisp(setq gnus-build-sparse-threads 'some)@end lisp@itemOutgoing articles are stored on a special archive server(@pxref{Archived Messages}).@itemPartial thread regeneration now happens when articles arereferred.@itemGnus can make use of GroupLens predictions (@pxref{GroupLens}).@itemPicons (personal icons) can be displayed under XEmacs (@pxref{Picons}).@itemA @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).@lisp(setq gnus-use-trees t)@end lisp@itemAn @code{nn}-like pick-and-read minor mode is available for the summarybuffers (@pxref{Pick and Read}).@lisp(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)@end lisp@itemIn binary groups you can use a special binary minor mode (@pxref{BinaryGroups}).@itemGroups can be grouped in a folding topic hierarchy (@pxref{GroupTopics}).@lisp(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)@end lisp@itemGnus can re-send and bounce mail (@pxref{Summary Mail Commands}).@itemGroups can now have a score, and bubbling based on entry frequencyis possible (@pxref{Group Score}).@lisp(add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)@end lisp@itemGroups can be process-marked, and commands can be performed ongroups of groups (@pxref{Marking Groups}).@itemCaching is possible in virtual groups.@item@code{nndoc} now understands all kinds of digests, mail boxes, rnewsnews batches, ClariNet briefs collections, and just about everythingelse (@pxref{Document Groups}).@itemGnus has a new back end (@code{nnsoup}) to create/read SOUP packets(@pxref{SOUP}).@itemThe Gnus cache is much faster.@itemGroups can be sorted according to many criteria (@pxref{SortingGroups}).@itemNew group parameters have been introduced to set list-addresses andexpiry times (@pxref{Group Parameters}).@itemAll formatting specs allow specifying faces to be used(@pxref{Formatting Fonts}).@itemThere are several more commands for setting/removing/acting on processmarked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).@itemThe summary buffer can be limited to show parts of the availablearticles based on a wide range of criteria. These commands have beenbound to keys on the @kbd{/} submap (@pxref{Limiting}).@itemArticles can be made persistent with the @kbd{*} command(@pxref{Persistent Articles}).@itemAll functions for hiding article elements are now toggles.@itemArticle headers can be buttonized (@pxref{Article Washing}).@itemAll mail back ends support fetching articles by @code{Message-ID}.@itemDuplicate mail can now be treated properly (@pxref{Duplicates}).@itemAll summary mode commands are available directly from the articlebuffer (@pxref{Article Keymap}).@itemFrames can be part of @code{gnus-buffer-configuration} (@pxref{WindowsConfiguration}).@itemMail can be re-scanned by a daemonic process (@pxref{Daemons}).@iftex@iflatex\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}}@end iflatex@end iftex@itemGnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).@lisp(setq gnus-use-nocem t)@end lisp@itemGroups can be made permanently visible (@pxref{Listing Groups}).@lisp(setq gnus-permanently-visible-groups "^nnml:")@end lisp@itemMany new hooks have been introduced to make customizing easier.@itemGnus respects the @code{Mail-Copies-To} header.@itemThreads can be gathered by looking at the @code{References} header(@pxref{Customizing Threading}).@lisp(setq gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references)@end lisp@itemRead articles can be stored in a special backlog buffer to avoidrefetching (@pxref{Article Backlog}).@lisp(setq gnus-keep-backlog 50)@end lisp@itemA clean copy of the current article is always stored in a separatebuffer to allow easier treatment.@itemGnus can suggest where to save articles (@pxref{Saving Articles}).@itemGnus doesn't have to do as much prompting when saving (@pxref{SavingArticles}).@lisp(setq gnus-prompt-before-saving t)@end lisp@item@code{gnus-uu} can view decoded files asynchronously while fetchingarticles (@pxref{Other Decode Variables}).@lisp(setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)@end lisp@itemFilling in the article buffer now works properly on cited text(@pxref{Article Washing}).@itemHiding cited text adds buttons to toggle hiding, and how muchcited text to hide is now customizable (@pxref{Article Hiding}).@lisp(setq gnus-cited-lines-visible 2)@end lisp@itemBoring headers can be hidden (@pxref{Article Hiding}).@itemDefault scoring values can now be set from the menu bar.@itemFurther syntax checking of outgoing articles have been added.@end itemize@node Red Gnus@subsubsection Red GnusNew features in Gnus 5.4/5.5:@iftex@iflatex\gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}}@end iflatex@end iftex@itemize @bullet@item@file{nntp.el} has been totally rewritten in an asynchronous fashion.@itemArticle prefetching functionality has been moved up intoGnus (@pxref{Asynchronous Fetching}).@itemScoring can now be performed with logical operators like @code{and},@code{or}, @code{not}, and parent redirection (@pxref{AdvancedScoring}).@itemArticle washing status can be displayed in thearticle mode line (@pxref{Misc Article}).@item@file{gnus.el} has been split into many smaller files.@itemSuppression of duplicate articles based on Message-ID can be done(@pxref{Duplicate Suppression}).@lisp(setq gnus-suppress-duplicates t)@end lisp@itemNew variables for specifying what score and adapt files are to beconsidered home score and adapt files (@pxref{Home Score File}) havebeen added.@item@code{nndoc} was rewritten to be easily extensible (@pxref{DocumentServer Internals}).@itemGroups can inherit group parameters from parent topics (@pxref{TopicParameters}).@itemArticle editing has been revamped and is now actually usable.@itemSignatures can be recognized in more intelligent fashions(@pxref{Article Signature}).@itemSummary pick mode has been made to look more @code{nn}-like. Linenumbers are displayed and the @kbd{.} command can be used to pickarticles (@code{Pick and Read}).@itemCommands for moving the @file{.newsrc.eld} from one server toanother have been added (@pxref{Changing Servers}).@itemThere's a way now to specify that ``uninteresting'' fields be suppressedwhen generating lines in buffers (@pxref{Advanced Formatting}).@itemSeveral commands in the group buffer can be undone with @kbd{C-M-_}(@pxref{Undo}).@itemScoring can be done on words using the new score type @code{w}(@pxref{Score File Format}).@itemAdaptive scoring can be done on a Subject word-by-word basis(@pxref{Adaptive Scoring}).@lisp(setq gnus-use-adaptive-scoring '(word))@end lisp@itemScores can be decayed (@pxref{Score Decays}).@lisp(setq gnus-decay-scores t)@end lisp@itemScoring can be performed using a regexp on the Date header. The Date isnormalized to compact ISO 8601 format first (@pxref{Score File Format}).@itemA new command has been added to remove all data on articles fromthe native server (@pxref{Changing Servers}).@itemA new command for reading collections of documents(@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{C-M-d}(@pxref{Really Various Summary Commands}).@itemProcess mark sets can be pushed and popped (@pxref{Setting ProcessMarks}).@itemA new mail-to-news back end makes it possible to post even when the @sc{nntp}server doesn't allow posting (@pxref{Mail-To-News Gateways}).@itemA new back end for reading searches from Web search engines(@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added(@pxref{Web Searches}).@itemGroups inside topics can now be sorted using the standard sortingfunctions, and each topic can be sorted independently (@pxref{TopicSorting}).@itemSubsets of the groups can be sorted independently (@code{SortingGroups}).@itemCached articles can be pulled into the groups (@pxref{Summary GenerationCommands}).@iftex@iflatex\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}}@end iflatex@end iftex@itemScore files are now applied in a more reliable order (@pxref{ScoreVariables}).@itemReports on where mail messages end up can be generated (@pxref{SplittingMail}).@itemMore hooks and functions have been added to remove junk from incomingmail before saving the mail (@pxref{Washing Mail}).@itemEmphasized text can be properly fontified:@end itemize@node Quassia Gnus@subsubsection Quassia GnusNew features in Gnus 5.6:@itemize @bullet@itemNew functionality for using Gnus as an offline newsreader has beenadded. A plethora of new commands and modes have been added. See@pxref{Gnus Unplugged} for the full story.@item The @code{nndraft} back end has returned, but works differently thanbefore. All Message buffers are now also articles in the @code{nndraft}group, which is created automatically.@item@code{gnus-alter-header-function} can now be used to alter headervalues.@item @code{gnus-summary-goto-article} now accept Message-ID's.@item A new Message command for deleting text in the body of a messageoutside the region: @kbd{C-c C-v}.@item You can now post to component group in @code{nnvirtual} groups with@kbd{C-u C-c C-c}.@item @code{nntp-rlogin-program}---new variable to ease customization.@item @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibitre-highlighting of the article buffer.@item New element in @code{gnus-boring-article-headers}---@code{long-to}.@item @kbd{M-i} symbolic prefix command. See the section "SymbolicPrefixes" in the Gnus manual for details.@item @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix@kbd{a} to add the score rule to the "all.SCORE" file.@item @code{gnus-simplify-subject-functions} variable to allow greatercontrol over simplification.@item @kbd{A T}---new command for fetching the current thread.@item @kbd{/ T}---new command for including the current thread in thelimit.@item @kbd{M-@key{RET}} is a new Message command for breaking cited text.@item @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}.@item The @code{custom-face-lookup} function has been removed.If you used this function in your initialization files, you mustrewrite them to use @code{face-spec-set} instead.@item Canceling now uses the current select method. Symbolic prefix@kbd{a} forces normal posting method.@item New command to translate M******** sm*rtq**t*s into propertext---@kbd{W d}.@item For easier debugging of @code{nntp}, you can set@code{nntp-record-commands} to a non-@code{nil} value.@item @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, forcontrolling where and how to send @sc{authinfo} to @sc{nntp} servers.@item A command for editing group parameters from the summary bufferhas been added.@item A history of where mails have been split is available.@item A new article date command has been added---@code{article-date-iso8601}.@item Subjects can be simplified when threading by setting@code{gnus-score-thread-simplify}.@item A new function for citing in Message has beenadded---@code{message-cite-original-without-signature}.@item @code{article-strip-all-blank-lines}---new article command.@item A new Message command to kill to the end of the article hasbeen added.@item A minimum adaptive score can be specified by using the@code{gnus-adaptive-word-minimum} variable.@item The "lapsed date" article header can be kept continuallyupdated by the @code{gnus-start-date-timer} command.@item Web listserv archives can be read with the @code{nnlistserv} back end.@item Old dejanews archives can now be read by @code{nnweb}.@end itemize@node Pterodactyl Gnus@subsubsection Pterodactyl GnusNew features in Gnus 5.8:@itemize @bullet@item The mail-fetching functions have changed. See the manual for themany details. In particular, all procmail fetching variables are gone.If you used procmail like in@lisp(setq nnmail-use-procmail t)(setq nnmail-spool-file 'procmail)(setq nnmail-procmail-directory "~/mail/incoming/")(setq nnmail-procmail-suffix "\\.in")@end lispthis now has changed to@lisp(setq mail-sources '((directory :path "~/mail/incoming/" :suffix ".in")))@end lispMore information is available in the info doc at Select Methods ->Getting Mail -> Mail Sources@item Gnus is now a MIME-capable reader. This affects many parts ofGnus, and adds a slew of new commands. See the manual for details.@item Gnus has also been multilingualized. This also affects toomany parts of Gnus to summarize here, and adds many new variables.@item @code{gnus-auto-select-first} can now be a function to becalled to position point.@item The user can now decide which extra headers should be included insummary buffers and NOV files.@item @code{gnus-article-display-hook} has been removed. Instead, a numberof variables starting with @code{gnus-treat-} have been added.@item The Gnus posting styles have been redone again and now works in asubtly different manner.@item New web-based back ends have been added: @code{nnslashdot},@code{nnwarchive} and @code{nnultimate}. nnweb has been revamped,again, to keep up with ever-changing layouts.@item Gnus can now read IMAP mail via @code{nnimap}.@end itemize@iftex@page@node The Manual@section The Manual@cindex colophon@cindex manualThis manual was generated from a TeXinfo file and then run througheither @code{texi2dvi}@iflatexor my own home-brewed TeXinfo to \LaTeX\ transformer,and then run through @code{latex} and @code{dvips}@end iflatexto get what you hold in your hands now.The following conventions have been used:@enumerate@itemThis is a @samp{string}@itemThis is a @kbd{keystroke}@itemThis is a @file{file}@itemThis is a @code{symbol}@end enumerateSo if I were to say ``set @code{flargnoze} to @samp{yes}'', that wouldmean:@lisp(setq flargnoze "yes")@end lispIf I say ``set @code{flumphel} to @code{yes}'', that would mean:@lisp(setq flumphel 'yes)@end lisp@samp{yes} and @code{yes} are two @emph{very} different things---don'tever get them confused.@iflatex@c @headOf course, everything in this manual is of vital interest, so you shouldread it all. Several times. However, if you feel like skimming themanual, look for that gnu head you should see in the margin overthere---it means that what's being discussed is of more importance thanthe rest of the stuff. (On the other hand, if everything is infinitelyimportant, how can anything be more important than that? Just one moreof the mysteries of this world, I guess.)@end iflatex@end iftex@node On Writing Manuals@section On Writing ManualsI guess most manuals are written after-the-fact; documenting a programthat's already there. This is not how this manual is written. Whenimplementing something, I write the manual entry for that somethingstraight away. I then see that it's difficult to explain thefunctionality, so I write how it's supposed to be, and then I change theimplementation. Writing the documentation and writing the code goeshand in hand.This, of course, means that this manual has no, or little, flow. Itdocuments absolutely everything in Gnus, but often not where you'relooking for it. It is a reference manual, and not a guide to how to getstarted with Gnus.That would be a totally different book, that should be written using thereference manual as source material. It would look quite differently.@page@node Terminology@section Terminology@cindex terminology@table @dfn@item news@cindex newsThis is what you are supposed to use this thing for---reading news.News is generally fetched from a nearby @sc{nntp} server, and isgenerally publicly available to everybody. If you post news, the entireworld is likely to read just what you have written, and they'll allsnigger mischievously. Behind your back.@item mail@cindex mailEverything that's delivered to you personally is mail. Some news/mailreaders (like Gnus) blur the distinction between mail and news, butthere is a difference. Mail is private. News is public. Mailing isnot posting, and replying is not following up.@item reply@cindex replySend a mail to the person who has written what you are reading.@item follow up@cindex follow upPost an article to the current newsgroup responding to the article youare reading.@item back end@cindex back endGnus gets fed articles from a number of back ends, both news and mailback ends. Gnus does not handle the underlying media, so to speak---thisis all done by the back ends.@item native@cindex nativeGnus will always use one method (and back end) as the @dfn{native}, ordefault, way of getting news.@item foreign@cindex foreignYou can also have any number of foreign groups active at the same time.These are groups that use non-native non-secondary back ends for gettingnews.@item secondary@cindex secondarySecondary back ends are somewhere half-way between being native and beingforeign, but they mostly act like they are native.@item article@cindex articleA message that has been posted as news.@item mail message@cindex mail messageA message that has been mailed.@item message@cindex messageA mail message or news article@item head@cindex headThe top part of a message, where administrative information (etc.) isput.@item body@cindex bodyThe rest of an article. Everything not in the head is in thebody.@item header@cindex headerA line from the head of an article.@item headers@cindex headersA collection of such lines, or a collection of heads. Or even acollection of @sc{nov} lines.@item @sc{nov}@cindex novWhen Gnus enters a group, it asks the back end for the headers of allunread articles in the group. Most servers support the News OverViewformat, which is more compact and much faster to read and parse than thenormal @sc{head} format.@item level@cindex levelsEach group is subscribed at some @dfn{level} or other (1-9). The onesthat have a lower level are ``more'' subscribed than the groups with ahigher level. In fact, groups on levels 1-5 are considered@dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9are @dfn{killed}. Commands for listing groups and scanning for newarticles will all use the numeric prefix as @dfn{working level}.@item killed groups@cindex killed groupsNo information on killed groups is stored or updated, which makes killedgroups much easier to handle than subscribed groups.@item zombie groups@cindex zombie groupsJust like killed groups, only slightly less dead.@item active file@cindex active fileThe news server has to keep track of what articles it carries, and whatgroups exist. All this information in stored in the active file, whichis rather large, as you might surmise.@item bogus groups@cindex bogus groupsA group that exists in the @file{.newsrc} file, but isn't known to theserver (i.e., it isn't in the active file), is a @emph{bogus group}.This means that the group probably doesn't exist (any more).@item activating@cindex activating groupsThe act of asking the server for info on a group and computing thenumber of unread articles is called @dfn{activating the group}.Un-activated groups are listed with @samp{*} in the group buffer.@item server@cindex serverA machine one can connect to and get news (or mail) from.@item select method@cindex select methodA structure that specifies the back end, the server and the virtualserver settings.@item virtual server@cindex virtual serverA named select method. Since a select method defines all there is toknow about connecting to a (physical) server, taking the thing as awhole is a virtual server.@item washing@cindex washingTaking a buffer and running it through a filter of some sort. Theresult will (more often than not) be cleaner and more pleasing than theoriginal.@item ephemeral groups@cindex ephemeral groupsMost groups store data on what articles you have read. @dfn{Ephemeral}groups are groups that will have no data stored---when you exit thegroup, it'll disappear into the ether.@item solid groups@cindex solid groupsThis is the opposite of ephemeral groups. All groups listed in thegroup buffer are solid groups.@item sparse articles@cindex sparse articlesThese are article placeholders shown in the summary buffer when@code{gnus-build-sparse-threads} has been switched on.@item threading@cindex threadingTo put responses to articles directly after the articles they respondto---in a hierarchical fashion.@item root@cindex root@cindex thread rootThe first article in a thread is the root. It is the ancestor of allarticles in the thread.@item parent@cindex parentAn article that has responses.@item child@cindex childAn article that responds to a different article---its parent.@item digest@cindex digestA collection of messages in one file. The most common digest format isspecified by RFC 1153.@end table@page@node Customization@section Customization@cindex general customizationAll variables are properly documented elsewhere in this manual. Thissection is designed to give general pointers on how to customize Gnusfor some quite common situations.@menu* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.* Slow Terminal Connection:: You run a remote Emacs.* Little Disk Space:: You feel that having large setup files is icky.* Slow Machine:: You feel like buying a faster machine.@end menu@node Slow/Expensive Connection@subsection Slow/Expensive @sc{nntp} ConnectionIf you run Emacs on a machine locally, and get your news from a machineover some very thin strings, you want to cut down on the amount of dataGnus has to get from the @sc{nntp} server.@table @code@item gnus-read-active-fileSet this to @code{nil}, which will inhibit Gnus from requesting theentire active file from the server. This file is often very large. Youalso have to set @code{gnus-check-new-newsgroups} and@code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnusdoesn't suddenly decide to fetch the active file anyway.@item gnus-nov-is-evilThis one has to be @code{nil}. If not, grabbing article headers fromthe @sc{nntp} server will not be very fast. Not all @sc{nntp} serverssupport @sc{xover}; Gnus will detect this by itself.@end table@node Slow Terminal Connection@subsection Slow Terminal ConnectionLet's say you use your home computer for dialing up the system that runsEmacs and Gnus. If your modem is slow, you want to reduce (as much aspossible) the amount of data sent over the wires.@table @code@item gnus-auto-center-summarySet this to @code{nil} to inhibit Gnus from re-centering the summarybuffer all the time. If it is @code{vertical}, do only verticalre-centering. If it is neither @code{nil} nor @code{vertical}, do bothhorizontal and vertical recentering.@item gnus-visible-headersCut down on the headers included in the articles to theminimum. You can, in fact, make do without them altogether---most of theuseful data is in the summary buffer, anyway. Set this variable to@samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.Set this hook to all the available hiding commands:@lisp(setq gnus-treat-hide-headers 'head gnus-treat-hide-signature t gnus-treat-hide-citation t)@end lisp@item gnus-use-full-windowBy setting this to @code{nil}, you can make all the windows smaller.While this doesn't really cut down much generally, it means that youhave to see smaller portions of articles before deciding that you didn'twant to read them anyway.@item gnus-thread-hide-subtreeIf this is non-@code{nil}, all threads in the summary buffer will behidden initially.@item gnus-updated-mode-linesIf this is @code{nil}, Gnus will not put information in the buffer modelines, which might save some time.@end table@node Little Disk Space@subsection Little Disk Space@cindex disk spaceThe startup files can get rather large, so you may want to cut theirsizes a bit if you are running out of space.@table @code@item gnus-save-newsrc-fileIf this is @code{nil}, Gnus will never save @file{.newsrc}---it willonly save @file{.newsrc.eld}. This means that you will not be able touse any other newsreaders than Gnus. This variable is @code{t} bydefault.@item gnus-read-newsrc-fileIf this is @code{nil}, Gnus will never read @file{.newsrc}---it willonly read @file{.newsrc.eld}. This means that you will not be able touse any other newsreaders than Gnus. This variable is @code{t} bydefault.@item gnus-save-killed-listIf this is @code{nil}, Gnus will not save the list of dead groups. Youshould also set @code{gnus-check-new-newsgroups} to @code{ask-server}and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set thisvariable to @code{nil}. This variable is @code{t} by default.@end table@node Slow Machine@subsection Slow Machine@cindex slow machineIf you have a slow machine, or are just really impatient, there are afew things you can do to make Gnus run faster.Set @code{gnus-check-new-newsgroups} and@code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and@code{gnus-nov-is-evil} to @code{nil} to make entering and exiting thesummary buffer faster.@page@node Troubleshooting@section Troubleshooting@cindex troubleshootingGnus works @emph{so} well straight out of the box---I can't imagine anyproblems, really.Ahem.@enumerate@itemMake sure your computer is switched on.@itemMake sure that you really load the current Gnus version. If you havebeen running @sc{gnus}, you need to exit Emacs and start it up again beforeGnus will work.@itemTry doing an @kbd{M-x gnus-version}. If you get something that lookslike @samp{Gnus v5.46; nntp 4.0} you have the right files loaded. If,on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntpflee}, you have some old @file{.el} files lying around. Delete these.@itemRead the help group (@kbd{G h} in the group buffer) for a FAQ and ahow-to.@item@vindex max-lisp-eval-depthGnus works on many recursive structures, and in some extreme (and veryrare) cases Gnus may recurse down ``too deeply'' and Emacs will beep atyou. If this happens to you, set @code{max-lisp-eval-depth} to 500 orsomething like that.@end enumerateIf all else fails, report the problem as a bug.@cindex bugs@cindex reporting bugs@kindex M-x gnus-bug@findex gnus-bugIf you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}command. @kbd{M-x set-variable @key{RET} debug-on-error @key{RET} t @key{RET}}, and sendme the backtrace. I will fix bugs, but I can only fix them if you sendme a precise description as to how to reproduce the bug.You really can never be too detailed in a bug report. Always use the@kbd{M-x gnus-bug} command when you make bug reports, even if it createsa 10Kb mail each time you use it, and even if you have sent me yourenvironment 500 times before. I don't care. I want the full info eachtime.It is also important to remember that I have no memory whatsoever. Ifyou send a bug report, and I send you a reply, and then you just sendback ``No, it's not! Moron!'', I will have no idea what you areinsulting me about. Always over-explain everything. It's much easierfor all of us---if I don't have all the information I need, I will justmail you and ask for more info, and everything takes more time.If the problem you're seeing is very visual, and you can't quite explainit, copy the Emacs window to a file (with @code{xwd}, for instance), putit somewhere it can be reached, and include the URL of the picture inthe bug report.If you just need help, you are better off asking on@samp{gnu.emacs.gnus}. I'm not very helpful.@cindex gnu.emacs.gnus@cindex ding mailing listYou can also ask on the ding mailing list---@samp{ding@@gnus.org}.Write to @samp{ding-request@@gnus.org} to subscribe.@page@node Gnus Reference Guide@section Gnus Reference GuideIt is my hope that other people will figure out smart stuff that Gnuscan do, and that other people will write those smart things as well. Tofacilitate that I thought it would be a good idea to describe the innerworkings of Gnus. And some of the not-so-inner workings, while I'm atit.You can never expect the internals of a program not to change, but Iwill be defining (in some details) the interface between Gnus and itsback ends (this is written in stone), the format of the score files(ditto), data structures (some are less likely to change than others)and general methods of operation.@menu* Gnus Utility Functions:: Common functions and variable to use.* Back End Interface:: How Gnus communicates with the servers.* Score File Syntax:: A BNF definition of the score file standard.* Headers:: How Gnus stores headers internally.* Ranges:: A handy format for storing mucho numbers.* Group Info:: The group info format.* Extended Interactive:: Symbolic prefixes and stuff.* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.* Various File Formats:: Formats of files that Gnus use.@end menu@node Gnus Utility Functions@subsection Gnus Utility Functions@cindex Gnus utility functions@cindex utility functions@cindex functions@cindex internal variablesWhen writing small functions to be run from hooks (and stuff), it'svital to have access to the Gnus internal functions and variables.Below is a list of the most common ones.@table @code@item gnus-newsgroup-name@vindex gnus-newsgroup-nameThis variable holds the name of the current newsgroup.@item gnus-find-method-for-group@findex gnus-find-method-for-groupA function that returns the select method for @var{group}.@item gnus-group-real-name@findex gnus-group-real-nameTakes a full (prefixed) Gnus group name, and returns the unprefixedname.@item gnus-group-prefixed-name@findex gnus-group-prefixed-nameTakes an unprefixed group name and a select method, and returns the full(prefixed) Gnus group name.@item gnus-get-info@findex gnus-get-infoReturns the group info list for @var{group}.@item gnus-group-unread@findex gnus-group-unreadThe number of unread articles in @var{group}, or @code{t} if that isunknown.@item gnus-active@findex gnus-activeThe active entry for @var{group}.@item gnus-set-active@findex gnus-set-activeSet the active entry for @var{group}.@item gnus-add-current-to-buffer-list@findex gnus-add-current-to-buffer-listAdds the current buffer to the list of buffers to be killed on Gnusexit.@item gnus-continuum-version@findex gnus-continuum-versionTakes a Gnus version string as a parameter and returns a floating pointnumber. Earlier versions will always get a lower number than laterversions.@item gnus-group-read-only-p@findex gnus-group-read-only-pSays whether @var{group} is read-only or not.@item gnus-news-group-p@findex gnus-news-group-pSays whether @var{group} came from a news back end.@item gnus-ephemeral-group-p@findex gnus-ephemeral-group-pSays whether @var{group} is ephemeral or not.@item gnus-server-to-method@findex gnus-server-to-methodReturns the select method corresponding to @var{server}.@item gnus-server-equal@findex gnus-server-equalSays whether two virtual servers are equal.@item gnus-group-native-p@findex gnus-group-native-pSays whether @var{group} is native or not.@item gnus-group-secondary-p@findex gnus-group-secondary-pSays whether @var{group} is secondary or not.@item gnus-group-foreign-p@findex gnus-group-foreign-pSays whether @var{group} is foreign or not.@item group-group-find-parameter@findex group-group-find-parameterReturns the parameter list of @var{group}. If given a second parameter,returns the value of that parameter for @var{group}.@item gnus-group-set-parameter@findex gnus-group-set-parameterTakes three parameters; @var{group}, @var{parameter} and @var{value}.@item gnus-narrow-to-body@findex gnus-narrow-to-bodyNarrows the current buffer to the body of the article.@item gnus-check-backend-function@findex gnus-check-backend-functionTakes two parameters, @var{function} and @var{group}. If the back end@var{group} comes from supports @var{function}, return non-@code{nil}.@lisp(gnus-check-backend-function "request-scan" "nnml:misc")@result{} t@end lisp@item gnus-read-method@findex gnus-read-methodPrompts the user for a select method.@end table@node Back End Interface@subsection Back End InterfaceGnus doesn't know anything about @sc{nntp}, spools, mail or virtualgroups. It only knows how to talk to @dfn{virtual servers}. A virtualserver is a @dfn{back end} and some @dfn{back end variables}. As examplesof the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}. Asexamples of the latter we have @code{nntp-port-number} and@code{nnmbox-directory}.When Gnus asks for information from a back end---say @code{nntp}---onsomething, it will normally include a virtual server name in thefunction parameters. (If not, the back end should use the ``current''virtual server.) For instance, @code{nntp-request-list} takes a virtualserver as its only (optional) parameter. If this virtual server hasn'tbeen opened, the function should fail.Note that a virtual server name has no relation to some physical servername. Take this example:@lisp(nntp "odd-one" (nntp-address "ifi.uio.no") (nntp-port-number 4324))@end lispHere the virtual server name is @samp{odd-one} while the name ofthe physical server is @samp{ifi.uio.no}.The back ends should be able to switch between several virtual servers.The standard back ends implement this by keeping an alist of virtualserver environments that they pull down/push up when needed.There are two groups of interface functions: @dfn{required functions},which must be present, and @dfn{optional functions}, which Gnus willalways check for presence before attempting to call 'em.All these functions are expected to return data in the buffer@code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhatunfortunately named, but we'll have to live with it. When I talk about@dfn{resulting data}, I always refer to the data in that buffer. When Italk about @dfn{return value}, I talk about the function value returned bythe function call. Functions that fail should return @code{nil} as thereturn value.Some back ends could be said to be @dfn{server-forming} back ends, andsome might be said not to be. The latter are back ends that generallyonly operate on one group at a time, and have no concept of ``server''-- they have a group, and they deliver info on that group and nothingmore.In the examples and definitions I will refer to the imaginary back end@code{nnchoke}.@cindex @code{nnchoke}@menu* Required Back End Functions:: Functions that must be implemented.* Optional Back End Functions:: Functions that need not be implemented.* Error Messaging:: How to get messages and report errors.* Writing New Back Ends:: Extending old back ends.* Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.* Mail-like Back Ends:: Some tips on mail back ends.@end menu@node Required Back End Functions@subsubsection Required Back End Functions@table @code@item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)@var{articles} is either a range of article numbers or a list of@code{Message-ID}s. Current back ends do not fully support either---onlysequences (lists) of article numbers, and most back ends do not supportretrieval of @code{Message-ID}s. But they should try for both.The result data should either be HEADs or NOV lines, and the resultvalue should either be @code{headers} or @code{nov} to reflect this.This might later be expanded to @code{various}, which will be a mixtureof HEADs and NOV lines, but this is currently not supported by Gnus.If @var{fetch-old} is non-@code{nil} it says to try fetching "extraheaders", in some meaning of the word. This is generally done byfetching (at most) @var{fetch-old} extra headers less than the smallestarticle number in @code{articles}, and filling the gaps as well. Thepresence of this parameter can be ignored if the back end finds itcumbersome to follow the request. If this is non-@code{nil} and not anumber, do maximum fetches.Here's an example HEAD:@example221 1056 Article retrieved.Path: ifi.uio.no!sturlesFrom: sturles@@ifi.uio.no (Sturle Sunde)Newsgroups: ifi.discussionSubject: Re: Something very drollDate: 27 Oct 1994 14:02:57 +0100Organization: Dept. of Informatics, University of Oslo, NorwayLines: 26Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>References: <38jdmq$4qu@@visbur.ifi.uio.no>NNTP-Posting-Host: holmenkollen.ifi.uio.no.@end exampleSo a @code{headers} return value would imply that there's a number ofthese in the data buffer.Here's a BNF definition of such a buffer:@exampleheaders = *headhead = error / valid-headerror-message = [ "4" / "5" ] 2number " " <error message> eolvalid-head = valid-message *header "." eolvalid-message = "221 " <number> " Article retrieved." eolheader = <text> eol@end exampleIf the return value is @code{nov}, the data buffer should contain@dfn{network overview database} lines. These are basically fieldsseparated by tabs.@examplenov-buffer = *nov-linenov-line = 8*9 [ field <TAB> ] eolfield = <text except TAB>@end exampleFor a closer look at what should be in those fields,@pxref{Headers}.@item (nnchoke-open-server SERVER &optional DEFINITIONS)@var{server} is here the virtual server name. @var{definitions} is alist of @code{(VARIABLE VALUE)} pairs that define this virtual server.If the server can't be opened, no error should be signaled. The back endmay then choose to refuse further attempts at connecting to thisserver. In fact, it should do so.If the server is opened already, this function should return anon-@code{nil} value. There should be no data returned.@item (nnchoke-close-server &optional SERVER)Close connection to @var{server} and free all resources connectedto it. Return @code{nil} if the server couldn't be closed for somereason.There should be no data returned.@item (nnchoke-request-close)Close connection to all servers and free all resources that the back endhave reserved. All buffers that have been created by that back endshould be killed. (Not the @code{nntp-server-buffer}, though.) Thisfunction is generally only called when Gnus is shutting down.There should be no data returned.@item (nnchoke-server-opened &optional SERVER)If @var{server} is the current virtual server, and the connection to thephysical server is alive, then this function should return anon-@code{nil} vlue. This function should under no circumstancesattempt to reconnect to a server we have lost connection to.There should be no data returned.@item (nnchoke-status-message &optional SERVER)This function should return the last error message from @var{server}.There should be no data returned.@item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)The result data from this function should be the article specified by@var{article}. This might either be a @code{Message-ID} or a number.It is optional whether to implement retrieval by @code{Message-ID}, butit would be nice if that were possible.If @var{to-buffer} is non-@code{nil}, the result data should be returnedin this buffer instead of the normal data buffer. This is to make itpossible to avoid copying large amounts of data from one buffer toanother, while Gnus mainly requests articles to be inserted directlyinto its article buffer.If it is at all possible, this function should return a cons cell wherethe @code{car} is the group name the article was fetched from, and the @code{cdr} isthe article number. This will enable Gnus to find out what the realgroup and article numbers are when fetching articles by@code{Message-ID}. If this isn't possible, @code{t} should be returnedon successful article retrieval.@item (nnchoke-request-group GROUP &optional SERVER FAST)Get data on @var{group}. This function also has the side effect ofmaking @var{group} the current group.If @var{fast}, don't bother to return useful data, just make @var{group}the current group.Here's an example of some result data and a definition of the same:@example211 56 1000 1059 ifi.discussion@end exampleThe first number is the status, which should be 211. Next is thetotal number of articles in the group, the lowest article number, thehighest article number, and finally the group name. Note that the totalnumber of articles may be less than one might think while justconsidering the highest and lowest article numbers, but some articlesmay have been canceled. Gnus just discards the total-number, sowhether one should take the bother to generate it properly (if that is aproblem) is left as an exercise to the reader.@examplegroup-status = [ error / info ] eolerror = [ "4" / "5" ] 2<number> " " <Error message>info = "211 " 3* [ <number> " " ] <string>@end example@item (nnchoke-close-group GROUP &optional SERVER)Close @var{group} and free any resources connected to it. This will bea no-op on most back ends.There should be no data returned.@item (nnchoke-request-list &optional SERVER)Return a list of all groups available on @var{server}. And that means@emph{all}.Here's an example from a server that only carries two groups:@exampleifi.test 0000002200 0000002000 yifi.discussion 3324 3300 n@end exampleOn each line we have a group name, then the highest article number inthat group, the lowest article number, and finally a flag.@exampleactive-file = *active-lineactive-line = name " " <number> " " <number> " " flags eolname = <string>flags = "n" / "y" / "m" / "x" / "j" / "=" name@end exampleThe flag says whether the group is read-only (@samp{n}), is moderated(@samp{m}), is dead (@samp{x}), is aliased to some other group(@samp{=other-group}) or none of the above (@samp{y}).@item (nnchoke-request-post &optional SERVER)This function should post the current buffer. It might return whetherthe posting was successful or not, but that's not required. If, forinstance, the posting is done asynchronously, it has generally not beencompleted by the time this function concludes. In that case, thisfunction should set up some kind of sentinel to beep the user loud andclear if the posting could not be completed.There should be no result data from this function.@end table@node Optional Back End Functions@subsubsection Optional Back End Functions@table @code@item (nnchoke-retrieve-groups GROUPS &optional SERVER)@var{groups} is a list of groups, and this function should request dataon all those groups. How it does it is of no concern to Gnus, but itshould attempt to do this in a speedy fashion.The return value of this function can be either @code{active} or@code{group}, which says what the format of the result data is. Theformer is in the same format as the data from@code{nnchoke-request-list}, while the latter is a buffer full of linesin the same format as @code{nnchoke-request-group} gives.@examplegroup-buffer = *active-line / *group-status@end example@item (nnchoke-request-update-info GROUP INFO &optional SERVER)A Gnus group info (@pxref{Group Info}) is handed to the back end foralterations. This comes in handy if the back end really carries all theinformation (as is the case with virtual and imap groups). Thisfunction should destructively alter the info to suit its needs, andshould return the (altered) group info.There should be no result data from this function.@item (nnchoke-request-type GROUP &optional ARTICLE)When the user issues commands for ``sending news'' (@kbd{F} in thesummary buffer, for instance), Gnus has to know whether the article theuser is following up on is news or mail. This function should return@code{news} if @var{article} in @var{group} is news, @code{mail} if itis mail and @code{unknown} if the type can't be decided. (The@var{article} parameter is necessary in @code{nnvirtual} groups whichmight very well combine mail groups and news groups.) Both @var{group}and @var{article} may be @code{nil}.There should be no result data from this function.@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)Set/remove/add marks on articles. Normally Gnus handles the articlemarks (such as read, ticked, expired etc) internally, and store them in@code{~/.newsrc.eld}. Some back ends (such as @sc{imap}) however carryall information about the articles on the server, so Gnus need topropagate the mark information to the server.ACTION is a list of mark setting requests, having this format:@example(RANGE ACTION MARK)@end exampleRange is a range of articles you wish to update marks on. Action is@code{set}, @code{add} or @code{del}, respectively used for removing allexisting marks and setting them as specified, adding (preserving themarks not mentioned) mark and removing (preserving the marks notmentioned) marks. Mark is a list of marks; where each mark is a symbol.Currently used marks are @code{read}, @code{tick}, @code{reply},@code{expire}, @code{killed}, @code{dormant}, @code{save},@code{download} and @code{unsend}, but your back end should, if possible,not limit itself to these.Given contradictory actions, the last action in the list should be theeffective one. That is, if your action contains a request to add the@code{tick} mark on article 1 and, later in the list, a request toremove the mark on the same article, the mark should in fact be removed.An example action list:@example(((5 12 30) 'del '(tick)) ((10 . 90) 'add '(read expire)) ((92 94) 'del '(read)))@end exampleThe function should return a range of articles it wasn't able to set themark on (currently not used for anything).There should be no result data from this function.@item (nnchoke-request-update-mark GROUP ARTICLE MARK)If the user tries to set a mark that the back end doesn't like, thisfunction may change the mark. Gnus will use whatever this functionreturns as the mark for @var{article} instead of the original@var{mark}. If the back end doesn't care, it must return the original@var{mark}, and not @code{nil} or any other type of garbage.The only use for this I can see is what @code{nnvirtual} does withit---if a component group is auto-expirable, marking an article as readin the virtual group should result in the article being marked asexpirable.There should be no result data from this function.@item (nnchoke-request-scan &optional GROUP SERVER)This function may be called at any time (by Gnus or anything else) torequest that the back end check for incoming articles, in one way oranother. A mail back end will typically read the spool file or query thePOP server when this function is invoked. The @var{group} doesn't haveto be heeded---if the back end decides that it is too much work justscanning for a single group, it may do a total scan of all groups. Itwould be nice, however, to keep things local if that's practical.There should be no result data from this function.@item (nnchoke-request-group-description GROUP &optional SERVER)The result data from this function should be a description of@var{group}.@exampledescription-line = name <TAB> description eolname = <string>description = <text>@end example@item (nnchoke-request-list-newsgroups &optional SERVER)The result data from this function should be the description of allgroups available on the server.@exampledescription-buffer = *description-line@end example@item (nnchoke-request-newgroups DATE &optional SERVER)The result data from this function should be all groups that werecreated after @samp{date}, which is in normal human-readable dateformat. The data should be in the active buffer format.@item (nnchoke-request-create-group GROUP &optional SERVER)This function should create an empty group with name @var{group}.There should be no return data.@item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)This function should run the expiry process on all articles in the@var{articles} range (which is currently a simple list of articlenumbers.) It is left up to the back end to decide how old articlesshould be before they are removed by this function. If @var{force} isnon-@code{nil}, all @var{articles} should be deleted, no matter how newthey are.This function should return a list of articles that it did not/was notable to delete.There should be no result data returned.@item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM&optional LAST)This function should move @var{article} (which is a number) from@var{group} by calling @var{accept-form}.This function should ready the article in question for moving byremoving any header lines it has added to the article, and generallyshould ``tidy up'' the article. Then it should @code{eval}@var{accept-form} in the buffer where the ``tidy'' article is. Thiswill do the actual copying. If this @code{eval} returns anon-@code{nil} value, the article should be removed.If @var{last} is @code{nil}, that means that there is a high likelihoodthat there will be more requests issued shortly, so that allows someoptimizations.The function should return a cons where the @code{car} is the group name andthe @code{cdr} is the article number that the article was entered as.There should be no data returned.@item (nnchoke-request-accept-article GROUP &optional SERVER LAST)This function takes the current buffer and inserts it into @var{group}.If @var{last} in @code{nil}, that means that there will be more calls tothis function in short order.The function should return a cons where the @code{car} is the group name andthe @code{cdr} is the article number that the article was entered as.There should be no data returned.@item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)This function should remove @var{article} (which is a number) from@var{group} and insert @var{buffer} there instead.There should be no data returned.@item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)This function should delete @var{group}. If @var{force}, it shouldreally delete all the articles in the group, and then delete the groupitself. (If there is such a thing as ``the group itself''.)There should be no data returned.@item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)This function should rename @var{group} into @var{new-name}. Allarticles in @var{group} should move to @var{new-name}.There should be no data returned.@end table@node Error Messaging@subsubsection Error Messaging@findex nnheader-report@findex nnheader-get-reportThe back ends should use the function @code{nnheader-report} to reporterror conditions---they should not raise errors when they aren't able toperform a request. The first argument to this function is the back endsymbol, and the rest are interpreted as arguments to @code{format} ifthere are multiple of them, or just a string if there is one of them.This function must always returns @code{nil}.@lisp(nnheader-report 'nnchoke "You did something totally bogus")(nnheader-report 'nnchoke "Could not request group %s" group)@end lispGnus, in turn, will call @code{nnheader-get-report} when it gets a@code{nil} back from a server, and this function returns the mostrecently reported message for the back end in question. This functiontakes one argument---the server symbol.Internally, these functions access @var{back-end}@code{-status-string},so the @code{nnchoke} back end will have its error message stored in@code{nnchoke-status-string}.@node Writing New Back Ends@subsubsection Writing New Back EndsMany back ends are quite similar. @code{nnml} is just like@code{nnspool}, but it allows you to edit the articles on the server.@code{nnmh} is just like @code{nnml}, but it doesn't use an active file,and it doesn't maintain overview databases. @code{nndir} is just like@code{nnml}, but it has no concept of ``groups'', and it doesn't allowediting articles.It would make sense if it were possible to ``inherit'' functions fromback ends when writing new back ends. And, indeed, you can do that if youwant to. (You don't have to if you don't want to, of course.)All the back ends declare their public variables and functions by using apackage called @code{nnoo}.To inherit functions from other back ends (and allow other back ends toinherit functions from the current back end), you should use thefollowing macros:@table @code@item nnoo-declareThis macro declares the first parameter to be a child of the subsequentparameters. For instance:@lisp(nnoo-declare nndir nnml nnmh)@end lisp@code{nndir} has declared here that it intends to inherit functions fromboth @code{nnml} and @code{nnmh}.@item defvooThis macro is equivalent to @code{defvar}, but registers the variable asa public server variable. Most state-oriented variables should bedeclared with @code{defvoo} instead of @code{defvar}.In addition to the normal @code{defvar} parameters, it takes a list ofvariables in the parent back ends to map the variable to when executinga function in those back ends.@lisp(defvoo nndir-directory nil "Where nndir will look for groups." nnml-current-directory nnmh-current-directory)@end lispThis means that @code{nnml-current-directory} will be set to@code{nndir-directory} when an @code{nnml} function is called on behalfof @code{nndir}. (The same with @code{nnmh}.)@item nnoo-define-basicsThis macro defines some common functions that almost all back ends shouldhave.@example(nnoo-define-basics nndir)@end example@item deffooThis macro is just like @code{defun} and takes the same parameters. Inaddition to doing the normal @code{defun} things, it registers thefunction as being public so that other back ends can inherit it.@item nnoo-map-functionsThis macro allows mapping of functions from the current back end tofunctions from the parent back ends.@example(nnoo-map-functions nndir (nnml-retrieve-headers 0 nndir-current-group 0 0) (nnmh-request-article 0 nndir-current-group 0 0))@end exampleThis means that when @code{nndir-retrieve-headers} is called, the first,third, and fourth parameters will be passed on to@code{nnml-retrieve-headers}, while the second parameter is set to thevalue of @code{nndir-current-group}.@item nnoo-importThis macro allows importing functions from back ends. It should be thelast thing in the source file, since it will only define functions thathaven't already been defined.@example(nnoo-import nndir (nnmh nnmh-request-list nnmh-request-newgroups) (nnml))@end exampleThis means that calls to @code{nndir-request-list} should just be passedon to @code{nnmh-request-list}, while all public functions from@code{nnml} that haven't been defined in @code{nndir} yet should bedefined now.@end tableBelow is a slightly shortened version of the @code{nndir} back end.@lisp;;; nndir.el --- single directory newsgroup access for Gnus;; Copyright (C) 1995,96 Free Software Foundation, Inc.;;; Code:(require 'nnheader)(require 'nnmh)(require 'nnml)(require 'nnoo)(eval-when-compile (require 'cl))(nnoo-declare nndir nnml nnmh)(defvoo nndir-directory nil "Where nndir will look for groups." nnml-current-directory nnmh-current-directory)(defvoo nndir-nov-is-evil nil "*Non-nil means that nndir will never retrieve NOV headers." nnml-nov-is-evil)(defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group)(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)(defvoo nndir-status-string "" nil nnmh-status-string)(defconst nndir-version "nndir 1.0");;; Interface functions.(nnoo-define-basics nndir)(deffoo nndir-open-server (server &optional defs) (setq nndir-directory (or (cadr (assq 'nndir-directory defs)) server)) (unless (assq 'nndir-directory defs) (push `(nndir-directory ,server) defs)) (push `(nndir-current-group ,(file-name-nondirectory (directory-file-name nndir-directory))) defs) (push `(nndir-top-directory ,(file-name-directory (directory-file-name nndir-directory))) defs) (nnoo-change-server 'nndir server defs))(nnoo-map-functions nndir (nnml-retrieve-headers 0 nndir-current-group 0 0) (nnmh-request-article 0 nndir-current-group 0 0) (nnmh-request-group nndir-current-group 0 0) (nnmh-close-group nndir-current-group 0))(nnoo-import nndir (nnmh nnmh-status-message nnmh-request-list nnmh-request-newgroups))(provide 'nndir)@end lisp@node Hooking New Back Ends Into Gnus@subsubsection Hooking New Back Ends Into Gnus@vindex gnus-valid-select-methodsHaving Gnus start using your new back end is rather easy---you justdeclare it with the @code{gnus-declare-backend} functions. This willenter the back end into the @code{gnus-valid-select-methods} variable.@code{gnus-declare-backend} takes two parameters---the back end name andan arbitrary number of @dfn{abilities}.Here's an example:@lisp(gnus-declare-backend "nnchoke" 'mail 'respool 'address)@end lispThe abilities can be:@table @code@item mailThis is a mailish back end---followups should (probably) go via mail.@item postThis is a newsish back end---followups should (probably) go via news.@item post-mailThis back end supports both mail and news.@item noneThis is neither a post nor mail back end---it's something completelydifferent.@item respoolIt supports respooling---or rather, it is able to modify its sourcearticles and groups.@item addressThe name of the server should be in the virtual server name. This istrue for almost all back ends.@item prompt-addressThe user should be prompted for an address when doing commands like@kbd{B} in the group buffer. This is true for back ends like@code{nntp}, but not @code{nnmbox}, for instance.@end table@node Mail-like Back Ends@subsubsection Mail-like Back EndsOne of the things that separate the mail back ends from the rest of theback ends is the heavy dependence by the mail back ends on commonfunctions in @file{nnmail.el}. For instance, here's the definition of@code{nnml-request-scan}:@lisp(deffoo nnml-request-scan (&optional group server) (setq nnml-article-file-alist nil) (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))@end lispIt simply calls @code{nnmail-get-new-mail} with a few parameters,and @code{nnmail} takes care of all the moving and splitting of themail.This function takes four parameters.@table @var@item methodThis should be a symbol to designate which back end is responsible forthe call.@item exit-functionThis function should be called after the splitting has been performed.@item temp-directoryWhere the temporary files should be stored.@item groupThis optional argument should be a group name if the splitting is to beperformed for one group only.@end table@code{nnmail-get-new-mail} will call @var{back-end}@code{-save-mail} tosave each article. @var{back-end}@code{-active-number} will be called tofind the article number assigned to this article.The function also uses the following variables:@var{back-end}@code{-get-new-mail} (to see whether to get new mail forthis back end); and @var{back-end}@code{-group-alist} and@var{back-end}@code{-active-file} to generate the new active file.@var{back-end}@code{-group-alist} should be a group-active alist, likethis:@example(("a-group" (1 . 10)) ("some-group" (34 . 39)))@end example@node Score File Syntax@subsection Score File SyntaxScore files are meant to be easily parseable, but yet extremelymallable. It was decided that something that had the same read syntaxas an Emacs Lisp list would fit that spec.Here's a typical score file:@lisp(("summary" ("win95" -10000 nil s) ("Gnus")) ("from" ("Lars" -1000)) (mark -100))@end lispBNF definition of a score file:@examplescore-file = "" / "(" *element ")"element = rule / atomrule = string-rule / number-rule / date-rulestring-rule = "(" quote string-header quote space *string-match ")"number-rule = "(" quote number-header quote space *number-match ")"date-rule = "(" quote date-header quote space *date-match ")"quote = <ascii 34>string-header = "subject" / "from" / "references" / "message-id" / "xref" / "body" / "head" / "all" / "followup"number-header = "lines" / "chars"date-header = "date"string-match = "(" quote <string> quote [ "" / [ space score [ "" / space date [ "" / [ space string-match-t ] ] ] ] ] ")"score = "nil" / <integer>date = "nil" / <natural number>string-match-t = "nil" / "s" / "substring" / "S" / "Substring" / "r" / "regex" / "R" / "Regex" / "e" / "exact" / "E" / "Exact" / "f" / "fuzzy" / "F" / "Fuzzy"number-match = "(" <integer> [ "" / [ space score [ "" / space date [ "" / [ space number-match-t ] ] ] ] ] ")"number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<="date-match = "(" quote <string> quote [ "" / [ space score [ "" / space date [ "" / [ space date-match-t ] ] ] ] ")"date-match-t = "nil" / "at" / "before" / "after"atom = "(" [ required-atom / optional-atom ] ")"required-atom = mark / expunge / mark-and-expunge / files / exclude-files / read-only / touchedoptional-atom = adapt / local / evalmark = "mark" space nil-or-numbernil-or-number = "nil" / <integer>expunge = "expunge" space nil-or-numbermark-and-expunge = "mark-and-expunge" space nil-or-numberfiles = "files" *[ space <string> ]exclude-files = "exclude-files" *[ space <string> ]read-only = "read-only" [ space "nil" / space "t" ]adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ]adapt-rule = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"local = "local" *[ space "(" <string> space <form> ")" ]eval = "eval" space <form>space = *[ " " / <TAB> / <NEWLINE> ]@end exampleAny unrecognized elements in a score file should be ignored, but notdiscarded.As you can see, white space is needed, but the type and amount of whitespace is irrelevant. This means that formatting of the score file isleft up to the programmer---if it's simpler to just spew it all out onone looong line, then that's ok.The meaning of the various atoms are explained elsewhere in thismanual (@pxref{Score File Format}).@node Headers@subsection HeadersInternally Gnus uses a format for storing article headers thatcorresponds to the @sc{nov} format in a mysterious fashion. One couldalmost suspect that the author looked at the @sc{nov} specification andjust shamelessly @emph{stole} the entire thing, and one would be right.@dfn{Header} is a severely overloaded term. ``Header'' is used inRFC 1036 to talk about lines in the head of an article (e.g.,@code{From}). It is used by many people as a synonym for``head''---``the header and the body''. (That should be avoided, in myopinion.) And Gnus uses a format internally that it calls ``header'',which is what I'm talking about here. This is a 9-element vector,basically, with each header (ouch) having one slot.These slots are, in order: @code{number}, @code{subject}, @code{from},@code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},@code{xref}, and @code{extra}. There are macros for accessing andsetting these slots---they all have predictable names beginning with@code{mail-header-} and @code{mail-header-set-}, respectively.All these slots contain strings, except the @code{extra} slot, whichcontains an alist of header/value pairs (@pxref{To From Newsgroups}).@node Ranges@subsection Ranges@sc{gnus} introduced a concept that I found so useful that I've startedusing it a lot and have elaborated on it greatly.The question is simple: If you have a large amount of objects that areidentified by numbers (say, articles, to take a @emph{wild} example)that you want to qualify as being ``included'', a normal sequence isn'tvery useful. (A 200,000 length sequence is a bit long-winded.)The solution is as simple as the question: You just collapse thesequence.@example(1 2 3 4 5 6 10 11 12)@end exampleis transformed into@example((1 . 6) (10 . 12))@end exampleTo avoid having those nasty @samp{(13 . 13)} elements to denote alonesome object, a @samp{13} is a valid element:@example((1 . 6) 7 (10 . 12))@end exampleThis means that comparing two ranges to find out whether they are equalis slightly tricky:@example((1 . 5) 7 8 (10 . 12))@end exampleand@example((1 . 5) (7 . 8) (10 . 12))@end exampleare equal. In fact, any non-descending list is a range:@example(1 2 3 4 5)@end exampleis a perfectly valid range, although a pretty long-winded one. This isalso valid:@example(1 . 5)@end exampleand is equal to the previous range.Here's a BNF definition of ranges. Of course, one must remember thesemantic requirement that the numbers are non-descending. (Any numberof repetition of the same number is allowed, but apt to disappear inrange handling.)@examplerange = simple-range / normal-rangesimple-range = "(" number " . " number ")"normal-range = "(" start-contents ")"contents = "" / simple-range *[ " " contents ] / number *[ " " contents ]@end exampleGnus currently uses ranges to keep track of read articles and articlemarks. I plan on implementing a number of range operators in C if ThePowers That Be are willing to let me. (I haven't asked yet, because Ineed to do some more thinking on what operators I need to make lifetotally range-based without ever having to convert back to normalsequences.)@node Group Info@subsection Group InfoGnus stores all permanent info on groups in a @dfn{group info} list.This list is from three to six elements (or more) long and exhaustivelydescribes the group.Here are two example group infos; one is a very simple group while thesecond is a more complex one:@example("no.group" 5 ((1 . 54324)))("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55)) ((tick (15 . 19)) (replied 3 6 (19 . 3))) (nnml "") ((auto-expire . t) (to-address . "ding@@gnus.org")))@end exampleThe first element is the @dfn{group name}---as Gnus knows the group,anyway. The second element is the @dfn{subscription level}, whichnormally is a small integer. (It can also be the @dfn{rank}, which is acons cell where the @code{car} is the level and the @code{cdr} is thescore.) The third element is a list of ranges of read articles. Thefourth element is a list of lists of article marks of various kinds.The fifth element is the select method (or virtual server, if you like).The sixth element is a list of @dfn{group parameters}, which is whatthis section is about.Any of the last three elements may be missing if they are not required.In fact, the vast majority of groups will normally only have the firstthree elements, which saves quite a lot of cons cells.Here's a BNF definition of the group info format:@exampleinfo = "(" group space ralevel space read [ "" / [ space marks-list [ "" / [ space method [ "" / space parameters ] ] ] ] ] ")"group = quote <string> quoteralevel = rank / levellevel = <integer in the range of 1 to inf>rank = "(" level "." score ")"score = <integer in the range of 1 to inf>read = rangemarks-lists = nil / "(" *marks ")"marks = "(" <string> range ")"method = "(" <string> *elisp-forms ")"parameters = "(" *elisp-forms ")"@end exampleActually that @samp{marks} rule is a fib. A @samp{marks} is a@samp{<string>} consed on to a @samp{range}, but that's a bitch to sayin pseudo-BNF.If you have a Gnus info and want to access the elements, Gnus offers aseries of macros for getting/setting these elements.@table @code@item gnus-info-group@itemx gnus-info-set-group@findex gnus-info-group@findex gnus-info-set-groupGet/set the group name.@item gnus-info-rank@itemx gnus-info-set-rank@findex gnus-info-rank@findex gnus-info-set-rankGet/set the group rank (@pxref{Group Score}).@item gnus-info-level@itemx gnus-info-set-level@findex gnus-info-level@findex gnus-info-set-levelGet/set the group level.@item gnus-info-score@itemx gnus-info-set-score@findex gnus-info-score@findex gnus-info-set-scoreGet/set the group score (@pxref{Group Score}).@item gnus-info-read@itemx gnus-info-set-read@findex gnus-info-read@findex gnus-info-set-readGet/set the ranges of read articles.@item gnus-info-marks@itemx gnus-info-set-marks@findex gnus-info-marks@findex gnus-info-set-marksGet/set the lists of ranges of marked articles.@item gnus-info-method@itemx gnus-info-set-method@findex gnus-info-method@findex gnus-info-set-methodGet/set the group select method.@item gnus-info-params@itemx gnus-info-set-params@findex gnus-info-params@findex gnus-info-set-paramsGet/set the group parameters.@end tableAll the getter functions take one parameter---the info list. The setterfunctions take two parameters---the info list and the new value.The last three elements in the group info aren't mandatory, so it may benecessary to extend the group info before setting the element. If thisis necessary, you can just pass on a non-@code{nil} third parameter tothe three final setter functions to have this happen automatically.@node Extended Interactive@subsection Extended Interactive@cindex interactive@findex gnus-interactiveGnus extends the standard Emacs @code{interactive} specificationslightly to allow easy use of the symbolic prefix (@pxref{SymbolicPrefixes}). Here's an example of how this is used:@lisp(defun gnus-summary-increase-score (&optional score symp) (interactive (gnus-interactive "P\ny")) ... )@end lispThe best thing to do would have been to implement@code{gnus-interactive} as a macro which would have returned an@code{interactive} form, but this isn't possible since Emacs checkswhether a function is interactive or not by simply doing an @code{assq}on the lambda form. So, instead we have @code{gnus-interactive}function that takes a string and returns values that are usable to@code{interactive}.This function accepts (almost) all normal @code{interactive} specs, butadds a few more.@table @samp@item y@vindex gnus-current-prefix-symbolThe current symbolic prefix---the @code{gnus-current-prefix-symbol}variable.@item Y@vindex gnus-current-prefix-symbolsA list of the current symbolic prefixes---the@code{gnus-current-prefix-symbol} variable.@item AThe current article number---the @code{gnus-summary-article-number}function.@item HThe current article header---the @code{gnus-summary-article-header}function.@item gThe current group name---the @code{gnus-group-group-name}function.@end table@node Emacs/XEmacs Code@subsection Emacs/XEmacs Code@cindex XEmacs@cindex EmacsenWhile Gnus runs under Emacs, XEmacs and Mule, I decided that one of theplatforms must be the primary one. I chose Emacs. Not because I don'tlike XEmacs or Mule, but because it comes first alphabetically.This means that Gnus will byte-compile under Emacs with nary a warning,while XEmacs will pump out gigabytes of warnings while byte-compiling.As I use byte-compilation warnings to help me root out trivial errors inGnus, that's very useful.I've also consistently used Emacs function interfaces, but have usedGnusey aliases for the functions. To take an example: Emacs defines a@code{run-at-time} function while XEmacs defines a @code{start-itimer}function. I then define a function called @code{gnus-run-at-time} thattakes the same parameters as the Emacs @code{run-at-time}. When runningGnus under Emacs, the former function is just an alias for the latter.However, when running under XEmacs, the former is an alias for thefollowing function:@lisp(defun gnus-xmas-run-at-time (time repeat function &rest args) (start-itimer "gnus-run-at-time" `(lambda () (,function ,@@args)) time repeat))@end lispThis sort of thing has been done for bunches of functions. Gnus doesnot redefine any native Emacs functions while running under XEmacs---itdoes this @code{defalias} thing with Gnus equivalents instead. Cleanerall over.In the cases where the XEmacs function interface was obviously cleaner,I used it instead. For example @code{gnus-region-active-p} is an aliasfor @code{region-active-p} in XEmacs, whereas in Emacs it is a function.Of course, I could have chosen XEmacs as my native platform and donemapping functions the other way around. But I didn't. The performancehit these indirections impose on Gnus under XEmacs should be slight.@node Various File Formats@subsection Various File Formats@menu* Active File Format:: Information on articles and groups available.* Newsgroups File Format:: Group descriptions.@end menu@node Active File Format@subsubsection Active File FormatThe active file lists all groups available on the server inquestion. It also lists the highest and lowest current article numbersin each group.Here's an excerpt from a typical active file:@examplesoc.motss 296030 293865 yalt.binaries.pictures.fractals 3922 3913 ncomp.sources.unix 1605 1593 mcomp.binaries.ibm.pc 5097 5089 yno.general 1000 900 y@end exampleHere's a pseudo-BNF definition of this file:@exampleactive = *group-linegroup-line = group spc high-number spc low-number spc flag <NEWLINE>group = <non-white-space string>spc = " "high-number = <non-negative integer>low-number = <positive integer>flag = "y" / "n" / "m" / "j" / "x" / "=" group@end exampleFor a full description of this file, see the manual pages for@samp{innd}, in particular @samp{active(5)}.@node Newsgroups File Format@subsubsection Newsgroups File FormatThe newsgroups file lists groups along with their descriptions. Not allgroups on the server have to be listed, and not all groups in the filehave to exist on the server. The file is meant purely as information tothe user.The format is quite simple; a group name, a tab, and the description.Here's the definition:@examplenewsgroups = *lineline = group tab description <NEWLINE>group = <non-white-space string>tab = <TAB>description = <string>@end example@page@node Emacs for Heathens@section Emacs for HeathensBelieve it or not, but some people who use Gnus haven't really usedEmacs much before they embarked on their journey on the Gnus Love Boat.If you are one of those unfortunates whom ``@kbd{C-M-a}'', ``kill theregion'', and ``set @code{gnus-flargblossen} to an alist where the keyis a regexp that is used for matching on the group name'' are magicalphrases with little or no meaning, then this appendix is for you. Ifyou are already familiar with Emacs, just ignore this and go fondle yourcat instead.@menu* Keystrokes:: Entering text and executing commands.* Emacs Lisp:: The built-in Emacs programming language.@end menu@node Keystrokes@subsection Keystrokes@itemize @bullet@itemQ: What is an experienced Emacs user?@itemA: A person who wishes that the terminal had pedals.@end itemizeYes, when you use Emacs, you are apt to use the control key, the shiftkey and the meta key a lot. This is very annoying to some people(notably @code{vi}le users), and the rest of us just love the hell outof it. Just give up and submit. Emacs really does stand for``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as youmay have heard from other disreputable sources (like the Emacs author).The shift keys are normally located near your pinky fingers, and arenormally used to get capital letters and stuff. You probably use it allthe time. The control key is normally marked ``CTRL'' or something likethat. The meta key is, funnily enough, never marked as such on anykeyboard. The one I'm currently at has a key that's marked ``Alt'',which is the meta key on this keyboard. It's usually located somewhereto the left hand side of the keyboard, usually on the bottom row.Now, us Emacs people don't say ``press the meta-control-m key'',because that's just too inconvenient. We say ``press the @kbd{C-M-m}key''. @kbd{M-} is the prefix that means ``meta'' and ``C-'' is theprefix that means ``control''. So ``press @kbd{C-k}'' means ``pressdown the control key, and hold it down while you press @kbd{k}''.``Press @kbd{C-M-k}'' means ``press down and hold down the meta key andthe control key and then press @kbd{k}''. Simple, ay?This is somewhat complicated by the fact that not all keyboards have ameta key. In that case you can use the ``escape'' key. Then @kbd{M-k}means ``press escape, release escape, press @kbd{k}''. That's much morework than if you have a meta key, so if that's the case, I respectfullysuggest you get a real keyboard with a meta key. You can't live withoutit.@node Emacs Lisp@subsection Emacs LispEmacs is the King of Editors because it's really a Lisp interpreter.Each and every key you tap runs some Emacs Lisp code snippet, and sinceEmacs Lisp is an interpreted language, that means that you can configureany key to run any arbitrary code. You just, like, do it.Gnus is written in Emacs Lisp, and is run as a bunch of interpretedfunctions. (These are byte-compiled for speed, but it's stillinterpreted.) If you decide that you don't like the way Gnus doescertain things, it's trivial to have it do something a different way.(Well, at least if you know how to write Lisp code.) However, that'sbeyond the scope of this manual, so we are simply going to talk aboutsome common constructs that you normally use in your @file{.emacs} fileto customize Gnus.If you want to set the variable @code{gnus-florgbnize} to four (4), youwrite the following:@lisp(setq gnus-florgbnize 4)@end lispThis function (really ``special form'') @code{setq} is the one that canset a variable to some value. This is really all you need to know. Nowyou can go and fill your @code{.emacs} file with lots of these to changehow Gnus works.If you have put that thing in your @code{.emacs} file, it will be readand @code{eval}ed (which is lisp-ese for ``run'') the next time youstart Emacs. If you want to change the variable right away, simply say@kbd{C-x C-e} after the closing parenthesis. That will @code{eval} theprevious ``form'', which is a simple @code{setq} statement here.Go ahead---just try it, if you're located at your Emacs. After you@kbd{C-x C-e}, you will see @samp{4} appear in the echo area, whichis the return value of the form you @code{eval}ed.Some pitfalls:If the manual says ``set @code{gnus-read-active-file} to @code{some}'',that means:@lisp(setq gnus-read-active-file 'some)@end lispOn the other hand, if the manual says ``set @code{gnus-nntp-server} to@samp{nntp.ifi.uio.no}'', that means:@lisp(setq gnus-nntp-server "nntp.ifi.uio.no")@end lispSo be careful not to mix up strings (the latter) with symbols (theformer). The manual is unambiguous, but it can be confusing.@page@include gnus-faq.texi@node Index@chapter Index@printindex cp@node Key Index@chapter Key Index@printindex ky@summarycontents@contents@bye@iftex@iflatex\end{document}@end iflatex@end iftex@c End:@ignore arch-tag: c9fa47e7-78ca-4681-bda9-9fef45d1c819@end ignore