From 64763fe36c0c9e7ff1876c72e59941be33e12389 Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Sun, 21 Sep 2008 04:22:42 +0000 Subject: [PATCH] Merge from gnus--devo--0 Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1424 --- doc/misc/ChangeLog | 10 ++ doc/misc/gnus.texi | 216 +++++++++++++++++++++++++++++++++++++ lisp/gnus/ChangeLog | 16 +++ lisp/gnus/gnus-registry.el | 4 +- lisp/gnus/gnus-sum.el | 24 +++-- lisp/gnus/sieve-manage.el | 2 +- 6 files changed, 258 insertions(+), 14 deletions(-) diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index f2af5ae513..0c240e6d0a 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -1,3 +1,13 @@ +2008-09-19 Katsumi Yamaoka + + * gnus.texi (Top, Setup, Fancy splitting to parent) + (Store custom flags and keywords, Store arbitrary data): Clean up + markup. + +2008-09-16 Teodor Zlatanov + + * gnus.texi (The Gnus Registry): Document it. + 2008-09-08 David Engster * gnus.texi (nnmairix): Point out that nnml uses MH format. Clarify diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index a8c11be66c..cf6d65282a 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -827,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. @@ -22740,6 +22741,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 @@ -26502,6 +26504,220 @@ 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 diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 1f7a462fb9..82b9cf8b1e 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,19 @@ +2008-09-17 Simon Josefsson + + * sieve-manage.el (sieve-manage-is-string): Accept literals too. + Reported by Arnt Gulbrandsen . + +2008-09-16 Teodor Zlatanov + + * gnus-registry.el (gnus-registry-use-long-group-names): Make t the + default, it's better. + +2008-09-11 Teodor Zlatanov + + * gnus-sum.el (gnus-summary-insert-line): Trap errors on setting the + summary line gnus-number property and ignore them (with a warning + message). + 2008-09-10 Katsumi Yamaoka * gnus-group.el (gnus-group-make-useful-group): Don't use the compiler diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el index 8704d7ce3d..f4337a5152 100644 --- a/lisp/gnus/gnus-registry.el +++ b/lisp/gnus/gnus-registry.el @@ -144,8 +144,8 @@ and no extra data." :group 'gnus-registry :type 'boolean) -(defcustom gnus-registry-use-long-group-names nil - "Whether the registry should use long group names (BUGGY)." +(defcustom gnus-registry-use-long-group-names t + "Whether the registry should use long group names." :group 'gnus-registry :type 'boolean) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index edec081f2c..4f6a565aa5 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -3740,10 +3740,12 @@ buffer that was in action when the last article was fetched." (if (= gnus-tmp-lines -1) (setq gnus-tmp-lines "?") (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property - (point) - (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number gnus-tmp-number) + (condition-case () + (gnus-put-text-property + (point) + (progn (eval gnus-summary-line-format-spec) (point)) + 'gnus-number gnus-tmp-number) + (error (gnus-message 5 "Error updating the summary line"))) (when (gnus-visual-p 'summary-highlight 'highlight) (forward-line -1) (gnus-run-hooks 'gnus-summary-update-hook) @@ -5351,15 +5353,15 @@ or a straight list of headers." (setq gnus-tmp-lines "?") (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) (gnus-put-text-property - (point) - (progn (eval gnus-summary-line-format-spec) (point)) + (point) + (progn (eval gnus-summary-line-format-spec) (point)) 'gnus-number number) - (when gnus-visual-p - (forward-line -1) - (gnus-run-hooks 'gnus-summary-update-hook) - (forward-line 1)) + (when gnus-visual-p + (forward-line -1) + (gnus-run-hooks 'gnus-summary-update-hook) + (forward-line 1)) - (setq gnus-tmp-prev-subject simp-subject))) + (setq gnus-tmp-prev-subject simp-subject))) (when (nth 1 thread) (push (list (max 0 gnus-tmp-level) diff --git a/lisp/gnus/sieve-manage.el b/lisp/gnus/sieve-manage.el index 513aa9fc05..2e9ec771cd 100644 --- a/lisp/gnus/sieve-manage.el +++ b/lisp/gnus/sieve-manage.el @@ -647,7 +647,7 @@ password is remembered in the buffer." (prog1 (match-string 1) (goto-char (match-end 0)))) - ((looking-at (concat "{\\([0-9]+\\)}" sieve-manage-server-eol)) + ((looking-at (concat "{\\([0-9]+\\+?\\)}" sieve-manage-server-eol)) (let ((pos (match-end 0)) (len (string-to-number (match-string 1)))) (if (< (point-max) (+ pos len)) -- 2.39.2