X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=texi%2Fgnus.texi;h=a7b2044d91d5bcfd7dec40c1b0f6a20c970c14b2;hp=ca8a84ea7574743faafd83f6e621edc29ea143d9;hb=bbc2a5e2fc97f170fbfe9172c0fd98079824048f;hpb=7e2b201713a622b9acdefbf481b84cd69aa4f622;ds=sidebyside diff --git a/texi/gnus.texi b/texi/gnus.texi index ca8a84ea7..a7b2044d9 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -16,19 +16,13 @@ Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001, Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. +Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', +and with the Back-Cover Texts as in (a) below. A copy of the license +is included in the section entitled ``GNU Free Documentation License''. + +(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and +modify this GNU manual. Buying copies from the FSF supports it in +developing GNU and promoting software freedom.'' @end quotation @end copying @@ -52,7 +46,7 @@ license to the document, as described in section 6 of the license. \begin{document} % Adjust ../Makefile.in if you change the following line: -\newcommand{\gnusversionname}{No Gnus v0.9} +\newcommand{\gnusversionname}{No Gnus v0.11} \newcommand{\gnuschaptername}{} \newcommand{\gnussectionname}{} @@ -362,7 +356,7 @@ spool or your mbox file. All at the same time, if you want to push your luck. @c Adjust ../Makefile.in if you change the following line: -This manual corresponds to No Gnus v0.9. +This manual corresponds to No Gnus v0.11. @end ifinfo @@ -392,7 +386,7 @@ people should be empowered to do what they want by using (or abusing) the program. @c Adjust ../Makefile.in if you change the following line: -This manual corresponds to No Gnus v0.9. +This manual corresponds to No Gnus v0.11. @heading Other related manuals @itemize @@ -833,6 +827,7 @@ Various * Fuzzy Matching:: What's the big fuzz? * Thwarting Email Spam:: Simple ways to avoid unsolicited commercial email. * Spam Package:: A package for filtering and processing spam. +* The Gnus Registry:: A package for tracking messages by Message-ID. * Other modes:: Interaction with other modes. * Various Various:: Things that are really various. @@ -1736,6 +1731,7 @@ long as Gnus is active. * Exiting Gnus:: Stop reading news and get some work done. * Group Topics:: A folding group mode divided into topics. * Non-ASCII Group Names:: Accessing groups of non-English names. +* Searching:: Mail search engines. * Misc Group Stuff:: Other stuff that you can to do. @end menu @@ -3167,7 +3163,7 @@ message). As a workaround, it might help to add the variable in question to @code{gnus-newsgroup-variables}. @xref{Various Summary Stuff}. So if you want to set @code{message-from-style} via the group parameters, then you may need the following statement elsewhere in your -@file{~/.gnus} file: +@file{~/.gnus.el} file: @lisp (add-to-list 'gnus-newsgroup-variables 'message-from-style) @@ -4356,6 +4352,713 @@ names should be the same in both groups. Otherwise the Newsgroups header will be displayed incorrectly in the article buffer. +@node Searching +@section Searching + +@menu +* nnir:: Searching on IMAP, with swish, namazu, etc. +* nnmairix:: Searching maildir, MH or mbox with Mairix. +@end menu + +@cindex Searching + +FIXME: This node is a stub. + +FIXME: Add a brief overview of Gnus search capabilities. A brief +comparison of nnir, nnmairix, contrib/gnus-namazu would be nice +as well. + +FIXME: Explain difference to @ref{Searching for Articles}, add reference +and back-reference. + +@node nnir +@subsection nnir + +FIXME: As a first step, convert the commentary of @file{nnir} to texi. +@cindex nnir + +@node nnmairix +@subsection nnmairix + +@cindex mairix +@cindex nnmairix +This paragraph describes how to set up mairix and the back end +@code{nnmairix} for indexing and searching your mail from within +Gnus. Additionally, you can create permanent ``smart'' groups which are +bound to mairix searches and are automatically updated. + +@menu +* About mairix:: About the mairix mail search engine +* nnmairix requirements:: What you will need for using nnmairix +* What nnmairix does:: What does nnmairix actually do? +* Setting up mairix:: Set up your mairix installation +* Configuring nnmairix:: Set up the nnmairix back end +* nnmairix keyboard shortcuts:: List of available keyboard shortcuts +* Propagating marks:: How to propagate marks from nnmairix groups +* nnmairix tips and tricks:: Some tips, tricks and examples +* nnmairix caveats:: Some more stuff you might want to know +@end menu + +@c FIXME: The markup in this section might need improvement. +@c E.g. adding @samp, @var, @file, @command, etc. +@c Cf. (info "(texinfo)Indicating") + +@node About mairix +@subsubsection About mairix + +Mairix is a tool for indexing and searching words in locally stored +mail. It was written by Richard Curnow and is licensed under the +GPL. Mairix comes with most popular GNU/Linux distributions, but it also +runs under Windows (with cygwin), Mac OS X and Solaris. The homepage can +be found at +@uref{http://www.rpcurnow.force9.co.uk/mairix/index.html} + +Though mairix might not be as flexible as other search tools like +swish++ or namazu, which you can use via the @code{nnir} back end, it +has the prime advantage of being incredibly fast. On current systems, it +can easily search through headers and message bodies of thousands and +thousands of mails in well under a second. Building the database +necessary for searching might take a minute or two, but only has to be +done once fully. Afterwards, the updates are done incrementally and +therefore are really fast, too. Additionally, mairix is very easy to set +up. + +For maximum speed though, mairix should be used with mails stored in +@code{Maildir} or @code{MH} format (this includes the @code{nnml} back +end), although it also works with mbox. Mairix presents the search +results by populating a @emph{virtual} maildir/MH folder with symlinks +which point to the ``real'' message files (if mbox is used, copies are +made). Since mairix already presents search results in such a virtual +mail folder, it is very well suited for using it as an external program +for creating @emph{smart} mail folders, which represent certain mail +searches. This is similar to a Kiboze group (@pxref{Kibozed Groups}), +but much faster. + +@node nnmairix requirements +@subsubsection nnmairix requirements + +Mairix searches local mail---that means, mairix absolutely must have +direct access to your mail folders. If your mail resides on another +server (e.g. an @acronym{IMAP} server) and you happen to have shell +access, @code{nnmairix} supports running mairix remotely, e.g. via ssh. + +Additionally, @code{nnmairix} only supports the following Gnus back +ends: @code{nnml}, @code{nnmaildir}, and @code{nnimap}. You must use +one of these back ends for using @code{nnmairix}. Other back ends, like +@code{nnmbox}, @code{nnfolder} or @code{nnmh}, won't work. + +If you absolutely must use mbox and still want to use @code{nnmairix}, +you can set up a local @acronym{IMAP} server, which you then access via +@code{nnimap}. This is a rather massive setup for accessing some mbox +files, so just change to MH or Maildir already... However, if you're +really, really passionate about using mbox, you might want to look into +the package @file{mairix.el}, which comes with Emacs 23. + +@node What nnmairix does +@subsubsection What nnmairix does + +The back end @code{nnmairix} enables you to call mairix from within Gnus, +either to query mairix with a search term or to update the +database. While visiting a message in the summary buffer, you can use +several pre-defined shortcuts for calling mairix, e.g. to quickly +search for all mails from the sender of the current message or to +display the whole thread associated with the message, even if the +mails are in different folders. + +Additionally, you can create permanent @code{nnmairix} groups which are bound +to certain mairix searches. This way, you can easily create a group +containing mails from a certain sender, with a certain subject line or +even for one specific thread based on the Message-ID. If you check for +new mail in these folders (e.g. by pressing @kbd{g} or @kbd{M-g}), they +automatically update themselves by calling mairix. + +You might ask why you need @code{nnmairix} at all, since mairix already +creates the group, populates it with links to the mails so that you can +then access it with Gnus, right? Well, this @emph{might} work, but often +does not---at least not without problems. Most probably you will get +strange article counts, and sometimes you might see mails which Gnus +claims have already been canceled and are inaccessible. This is due to +the fact that Gnus isn't really amused when things are happening behind +its back. Another problem can be the mail back end itself, e.g. if you +use mairix with an @acronym{IMAP} server (I had Dovecot complaining +about corrupt index files when mairix changed the contents of the search +group). Using @code{nnmairix} should circumvent these problems. + +@code{nnmairix} is not really a mail back end---it's actually more like +a wrapper, sitting between a ``real'' mail back end where mairix stores +the searches and the Gnus front end. You can choose between three +different mail back ends for the mairix folders: @code{nnml}, +@code{nnmaildir} or @code{nnimap}. @code{nnmairix} will call the mairix +binary so that the search results are stored in folders named +@code{zz_mairix--} on this mail back end, but it will +present these folders in the Gnus front end only with @code{}. +You can use an existing mail back end where you already store your mail, +but if you're uncomfortable with @code{nnmairix} creating new mail +groups alongside your other mail, you can also create e.g. a new +@code{nnmaildir} or @code{nnml} server exclusively for mairix, but then +make sure those servers do not accidentally receive your new mail +(@pxref{nnmairix caveats}). A special case exists if you want to use +mairix remotely on an IMAP server with @code{nnimap}---here the mairix +folders and your other mail must be on the same @code{nnimap} back end. + +@node Setting up mairix +@subsubsection Setting up mairix + +First: create a backup of your mail folders (@pxref{nnmairix caveats}). + +Setting up mairix is easy: simply create a @file{.mairixrc} file with +(at least) the following entries: + +@example +# Your Maildir/MH base folder +base=~/Maildir +@end example + +This is the base folder for your mails. All the following directories +are relative to this base folder. If you want to use @code{nnmairix} +with @code{nnimap}, this base directory has to point to the mail +directory where the @acronym{IMAP} server stores the mail folders! + +@example +maildir= ... your maildir folders which should be indexed ... +mh= ... your nnml/mh folders which should be indexed ... +mbox = ... your mbox files which should be indexed ... +@end example + +This specifies all your mail folders and mbox files (relative to the +base directory!) you want to index with mairix. Note that the +@code{nnml} back end saves mails in MH format, so you have to put those +directories in the @code{mh} line. See the example at the end of this +section and mairixrc's man-page for further details. + +@example +omit=zz_mairix-* +@end example + +@vindex nnmairix-group-prefix +This should make sure that you don't accidentally index the mairix +search results. You can change the prefix of these folders with the +variable @code{nnmairix-group-prefix}. + +@example +mformat= ... 'maildir' or 'mh' ... +database= ... location of database file ... +@end example + +The @code{format} setting specifies the output format for the mairix +search folder. Set this to @code{mh} if you want to access search results +with @code{nnml}. Otherwise choose @code{maildir}. + +To summarize, here is my shortened @file{.mairixrc} file as an example: + +@example +base=~/Maildir +maildir=.personal:.work:.logcheck:.sent +mh=../Mail/nnml/*... +mbox=../mboxmail/mailarchive_year* +mformat=maildir +omit=zz_mairix-* +database=~/.mairixdatabase +@end example + +In this case, the base directory is @file{~/Maildir}, where all my Maildir +folders are stored. As you can see, the folders are separated by +colons. If you wonder why every folder begins with a dot: this is +because I use Dovecot as @acronym{IMAP} server, which again uses +@code{Maildir++} folders. For testing nnmairix, I also have some +@code{nnml} mail, which is saved in @file{~/Mail/nnml}. Since this has +to be specified relative to the @code{base} directory, the @code{../Mail} +notation is needed. Note that the line ends in @code{*...}, which means +to recursively scan all files under this directory. Without the three +dots, the wildcard @code{*} will not work recursively. I also have some +old mbox files with archived mail lying around in @file{~/mboxmail}. +The other lines should be obvious. + +See the man page for @code{mairixrc} for details and further options, +especially regarding wildcard usage, which may be a little different +than you are used to. + +Now simply call @code{mairix} to create the index for the first time. +Note that this may take a few minutes, but every following index will do +the updates incrementally and hence is very fast. + +@node Configuring nnmairix +@subsubsection Configuring nnmairix + +In group mode, type @kbd{G b c} +(@code{nnmairix-create-server-and-default-group}). This will ask you for all +necessary information and create a @code{nnmairix} server as a foreign +server. You will have to specify the following: + +@itemize @bullet + +@item +The @strong{name} of the @code{nnmairix} server---choose whatever you +want. + +@item +The name of the @strong{back end server} where mairix should store its +searches. This must be a full server name, like @code{nnml:mymail}. +Just hit @kbd{TAB} to see the available servers. Currently, servers +which are accessed through @code{nnmaildir}, @code{nnimap} and +@code{nnml} are supported. As explained above, for locally stored +mails, this can be an existing server where you store your mails. +However, you can also create e.g. a new @code{nnmaildir} or @code{nnml} +server exclusively for @code{nnmairix} in your secondary select methods +(@pxref{Finding the News}). If you use a secondary @code{nnml} server +just for mairix, make sure that you explicitly set the server variable +@code{nnml-get-new-mail} to @code{nil}, or you might loose mail +(@pxref{nnmairix caveats}). If you want to use mairix remotely on an +@acronym{IMAP} server, you have to choose the corresponding +@code{nnimap} server here. + +@item +@vindex nnmairix-mairix-search-options +The @strong{command} to call the mairix binary. This will usually just +be @code{mairix}, but you can also choose something like @code{ssh +SERVER mairix} if you want to call mairix remotely, e.g. on your +@acronym{IMAP} server. If you want to add some default options to +mairix, you could do this here, but better use the variable +@code{nnmairix-mairix-search-options} instead. + +@item +The name of the @strong{default search group}. This will be the group +where all temporary mairix searches are stored, i.e. all searches which +are not bound to permanent @code{nnmairix} groups. Choose whatever you +like. + +@item +If the mail back end is @code{nnimap} or @code{nnmaildir}, you will be +asked if you work with @strong{Maildir++}, i.e. with hidden maildir +folders (=beginning with a dot). For example, you have to answer +@samp{yes} here if you work with the Dovecot @acronym{IMAP} +server. Otherwise, you should answer @samp{no} here. + +@end itemize + +@node nnmairix keyboard shortcuts +@subsubsection nnmairix keyboard shortcuts + +In group mode: + +@table @kbd + +@item G b c +@kindex G b c (Group) +@findex nnmairix-create-server-and-default-group +Creates @code{nnmairix} server and default search group for this server +(@code{nnmairix-create-server-and-default-group}). You should have done +this by now (@pxref{Configuring nnmairix}). + +@item G b s +@kindex G b s (Group) +@findex nnmairix-search +Prompts for query which is then sent to the mairix binary. Search +results are put into the default search group which is automatically +displayed (@code{nnmairix-search}). + +@item G b m +@kindex G b m (Group) +@findex nnmairix-widget-search +Allows you to create a mairix search or a permanent group more +comfortably using graphical widgets, similar to a customization +group. Just try it to see how it works (@code{nnmairix-widget-search}). + +@item G b i +@kindex G b i (Group) +@findex nnmairix-search-interactive +Another command for creating a mairix query more comfortably, but uses +only the minibuffer (@code{nnmairix-search-interactive}). + +@item G b g +@kindex G b g (Group) +@findex nnmairix-create-search-group +Creates a permanent group which is associated with a search query +(@code{nnmairix-create-search-group}). The @code{nnmairix} back end +automatically calls mairix when you update this group with @kbd{g} or +@kbd{M-g}. + +@item G b q +@kindex G b q (Group) +@findex nnmairix-group-change-query-this-group +Changes the search query for the @code{nnmairix} group under cursor +(@code{nnmairix-group-change-query-this-group}). + +@item G b t +@kindex G b t (Group) +@findex nnmairix-group-toggle-threads-this-group +Toggles the 'threads' parameter for the @code{nnmairix} group under cursor, +i.e. if you want see the whole threads of the found messages +(@code{nnmairix-group-toggle-threads-this-group}). + +@item G b u +@kindex G b u (Group) +@findex nnmairix-update-database +@vindex nnmairix-mairix-update-options +Calls mairix binary for updating the database +(@code{nnmairix-update-database}). The default parameters are @code{-F} +and @code{-Q} for making this as fast as possible (see variable +@code{nnmairix-mairix-update-options} for defining these default +options). + +@item G b r +@kindex G b r (Group) +@findex nnmairix-group-toggle-readmarks-this-group +Keep articles in this @code{nnmairix} group always read or unread, or leave the +marks unchanged (@code{nnmairix-group-toggle-readmarks-this-group}). + +@item G b d +@kindex G b d (Group) +@findex nnmairix-group-delete-recreate-this-group +Recreate @code{nnmairix} group on the ``real'' mail back end +(@code{nnmairix-group-delete-recreate-this-group}). You can do this if +you always get wrong article counts with a @code{nnmairix} group. + +@item G b a +@kindex G b a (Group) +@findex nnmairix-group-toggle-allowfast-this-group +Toggles the @code{allow-fast} parameters for group under cursor +(@code{nnmairix-group-toggle-allowfast-this-group}). The default +behavior of @code{nnmairix} is to do a mairix search every time you +update or enter the group. With the @code{allow-fast} parameter set, +mairix will only be called when you explicitly update the group, but not +upon entering. This makes entering the group faster, but it may also +lead to dangling symlinks if something changed between updating and +entering the group which is not yet in the mairix database. + +@item G b p +@kindex G b p (Group) +@findex nnmairix-group-toggle-propmarks-this-group +Toggle marks propagation for this group +(@code{nnmairix-group-toggle-propmarks-this-group}). (@pxref{Propagating +marks}). + +@item G b o +@kindex G b o (Group) +@findex nnmairix-propagate-marks +Manually propagate marks (@code{nnmairix-propagate-marks}); needed only when +@code{nnmairix-propagate-marks-upon-close} is set to @code{nil}. + +@end table + +In summary mode: + +@table @kbd + +@item $ m +@kindex $ m (Summary) +@findex nnmairix-widget-search-from-this-article +Allows you to create a mairix query or group based on the current +message using graphical widgets (same as @code{nnmairix-widget-search}) +(@code{nnmairix-widget-search-from-this-article}). + +@item $ g +@kindex $ g (Summary) +@findex nnmairix-create-search-group-from-message +Interactively creates a new search group with query based on the current +message, but uses the minibuffer instead of graphical widgets +(@code{nnmairix-create-search-group-from-message}). + +@item $ t +@kindex $ t (Summary) +@findex nnmairix-search-thread-this-article +Searches thread for the current article +(@code{nnmairix-search-thread-this-article}). This is effectively a +shortcut for calling @code{nnmairix-search} with @samp{m:msgid} of the +current article and enabled threads. + +@item $ f +@kindex $ f (Summary) +@findex nnmairix-search-from-this-article +Searches all messages from sender of the current article +(@code{nnmairix-search-from-this-article}). This is a shortcut for +calling @code{nnmairix-search} with @samp{f:From}. + +@item $ o +@kindex $ o (Summary) +@findex nnmairix-goto-original-article +(Only in @code{nnmairix} groups!) Tries determine the group this article +originally came from and displays the article in this group, so that +e.g. replying to this article the correct posting styles/group +parameters are applied (@code{nnmairix-goto-original-article}). This +function will use the registry if available, but can also parse the +article file name as a fallback method. + +@item $ u +@kindex $ u (Summary) +@findex nnmairix-remove-tick-mark-original-article +Remove possibly existing tick mark from original article +(@code{nnmairix-remove-tick-mark-original-article}). (@pxref{nnmairix +tips and tricks}). + +@end table + +@node Propagating marks +@subsubsection Propagating marks + +First of: you really need a patched mairix binary for using the marks +propagation feature efficiently. Otherwise, you would have to update +the mairix database all the time. You can get the patch at + +@uref{http://www.randomsample.de/mairix-maildir-patch.tar} + +You need the mairix v0.21 source code for this patch; everything else +is explained in the accompanied readme file. If you don't want to use +marks propagation, you don't have to apply these patches, but they also +fix some annoyances regarding changing maildir flags, so it might still +be useful to you. + +With the patched mairix binary, you can use @code{nnmairix} as an +alternative to mail splitting (@pxref{Fancy Mail Splitting}). For +example, instead of splitting all mails from @samp{david@@foobar.com} +into a group, you can simply create a search group with the query +@samp{f:david@@foobar.com}. This is actually what ``smart folders'' are +all about: simply put everything in one mail folder and dynamically +create searches instead of splitting. This is more flexible, since you +can dynamically change your folders any time you want to. This also +implies that you will usually read your mails in the @code{nnmairix} +groups instead of your ``real'' mail groups. + +There is one problem, though: say you got a new mail from +@samp{david@@foobar.com}; it will now show up in two groups, the +``real'' group (your INBOX, for example) and in the @code{nnmairix} +search group (provided you have updated the mairix database). Now you +enter the @code{nnmairix} group and read the mail. The mail will be +marked as read, but only in the @code{nnmairix} group---in the ``real'' +mail group it will be still shown as unread. + +You could now catch up the mail group (@pxref{Group Data}), but this is +tedious and error prone, since you may overlook mails you don't have +created @code{nnmairix} groups for. Of course, you could first use +@code{nnmairix-goto-original-article} (@pxref{nnmairix keyboard +shortcuts}) and then read the mail in the original group, but that's +even more cumbersome. + +Clearly, the easiest way would be if marks could somehow be +automatically set for the original article. This is exactly what +@emph{marks propagation} is about. + +Marks propagation is deactivated by default. You can activate it for a +certain @code{nnmairix} group with +@code{nnmairix-group-toggle-propmarks-this-group} (bound to @kbd{G b +p}). This function will warn you if you try to use it with your default +search group; the reason is that the default search group is used for +temporary searches, and it's easy to accidentally propagate marks from +this group. However, you can ignore this warning if you really want to. + +With marks propagation enabled, all the marks you set in a @code{nnmairix} +group should now be propagated to the original article. For example, +you can now tick an article (by default with @kbd{!}) and this mark should +magically be set for the original article, too. + +A few more remarks which you may or may not want to know: + +@vindex nnmairix-propagate-marks-upon-close +Marks will not be set immediately, but only upon closing a group. This +not only makes marks propagation faster, it also avoids problems with +dangling symlinks when dealing with maildir files (since changing flags +will change the file name). You can also control when to propagate marks +via @code{nnmairix-propagate-marks-upon-close} (see the doc-string for +details). + +Obviously, @code{nnmairix} will have to look up the original group for every +article you want to set marks for. If available, @code{nnmairix} will first use +the registry for determining the original group. The registry is very +fast, hence you should really, really enable the registry when using +marks propagation. If you don't have to worry about RAM and disc space, +set @code{gnus-registry-max-entries} to a large enough value; to be on +the safe side, choose roughly the amount of mails you index with mairix. + +@vindex nnmairix-only-use-registry +If you don't want to use the registry or the registry hasn't seen the +original article yet, @code{nnmairix} will use an additional mairix +search for determining the file name of the article. This, of course, is +way slower than the registry---if you set hundreds or even thousands of +marks this way, it might take some time. You can avoid this situation by +setting @code{nnmairix-only-use-registry} to t. + +Maybe you also want to propagate marks the other way round, i.e. if you +tick an article in a "real" mail group, you'd like to have the same +article in a @code{nnmairix} group ticked, too. For several good +reasons, this can only be done efficiently if you use maildir. To +immediately contradict myself, let me mention that it WON'T work with +@code{nnmaildir}, since @code{nnmaildir} stores the marks externally and +not in the file name. Therefore, propagating marks to @code{nnmairix} +groups will usually only work if you use an IMAP server which uses +maildir as its file format. + +@vindex nnmairix-propagate-marks-to-nnmairix-groups +If you work with this setup, just set +@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t} and see what +happens. If you don't like what you see, just set it to @code{nil} again. One +problem might be that you get a wrong number of unread articles; this +usually happens when you delete or expire articles in the original +groups. When this happens, you can recreate the @code{nnmairix} group on the +back end using @kbd{G b d}. + +@node nnmairix tips and tricks +@subsubsection nnmairix tips and tricks + +@itemize +@item +Checking Mail + +@findex nnmairix-update-groups +I put all my important mail groups at group level 1. The mairix groups +have group level 5, so they do not get checked at start up (@pxref{Group +Levels}). + +I use the following to check for mails: + +@lisp +(defun my-check-mail-mairix-update (level) + (interactive "P") + ;; if no prefix given, set level=1 + (gnus-group-get-new-news (or level 1)) + (nnmairix-update-groups "mairixsearch" t t) + (gnus-group-list-groups)) + +(define-key gnus-group-mode-map "g" 'my-check-mail-mairix-update) +@end lisp + +Instead of @samp{"mairixsearch"} use the name of your @code{nnmairix} +server. See the doc string for @code{nnmairix-update-groups} for +details. + +@item +Example: search group for ticked articles + +For example, you can create a group for all ticked articles, where the +articles always stay unread: + +Hit @kbd{G b g}, enter group name (e.g. @samp{important}), use +@samp{F:f} as query and do not include threads. + +Now activate marks propagation for this group by using @kbd{G b p}. Then +activate the always-unread feature by using @kbd{G b r} twice. + +So far so good---but how do you remove the tick marks in the @code{nnmairix} +group? There are two options: You may simply use +@code{nnmairix-remove-tick-mark-original-article} (bound to @kbd{$ u}) to remove +tick marks from the original article. The other possibility is to set +@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t}, but see the above +comments about this option. If it works for you, the tick marks should +also exist in the @code{nnmairix} group and you can remove them as usual, +e.g. by marking an article as read. + +When you have removed a tick mark from the original article, this +article should vanish from the @code{nnmairix} group after you have updated the +mairix database and updated the group. Fortunately, there is a function +for doing exactly that: @code{nnmairix-update-groups}. See the previous code +snippet and the doc string for details. + +@item +Dealing with auto-subscription of mail groups + +As described before, all @code{nnmairix} groups are in fact stored on +the mail back end in the form @samp{zz_mairix--}. You can +see them when you enter the back end server in the server buffer. You +should not subscribe these groups! Unfortunately, these groups will +usually get @emph{auto-subscribed} when you use @code{nnmaildir} or +@code{nnml}, i.e. you will suddenly see groups of the form +@samp{zz_mairix*} pop up in your group buffer. If this happens to you, +simply kill these groups with C-k. For avoiding this, turn off +auto-subscription completely by setting the variable +@code{gnus-auto-subscribed-groups} to @code{nil} (@pxref{Filtering New +Groups}), or if you like to keep this feature use the following kludge +for turning it off for all groups beginning with @samp{zz_}: + +@lisp +(setq gnus-auto-subscribed-groups + "^\\(nnml\\|nnfolder\\|nnmbox\\|nnmh\\|nnbabyl\\|nnmaildir\\).*:\\([^z]\\|z$\\|\\z[^z]\\|zz$\\|zz[^_]\\|zz_$\\).*") +@end lisp + +@end itemize + +@node nnmairix caveats +@subsubsection nnmairix caveats + +@itemize +@item +You can create a secondary @code{nnml} server just for nnmairix, but then +you have to explicitly set the corresponding server variable +@code{nnml-get-new-mail} to @code{nil}. Otherwise, new mail might get +put into this secondary server (and would never show up again). Here's +an example server definition: + +@lisp +(nnml "mairix" (nnml-directory "mairix") (nnml-get-new-mail nil)) +@end lisp + +(The @code{nnmaildir} back end also has a server variabe +@code{get-new-mail}, but its default value is @code{nil}, so you don't +have to explicitly set it if you use a @code{nnmaildir} server just for +mairix.) + +@item +If you use the Gnus registry: don't use the registry with +@code{nnmairix} groups (put them in +@code{gnus-registry-unfollowed-groups}). Be @emph{extra careful} if +you use @code{gnus-registry-split-fancy-with-parent}; mails which are +split into @code{nnmairix} groups are usually gone for good as soon as +you check the group for new mail (yes, it has happened to me...). + +@item +Therefore: @emph{Never ever} put ``real'' mails into @code{nnmairix} +groups (you shouldn't be able to, anyway). + +@item +If you use the Gnus agent (@pxref{Gnus Unplugged}): don't agentize +@code{nnmairix} groups (though I have no idea what happens if you do). + +@item +mairix does only support us-ascii characters. + +@item +@code{nnmairix} uses a rather brute force method to force Gnus to +completely reread the group on the mail back end after mairix was +called---it simply deletes and re-creates the group on the mail +back end. So far, this has worked for me without any problems, and I +don't see how @code{nnmairix} could delete other mail groups than its +own, but anyway: you really should have a backup of your mail +folders. + +@item +All necessary information is stored in the group parameters +(@pxref{Group Parameters}). This has the advantage that no active file +is needed, but also implies that when you kill a @code{nnmairix} group, +it is gone for good. + +@item +@findex nnmairix-purge-old-groups +If you create and kill a lot of @code{nnmairix} groups, the +``zz_mairix-*'' groups will accumulate on the mail back end server. To +delete old groups which are no longer needed, call +@code{nnmairix-purge-old-groups}. Note that this assumes that you don't +save any ``real'' mail in folders of the form +@code{zz_mairix--}. You can change the prefix of +@code{nnmairix} groups by changing the variable +@code{nnmairix-group-prefix}. + +@item +The following only applies if you @emph{don't} use the mentioned patch +for mairix (@pxref{Propagating marks}): + +A problem can occur when using @code{nnmairix} with maildir folders and +comes with the fact that maildir stores mail flags like @samp{Seen} or +@samp{Replied} by appending chars @samp{S} and @samp{R} to the message +file name, respectively. This implies that currently you would have to +update the mairix database not only when new mail arrives, but also when +mail flags are changing. The same applies to new mails which are indexed +while they are still in the @samp{new} folder but then get moved to +@samp{cur} when Gnus has seen the mail. If you don't update the database +after this has happened, a mairix query can lead to symlinks pointing to +non-existing files. In Gnus, these messages will usually appear with +``(none)'' entries in the header and can't be accessed. If this happens +to you, using @kbd{G b u} and updating the group will usually fix this. + +@end itemize + @node Misc Group Stuff @section Misc Group Stuff @@ -7071,6 +7774,14 @@ This variable can also be set to @code{invisible}. This won't have any visible effects, but is useful if you use the @kbd{A T} command a lot (@pxref{Finding the Parent}). +The server has to support @acronym{NOV} for any of this to work. + +@cindex Gmane, gnus-fetch-old-headers +This feature can seriously impact performance it ignores all locally +cached header entries. Setting it to @code{t} for groups for a server +that doesn't expire articles (such as news.gmane.org), leads to very +slow summary generation. + @item gnus-fetch-old-ephemeral-headers @vindex gnus-fetch-old-ephemeral-headers Same as @code{gnus-fetch-old-headers}, but only used for ephemeral @@ -7428,11 +8139,13 @@ tickles your fancy. @findex gnus-article-sort-functions @findex gnus-article-sort-by-date +@findex gnus-article-sort-by-most-recent-date @findex gnus-article-sort-by-score @findex gnus-article-sort-by-subject @findex gnus-article-sort-by-author @findex gnus-article-sort-by-random @findex gnus-article-sort-by-number +@findex gnus-article-sort-by-most-recent-number If 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 @@ -7831,10 +8544,15 @@ Save the current article in a VM folder @kindex O p (Summary) @kindex | (Summary) @findex gnus-summary-pipe-output +@vindex gnus-summary-pipe-output-default-command Save the current article in a pipe. Uhm, like, what I mean is---Pipe the current article to a process (@code{gnus-summary-pipe-output}). If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the -complete headers in the piped output. +complete headers in the piped output. The symbolic prefix @code{r} is +special; it lets this command pipe a raw article including all headers. +The @code{gnus-summary-pipe-output-default-command} variable can be set +to a string containing the default command and options (default +@code{nil}). @item O P @kindex O P (Summary) @@ -7930,6 +8648,26 @@ to get a file name to save the article in. The default is @findex gnus-summary-save-in-vm Save the article in a VM folder. You have to have the VM mail reader to use this setting. + +@item gnus-summary-save-in-pipe +@findex gnus-summary-save-in-pipe +Pipe the article to a shell command. This function takes optional two +arguments COMMAND and RAW. Valid values for COMMAND include: + +@itemize @bullet +@item a string@* +The executable command name and possibly arguments. +@item @code{nil}@* +You will be prompted for the command in the minibuffer. +@item the symbol @code{default}@* +It will be replaced with the command which the variable +@code{gnus-summary-pipe-output-default-command} holds or the command +last used for saving. +@end itemize + +Non-@code{nil} value for RAW overrides @code{:decode} and +@code{:headers} properties (see below) and the raw article including all +headers will be piped. @end table The symbol of each function may have the following properties: @@ -7939,8 +8677,9 @@ The symbol of each function may have the following properties: The value non-@code{nil} means save decoded articles. This is meaningful only with @code{gnus-summary-save-in-file}, @code{gnus-summary-save-body-in-file}, -@code{gnus-summary-write-to-file}, and -@code{gnus-summary-write-body-to-file}. +@code{gnus-summary-write-to-file}, +@code{gnus-summary-write-body-to-file}, and +@code{gnus-summary-save-in-pipe}. @item :function The value specifies an alternative function which appends, not @@ -10086,6 +10825,12 @@ can't really see why you'd want that. @findex gnus-summary-sort-by-number Sort by article number (@code{gnus-summary-sort-by-number}). +@item C-c C-s C-m C-n +@kindex C-c C-s C-n (Summary) +@findex gnus-summary-sort-by-most-recent-number +Sort by most recent article number +(@code{gnus-summary-sort-by-most-recent-number}). + @item C-c C-s C-a @kindex C-c C-s C-a (Summary) @findex gnus-summary-sort-by-author @@ -10106,6 +10851,11 @@ Sort by subject (@code{gnus-summary-sort-by-subject}). @findex gnus-summary-sort-by-date Sort by date (@code{gnus-summary-sort-by-date}). +@item C-c C-s C-m C-d +@kindex C-c C-s C-m C-d (Summary) +@findex gnus-summary-sort-by-most-recent-date +Sort by most recent date (@code{gnus-summary-sort-by-most-recent-date}). + @item C-c C-s C-l @kindex C-c C-s C-l (Summary) @findex gnus-summary-sort-by-lines @@ -10140,6 +10890,8 @@ root-by-root basis, which might not be what you were looking for. To toggle whether to use threading, type @kbd{T T} (@pxref{Thread Commands}). +If a prefix argument if given, the sort order is reversed. + @node Finding the Parent @section Finding the Parent @@ -12083,7 +12835,7 @@ Displayed when the signature has been hidden in the Article buffer. Displayed when Gnus has treated overstrike characters in the article buffer. @item e -Displayed when Gnus has treated emphasised strings in the article buffer. +Displayed when Gnus has treated emphasized strings in the article buffer. @end table @@ -14726,8 +15478,8 @@ files. If a positive number, delete files older than number of days (the deletion will only happen when receiving new mail). You may also set @code{mail-source-delete-incoming} to @code{nil} and call @code{mail-source-delete-old-incoming} from a hook or interactively. -@code{mail-source-delete-incoming} defaults to @code{2} in alpha Gnusae -and @code{10} in released Gnusae. @xref{Gnus Development}. +@code{mail-source-delete-incoming} defaults to @code{10} in alpha Gnusae +and @code{2} in released Gnusae. @xref{Gnus Development}. @item mail-source-delete-old-incoming-confirm @vindex mail-source-delete-old-incoming-confirm @@ -21431,7 +22183,14 @@ other headers requires writing a @code{head} scoring rule, which means that Gnus has to request every single article from the back end to find matches. This takes a long time in big groups. -Now, there's not much you can do about this for news groups, but for +@vindex gnus-inhibit-slow-scoring +You can inhibit this slow scoring on headers or body by setting the +variable @code{gnus-inhibit-slow-scoring}. If +@code{gnus-inhibit-slow-scoring} is regexp, slow scoring is inhibited if +the group matches the regexp. If it is t, slow scoring on it is +inhibited for all groups. + +Now, there's not much you can do about the slowness for news groups, but for mail groups, you have greater control. In @ref{To From Newsgroups}, it's explained in greater detail what this mechanism does, but here's a cookbook example for @code{nnml} on how to allow scoring on the @@ -21453,13 +22212,6 @@ so: @kbd{I e s p To RET RET}. See? Simple. -@vindex gnus-inhibit-slow-scoring -You can inhibit scoring the slow scoring on headers or body by setting -the variable @code{gnus-inhibit-slow-scoring}. If -@code{gnus-inhibit-slow-scoring} is regexp, slow scoring is inhibited if -the group matches the regexp. If it is t, slow scoring on it is -inhibited for all groups. - @node Scoring Tips @section Scoring Tips @@ -22011,6 +22763,7 @@ four days, Gnus will decay the scores four times, for instance. * Fuzzy Matching:: What's the big fuzz? * Thwarting Email Spam:: Simple ways to avoid unsolicited commercial email. * Spam Package:: A package for filtering and processing spam. +* The Gnus Registry:: A package for tracking messages by Message-ID. * Other modes:: Interaction with other modes. * Various Various:: Things that are really various. @end menu @@ -23980,11 +24733,10 @@ might want to have a nifty function to call when you happen to read spam. And here is the nifty function: @lisp - (defun my-gnus-raze-spam () +(defun my-gnus-raze-spam () "Submit SPAM to Vipul's Razor, then mark it as expirable." (interactive) - (gnus-summary-show-raw-article) - (gnus-summary-save-in-pipe "razor-report -f -d") + (gnus-summary-save-in-pipe "razor-report -f -d" t) (gnus-summary-mark-as-expirable 1)) @end lisp @@ -25774,6 +26526,222 @@ Reduce table size: (spam-stat-reduce-size) Save table: (spam-stat-save) @end smallexample +@node The Gnus Registry +@section The Gnus Registry +@cindex registry +@cindex split +@cindex track + +The Gnus registry is a package that tracks messages by their +Message-ID across all backends. This allows Gnus users to do several +cool things, be the envy of the locals, get free haircuts, and be +experts on world issues. Well, maybe not all of those, but the +features are pretty cool. + +Although they will be explained in detail shortly, here's a quick list +of said features in case your attention span is... never mind. + +@enumerate +@item +Split messages to their parent + +This keeps discussions in the same group. You can use the subject and +the sender in addition to the Message-ID. Several strategies are +available. + +@item +Store custom flags and keywords + +The registry can store custom flags and keywords for a message. For +instance, you can mark a message ``To-Do'' this way and the flag will +persist whether the message is in the nnimap, nnml, nnmaildir, +etc. backends. + +@item +Store arbitrary data + +Through a simple ELisp API, the registry can remember any data for a +message. A built-in inverse map, when activated, allows quick lookups +of all messages matching a particular set of criteria. +@end enumerate + +@menu +* Setup:: +* Fancy splitting to parent:: +* Store custom flags and keywords:: +* Store arbitrary data:: +@end menu + +@node Setup +@subsection Setup + +Fortunately, setting up the Gnus registry is pretty easy: + +@lisp +(setq gnus-registry-max-entries 2500 + gnus-registry-use-long-group-names t) + +(gnus-registry-initialize) +@end lisp + +This adds registry saves to Gnus newsrc saves (which happen on exit +and when you press @kbd{s} from the @code{*Group*} buffer. It also +adds registry calls to article actions in Gnus (copy, move, etc.) so +it's not easy to undo the initialization. See +@code{gnus-registry-initialize} for the gory details. + +Here are other settings used by the author of the registry (understand +what they do before you copy them blindly). + +@lisp +(setq + gnus-registry-split-strategy 'majority + gnus-registry-ignored-groups '(("nntp" t) + ("nnrss" t) + ("spam" t) + ("train" t)) + gnus-registry-max-entries 500000 + gnus-registry-use-long-group-names t + gnus-registry-track-extra '(sender subject)) +@end lisp + +They say: keep a lot of messages around, use long group names, track +messages by sender and subject (not just parent Message-ID), and when +the registry splits incoming mail, use a majority rule to decide where +messages should go if there's more than one possibility. In addition, +the registry should ignore messages in groups that match ``nntp'', +``nnrss'', ``spam'', or ``train.'' + +You are doubtless impressed by all this, but you ask: ``I am a Gnus +user, I customize to live. Give me more.'' Here you go, these are +the general settings. + +@defvar gnus-registry-unfollowed-groups +The groups that will not be followed by +@code{gnus-registry-split-fancy-with-parent}. They will still be +remembered by the registry. This is a list of regular expressions. +@end defvar + +@defvar gnus-registry-ignored-groups +The groups that will not be remembered by the registry. This is a +list of regular expressions, also available through Group/Topic +customization (so you can ignore or keep a specific group or a whole +topic). +@end defvar + +@defvar gnus-registry-use-long-group-names +Whether the registry will use long group names. It's recommended to +set this to @code{t}, although everything works if you don't. Future +functionality will require it. +@end defvar + +@defvar gnus-registry-max-entries +The number (an integer or @code{nil} for unlimited) of entries the +registry will keep. +@end defvar + +@defvar gnus-registry-cache-file +The file where the registry will be stored between Gnus sessions. +@end defvar + +@node Fancy splitting to parent +@subsection Fancy splitting to parent + +Simply put, this lets you put followup e-mail where it belongs. + +Every message has a Message-ID, which is unique, and the registry +remembers it. When the message is moved or copied, the registry will +notice this and offer the new group as a choice to the splitting +strategy. + +When a followup is made, usually it mentions the original message's +Message-ID in the headers. The registry knows this and uses that +mention to find the group where the original message lives. You only +have to put a rule like this: + +@lisp +(setq nnimap-my-split-fancy '(| + + ;; split to parent: you need this + (: gnus-registry-split-fancy-with-parent) + + ;; other rules, as an example + (: spam-split) + ;; default mailbox + "mail") +@end lisp + +in your fancy split setup. In addition, you may want to customize the +following variables. + +@defvar gnus-registry-track-extra +This is a list of symbols, so it's best to change it from the +Customize interface. By default it's @code{nil}, but you may want to +track @code{subject} and @code{sender} as well when splitting by parent. +It may work for you. It can be annoying if your mail flow is large and +people don't stick to the same groups. +@end defvar + +@defvar gnus-registry-split-strategy +This is a symbol, so it's best to change it from the Customize +interface. By default it's @code{nil}, but you may want to set it to +@code{majority} or @code{first} to split by sender or subject based on +the majority of matches or on the first found. +@end defvar + +@node Store custom flags and keywords +@subsection Store custom flags and keywords + +The registry lets you set custom flags and keywords per message. You +can use the Gnus->Registry Marks menu or the @kbd{M M x} keyboard +shortcuts, where @code{x} is the first letter of the mark's name. + +@defvar gnus-registry-marks +The custom marks that the registry can use. You can modify the +default list, if you like. If you do, you'll have to exit Emacs +before they take effect (you can also unload the registry and reload +it or evaluate the specific macros you'll need, but you probably don't +want to bother). Use the Customize interface to modify the list. + +By default this list has the @code{Important}, @code{Work}, +@code{Personal}, @code{To-Do}, and @code{Later} marks. They all have +keyboard shortcuts like @kbd{M M i} for Important, using the first +letter. +@end defvar + +@defun gnus-registry-mark-article +Call this function to mark an article with a custom registry mark. It +will offer the available marks for completion. +@end defun + +@node Store arbitrary data +@subsection Store arbitrary data + +The registry has a simple API that uses a Message-ID as the key to +store arbitrary data (as long as it can be converted to a list for +storage). + +@defun gnus-registry-store-extra-entry (id key value) +Store @code{value} in the extra data key @code{key} for message +@code{id}. +@end defun + +@defun gnus-registry-delete-extra-entry (id key) +Delete the extra data key @code{key} for message @code{id}. +@end defun + +@defun gnus-registry-fetch-extra (id key) +Get the extra data key @code{key} for message @code{id}. +@end defun + +@defvar gnus-registry-extra-entries-precious +If any extra entries are precious, their presence will make the +registry keep the whole entry forever, even if there are no groups for +the Message-ID and if the size limit of the registry is reached. By +default this is just @code{(marks)} so the custom registry marks are +precious. +@end defvar + @node Other modes @section Interaction with other modes @@ -27948,7 +28916,7 @@ controls this. @item You can now drag and drop attachments to the Message buffer. See @code{mml-dnd-protocol-alist} and @code{mml-dnd-attach-options}. @xref{MIME, ,MIME, message, Message Manual}. -@c New in 5.10.9 / 5.11 (Emacs 21.1) +@c New in 5.10.9 / 5.11 (Emacs 22.1) @item @code{auto-fill-mode} is enabled by default in Message mode. See @code{message-fill-column}. @xref{Various Message Variables, , @@ -28578,7 +29546,7 @@ Gnus will work. @item Try doing an @kbd{M-x gnus-version}. If you get something that looks like @c -@samp{No Gnus v0.9} @c Adjust ../Makefile.in if you change this line! +@samp{No Gnus v0.10} @c Adjust ../Makefile.in if you change this line! @c you have the right files loaded. Otherwise you have some old @file{.el} files lying around. Delete these.