summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2008-09-21 04:22:42 +0000
committerMiles Bader <miles@gnu.org>2008-09-21 04:22:42 +0000
commita5e87464ef2296f1f042204ce8386e3a5acdaaed (patch)
tree865ca91a4615b3a87be1ba9f2efd65513764871f
parent861f9d41b3a5d3ec9d305114668a19d00e6bb85d (diff)
downloademacs-a5e87464ef2296f1f042204ce8386e3a5acdaaed.tar.gz
Merge from gnus--devo--0
Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1424
-rw-r--r--doc/misc/ChangeLog10
-rw-r--r--doc/misc/gnus.texi216
-rw-r--r--lisp/gnus/ChangeLog16
-rw-r--r--lisp/gnus/gnus-registry.el4
-rw-r--r--lisp/gnus/gnus-sum.el24
-rw-r--r--lisp/gnus/sieve-manage.el2
6 files changed, 258 insertions, 14 deletions
diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog
index f2af5ae5130..0c240e6d0ae 100644
--- a/doc/misc/ChangeLog
+++ b/doc/misc/ChangeLog
@@ -1,3 +1,13 @@
+2008-09-19 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Top, Setup, Fancy splitting to parent)
+ (Store custom flags and keywords, Store arbitrary data): Clean up
+ markup.
+
+2008-09-16 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * gnus.texi (The Gnus Registry): Document it.
+
2008-09-08 David Engster <dengste@eml.cc>
* gnus.texi (nnmairix): Point out that nnml uses MH format. Clarify
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index a8c11be66ca..cf6d65282a8 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 d011100c698..8183acd10e1 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,19 @@
+2008-09-17 Simon Josefsson <simon@josefsson.org>
+
+ * sieve-manage.el (sieve-manage-is-string): Accept literals too.
+ Reported by Arnt Gulbrandsen <arnt@oryx.com>.
+
+2008-09-16 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * gnus-registry.el (gnus-registry-use-long-group-names): Make t the
+ default, it's better.
+
+2008-09-11 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * 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 <yamaoka@jpl.org>
* 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 8704d7ce3df..f4337a51524 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 edec081f2ce..4f6a565aa52 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 513aa9fc05d..2e9ec771cdc 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))