\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Gnus 5.4.39 Manual
+@settitle Gnus 5.4.52 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Gnus 5.4.39 Manual
+@title Gnus 5.4.52 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Gnus 5.4.39.
+This manual corresponds to Gnus 5.4.52.
@end ifinfo
What Gnus does when it encounters a new group is determined by the
@code{gnus-subscribe-newsgroup-method} variable.
-This variable should contain a function. Some handy pre-fab values
-are:
+This variable should contain a function. This function will be called
+with the name of the new group as the only parameter.
+
+Some handy pre-fab functions are:
@table @code
Describe all groups (@code{gnus-group-describe-all-groups}). If given a
prefix, force Gnus to re-read the description file from the server.
-@item V
+@item H v
+@itemx V
@kindex V (Group)
+@kindex H v (Group)
@cindex version
@findex gnus-version
Display current Gnus version numbers (@code{gnus-version}).
@item S O p
@kindex S O p (Summary)
@findex gnus-uu-digest-post-forward
+@cindex digests
+@cindex making digests
Digest the current series and forward the result to a newsgroup
-(@code{gnus-uu-digest-mail-forward}).
+(@code{gnus-uu-digest-mail-forward}). This command uses the
+process/prefix convention.
@item S u
@kindex S u (Summary)
(setq gnus-thread-sort-functions
'(gnus-thread-sort-by-number
gnus-thread-sort-by-subject
- gnus-thread-sort-by-score))
+ gnus-thread-sort-by-total-score))
@end lisp
The threads that have highest score will be displayed first in the
@code{Archive-name} line and use that as a suggestion for the file
name.
+Here's an example function to clean up file names somewhat. If you have
+lots of mail groups that are called things like
+@samp{nnml:mail.whatever}, you may want to chop off the beginning of
+these group names before creating the file name to save to. The
+following 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-name
Finally, you have the @code{gnus-use-long-file-name} variable. If it is
@code{nil}, all the preceding functions will replace all periods
that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You
have to get it all exactly right. No fuzzy searches, I'm afraid.
+The current select method will be used when fetching by
+@code{Message-ID} from non-news select method, but you can override this
+by giving this command a prefix.
+
@vindex gnus-refer-article-method
If the group you are reading is located on a backend that does not
support fetching by @code{Message-ID} very well (like @code{nnspool}),
@subsection Pick and Read
@cindex pick and read
-Some newsreaders (like @code{nn} and, uhm, @code{nn}) use a two-phased
-reading interface. The user first marks the articles she wants to read
-from a summary buffer. Then she starts reading the articles with just
-an article buffer displayed.
+Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
+a two-phased reading interface. The user first marks the articles she
+wants to read from a summary buffer. Then she starts reading the
+articles with just an article buffer displayed.
@findex gnus-pick-mode
@kindex M-x gnus-pick-mode
If this variable is non-@code{nil}, Gnus will try to keep the tree
buffer as small as possible to allow more room for the other Gnus
windows. If this variable is a number, the tree buffer will never be
-higher than that number. The default is @code{t}.
+higher than that number. The default is @code{t}. Note that if you
+have several windows displayed side-by-side in a frame and the tree
+buffer is one of these, minimizing the tree window will also resize all
+other windows that are displayed next to it.
@item gnus-generate-tree-function
@vindex gnus-generate-tree-function
server.
@findex nntp-open-rlogin
+@findex nntp-open-telnet
@findex nntp-open-network-stream
@item nntp-open-connection-function
@vindex nntp-open-connection-function
-This function is used to connect to the remote system. Two pre-made
+This function is used to connect to the remote system. Three pre-made
functions are @code{nntp-open-network-stream}, which is the default, and
simply connects to some port or other on the remote system. The other
-is @code{nntp-open-rlogin}, which does an rlogin on the remote system,
-and then does a telnet to the @sc{nntp} server available there.
+two are @code{nntp-open-rlogin}, which does an @samp{rlogin} on the
+remote system, and then does a @samp{telnet} to the @sc{nntp} server
+available there, and @code{nntp-open-telnet}, which does a @samp{telnet}
+to the remote system and then another @samp{telnet} to get to the
+@sc{nntp} server.
+
+@code{nntp-open-rlogin}-related variables:
+
+@table @code
@item nntp-rlogin-parameters
@vindex nntp-rlogin-parameters
-If you use @code{nntp-open-rlogin} as the
-@code{nntp-open-connection-function}, this list will be used as the
-parameter list given to @code{rsh}.
+This list will be used as the parameter list given to @code{rsh}.
+
+@item nntp-rlogin-user-name
+@vindex nntp-rlogin-user-name
+User name on the remote system.
+
+@end table
+
+@code{nntp-open-telnet}-related variables:
+
+@table @code
+@item nntp-telnet-command
+@vindex nntp-telnet-command
+Command used to start @samp{telnet}.
+
+@item nntp-telnet-switches
+@vindex nntp-telnet-switches
+List of strings to be used as the switches to the telnet command.
+
+@item nntp-telnet-user-name
+@vindex nntp-telnet-user-name
+User name to log in on the remote system as.
+
+@item nntp-telnet-passwd
+@vindex nntp-telnet-passwd
+Password to use when logging in.
+
+@item nntp-telnet-parameters
+@vindex nntp-telnet-parameters
+A list of strings that will be executed as a command after logging in
+via telnet.
+
+@end table
@item nntp-end-of-line
@vindex nntp-end-of-line
(eval (ding)))
@end lisp
-This example demonstrates absolutely everything about a score file.
+This example demonstrates most score file elements. For a different
+approach, 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 it
function. 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 messages
+not 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 lisp
+
+This might be dangerous, though.
+
@item gnus-nocem-directory
@vindex gnus-nocem-directory
This is where Gnus will store its NoCeM cache files. The default is
@end table
+Using NoCeM could potentially be a memory hog. If you have many living
+(i. e., subscribed or unsubscribed groups), your Emacs process will grow
+big. If this is a problem, you should kill off all (or most) of your
+unsubscribed groups (@pxref{Subscription Commands}).
+
@node Picons
@section Picons
false pretenses. I press @kbd{g} and Gnus merrily informs me that I
have 10 new emails. I say ``Golly gee! Happy is me!'' and selects the
mail group, only to find two pyramid schemes, seven advertisements
-``New! Miracle tonic for growing full, lustrouos hair on your toes!''
+(``New! Miracle tonic for growing full, lustrouos hair on your toes!'')
and one mail asking me to repent and find some god.
This is annoying.
First, pick one (1) legal mail address that you can be reached at, and
put it in your @code{From} header of all your news articles. (I've
-chosen @samp{larsi@@trym.ifi.uio.no}.)
+chosen @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 your
+sysadm whether your sendmail installation accepts keywords in the local
+part of the mail address.)
@lisp
(setq message-default-news-headers
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} server
+and do not include your email address explicitly in the @code{To}
+header. Why they do this is unknown---perhaps it's to thwart this
+twarting scheme? In any case, this is trivial to deal with---you just
+put anything not addressed to you in the @samp{spam} group by ending
+your fancy split rule in this way:
+
+@lisp
+(
+ ...
+ (to "larsi" "misc")
+ "spam")
+@end lisp
+
In my experience, this will sort virtually everything into the right
group. You still have to check the @samp{spam} group from time to time to
check for legitimate mail, though. If you feel like being a good net
citizen, you can even send off complaints to the proper authorities on
each unsolicited commercial email---at your leisure.
+If you are also a lazy net citizen, you will probably prefer complaining
+automatically with the @file{gnus-junk.el} package, availiable FOR FREE
+at @file{<URL:http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html>}.
+Since most e-mail spam is sent automatically, this may reconcile the
+cosmic balance somewhat.
+
This works for me. It allows people an easy way to contact me (they can
just press @kbd{r} in the usual way), and I'm not bothered at all with
spam. It's a win-win situation. Forging @code{From} headers to point
Ulrik Dickow,
Dave Disser,
Joev Dubach,
+Michael Welsh Duggan,
Paul Eggert,
Michael Ernst,
Luc Van Eycken,
Sam Falkner,
Paul Franklin,
+Arne Georg Gleditsch,
David S. Goldberg,
D. Hall,
Magnus Hammerin,
Raja R. Harinath,
Hisashige Kenji, @c Hisashige
Marc Horowitz,
+Gunnar Horrigmo,
+Brad Howes,
François Felix Ingrand,
Ishikawa Ichiro, @c Ishikawa
Lee Iverson,
Rajappa Iyer,
Randell Jesup,
Fred Johansen,
+Kim-Minh Kaplan,
Greg Klanderman,
Karl Kleinpaste,
Peter Skov Knudsen,
Colin Rafferty,
Bart Robinson,
Jason Rumney,
+Dewey M. Sasser,
Loren Schall,
Dan Schmidt,
Ralph Schleicher,
Danny Siu,
Paul D. Smith,
Jeff Sparkes,
+Toby Speight,
Michael Sperber,
Richard Stallman,
Greg Stark,
Teddy,
Chuck Thompson,
Philippe Troin,
+Aaron M. Ucko,
Jan Vroonhof,
Barry A. Warsaw,
Christoph Wedler,
and general method of operations.
@menu
+* Gnus Utility Functions:: Common functions and variable to use.
* Backend Interface:: How Gnus communicates with the servers.
* Score File Syntax:: A BNF definition of the score file standard.
* Headers:: How Gnus stores headers internally.
@end menu
+@node Gnus Utility Functions
+@subsection Gnus Utility Functions
+@cindex Gnus utility functions
+@cindex utility functions
+@cindex functions
+@cindex internal variables
+
+When writing small functions to be run from hooks (and stuff), it's
+vital 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-name
+This variable holds the name of the current newsgroup.
+
+@item gnus-find-method-for-group
+@findex gnus-find-method-for-group
+A function that returns the select method for @var{group}.
+
+@item gnus-group-real-name
+@findex gnus-group-real-name
+Takes a full (prefixed) Gnus group name, and returns the unprefixed
+name.
+
+@item gnus-group-prefixed-name
+@findex gnus-group-prefixed-name
+Takes an unprefixed group name and a select method, and returns the full
+(prefixed) Gnus group name.
+
+@item gnus-get-info
+@findex gnus-get-info
+Return the group info list for @var{group}.
+
+@item gnus-add-current-to-buffer-list
+@findex gnus-add-current-to-buffer-list
+Add the current buffer to the list of buffers to be killed on Gnus
+exit.
+
+@item gnus-continuum-version
+@findex gnus-continuum-version
+Take a Gnus version string as a parameter and returns a floating point
+number. Earlier versions will always get a lower number than later
+versions.
+
+@item gnus-group-read-only-p
+@findex gnus-group-read-only-p
+Say whether @var{group} is read-only or not.
+
+@item gnus-news-group-p
+@findex gnus-news-group-p
+Say whether @var{group} came from a news backend.
+
+@item gnus-ephemeral-group-p
+@findex gnus-ephemeral-group-p
+Say whether @var{group} is ephemeral or not.
+
+@item gnus-server-to-method
+@findex gnus-server-to-method
+Return the select method corresponding to @var{server}.
+
+@item gnus-server-equal
+@findex gnus-server-equal
+Say whether two virtual servers are equal.
+
+@item gnus-group-native-p
+@findex gnus-group-native-p
+Say whether @var{group} is native or not.
+
+@item gnus-group-secondary-p
+@findex gnus-group-secondary-p
+Say whether @var{group} is secondary or not.
+
+@item gnus-group-foreign-p
+@findex gnus-group-foreign-p
+Say whether @var{group} is foreign or not.
+
+@item group-group-find-parameter
+@findex group-group-find-parameter
+Return the parameter list of @var{group}. If given a second parameter,
+return the value of that parameter for @var{group}.
+
+@item gnus-group-set-parameter
+@findex gnus-group-set-parameter
+Takes three parameters; @var{group}, @var{parameter} and @var{value}.
+
+@item gnus-narrow-to-body
+@findex gnus-narrow-to-body
+Narrow the current buffer to the body of the article.
+
+@item gnus-check-backend-function
+@findex gnus-check-backend-function
+Takes two parameters, @var{function} and @var{group}. If the backend
+@var{group} comes from supports @var{function}, return non-@code{nil}.
+
+@lisp
+(gnus-check-backend-function "request-scan" "nnml:misc")
+=> t
+@end lisp
+
+@item gnus-read-method
+@findex gnus-read-method
+Prompt the user for a select method.
+
+@end table
+
+
@node Backend Interface
@subsection Backend Interface
files = "files" *[ space <string> ]
exclude-files = "exclude-files" *[ space <string> ]
read-only = "read-only" [ space "nil" / space "t" ]
-adapt = "adapt" [ space "nil" / space "t" / space adapt-rule ]
+adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
adapt-rule = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
local = "local" *[ space "(" <string> space <form> ")" ]
eval = "eval" space <form>
@samp{<string>} consed on to a @samp{range}, but that's a bitch to say
in pseudo-BNF.
+If you have a Gnus info and want to access the elements, Gnus offers a
+series 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-group
+Get/set the group name.
+
+@item gnus-info-rank
+@itemx gnus-info-set-rank
+@findex gnus-info-rank
+@findex gnus-info-set-rank
+Get/set the group rank.
+
+@item gnus-info-level
+@itemx gnus-info-set-level
+@findex gnus-info-level
+@findex gnus-info-set-level
+Get/set the group level.
+
+@item gnus-info-score
+@itemx gnus-info-set-score
+@findex gnus-info-score
+@findex gnus-info-set-score
+Get/set the group score.
+
+@item gnus-info-read
+@itemx gnus-info-set-read
+@findex gnus-info-read
+@findex gnus-info-set-read
+Get/set the ranges of read articles.
+
+@item gnus-info-marks
+@itemx gnus-info-set-marks
+@findex gnus-info-marks
+@findex gnus-info-set-marks
+Get/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-method
+Get/set the group select method.
+
+@item gnus-info-params
+@itemx gnus-info-set-params
+@findex gnus-info-params
+@findex gnus-info-set-params
+Get/set the group parameters.
+@end table
+
+All the getter functions take one parameter---the info list. The setter
+functions take two parameters---the info list and the new value.
+
+The last three elements in the group info aren't mandatory, so it may be
+necessary to extend the group info before setting the element. If this
+is necessary, you can just pass on a non-@code{nil} third parameter to
+the three final setter functions to have this happen automatically.
+
@node Emacs/XEmacs Code
@subsection Emacs/XEmacs Code
does this @code{defalias} thing with Gnus equivalents instead. Cleaner
all over.
+In the cases when the XEmacs function interface was obviously
+cleaner, I used it instead. For example @code{gnus-region-active-p}
+is an alias for @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 done
mapping functions the other way around. But I didn't. The performance
hit these indirections impose on Gnus under XEmacs should be slight.