From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.emacs.gnus.general/20763 Path: main.gmane.org!not-for-mail From: Kai.Grossjohann@CS.Uni-Dortmund.DE Newsgroups: gmane.emacs.gnus.general Subject: Split replies to go with originals Date: 28 Jan 1999 19:35:53 +0100 Sender: owner-ding@hpc.uh.edu Message-ID: NNTP-Posting-Host: coloc-standby.netfonds.no Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: main.gmane.org 1035158995 19481 80.91.224.250 (21 Oct 2002 00:09:55 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Mon, 21 Oct 2002 00:09:55 +0000 (UTC) Return-Path: Original-Received: from karazm.math.uh.edu (karazm.math.uh.edu [129.7.128.1]) by sclp3.sclp.com (8.8.5/8.8.5) with ESMTP id NAA22020 for ; Thu, 28 Jan 1999 13:37:28 -0500 (EST) Original-Received: from sina.hpc.uh.edu (lists@Sina.HPC.UH.EDU [129.7.3.5]) by karazm.math.uh.edu (8.9.1/8.9.1) with ESMTP id MAB09309; Thu, 28 Jan 1999 12:36:28 -0600 (CST) Original-Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Thu, 28 Jan 1999 12:36:38 -0600 (CST) Original-Received: from sclp3.sclp.com (root@sclp3.sclp.com [204.252.123.139]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id MAA01804 for ; Thu, 28 Jan 1999 12:36:28 -0600 (CST) Original-Received: from waldorf.cs.uni-dortmund.de (waldorf.cs.uni-dortmund.de [129.217.4.42]) by sclp3.sclp.com (8.8.5/8.8.5) with ESMTP id NAA22003 for ; Thu, 28 Jan 1999 13:36:14 -0500 (EST) Original-Received: from ramses.informatik.uni-dortmund.de (ramses.cs.uni-dortmund.de [129.217.20.180]) by waldorf.cs.uni-dortmund.de with SMTP id TAA18833 for ; Thu, 28 Jan 1999 19:35:55 +0100 (MET) Original-Received: (grossjoh@localhost) by ramses.informatik.uni-dortmund.de id TAA15600; Thu, 28 Jan 1999 19:35:54 +0100 Original-To: ding@gnus.org Original-Lines: 148 User-Agent: Gnus/5.070073 (Pterodactyl Gnus v0.73) Emacs/20.3 Precedence: list X-Majordomo: 1.94.jlt7 Xref: main.gmane.org gmane.emacs.gnus.general:20763 X-Report-Spam: http://spam.gmane.org/gmane.emacs.gnus.general:20763 This is a MIME multipart message. If you are reading this, you shouldn't. --=-=-= For a long time, I have wanted the following feature: after I have manually moved a certain article to a certain group, I want all followups (or replies) to that article to go to that same group automatically. Back in the sixties, I created the following patch which will enable Gnus to do that. I'm interested in you folks trying it out to see if it works. Lars has said that he's willing to add this feature to Gnus but that he's going to rewrite the mail splitting thing. Now that he's rewritten mail fetching, I think this is a good time to once again check whether this feature works, before actually integrating it into the Gnus core. What does the patch do? Well, Gnus keeps a log of recently seen mail in ~/.nnmail-cache. This patch just adds the group name along with the message id, and then there's a splitting function for nnmail-split-fancy which looks up message ids in the In-Reply-To and References headers in that file to find out the right group name. The file format is backward-compatible, i.e. you can continue to use your existing file; the group name will be added to newly encountered messages. And the patch is smart enough to only put the group name in if it's a group in the mail backend where mail is split to. (This is also the part that will need to be changed when mail splitting is improved.) The patch is for pgnus 0.63 but still applies cleanly to 0.73, except for an offset of some lines. How do you use it? You need not do anything for this to store the message ids in ~/.nnmail-cache. The patch defines a function nnmail-split-fancy-with-parent which can be invoked from nnmail-split-fancy like so: (setq nnmail-split-fancy '(| (: nnmail-split-fancy-with-parent) ;; other splits go here )) Modify as appropriate. I'm interested in all kinds of feedback. kai -- Abort this operation? [Abort] [Cancel] --=-=-= Content-Type: application/x-patch Content-Disposition: attachment; filename=nnmail.el-patch-pgnus-0.63 Content-Transfer-Encoding: 8bit Content-Description: mail split patch --- lisp/nnmail.el.orig Mon Nov 30 22:47:02 1998 +++ lisp/nnmail.el Fri Dec 4 13:34:02 1998 @@ -1489,12 +1489,78 @@ (defun nnmail-cache-insert (id) (when nnmail-treat-duplicates - (unless (gnus-buffer-live-p nnmail-cache-buffer) - (nnmail-cache-open)) + ;; Store some information about the group this message is written + ;; to. This function might have been called from various places. + ;; Sometimes, a function up in the calling sequence has an + ;; argument GROUP which is bound to a string, the group name. At + ;; other times, there is a function up in the calling sequence + ;; which has an argument GROUP-ART which is a list of pairs, and + ;; the car of a pair is a group name. Should we check that the + ;; length of the list is equal to 1? -- kai + (let ((g nil)) + (cond ((and (boundp 'group) group) + (setq g group)) + ((and (boundp 'group-art-list) group-art-list + (listp group-art-list)) + (setq g (caar group-art-list))) + ((and (boundp 'group-art) group-art (listp group-art)) + (setq g (caar group-art))) + (t (setq g ""))) + (unless (gnus-buffer-live-p nnmail-cache-buffer) + (nnmail-cache-open)) + (save-excursion + (set-buffer nnmail-cache-buffer) + (goto-char (point-max)) + (if (and g (not (string= "" g)) + (gnus-methods-equal-p gnus-command-method + (nnmail-cache-primary-mail-backend))) + (insert id "\t" g "\n") + (insert id "\n")))))) + +(defun nnmail-cache-primary-mail-backend () + (let ((be-list (cons gnus-select-method gnus-secondary-select-methods)) + (be nil) + (res nil)) + (while (and (null res) be-list) + (setq be (car be-list)) + (setq be-list (cdr be-list)) + (when (and (gnus-method-option-p be 'respool) + (eval (intern (format "%s-get-new-mail" (car be))))) + (setq res be))) + res)) + +;; Fetch the group name corresponding to the message id stored in the +;; cache. +(defun nnmail-cache-fetch-group (id) + (when (and nnmail-treat-duplicates nnmail-cache-buffer) (save-excursion (set-buffer nnmail-cache-buffer) (goto-char (point-max)) - (insert id "\n")))) + (when (search-backward id nil t) + (beginning-of-line) + (skip-chars-forward "^\n\r\t") + (unless (eolp) + (forward-char 1) + (buffer-substring (point) + (progn (end-of-line) (point)))))))) + +;; Function for nnmail-split-fancy: look up all references in the +;; cache and if a match is found, return that group. +(defun nnmail-split-fancy-with-parent () + (let* ((refstr (or (message-fetch-field "references") + (message-fetch-field "in-reply-to"))) + (references nil) + (res nil)) + (when refstr + (setq references (nreverse (gnus-split-references refstr))) + (unless (gnus-buffer-live-p nnmail-cache-buffer) + (nnmail-cache-open)) + (mapcar (lambda (x) + (setq res (or (nnmail-cache-fetch-group x) res)) + (when (string= "drafts" res) + (setq res nil))) + references) + res))) (defun nnmail-cache-id-exists-p (id) (when nnmail-treat-duplicates --=-=-=--