From 20822106f02657f8c7e2a40e329ad242029a1a5d Mon Sep 17 00:00:00 2001 From: yamaoka Date: Wed, 1 Jan 2003 00:23:59 +0000 Subject: [PATCH] Synch with Oort Gnus. --- lisp/ChangeLog | 14 +++ lisp/deuglify.el | 18 ++-- lisp/gnus-sum.el | 7 +- lisp/nnoo.el | 2 +- lisp/spam.el | 268 ++++++++++++++++++++++++++++-------------------------- 5 files changed, 167 insertions(+), 142 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9e4af25..60004a5 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,19 @@ +2002-12-31 Reiner Steib <4uce.02.r.steib@gmx.net> + + * gnus-sum.el (gnus-summary-limit-to-age): Make prompt string + mention negatives. + +2002-12-31 Raymond Scholz + + * deuglify.el (gnus-outlook-rearrange-article): Use + `transpose-regions' instead of tempering the kill-ring. + (gnus-article-outlook-deuglify-article): Rehighlight article + instead of a complete redisplay. + 2002-12-31 Teodor Zlatanov + * spam.el: most defvars are defcustoms now + patches from Michael Shields * spam.el (spam-bogofilter-articles): Select the article diff --git a/lisp/deuglify.el b/lisp/deuglify.el index 61bb0e1..77cf564 100644 --- a/lisp/deuglify.el +++ b/lisp/deuglify.el @@ -280,7 +280,6 @@ ;; Functions -;; TODO: don't kill MIME parts ;;;###autoload (defun gnus-outlook-unwrap-lines () "Unwrap lines that appear to be wrapped citation lines. @@ -311,19 +310,18 @@ length of an unwrapped citation line." (replace-match "\\1\\2 \\3") (goto-char (match-beginning 0)))))))))) -;; TODO: respect signatures, don't kill MIME parts (defun gnus-outlook-rearrange-article (from-where) - "Put the text from `from-where' to the end of buffer at the top of the article buffer." + "Put the text from `from-where' to the end of buffer at the top of +the article buffer." (save-excursion (let ((inhibit-read-only t) (cite-marks gnus-outlook-deuglify-cite-marks)) (gnus-with-article-buffer - (unless (search-forward-regexp - (concat "^[ \t]*[^" cite-marks "\n]") nil t) - (kill-region from-where (point-max)) - (article-goto-body) - (yank) - (insert "\n")))))) + (beginning-of-buffer) + (re-search-forward "^$") + (transpose-regions (point) (- from-where 1) + from-where (point-max) t))))) + ;; John Doe wrote in message ;; news:a87usw8$dklsssa$2@some.news.server... @@ -425,7 +423,7 @@ length of an unwrapped citation line." (interactive) (gnus-outlook-deuglify-article) (with-current-buffer (or gnus-article-buffer (current-buffer)) - (gnus-article-prepare-display))) + (gnus-article-highlight t))) (provide 'deuglify) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 238ce6d..7554adc 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -2281,7 +2281,7 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs)))) ["Unread" gnus-summary-limit-to-unread t] ["Unseen" gnus-summary-limit-to-unseen t] ["Non-dormant" gnus-summary-limit-exclude-dormant t] - ["Articles" gnus-summary-limit-to-articles t] + ["Next articles" gnus-summary-limit-to-articles t] ["Pop limit" gnus-summary-pop-limit t] ["Show dormant" gnus-summary-limit-include-dormant t] ["Hide childless dormant" @@ -7333,8 +7333,9 @@ articles that are younger than AGE days." days) (while (not days-got) (setq days (if younger - (read-string "Limit to articles within (in days): ") - (read-string "Limit to articles older than (in days): "))) + (read-string "Limit to articles younger than (in days, older when negative): ") + (read-string + "Limit to articles older than (in days, younger when negative): "))) (when (> (length days) 0) (setq days (read days))) (if (numberp days) diff --git a/lisp/nnoo.el b/lisp/nnoo.el index 5bedae1..384599b 100644 --- a/lisp/nnoo.el +++ b/lisp/nnoo.el @@ -254,7 +254,7 @@ (setcdr bstate (delq defs (cdr bstate))) (pop defs) (while defs - (set (car (pop defs)) nil))))) + (set (car (pop defs)) nil))))) t) (defun nnoo-close (backend) diff --git a/lisp/spam.el b/lisp/spam.el index 216cb16..34a9a21 100644 --- a/lisp/spam.el +++ b/lisp/spam.el @@ -30,13 +30,14 @@ ;;; The integration with Gnus is not yet complete. See various `FIXME' ;;; comments, below, for supplementary explanations or discussions. +;;; Several TODO items are marked as such + ;;; Code: (require 'gnus-sum) -;; FIXME! We should not require `dns' nor `message' until we actually -;; need them. Best would be to declare needed functions as auto-loadable. -(require 'dns) +;; FIXME! We should not require `message' until we actually need +;; them. Best would be to declare needed functions as auto-loadable. (require 'message) ;; Attempt to load BBDB macros @@ -58,82 +59,143 @@ (eval-and-compile (autoload 'query-dig "dig")) -;;; Main parameters. - -(defvar spam-use-dig t - "True if query-dig should be used instead of query-dns.") - -(defvar spam-use-blacklist t - "True if the blacklist should be used.") - -(defvar spam-use-whitelist nil - "True if the whitelist should be used.") - -(defvar spam-use-blackholes nil - "True if blackholes should be used.") - -(defvar spam-use-bogofilter nil - "True if bogofilter should be used.") - -(defvar spam-use-bbdb nil - "True if BBDB should be used.") - -(defvar spam-use-ifile nil - "True if ifile should be used.") - -(defvar spam-split-group "spam" - "Usual group name where spam should be split.") +;; autoload query-dns +(eval-and-compile + (autoload 'query-dns "dns")) -(defvar spam-junk-mailgroups - ;; FIXME! The mailgroup list evidently depends on other choices made by the - ;; user, so the built-in default below is not likely to be appropriate. - (cons spam-split-group '("mail.junk" "poste.pourriel")) - "Mailgroups which are dedicated by splitting to receive various junk. -All unmarked article in such group receive the spam mark on group entry.") +;;; Main parameters. -;; FIXME! For `spam-ham-marks' and `spam-spam-marks', I wonder if it would -;; not be easier for the user to just accept a string of mark letters, instead -;; of a list of Gnus variable names. In such case, the stunt of deferred -;; evaluation would not be useful anymore. Lars?? :-) +(defgroup spam nil + "Spam configuration.") -;; FIXME! It is rather questionable to see `K', `X' and `Y' as indicating -;; positive ham. It much depends on how and why people use kill files, score -;; files, and the kill command. Maybe it would be better, by default, to not -;; process a message neither as ham nor spam, that is, just ignore it for -;; learning purposes, when we are not sure of how the user sees it. -;; But `r' and `R' should undoubtedly be seen as ham. +(defcustom spam-directory "~/News/spam/" + "Directory for spam whitelists and blacklists." + :type 'directory + :group 'spam) -;; FIXME! Some might consider overkill to define a list of spam marks. On -;; the other hand, who knows, some users might for example like that -;; explicitly `E'xpired articles be processed as positive spam. +(defcustom spam-whitelist (expand-file-name "whitelist" spam-directory) + "The location of the whitelist. +The file format is one regular expression per line. +The regular expression is matched against the address." + :type 'file + :group 'spam) -(defvar spam-ham-marks - (list gnus-del-mark gnus-read-mark gnus-killed-mark - gnus-kill-file-mark gnus-low-score-mark) +(defcustom spam-blacklist (expand-file-name "blacklist" spam-directory) + "The location of the blacklist. +The file format is one regular expression per line. +The regular expression is matched against the address." + :type 'file + :group 'spam) + +(defcustom spam-use-dig t + "Whether query-dig should be used instead of query-dns." + :type 'boolean + :group 'spam) + +(defcustom spam-use-blacklist t + "Whether the blacklist should be used by spam-split." + :type 'boolean + :group 'spam) + +(defcustom spam-use-whitelist nil + "Whether the whitelist should be used by spam-split." + :type 'boolean + :group 'spam) + +(defcustom spam-use-blackholes nil + "Whether blackholes should be used by spam-split." + :type 'boolean + :group 'spam) + +(defcustom spam-use-bogofilter nil + "Whether bogofilter should be used by spam-split." + :type 'boolean + :group 'spam) + +(defcustom spam-use-bbdb nil + "Whether BBDB should be used by spam-split." + :type 'boolean + :group 'spam) + +(defcustom spam-use-ifile nil + "Whether ifile should be used by spam-split." + :type 'boolean + :group 'spam) + +(defcustom spam-split-group "spam" + "Group name where incoming spam should be put by spam-split." + :type 'string + :group 'spam) + +;; FIXME! The mailgroup list evidently depends on other choices made by the +;; user, so the built-in default below is not likely to be appropriate. +(defcustom spam-junk-mailgroups (cons spam-split-group '("mail.junk" "poste.pourriel")) + "Mailgroups with spam contents. +All unmarked article in such group receive the spam mark on group entry." + :type '(repeat (string :tag "Group")) + :group 'spam) + +(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org" "dev.null.dk" "relays.visi.com") + "List of blackhole servers." + :type '(repeat (string :tag "Server")) + :group 'spam) + +(defcustom spam-ham-marks (list gnus-del-mark gnus-read-mark gnus-killed-mark gnus-kill-file-mark gnus-low-score-mark) "Marks considered as being ham (positively not spam). -Such articles will be transmitted to `bogofilter -n' on group exit.") +Such articles will be processed as ham (non-spam) on group exit." + :type '(repeat (character :tag "Mark")) + :group 'spam) -(defvar spam-spam-marks - (list gnus-spam-mark) +(defcustom spam-spam-marks (list gnus-spam-mark) "Marks considered as being spam (positively spam). -Such articles will be transmitted to `bogofilter -s' on group exit.") - -;; FIXME! Ideally, the remainder of this page should be fully integrated -;; within `gnus-sum.el'. +Such articles will be transmitted to `bogofilter -s' on group exit." + :type '(repeat (character :tag "Mark")) + :group 'spam) + +(defcustom spam-face 'gnus-splash-face + "Face for spam-marked articles" + :type 'face + :group 'spam) + +(defgroup spam-bogofilter nil + "Spam bogofilter configuration." + :group 'spam) + +(defcustom spam-bogofilter-output-buffer-name "*Bogofilter Output*" + "Name of buffer when displaying `bogofilter -v' output." + :type 'string + :group 'spam-bogofilter) + +(defcustom spam-bogofilter-initial-timeout 40 + "Timeout in seconds for the initial reply from the `bogofilter' program." + :type 'integer + :group 'spam-bogofilter) + +(defcustom spam-bogofilter-subsequent-timeout 15 + "Timeout in seconds for any subsequent reply from the `bogofilter' program." + :type 'integer + :group 'spam-bogofilter) + +(defcustom spam-bogofilter-path (executable-find "bogofilter") + "File path of the Bogofilter executable program." + :type '(choice (file :tag "Location of bogofilter") + (const :tag "Bogofilter is not installed")) + :group 'spam-bogofilter) + +;; FIXME! In the following regexp, we should explain which tool produces +;; which kind of header. I do not even remember them all by now. X-Junk +;; (and previously X-NoSpam) are produced by the `NoSpam' tool, which has +;; never been published, so it might not be reasonable leaving it in the +;; list. +(defcustom spam-bogofilter-spaminfo-header-regexp "^X-\\(jf\\|Junk\\|NoSpam\\|Spam\\|SB\\)[^:]*:" + "Regexp for spam markups in headers. +Markup from spam recognisers, as well as `Xref', are to be removed from +articles before they get registered by Bogofilter." + :type 'regexp + :group 'spam-bogofilter) ;;; Key bindings for spam control. -;; FIXME! The justification for `M-d' is that this is what Paul Graham -;; suggests in his original article, and what Eric Raymond's patch for Mutt -;; uses. But more importantly, that binding was still free in Summary mode! - -;; FIXME! Lars has not blessed the following key bindings yet. It looks -;; convenient that the score analysis command uses a sequence ending with the -;; letter `t', so it nicely parallels `B t' or `V t'. `M-d' is a kind of -;; "alternate" `d', it is also the sequence suggested in Paul Graham article, -;; and also in Eric Raymond's patch for Mutt. `S x' might be the more -;; official key binding for `M-d'. - (gnus-define-keys gnus-summary-mode-map "St" spam-bogofilter-score "Sx" gnus-summary-mark-as-spam @@ -143,10 +205,9 @@ Such articles will be transmitted to `bogofilter -s' on group exit.") ;;; How to highlight a spam summary line. -;; FIXME! Of course, `gnus-splash-face' has another purpose. Maybe a -;; special face should be created, named and used instead, for spam lines. +;; TODO: How do we redo this every time spam-face is customized? -(push '((eq mark gnus-spam-mark) . gnus-splash-face) +(push '((eq mark gnus-spam-mark) . spam-face) gnus-summary-highlight) ;;; Hooks dispatching. A bit raw for now. @@ -211,12 +272,6 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." ;;;; Blackholes. -(defvar spam-blackhole-servers '("bl.spamcop.net" - "relays.ordb.org" - "dev.null.dk" - "relays.visi.com") - "List of blackhole servers.") - (defun spam-check-blackholes () "Check the Received headers for blackholed relays." (let ((headers (message-fetch-field "received")) @@ -250,19 +305,6 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." ;;;; Blacklists and whitelists. -(defvar spam-directory "~/News/spam/" - "When spam files are kept.") - -(defvar spam-whitelist (expand-file-name "whitelist" spam-directory) - "The location of the whitelist. -The file format is one regular expression per line. -The regular expression is matched against the address.") - -(defvar spam-blacklist (expand-file-name "blacklist" spam-directory) - "The location of the blacklist. -The file format is one regular expression per line. -The regular expression is matched against the address.") - (defvar spam-whitelist-cache nil) (defvar spam-blacklist-cache nil) @@ -313,16 +355,10 @@ The regular expression is matched against the address.") spam-list-of-checks)))) ;;; check the ifile backend; return nil if the mail was NOT classified as spam -(condition-case nil - (progn - (require 'ifile-gnus) - ;;; - (defun spam-check-ifile () - (let ((ifile-primary-spam-group spam-split-group)) - (ifile-spam-filter nil)))) - (file-error (setq spam-list-of-checks - (delete (assoc 'spam-use-ifile spam-list-of-checks) - spam-list-of-checks)))) +;;; TODO: we can't (require) ifile, because it will insinuate itself automatically +(defun spam-check-ifile () + (let ((ifile-primary-spam-group spam-split-group)) + (ifile-spam-filter nil))) (defun spam-check-blacklist () ;; FIXME! Should it detect when file timestamps change? @@ -448,31 +484,13 @@ The regular expression is matched against the address.") ;;; * ? bogofilter ;;; | formail -bfI "X-Spam-Status: Yes" -(defvar spam-output-buffer-name "*Bogofilter Output*" - "Name of buffer when displaying `bogofilter -v' output.") - -(defvar spam-spaminfo-header-regexp - ;; FIXME! In the following regexp, we should explain which tool produces - ;; which kind of header. I do not even remember them all by now. X-Junk - ;; (and previously X-NoSpam) are produced by the `NoSpam' tool, which has - ;; never been published, so it might not be reasonable leaving it in the - ;; list. - "^X-\\(jf\\|Junk\\|NoSpam\\|Spam\\|SB\\)[^:]*:" - "Regexp for spam markups in headers. -Markup from spam recognisers, as well as `Xref', are to be removed from -articles before they get registered by Bogofilter.") - -(defvar spam-bogofilter-path (executable-find "bogofilter") - "File path of the Bogofilter executable program. -Force this variable to nil if you want to inhibit the functionality.") - (defun spam-check-bogofilter () ;; Dynamic spam check. I do not know how to check the exit status, ;; so instead, read `bogofilter -v' output. (when (and spam-use-bogofilter spam-bogofilter-path) (spam-bogofilter-articles nil "-v" (list (gnus-summary-article-number))) (when (save-excursion - (set-buffer spam-output-buffer-name) + (set-buffer spam-bogofilter-output-buffer-name) (goto-char (point-min)) (re-search-forward "Spamicity: \\(0\\.9\\|1\\.0\\)" nil t)) spam-split-group))) @@ -484,7 +502,7 @@ spamicity coefficient of each, and the overall article spamicity." (interactive) (when (and spam-use-bogofilter spam-bogofilter-path) (spam-bogofilter-articles nil "-v" (list (gnus-summary-article-number))) - (with-current-buffer spam-output-buffer-name + (with-current-buffer spam-bogofilter-output-buffer-name (unless (zerop (buffer-size)) (if (<= (count-lines (point-min) (point-max)) 1) (progn @@ -510,16 +528,10 @@ spamicity coefficient of each, and the overall article spamicity." (when spam-articles (spam-bogofilter-articles "SPAM" "-s" spam-articles))))) -(defvar spam-bogofilter-initial-timeout 40 - "Timeout in seconds for the initial reply from the `bogofilter' program.") - -(defvar spam-bogofilter-subsequent-timeout 15 - "Timeout in seconds for any subsequent reply from the `bogofilter' program.") - (defun spam-bogofilter-articles (type option articles) - (let ((output-buffer (get-buffer-create spam-output-buffer-name)) + (let ((output-buffer (get-buffer-create spam-bogofilter-output-buffer-name)) (article-copy (get-buffer-create " *Bogofilter Article Copy*")) - (remove-regexp (concat spam-spaminfo-header-regexp "\\|Xref:")) + (remove-regexp (concat spam-bogofilter-spaminfo-header-regexp "\\|Xref:")) (counter 0) prefix process article) (when type -- 1.7.10.4