X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=lisp%2Fgnus.el;h=8c7559b4aa56a5668a22178c23983df26f688549;hp=ddb80ef8b01951a2e16735df453416bb77c91b95;hb=5193de49edd84a0e8d74e8289269b6055e14d6b1;hpb=22df34c1f3b123215761ce5cac119baac5b22e6c diff --git a/lisp/gnus.el b/lisp/gnus.el index ddb80ef8b..8c7559b4a 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -1,7 +1,8 @@ ;;; gnus.el --- a newsreader for GNU Emacs -;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, -;; 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998, +;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +;; Free Software Foundation, Inc. ;; Author: Masanobu UMEDA ;; Lars Magne Ingebrigtsen @@ -9,20 +10,18 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -30,16 +29,37 @@ (eval '(run-hooks 'gnus-load-hook)) +;; For Emacs < 22.2. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'wid-edit) (require 'mm-util) (require 'nnheader) +;; These are defined afterwards with gnus-define-group-parameter +(defvar gnus-ham-process-destinations) +(defvar gnus-parameter-ham-marks-alist) +(defvar gnus-parameter-spam-marks-alist) +(defvar gnus-spam-autodetect) +(defvar gnus-spam-autodetect-methods) +(defvar gnus-spam-newsgroup-contents) +(defvar gnus-spam-process-destinations) +(defvar gnus-spam-resend-to) +(defvar gnus-ham-resend-to) +(defvar gnus-spam-process-newsgroups) + + (defgroup gnus nil "The coffee-brewing, all singing, all dancing, kitchen sink newsreader." :group 'news :group 'mail) +(defgroup gnus-start nil + "Starting your favorite newsreader." + :group 'gnus) + (defgroup gnus-format nil "Dealing with formatting issues." :group 'gnus) @@ -59,10 +79,6 @@ "Article Registry." :group 'gnus) -(defgroup gnus-start nil - "Starting your favorite newsreader." - :group 'gnus) - (defgroup gnus-start-server nil "Server options at startup." :group 'gnus-start) @@ -70,7 +86,7 @@ ;; These belong to gnus-group.el. (defgroup gnus-group nil "Group buffers." - :link '(custom-manual "(gnus)The Group Buffer") + :link '(custom-manual "(gnus)Group Buffer") :group 'gnus) (defgroup gnus-group-foreign nil @@ -111,7 +127,7 @@ ;; These belong to gnus-sum.el. (defgroup gnus-summary nil "Summary buffers." - :link '(custom-manual "(gnus)The Summary Buffer") + :link '(custom-manual "(gnus)Summary Buffer") :group 'gnus) (defgroup gnus-summary-exit nil @@ -155,7 +171,7 @@ (defgroup gnus-summary-sort nil "Sorting the summary buffer." - :link '(custom-manual "(gnus)Sorting") + :link '(custom-manual "(gnus)Sorting the Summary Buffer") :group 'gnus-summary) (defgroup gnus-summary-visual nil @@ -268,12 +284,8 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Various Various") :group 'gnus) -(defgroup gnus-mime nil - "Variables for controlling the Gnus MIME interface." - :group 'gnus) - (defgroup gnus-exit nil - "Exiting gnus." + "Exiting Gnus." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) @@ -282,10 +294,10 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.10.5" +(defconst gnus-version-number "0.11" "Version number for this version of Gnus.") -(defconst gnus-version (format "Gnus v%s" gnus-version-number) +(defconst gnus-version (format "No Gnus v%s" gnus-version-number) "Version string for this version of Gnus.") (defcustom gnus-inhibit-startup-message nil @@ -303,9 +315,6 @@ be set in `.emacs' instead." (unless (fboundp 'gnus-group-remove-excess-properties) (defalias 'gnus-group-remove-excess-properties 'ignore)) -(unless (fboundp 'gnus-set-text-properties) - (defalias 'gnus-set-text-properties 'set-text-properties)) - (unless (featurep 'gnus-xmas) (defalias 'gnus-make-overlay 'make-overlay) (defalias 'gnus-delete-overlay 'delete-overlay) @@ -316,7 +325,6 @@ be set in `.emacs' instead." (defalias 'gnus-overlay-end 'overlay-end) (defalias 'gnus-extent-detached-p 'ignore) (defalias 'gnus-extent-start-open 'ignore) - (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window) (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names) (defalias 'gnus-character-to-event 'identity) (defalias 'gnus-assq-delete-all 'assq-delete-all) @@ -325,7 +333,8 @@ be set in `.emacs' instead." (defvar gnus-mode-line-image-cache t) (if (fboundp 'find-image) (defun gnus-mode-line-buffer-identification (line) - (let ((str (car-safe line))) + (let ((str (car-safe line)) + (load-path (mm-image-load-path))) (if (and (stringp str) (string-match "^Gnus:" str)) (progn (add-text-properties @@ -356,7 +365,7 @@ be set in `.emacs' instead." ;; We define these group faces here to avoid the display ;; update forced when creating new faces. -(defface gnus-group-news-1-face +(defface gnus-group-news-1 '((((class color) (background dark)) (:foreground "PaleTurquoise" :bold t)) @@ -365,9 +374,12 @@ be set in `.emacs' instead." (:foreground "ForestGreen" :bold t)) (t ())) - "Level 1 newsgroup face.") + "Level 1 newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-1-face 'face-alias 'gnus-group-news-1) -(defface gnus-group-news-1-empty-face +(defface gnus-group-news-1-empty '((((class color) (background dark)) (:foreground "PaleTurquoise")) @@ -376,9 +388,12 @@ be set in `.emacs' instead." (:foreground "ForestGreen")) (t ())) - "Level 1 empty newsgroup face.") + "Level 1 empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-1-empty-face 'face-alias 'gnus-group-news-1-empty) -(defface gnus-group-news-2-face +(defface gnus-group-news-2 '((((class color) (background dark)) (:foreground "turquoise" :bold t)) @@ -387,9 +402,12 @@ be set in `.emacs' instead." (:foreground "CadetBlue4" :bold t)) (t ())) - "Level 2 newsgroup face.") + "Level 2 newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-2-face 'face-alias 'gnus-group-news-2) -(defface gnus-group-news-2-empty-face +(defface gnus-group-news-2-empty '((((class color) (background dark)) (:foreground "turquoise")) @@ -398,9 +416,12 @@ be set in `.emacs' instead." (:foreground "CadetBlue4")) (t ())) - "Level 2 empty newsgroup face.") + "Level 2 empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-2-empty-face 'face-alias 'gnus-group-news-2-empty) -(defface gnus-group-news-3-face +(defface gnus-group-news-3 '((((class color) (background dark)) (:bold t)) @@ -409,9 +430,12 @@ be set in `.emacs' instead." (:bold t)) (t ())) - "Level 3 newsgroup face.") + "Level 3 newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-3-face 'face-alias 'gnus-group-news-3) -(defface gnus-group-news-3-empty-face +(defface gnus-group-news-3-empty '((((class color) (background dark)) ()) @@ -420,9 +444,12 @@ be set in `.emacs' instead." ()) (t ())) - "Level 3 empty newsgroup face.") + "Level 3 empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-3-empty-face 'face-alias 'gnus-group-news-3-empty) -(defface gnus-group-news-4-face +(defface gnus-group-news-4 '((((class color) (background dark)) (:bold t)) @@ -431,9 +458,12 @@ be set in `.emacs' instead." (:bold t)) (t ())) - "Level 4 newsgroup face.") + "Level 4 newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-4-face 'face-alias 'gnus-group-news-4) -(defface gnus-group-news-4-empty-face +(defface gnus-group-news-4-empty '((((class color) (background dark)) ()) @@ -442,9 +472,12 @@ be set in `.emacs' instead." ()) (t ())) - "Level 4 empty newsgroup face.") + "Level 4 empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-4-empty-face 'face-alias 'gnus-group-news-4-empty) -(defface gnus-group-news-5-face +(defface gnus-group-news-5 '((((class color) (background dark)) (:bold t)) @@ -453,9 +486,12 @@ be set in `.emacs' instead." (:bold t)) (t ())) - "Level 5 newsgroup face.") + "Level 5 newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-5-face 'face-alias 'gnus-group-news-5) -(defface gnus-group-news-5-empty-face +(defface gnus-group-news-5-empty '((((class color) (background dark)) ()) @@ -464,9 +500,12 @@ be set in `.emacs' instead." ()) (t ())) - "Level 5 empty newsgroup face.") + "Level 5 empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-5-empty-face 'face-alias 'gnus-group-news-5-empty) -(defface gnus-group-news-6-face +(defface gnus-group-news-6 '((((class color) (background dark)) (:bold t)) @@ -475,9 +514,12 @@ be set in `.emacs' instead." (:bold t)) (t ())) - "Level 6 newsgroup face.") + "Level 6 newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-6-face 'face-alias 'gnus-group-news-6) -(defface gnus-group-news-6-empty-face +(defface gnus-group-news-6-empty '((((class color) (background dark)) ()) @@ -486,9 +528,12 @@ be set in `.emacs' instead." ()) (t ())) - "Level 6 empty newsgroup face.") + "Level 6 empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-6-empty-face 'face-alias 'gnus-group-news-6-empty) -(defface gnus-group-news-low-face +(defface gnus-group-news-low '((((class color) (background dark)) (:foreground "DarkTurquoise" :bold t)) @@ -497,9 +542,12 @@ be set in `.emacs' instead." (:foreground "DarkGreen" :bold t)) (t ())) - "Low level newsgroup face.") + "Low level newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-low-face 'face-alias 'gnus-group-news-low) -(defface gnus-group-news-low-empty-face +(defface gnus-group-news-low-empty '((((class color) (background dark)) (:foreground "DarkTurquoise")) @@ -508,108 +556,140 @@ be set in `.emacs' instead." (:foreground "DarkGreen")) (t ())) - "Low level empty newsgroup face.") + "Low level empty newsgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-news-low-empty-face 'face-alias 'gnus-group-news-low-empty) -(defface gnus-group-mail-1-face +(defface gnus-group-mail-1 '((((class color) (background dark)) - (:foreground "aquamarine1" :bold t)) + (:foreground "#e1ffe1" :bold t)) (((class color) (background light)) (:foreground "DeepPink3" :bold t)) (t (:bold t))) - "Level 1 mailgroup face.") + "Level 1 mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-1-face 'face-alias 'gnus-group-mail-1) -(defface gnus-group-mail-1-empty-face +(defface gnus-group-mail-1-empty '((((class color) (background dark)) - (:foreground "aquamarine1")) + (:foreground "#e1ffe1")) (((class color) (background light)) (:foreground "DeepPink3")) (t (:italic t :bold t))) - "Level 1 empty mailgroup face.") + "Level 1 empty mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-1-empty-face 'face-alias 'gnus-group-mail-1-empty) -(defface gnus-group-mail-2-face +(defface gnus-group-mail-2 '((((class color) (background dark)) - (:foreground "aquamarine2" :bold t)) + (:foreground "DarkSeaGreen1" :bold t)) (((class color) (background light)) (:foreground "HotPink3" :bold t)) (t (:bold t))) - "Level 2 mailgroup face.") + "Level 2 mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-2-face 'face-alias 'gnus-group-mail-2) -(defface gnus-group-mail-2-empty-face +(defface gnus-group-mail-2-empty '((((class color) (background dark)) - (:foreground "aquamarine2")) + (:foreground "DarkSeaGreen1")) (((class color) (background light)) (:foreground "HotPink3")) (t (:bold t))) - "Level 2 empty mailgroup face.") + "Level 2 empty mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-2-empty-face 'face-alias 'gnus-group-mail-2-empty) -(defface gnus-group-mail-3-face +(defface gnus-group-mail-3 '((((class color) (background dark)) - (:foreground "aquamarine3" :bold t)) + (:foreground "aquamarine1" :bold t)) (((class color) (background light)) (:foreground "magenta4" :bold t)) (t (:bold t))) - "Level 3 mailgroup face.") + "Level 3 mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-3-face 'face-alias 'gnus-group-mail-3) -(defface gnus-group-mail-3-empty-face +(defface gnus-group-mail-3-empty '((((class color) (background dark)) - (:foreground "aquamarine3")) + (:foreground "aquamarine1")) (((class color) (background light)) (:foreground "magenta4")) (t ())) - "Level 3 empty mailgroup face.") + "Level 3 empty mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-3-empty-face 'face-alias 'gnus-group-mail-3-empty) -(defface gnus-group-mail-low-face +(defface gnus-group-mail-low '((((class color) (background dark)) - (:foreground "aquamarine4" :bold t)) + (:foreground "aquamarine2" :bold t)) (((class color) (background light)) (:foreground "DeepPink4" :bold t)) (t (:bold t))) - "Low level mailgroup face.") + "Low level mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-low-face 'face-alias 'gnus-group-mail-low) -(defface gnus-group-mail-low-empty-face +(defface gnus-group-mail-low-empty '((((class color) (background dark)) - (:foreground "aquamarine4")) + (:foreground "aquamarine2")) (((class color) (background light)) (:foreground "DeepPink4")) (t (:bold t))) - "Low level empty mailgroup face.") + "Low level empty mailgroup face." + :group 'gnus-group) +;; backward-compatibility alias +(put 'gnus-group-mail-low-empty-face 'face-alias 'gnus-group-mail-low-empty) ;; Summary mode faces. -(defface gnus-summary-selected-face '((t - (:underline t))) - "Face used for selected articles.") +(defface gnus-summary-selected '((t (:underline t))) + "Face used for selected articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-selected-face 'face-alias 'gnus-summary-selected) -(defface gnus-summary-cancelled-face +(defface gnus-summary-cancelled '((((class color)) (:foreground "yellow" :background "black"))) - "Face used for cancelled articles.") + "Face used for cancelled articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-cancelled-face 'face-alias 'gnus-summary-cancelled) -(defface gnus-summary-high-ticked-face +(defface gnus-summary-high-ticked '((((class color) (background dark)) (:foreground "pink" :bold t)) @@ -618,9 +698,12 @@ be set in `.emacs' instead." (:foreground "firebrick" :bold t)) (t (:bold t))) - "Face used for high interest ticked articles.") + "Face used for high interest ticked articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-high-ticked-face 'face-alias 'gnus-summary-high-ticked) -(defface gnus-summary-low-ticked-face +(defface gnus-summary-low-ticked '((((class color) (background dark)) (:foreground "pink" :italic t)) @@ -629,9 +712,12 @@ be set in `.emacs' instead." (:foreground "firebrick" :italic t)) (t (:italic t))) - "Face used for low interest ticked articles.") + "Face used for low interest ticked articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-low-ticked-face 'face-alias 'gnus-summary-low-ticked) -(defface gnus-summary-normal-ticked-face +(defface gnus-summary-normal-ticked '((((class color) (background dark)) (:foreground "pink")) @@ -640,9 +726,12 @@ be set in `.emacs' instead." (:foreground "firebrick")) (t ())) - "Face used for normal interest ticked articles.") + "Face used for normal interest ticked articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-normal-ticked-face 'face-alias 'gnus-summary-normal-ticked) -(defface gnus-summary-high-ancient-face +(defface gnus-summary-high-ancient '((((class color) (background dark)) (:foreground "SkyBlue" :bold t)) @@ -651,9 +740,12 @@ be set in `.emacs' instead." (:foreground "RoyalBlue" :bold t)) (t (:bold t))) - "Face used for high interest ancient articles.") + "Face used for high interest ancient articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-high-ancient-face 'face-alias 'gnus-summary-high-ancient) -(defface gnus-summary-low-ancient-face +(defface gnus-summary-low-ancient '((((class color) (background dark)) (:foreground "SkyBlue" :italic t)) @@ -662,9 +754,12 @@ be set in `.emacs' instead." (:foreground "RoyalBlue" :italic t)) (t (:italic t))) - "Face used for low interest ancient articles.") + "Face used for low interest ancient articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-low-ancient-face 'face-alias 'gnus-summary-low-ancient) -(defface gnus-summary-normal-ancient-face +(defface gnus-summary-normal-ancient '((((class color) (background dark)) (:foreground "SkyBlue")) @@ -673,51 +768,72 @@ be set in `.emacs' instead." (:foreground "RoyalBlue")) (t ())) - "Face used for normal interest ancient articles.") + "Face used for normal interest ancient articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-normal-ancient-face 'face-alias 'gnus-summary-normal-ancient) -(defface gnus-summary-high-undownloaded-face +(defface gnus-summary-high-undownloaded '((((class color) (background light)) (:bold t :foreground "cyan4")) (((class color) (background dark)) (:bold t :foreground "LightGray")) (t (:inverse-video t :bold t))) - "Face used for high interest uncached articles.") + "Face used for high interest uncached articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-high-undownloaded-face 'face-alias 'gnus-summary-high-undownloaded) -(defface gnus-summary-low-undownloaded-face +(defface gnus-summary-low-undownloaded '((((class color) (background light)) (:italic t :foreground "cyan4" :bold nil)) (((class color) (background dark)) (:italic t :foreground "LightGray" :bold nil)) (t (:inverse-video t :italic t))) - "Face used for low interest uncached articles.") + "Face used for low interest uncached articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-low-undownloaded-face 'face-alias 'gnus-summary-low-undownloaded) -(defface gnus-summary-normal-undownloaded-face +(defface gnus-summary-normal-undownloaded '((((class color) (background light)) (:foreground "cyan4" :bold nil)) (((class color) (background dark)) (:foreground "LightGray" :bold nil)) (t (:inverse-video t))) - "Face used for normal interest uncached articles.") + "Face used for normal interest uncached articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-normal-undownloaded-face 'face-alias 'gnus-summary-normal-undownloaded) -(defface gnus-summary-high-unread-face +(defface gnus-summary-high-unread '((t (:bold t))) - "Face used for high interest unread articles.") + "Face used for high interest unread articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-high-unread-face 'face-alias 'gnus-summary-high-unread) -(defface gnus-summary-low-unread-face +(defface gnus-summary-low-unread '((t (:italic t))) - "Face used for low interest unread articles.") + "Face used for low interest unread articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-low-unread-face 'face-alias 'gnus-summary-low-unread) -(defface gnus-summary-normal-unread-face +(defface gnus-summary-normal-unread '((t ())) - "Face used for normal interest unread articles.") + "Face used for normal interest unread articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-normal-unread-face 'face-alias 'gnus-summary-normal-unread) -(defface gnus-summary-high-read-face +(defface gnus-summary-high-read '((((class color) (background dark)) (:foreground "PaleGreen" @@ -728,9 +844,12 @@ be set in `.emacs' instead." :bold t)) (t (:bold t))) - "Face used for high interest read articles.") + "Face used for high interest read articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-high-read-face 'face-alias 'gnus-summary-high-read) -(defface gnus-summary-low-read-face +(defface gnus-summary-low-read '((((class color) (background dark)) (:foreground "PaleGreen" @@ -741,9 +860,12 @@ be set in `.emacs' instead." :italic t)) (t (:italic t))) - "Face used for low interest read articles.") + "Face used for low interest read articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-low-read-face 'face-alias 'gnus-summary-low-read) -(defface gnus-summary-normal-read-face +(defface gnus-summary-normal-read '((((class color) (background dark)) (:foreground "PaleGreen")) @@ -752,7 +874,10 @@ be set in `.emacs' instead." (:foreground "DarkGreen")) (t ())) - "Face used for normal interest read articles.") + "Face used for normal interest read articles." + :group 'gnus-summary) +;; backward-compatibility alias +(put 'gnus-summary-normal-read-face 'face-alias 'gnus-summary-normal-read) ;;; @@ -793,19 +918,21 @@ be set in `.emacs' instead." (defvar gnus-group-buffer "*Group*") -(eval-and-compile - (autoload 'gnus-play-jingle "gnus-audio")) +(autoload 'gnus-play-jingle "gnus-audio") -(defface gnus-splash-face +(defface gnus-splash '((((class color) (background dark)) - (:foreground "#888888")) + (:foreground "#cccccc")) (((class color) (background light)) (:foreground "#888888")) (t ())) - "Face for the splash screen.") + "Face for the splash screen." + :group 'gnus-start) +;; backward-compatibility alias +(put 'gnus-splash-face 'face-alias 'gnus-splash) (defun gnus-splash () (save-excursion @@ -851,12 +978,12 @@ be set in `.emacs' instead." (storm "#666699" "#99ccff") (pdino "#9999cc" "#99ccff") (purp "#9999cc" "#666699") - (no "#000000" "#ff0000") + (no "#ff0000" "#ffff00") (neutral "#b4b4b4" "#878787") (september "#bf9900" "#ffcc00")) "Color alist used for the Gnus logo.") -(defcustom gnus-logo-color-style 'oort +(defcustom gnus-logo-color-style 'no "*Color styles used for the Gnus logo." :type `(choice ,@(mapcar (lambda (elem) (list 'const (car elem))) gnus-logo-color-alist)) @@ -866,6 +993,8 @@ be set in `.emacs' instead." (cdr (assq gnus-logo-color-style gnus-logo-color-alist)) "Colors used for the Gnus logo.") +(declare-function image-size "image.c" (spec &optional pixels frame)) + (defun gnus-group-startup-message (&optional x y) "Insert startup message in current buffer." ;; Insert the message. @@ -874,7 +1003,17 @@ be set in `.emacs' instead." ((and (fboundp 'find-image) (display-graphic-p) - (let* ((data-directory (nnheader-find-etc-directory "gnus")) + ;; Make sure the library defining `image-load-path' is loaded + ;; (`find-image' is autoloaded) (and discard the result). Else, we may + ;; get "defvar ignored because image-load-path is let-bound" when calling + ;; `find-image' below. + (or (find-image '(nil (:type xpm :file "gnus.xpm"))) t) + (let* ((data-directory (nnheader-find-etc-directory "images/gnus")) + (image-load-path (cond (data-directory + (list data-directory)) + ((boundp 'image-load-path) + (symbol-value 'image-load-path)) + (t load-path))) (image (find-image `((:type xpm :file "gnus.xpm" :color-symbols @@ -884,11 +1023,11 @@ be set in `.emacs' instead." ("background" . ,(face-background 'default)))) (:type pbm :file "gnus.pbm" ;; Account for the pbm's blackground. - :background ,(face-foreground 'gnus-splash-face) + :background ,(face-foreground 'gnus-splash) :foreground ,(face-background 'default)) (:type xbm :file "gnus.xbm" ;; Account for the xbm's blackground. - :background ,(face-foreground 'gnus-splash-face) + :background ,(face-foreground 'gnus-splash) :foreground ,(face-background 'default)))))) (when image (let ((size (image-size image))) @@ -902,23 +1041,23 @@ be set in `.emacs' instead." (t (insert (format " %s - _ ___ _ _ - _ ___ __ ___ __ _ ___ - __ _ ___ __ ___ - _ ___ _ - _ _ __ _ - ___ __ _ - __ _ - _ _ _ - _ _ _ - _ _ _ - __ ___ - _ _ _ _ - _ _ - _ _ - _ _ - _ - __ + _ ___ _ _ + _ ___ __ ___ __ _ ___ + __ _ ___ __ ___ + _ ___ _ + _ _ __ _ + ___ __ _ + __ _ + _ _ _ + _ _ _ + _ _ _ + __ ___ + _ _ _ _ + _ _ + _ _ + _ _ + _ + __ " "")) @@ -932,7 +1071,7 @@ be set in `.emacs' instead." (rest (- wheight pheight))) (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))) ;; Fontify some. - (put-text-property (point-min) (point-max) 'face 'gnus-splash-face) + (put-text-property (point-min) (point-max) 'face 'gnus-splash) (setq gnus-simple-splash t))) (goto-char (point-min)) (setq mode-line-buffer-identification (concat " " gnus-version)) @@ -940,10 +1079,10 @@ be set in `.emacs' instead." (eval-when (load) (let ((command (format "%s" this-command))) - (if (and (string-match "gnus" command) - (not (string-match "gnus-other-frame" command))) - (gnus-splash) - (gnus-get-buffer-create gnus-group-buffer)))) + (when (string-match "gnus" command) + (if (string-match "gnus-other-frame" command) + (gnus-get-buffer-create gnus-group-buffer) + (gnus-splash))))) ;;; Do the rest. @@ -963,10 +1102,22 @@ For example: (\"mail\\\\.me\" (gnus-use-scoring t)) (\"list\\\\..*\" (total-expire . t) (broken-reply-to . t)))" + :version "22.1" :group 'gnus-group-various :type '(repeat (cons regexp (repeat sexp)))) +(defcustom gnus-parameters-case-fold-search 'default + "If it is t, ignore case of group names specified in `gnus-parameters'. +If it is nil, don't ignore case. If it is `default', which is for the +backward compatibility, use the value of `case-fold-search'." + :version "22.1" + :group 'gnus-group-various + :type '(choice :format "%{%t%}:\n %[Value Menu%] %v" + (const :tag "Use `case-fold-search'" default) + (const nil) + (const t))) + (defvar gnus-group-parameters-more nil) (defmacro gnus-define-group-parameter (param &rest rest) @@ -1103,9 +1254,13 @@ Check the NNTPSERVER environment variable and the (and (file-readable-p gnus-nntpserver-file) (with-temp-buffer (insert-file-contents gnus-nntpserver-file) - (let ((name (buffer-string))) - (unless (string-match "\\`[ \t\n]*$" name) - name)))))) + (when (re-search-forward "[^ \t\n\r]+" nil t) + (match-string 0)))))) + +;; `M-x customize-variable RET gnus-select-method RET' should work without +;; starting or even loading Gnus. +;;;###autoload(when (fboundp 'custom-autoload) +;;;###autoload (custom-autoload 'gnus-select-method "gnus")) (defcustom gnus-select-method (condition-case nil @@ -1140,16 +1295,36 @@ If you use this variable, you must set `gnus-nntp-server' to nil. There is a lot more to know about select methods and virtual servers - see the manual for details." :group 'gnus-server + :group 'gnus-start + :initialize 'custom-initialize-default :type 'gnus-select-method) (defcustom gnus-message-archive-method "archive" "*Method used for archiving messages you've sent. -This should be a mail method." +This should be a mail method. + +See also `gnus-update-message-archive-method'." :group 'gnus-server :group 'gnus-message :type '(choice (const :tag "Default archive method" "archive") gnus-select-method)) +(defcustom gnus-update-message-archive-method nil + "Non-nil means always update the saved \"archive\" method. + +The archive method is initially set according to the value of +`gnus-message-archive-method' and is saved in the \"~/.newsrc.eld\" file +so that it may be used as a real method of the server which is named +\"archive\" ever since. If it once has been saved, it will never be +updated if the value of this variable is nil, even if you change the +value of `gnus-message-archive-method' afterward. If you want the +saved \"archive\" method to be updated whenever you change the value of +`gnus-message-archive-method', set this variable to a non-nil value." + :version "23.1" ;; No Gnus + :group 'gnus-server + :group 'gnus-message + :type 'boolean) + (defcustom gnus-message-archive-group nil "*Name of the group in which to save the messages you've written. This can either be a string; a list of strings; or an alist @@ -1185,7 +1360,7 @@ non-numeric prefix - `C-u M-x gnus', in short." (defcustom gnus-nntp-server nil "*The name of the host running the NNTP server. -This variable is semi-obsolete. Use the `gnus-select-method' +This variable is semi-obsolete. Use the `gnus-select-method' variable instead." :group 'gnus-server :type '(choice (const :tag "disable" nil) @@ -1313,20 +1488,23 @@ If the default site is too slow, try one of these: (gnus-replace-in-string name "\\." "-") "-charter.html"))) "*An alist of (HIERARCHY . FORM) pairs used to construct the URL of a charter. When FORM is evaluated `name' is bound to the name of the group." + :version "22.1" :group 'gnus-group-various :type '(repeat (cons (string :tag "Hierarchy") (sexp :tag "Form")))) +(put 'gnus-group-charter-alist 'risky-local-variable t) (defcustom gnus-group-fetch-control-use-browse-url nil "*Non-nil means that control messages are displayed using `browse-url'. Otherwise they are fetched with ange-ftp and displayed in an ephemeral group." + :version "22.1" :group 'gnus-group-various :type 'boolean) (defcustom gnus-use-cross-reference t "*Non-nil means that cross referenced articles will be marked as read. If nil, ignore cross references. If t, mark articles as read in -subscribed newsgroups. If neither t nor nil, mark as read in all +subscribed newsgroups. If neither t nor nil, mark as read in all newsgroups." :group 'gnus-server :type '(choice (const :tag "off" nil) @@ -1349,7 +1527,7 @@ If it is nil, no confirmation is required." :type '(choice (const :tag "No limit" nil) integer)) -(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix))) +(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v))) "*Non-nil means that the default name of a file to save articles in is the group name. If it's nil, the directory form of the group name is used instead. @@ -1414,11 +1592,6 @@ cache to the full extent of the law." :group 'gnus-meta :type 'boolean) -(defcustom gnus-use-grouplens nil - "*If non-nil, use GroupLens ratings." - :group 'gnus-meta - :type 'boolean) - (defcustom gnus-keep-backlog 20 "*If non-nil, Gnus will keep read articles for later re-retrieval. If it is a number N, then Gnus will only keep the last N articles @@ -1431,9 +1604,23 @@ articles. This is not a good idea." :value t))) (defcustom gnus-use-nocem nil - "*If non-nil, Gnus will read NoCeM cancel messages." + "*If non-nil, Gnus will read NoCeM cancel messages. +You can also set this variable to a positive number as a group level. +In that case, Gnus scans NoCeM messages when checking new news if this +value is not exceeding a group level that you specify as the prefix +argument to some commands, e.g. `gnus', `gnus-group-get-new-news', etc. +Otherwise, Gnus does not scan NoCeM messages if you specify a group +level to those commands." :group 'gnus-meta - :type 'boolean) + :type '(choice + (const :tag "off" nil) + (const :tag "on" t) + (list :convert-widget + (lambda (widget) + (list 'integer :tag "group level" + :value (if (boundp 'gnus-level-default-subscribed) + gnus-level-default-subscribed + 3)))))) (defcustom gnus-suppress-duplicates nil "*If non-nil, Gnus will mark duplicate copies of the same article as read." @@ -1531,7 +1718,7 @@ of the select method. The other elements may be the category of this method (i. e., `post', `mail', `none' or whatever) or other properties that this method has (like being respoolable). If you implement a new select method, all you should have to change is -this variable. I think." +this variable. I think." :group 'gnus-server :type '(repeat (group (string :tag "Name") (radio-button-choice (const :format "%v " post) @@ -1599,6 +1786,7 @@ to be desirable; see the manual for further details." "Return GROUP's to-address." :variable-document "*Alist of group regexps and correspondent to-addresses." + :variable-group gnus-group-parameter :parameter-type '(gnus-email-address :tag "To Address") :parameter-document "\ This will be used when doing followups and posts. @@ -1625,6 +1813,7 @@ address was listed in gnus-group-split Addresses (see below).") "Return GROUP's to-list." :variable-document "*Alist of group regexps and correspondent to-lists." + :variable-group gnus-group-parameter :parameter-type '(gnus-email-address :tag "To List") :parameter-document "\ This address will be used when doing a `a' in the group. @@ -1643,6 +1832,7 @@ address was listed in gnus-group-split Addresses (see below).") "Return GROUP's subscription status." :variable-document "*Groups which are automatically considered subscribed." + :variable-group gnus-group-parameter :parameter-type '(const :tag "Subscribed" t) :parameter-document "\ Gnus assumed that you are subscribed to the To/List address. @@ -1682,7 +1872,7 @@ which to perform auto-expiry. This only makes sense for mail groups." "*Groups in which to perform expiry of all read articles. Use with extreme caution. All groups that match this regexp will be expiring - which means that all read articles will be deleted after -\(say) one week. (This only goes for mail groups and the like, of +\(say) one week. (This only goes for mail groups and the like, of course.)" :variable-group nnmail-expire :variable-type '(choice (const nil) @@ -1749,6 +1939,7 @@ posting an article." "Return GROUP's initial input of the number of articles." :variable-document "*Alist of group regexps and its initial input of the number of articles." + :variable-group gnus-group-parameter :parameter-type '(choice :tag "Initial Input for Large Newsgroup" (const :tag "All" nil) (integer)) @@ -1774,7 +1965,7 @@ total number of articles in the group.") (list (regexp :tag "Group Name Regular Expression") (boolean :tag "Ignored"))) - + :parameter-type '(boolean :tag "Group Ignored by the Registry") :parameter-document "Whether the Gnus Registry should ignore this group.") @@ -1783,6 +1974,7 @@ total number of articles in the group.") (defcustom gnus-install-group-spam-parameters t "*Disable the group parameters for spam detection. Enable if `G c' in XEmacs is giving you trouble, and make sure to submit a bug report." + :version "22.1" :type 'boolean :group 'gnus-start) @@ -1810,11 +2002,12 @@ registry.") :variable gnus-spam-newsgroup-contents :variable-default nil :variable-document - "*Groups in which to automatically mark new articles as spam on -summary entry. If non-nil, this should be a list of group name -regexps that should match all groups in which to do automatic spam -tagging, associated with a classification (spam, ham, or neither). -This only makes sense for mail groups." + "*Group classification (spam, ham, or neither). Only +meaningful when spam.el is loaded. If non-nil, this should be a +list of group name regexps associated with a classification for +each one. In spam groups, new articles are marked as spam on +summary entry. There is other behavior associated with ham and +no classification when spam.el is loaded - see the manual." :variable-group spam :variable-type '(repeat (list :tag "Group contents spam/ham classification" @@ -1831,7 +2024,45 @@ This only makes sense for mail groups." (const :tag "Unclassified" nil))) :parameter-document "The spam classification (spam, ham, or neither) of this group. -When a spam group is entered, all unread articles are marked as spam.") +When a spam group is entered, all unread articles are marked as +spam. There is other behavior associated with ham and no +classification when spam.el is loaded - see the manual.") + + (gnus-define-group-parameter + spam-resend-to + :type list + :function-document + "The address to get spam resent (through spam-report-resend)." + :variable gnus-spam-resend-to + :variable-default nil + :variable-document + "The address to get spam resent (through spam-report-resend)." + :variable-group spam + :variable-type '(repeat + (list :tag "Group address for resending spam" + (regexp :tag "Group") + (string :tag "E-mail address for resending spam (requires the spam-use-resend exit processor)"))) + :parameter-type 'string :tag "E-mail address for resending spam (requires the spam-use-resend exit processor)" + :parameter-document + "The address to get spam resent (through spam-report-resend).") + + (gnus-define-group-parameter + ham-resend-to + :type list + :function-document + "The address to get ham resent (through spam-report-resend)." + :variable gnus-ham-resend-to + :variable-default nil + :variable-document + "The address to get ham resent (through spam-report-resend)." + :variable-group spam + :variable-type '(repeat + (list :tag "Group address for resending ham" + (regexp :tag "Group") + (string :tag "E-mail address for resending ham (requires the spam-use-resend exit processor)"))) + :parameter-type 'string :tag "E-mail address for resending ham (requires the spam-use-resend exit processor)" + :parameter-document + "The address to get ham resent (through spam-report-resend).") (defvar gnus-group-spam-exit-processor-ifile "ifile" "OBSOLETE: The ifile summary exit spam processor.") @@ -1883,12 +2114,33 @@ Only applicable to non-spam (unclassified and ham) groups.") (gnus-define-group-parameter spam-process :type list - :parameter-type - '(choice + :parameter-type + '(choice :tag "Spam Summary Exit Processor" :value nil (list :tag "Spam Summary Exit Processor Choices" (set + (const :tag "Spam: Bogofilter" (spam spam-use-bogofilter)) + (const :tag "Spam: Blacklist" (spam spam-use-blacklist)) + (const :tag "Spam: Bsfilter" (spam spam-use-bsfilter)) + (const :tag "Spam: Gmane Report" (spam spam-use-gmane)) + (const :tag "Spam: Resend Message"(spam spam-use-resend)) + (const :tag "Spam: ifile" (spam spam-use-ifile)) + (const :tag "Spam: Spam Oracle" (spam spam-use-spamoracle)) + (const :tag "Spam: Spam-stat" (spam spam-use-stat)) + (const :tag "Spam: SpamAssassin" (spam spam-use-spamassassin)) + (const :tag "Spam: CRM114" (spam spam-use-crm114)) + (const :tag "Ham: BBDB" (ham spam-use-BBDB)) + (const :tag "Ham: Bogofilter" (ham spam-use-bogofilter)) + (const :tag "Ham: Bsfilter" (ham spam-use-bsfilter)) + (const :tag "Ham: Copy" (ham spam-use-ham-copy)) + (const :tag "Ham: Resend Message" (ham spam-use-resend)) + (const :tag "Ham: ifile" (ham spam-use-ifile)) + (const :tag "Ham: Spam Oracle" (ham spam-use-spamoracle)) + (const :tag "Ham: Spam-stat" (ham spam-use-stat)) + (const :tag "Ham: SpamAssassin" (ham spam-use-spamassassin)) + (const :tag "Ham: CRM114" (ham spam-use-crm114)) + (const :tag "Ham: Whitelist" (ham spam-use-whitelist)) (variable-item gnus-group-spam-exit-processor-ifile) (variable-item gnus-group-spam-exit-processor-stat) (variable-item gnus-group-spam-exit-processor-bogofilter) @@ -1901,20 +2153,7 @@ Only applicable to non-spam (unclassified and ham) groups.") (variable-item gnus-group-ham-exit-processor-whitelist) (variable-item gnus-group-ham-exit-processor-BBDB) (variable-item gnus-group-ham-exit-processor-spamoracle) - (variable-item gnus-group-ham-exit-processor-copy) - (const :tag "Spam: Gmane Report" (spam spam-use-gmane)) - (const :tag "Spam: Bogofilter" (spam spam-use-bogofilter)) - (const :tag "Spam: Blacklist" (spam spam-use-blacklist)) - (const :tag "Spam: ifile" (spam spam-use-ifile)) - (const :tag "Spam: Spam-stat" (spam spam-use-stat)) - (const :tag "Spam: Spam Oracle" (spam spam-use-spamoracle)) - (const :tag "Ham: ifile" (ham spam-use-ifile)) - (const :tag "Ham: Bogofilter" (ham spam-use-bogofilter)) - (const :tag "Ham: Spam-stat" (ham spam-use-stat)) - (const :tag "Ham: Whitelist" (ham spam-use-whitelist)) - (const :tag "Ham: BBDB" (ham spam-use-BBDB)) - (const :tag "Ham: Copy" (ham spam-use-ham-copy)) - (const :tag "Ham: Spam Oracle" (ham spam-use-spamoracle))))) + (variable-item gnus-group-ham-exit-processor-copy)))) :function-document "Which spam or ham processors will be applied when the summary is exited." :variable gnus-spam-process-newsgroups @@ -1925,12 +2164,33 @@ a backend on summary exit. If non-nil, this should be a list of group name regexps that should match all groups in which to do automatic spam processing, associated with the appropriate processor." :variable-group spam - :variable-type + :variable-type '(repeat :tag "Spam/Ham Processors" (list :tag "Spam Summary Exit Processor Choices" (regexp :tag "Group Regexp") - (set + (set :tag "Spam/Ham Summary Exit Processor" + (const :tag "Spam: Bogofilter" (spam spam-use-bogofilter)) + (const :tag "Spam: Blacklist" (spam spam-use-blacklist)) + (const :tag "Spam: Bsfilter" (spam spam-use-bsfilter)) + (const :tag "Spam: Gmane Report" (spam spam-use-gmane)) + (const :tag "Spam: Resend Message"(spam spam-use-resend)) + (const :tag "Spam: ifile" (spam spam-use-ifile)) + (const :tag "Spam: Spam-stat" (spam spam-use-stat)) + (const :tag "Spam: Spam Oracle" (spam spam-use-spamoracle)) + (const :tag "Spam: SpamAssassin" (spam spam-use-spamassassin)) + (const :tag "Spam: CRM114" (spam spam-use-crm114)) + (const :tag "Ham: BBDB" (ham spam-use-BBDB)) + (const :tag "Ham: Bogofilter" (ham spam-use-bogofilter)) + (const :tag "Ham: Bsfilter" (ham spam-use-bsfilter)) + (const :tag "Ham: Copy" (ham spam-use-ham-copy)) + (const :tag "Ham: Resend Message" (ham spam-use-resend)) + (const :tag "Ham: ifile" (ham spam-use-ifile)) + (const :tag "Ham: Spam-stat" (ham spam-use-stat)) + (const :tag "Ham: Spam Oracle" (ham spam-use-spamoracle)) + (const :tag "Ham: SpamAssassin" (ham spam-use-spamassassin)) + (const :tag "Ham: CRM114" (ham spam-use-crm114)) + (const :tag "Ham: Whitelist" (ham spam-use-whitelist)) (variable-item gnus-group-spam-exit-processor-ifile) (variable-item gnus-group-spam-exit-processor-stat) (variable-item gnus-group-spam-exit-processor-bogofilter) @@ -1943,20 +2203,7 @@ spam processing, associated with the appropriate processor." (variable-item gnus-group-ham-exit-processor-whitelist) (variable-item gnus-group-ham-exit-processor-BBDB) (variable-item gnus-group-ham-exit-processor-spamoracle) - (variable-item gnus-group-ham-exit-processor-copy) - (const :tag "Spam: Gmane Report" (spam spam-use-gmane)) - (const :tag "Spam: Bogofilter" (spam spam-use-bogofilter)) - (const :tag "Spam: Blacklist" (spam spam-use-blacklist)) - (const :tag "Spam: ifile" (spam spam-use-ifile)) - (const :tag "Spam: Spam-stat" (spam spam-use-stat)) - (const :tag "Spam: Spam Oracle" (spam spam-use-spamoracle)) - (const :tag "Ham: ifile" (ham spam-use-ifile)) - (const :tag "Ham: Bogofilter" (ham spam-use-bogofilter)) - (const :tag "Ham: Spam-stat" (ham spam-use-stat)) - (const :tag "Ham: Whitelist" (ham spam-use-whitelist)) - (const :tag "Ham: BBDB" (ham spam-use-BBDB)) - (const :tag "Ham: Copy" (ham spam-use-ham-copy)) - (const :tag "Ham: Spam Oracle" (ham spam-use-spamoracle))))) + (variable-item gnus-group-ham-exit-processor-copy)))) :parameter-document "Which spam or ham processors will be applied when the summary is exited.") @@ -1964,7 +2211,7 @@ spam processing, associated with the appropriate processor." (gnus-define-group-parameter spam-autodetect :type list - :parameter-type + :parameter-type '(boolean :tag "Spam autodetection") :function-document "Should spam be autodetected (with spam-split) in this group?" @@ -1975,7 +2222,7 @@ spam processing, associated with the appropriate processor." Only unseen articles will be examined, unless spam-autodetect-recheck-messages is set." :variable-group spam - :variable-type + :variable-type '(repeat :tag "Autodetection setting" (list @@ -1989,18 +2236,24 @@ spam-autodetect-recheck-messages is set.") (gnus-define-group-parameter spam-autodetect-methods :type list - :parameter-type + :parameter-type '(choice :tag "Spam autodetection-specific methods" (const none) (const default) (set :tag "Use specific methods" (variable-item spam-use-blacklist) + (variable-item spam-use-gmane-xref) (variable-item spam-use-regex-headers) (variable-item spam-use-regex-body) (variable-item spam-use-whitelist) (variable-item spam-use-BBDB) (variable-item spam-use-ifile) (variable-item spam-use-spamoracle) + (variable-item spam-use-crm114) + (variable-item spam-use-spamassassin) + (variable-item spam-use-spamassassin-headers) + (variable-item spam-use-bsfilter) + (variable-item spam-use-bsfilter-headers) (variable-item spam-use-stat) (variable-item spam-use-blackholes) (variable-item spam-use-hashcash) @@ -2016,7 +2269,7 @@ Requires the spam-autodetect parameter. Only unseen articles will be examined, unless spam-autodetect-recheck-messages is set." :variable-group spam - :variable-type + :variable-type '(repeat :tag "Autodetection methods" (list @@ -2026,19 +2279,25 @@ set." (const default) (set :tag "Use specific methods" (variable-item spam-use-blacklist) + (variable-item spam-use-gmane-xref) (variable-item spam-use-regex-headers) (variable-item spam-use-regex-body) (variable-item spam-use-whitelist) (variable-item spam-use-BBDB) (variable-item spam-use-ifile) (variable-item spam-use-spamoracle) + (variable-item spam-use-crm114) (variable-item spam-use-stat) (variable-item spam-use-blackholes) (variable-item spam-use-hashcash) + (variable-item spam-use-spamassassin) + (variable-item spam-use-spamassassin-headers) + (variable-item spam-use-bsfilter) + (variable-item spam-use-bsfilter-headers) (variable-item spam-use-bogofilter-headers) (variable-item spam-use-bogofilter))))) :parameter-document - "Spam autodetection methods. + "Spam autodetection methods. Requires the spam-autodetect parameter. Only unseen articles will be examined, unless spam-autodetect-recheck-messages is set.") @@ -2046,7 +2305,7 @@ set.") (gnus-define-group-parameter spam-process-destination :type list - :parameter-type + :parameter-type '(choice :tag "Destination for spam-processed articles at summary exit" (string :tag "Move to a group") (repeat :tag "Move to multiple groups" @@ -2064,7 +2323,7 @@ to do spam-processed article moving, associated with the destination group or nil for explicit expiration. This only makes sense for mail groups." :variable-group spam - :variable-type + :variable-type '(repeat :tag "Spam-processed articles destination" (list @@ -2077,11 +2336,11 @@ mail groups." (const :tag "Expire" nil)))) :parameter-document "Where spam-processed articles will go at summary exit.") - + (gnus-define-group-parameter ham-process-destination :type list - :parameter-type + :parameter-type '(choice :tag "Destination for ham articles at summary exit from a spam group" (string :tag "Move to a group") @@ -2101,7 +2360,7 @@ to do ham article moving, associated with the destination group or nil for explicit ignoring. This only makes sense for mail groups, and only works in spam groups." :variable-group spam - :variable-type + :variable-type '(repeat :tag "Ham articles destination" (list @@ -2202,7 +2461,8 @@ following hook: "Function run when a group level is changed. It is called with three parameters -- GROUP, LEVEL and OLDLEVEL." :group 'gnus-group-levels - :type 'function) + :type '(choice (const nil) + function)) ;;; Face thingies. @@ -2212,8 +2472,7 @@ It is called with three parameters -- GROUP, LEVEL and OLDLEVEL." summary-menu group-menu article-menu tree-highlight menu highlight browse-menu server-menu - page-marker tree-menu binary-menu pick-menu - grouplens-menu) + page-marker tree-menu binary-menu pick-menu) "*Enable visual features. If `visual' is disabled, there will be no menus and few faces. Most of the visual customization options below will be ignored. Gnus will use @@ -2227,8 +2486,7 @@ instance, to switch off all visual things except menus, you can say: Valid elements include `summary-highlight', `group-highlight', `article-highlight', `mouse-face', `summary-menu', `group-menu', `article-menu', `tree-highlight', `menu', `highlight', `browse-menu', -`server-menu', `page-marker', `tree-menu', `binary-menu', `pick-menu', -and `grouplens-menu'." +`server-menu', `page-marker', `tree-menu', `binary-menu', and`pick-menu'." :group 'gnus-meta :group 'gnus-visual :type '(set (const summary-highlight) @@ -2246,8 +2504,7 @@ and `grouplens-menu'." (const page-marker) (const tree-menu) (const binary-menu) - (const pick-menu) - (const grouplens-menu))) + (const pick-menu))) ;; Byte-compiler warning. (defvar gnus-visual) @@ -2288,7 +2545,7 @@ face." When set, Gnus will prefer using the locally stored content rather than re-fetching it from the server. You also need to enable `gnus-agent' for this to have any affect." - :version "21.3" + :version "22.1" :group 'gnus-agent :type 'boolean) @@ -2307,7 +2564,7 @@ covered by that variable." You may customize gnus-agent to disable its use. However, some back ends have started to use the agent as a client-side cache. Disabling the agent may result in noticeable loss of performance." - :version "21.3" + :version "22.1" :group 'gnus-agent :type 'boolean) @@ -2331,23 +2588,45 @@ This should be an alist for Emacs, or a plist for XEmacs." (symbol :tag "Parameter") (sexp :tag "Value"))))) -(defcustom gnus-user-agent 'emacs-gnus-type +(defcustom gnus-user-agent '(emacs gnus type) "Which information should be exposed in the User-Agent header. -It can be one of the symbols `gnus' \(show only Gnus version\), `emacs-gnus' -\(show only Emacs and Gnus versions\), `emacs-gnus-config' \(same as -`emacs-gnus' plus system configuration\), `emacs-gnus-type' \(same as -`emacs-gnus' plus system type\) or a custom string. If you set it to a -string, be sure to use a valid format, see RFC 2616." +Can be a list of symbols or a string. Valid symbols are `gnus' +\(show Gnus version\) and `emacs' \(show Emacs version\). In +addition to the Emacs version, you can add `codename' \(show +\(S\)XEmacs codename\) or either `config' \(show system +configuration\) or `type' \(show system type\). If you set it to +a string, be sure to use a valid format, see RFC 2616." + + :version "22.1" :group 'gnus-message - :type '(choice - (item :tag "Show Gnus and Emacs versions and system type" - emacs-gnus-type) - (item :tag "Show Gnus and Emacs versions and system configuration" - emacs-gnus-config) - (item :tag "Show Gnus and Emacs versions" emacs-gnus) - (item :tag "Show only Gnus version" gnus) - (string :tag "Other"))) + :type '(choice (list (set :inline t + (const gnus :tag "Gnus version") + (const emacs :tag "Emacs version") + (choice :tag "system" + (const type :tag "system type") + (const config :tag "system configuration")) + (const codename :tag "Emacs codename"))) + (string))) + +;; Convert old (< 2005-01-10) symbol type values: +(when (symbolp gnus-user-agent) + (setq gnus-user-agent + (cond ((eq gnus-user-agent 'emacs-gnus-config) + '(emacs gnus config)) + ((eq gnus-user-agent 'emacs-gnus-type) + '(emacs gnus type)) + ((eq gnus-user-agent 'emacs-gnus) + '(emacs gnus)) + ((eq gnus-user-agent 'gnus) + '(gnus)) + (t gnus-user-agent))) + (gnus-message 1 "Converted `gnus-user-agent' to `%s'." gnus-user-agent) + (sit-for 1) + (if (get 'gnus-user-agent 'saved-value) + (customize-save-variable 'gnus-user-agent gnus-user-agent) + (gnus-message 1 "Edit your init file to make this change permanent.") + (sit-for 2))) ;;; Internal variables @@ -2445,7 +2724,6 @@ such as a mark that says whether an article is stored in the cache (defvar gnus-headers-retrieved-by nil) (defvar gnus-article-reply nil) (defvar gnus-override-method nil) -(defvar gnus-article-check-size nil) (defvar gnus-opened-servers nil) (defvar gnus-current-kill-article nil) @@ -2540,7 +2818,7 @@ gnus-registry.el will populate this if it's loaded.") ;; This little mapcar goes through the list below and marks the ;; symbols in question as autoloaded functions. - (mapcar + (mapc (lambda (package) (let ((interactive (nth 1 (memq ':interactive package)))) (mapcar @@ -2639,7 +2917,7 @@ gnus-registry.el will populate this if it's loaded.") gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view gnus-uu-decode-binhex-view gnus-uu-unmark-thread - gnus-uu-mark-over gnus-uu-post-news) + gnus-uu-mark-over gnus-uu-post-news gnus-uu-invert-processable) ("gnus-uu" gnus-uu-delete-work-dir gnus-uu-unmark-thread) ("gnus-msg" (gnus-summary-send-map keymap) gnus-article-mail gnus-copy-article-buffer gnus-extended-version) @@ -2657,8 +2935,6 @@ gnus-registry.el will populate this if it's loaded.") gnus-summary-post-forward gnus-summary-wide-reply-with-original gnus-summary-post-forward) ("gnus-picon" :interactive t gnus-treat-from-picon) - ("gnus-gl" bbb-login bbb-logout bbb-grouplens-group-p - gnus-grouplens-mode) ("smiley" :interactive t smiley-region) ("gnus-win" gnus-configure-windows gnus-add-configuration) ("gnus-sum" gnus-summary-insert-line gnus-summary-read-group @@ -2693,14 +2969,15 @@ gnus-registry.el will populate this if it's loaded.") gnus-article-hide-pem gnus-article-hide-signature gnus-article-strip-leading-blank-lines gnus-article-date-local gnus-article-date-original gnus-article-date-lapsed -;; gnus-article-show-all-headers + ;;gnus-article-show-all-headers gnus-article-edit-mode gnus-article-edit-article gnus-article-edit-done gnus-article-decode-encoded-words gnus-start-date-timer gnus-stop-date-timer gnus-mime-view-all-parts) ("gnus-int" gnus-request-type) ("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1 - gnus-dribble-enter gnus-read-init-file gnus-dribble-touch) + gnus-dribble-enter gnus-read-init-file gnus-dribble-touch + gnus-check-reasonable-setup) ("gnus-dup" gnus-dup-suppress-articles gnus-dup-unsuppress-article gnus-dup-enter-articles) ("gnus-range" gnus-copy-sequence) @@ -2713,7 +2990,7 @@ gnus-registry.el will populate this if it's loaded.") gnus-async-prefetch-article gnus-async-prefetch-remove-group gnus-async-halt-prefetch) ("gnus-agent" gnus-open-agent gnus-agent-get-function - gnus-agent-save-groups gnus-agent-save-active gnus-agent-method-p + gnus-agent-save-active gnus-agent-method-p gnus-agent-get-undownloaded-list gnus-agent-fetch-session gnus-summary-set-agent-mark gnus-agent-save-group-info gnus-agent-request-article gnus-agent-retrieve-headers) @@ -2770,7 +3047,6 @@ with some simple extensions. %z Article zcore (character) %t Number of articles under the current thread (number). %e Whether the thread is empty or not (character). -%l GroupLens score (string). %V Total thread score (number). %P The line number (number). %O Download mark (character). @@ -2786,7 +3062,7 @@ with some simple extensions. The %U (status), %R (replied) and %z (zcore) specs have to be handled with care. For reasons of efficiency, Gnus will compute what column these characters will end up in, and \"hard-code\" that. This means that -it is invalid to have these specs after a variable-length spec. Well, +it is invalid to have these specs after a variable-length spec. Well, you might not be arrested, but your summary buffer will look strange, which is bad enough. @@ -2949,11 +3225,9 @@ Return nil if not defined." (defun gnus-shutdown (symbol) "Shut down everything that waits for SYMBOL." - (let ((alist gnus-shutdown-alist) - entry) - (while (setq entry (pop alist)) - (when (memq symbol (cdr entry)) - (funcall (car entry)))))) + (dolist (entry gnus-shutdown-alist) + (when (memq symbol (cdr entry)) + (funcall (car entry))))) ;;; @@ -3171,7 +3445,7 @@ GROUP can either be a string (a group name) or a select method." (defun gnus-group-read-only-p (&optional group) "Check whether GROUP supports editing or not. -If GROUP is nil, `gnus-newsgroup-name' will be checked instead. Note +If GROUP is nil, `gnus-newsgroup-name' will be checked instead. Note that that variable is buffer-local to the summary buffers." (let ((group (or group gnus-newsgroup-name))) (not (gnus-check-backend-function 'request-replace-article group)))) @@ -3219,7 +3493,7 @@ that that variable is buffer-local to the summary buffers." (defun gnus-generate-new-group-name (leaf) (let ((name leaf) (num 0)) - (while (gnus-gethash name gnus-newsrc-hashtb) + (while (gnus-group-entry name) (setq name (concat leaf "<" (int-to-string (setq num (1+ num))) ">"))) name)) @@ -3256,6 +3530,36 @@ that that variable is buffer-local to the summary buffers." (nth 1 method)))) method))) +(defsubst gnus-method-to-server (method &optional nocache) + (catch 'server-name + (setq method (or method gnus-select-method)) + + ;; Perhaps it is already in the cache. + (unless nocache + (mapc (lambda (name-method) + (if (equal (cdr name-method) method) + (throw 'server-name (car name-method)))) + gnus-server-method-cache)) + + (mapc + (lambda (server-alist) + (mapc (lambda (name-method) + (when (gnus-methods-equal-p (cdr name-method) method) + (unless (member name-method gnus-server-method-cache) + (push name-method gnus-server-method-cache)) + (throw 'server-name (car name-method)))) + server-alist)) + (list gnus-server-alist + gnus-predefined-server-alist)) + + (let* ((name (if (member (cadr method) '(nil "")) + (format "%s" (car method)) + (format "%s:%s" (car method) (cadr method)))) + (name-method (cons name method))) + (unless (member name-method gnus-server-method-cache) + (push name-method gnus-server-method-cache)) + name))) + (defsubst gnus-server-to-method (server) "Map virtual server names to select methods." (or (and server (listp server) server) @@ -3283,58 +3587,25 @@ that that variable is buffer-local to the summary buffers." (cadar servers))))) (pop servers)) (car servers)) - ;; This could be some sort of foreign server that I - ;; simply haven't opened (yet). Do a brute-force scan - ;; of the entire gnus-newsrc-alist for the server name - ;; of every method. As a side-effect, loads the - ;; gnus-server-method-cache so this only happens once, - ;; if at all. - (let (match) - (mapcar - (lambda (info) - (let ((info-method (gnus-info-method info))) - (unless (stringp info-method) - (let ((info-server (gnus-method-to-server info-method))) - (when (equal server info-server) - (setq match info-method)))))) - (cdr gnus-newsrc-alist)) - match)))) - (when result - (push (cons server result) gnus-server-method-cache)) + ;; This could be some sort of foreign server that I + ;; simply haven't opened (yet). Do a brute-force scan + ;; of the entire gnus-newsrc-alist for the server name + ;; of every method. As a side-effect, loads the + ;; gnus-server-method-cache so this only happens once, + ;; if at all. + (let ((alist (cdr gnus-newsrc-alist)) + method match) + (while alist + (setq method (gnus-info-method (pop alist))) + (when (and (not (stringp method)) + (equal server (gnus-method-to-server method))) + (setq match method + alist nil))) + match)))) + (when result + (push (cons server result) gnus-server-method-cache)) result))) -(defsubst gnus-method-to-server (method) - (catch 'server-name - (setq method (or method gnus-select-method)) - - ;; Perhaps it is already in the cache. - (mapc (lambda (name-method) - (if (equal (cdr name-method) method) - (throw 'server-name (car name-method)))) - gnus-server-method-cache) - - (mapc - (lambda (server-alist) - (mapc (lambda (name-method) - (when (gnus-methods-equal-p (cdr name-method) method) - (unless (member name-method gnus-server-method-cache) - (push name-method gnus-server-method-cache)) - (throw 'server-name (car name-method)))) - server-alist)) - (let ((alists (list gnus-server-alist - gnus-predefined-server-alist))) - (if gnus-select-method - (push (list (cons "native" gnus-select-method)) alists)) - alists)) - - (let* ((name (if (member (cadr method) '(nil "")) - (format "%s" (car method)) - (format "%s:%s" (car method) (cadr method)))) - (name-method (cons name method))) - (unless (member name-method gnus-server-method-cache) - (push name-method gnus-server-method-cache)) - name))) - (defsubst gnus-server-get-method (group method) ;; Input either a server name, and extended server name, or a ;; select method, and return a select method. @@ -3474,6 +3745,8 @@ server is native)." "Return the prefix of the current group name." (< 0 (length (gnus-group-real-prefix group)))) +(declare-function gnus-group-decoded-name "gnus-group" (string)) + (defun gnus-summary-buffer-name (group) "Return the summary buffer name of GROUP." (concat "*Summary " (gnus-group-decoded-name group) "*")) @@ -3553,7 +3826,10 @@ You should probably use `gnus-find-method-for-group' instead." (defun gnus-parameters-get-parameter (group) "Return the group parameters for GROUP from `gnus-parameters'." - (let (params-list) + (let ((case-fold-search (if (eq gnus-parameters-case-fold-search 'default) + case-fold-search + gnus-parameters-case-fold-search)) + params-list) (dolist (elem gnus-parameters) (when (string-match (car elem) group) (setq params-list @@ -3596,7 +3872,7 @@ The function `gnus-group-find-parameter' will do that for you." (if simple-results ;; Found results; return them. (car simple-results) - ;; We didn't found it there, try `gnus-parameters'. + ;; We didn't find it there, try `gnus-parameters'. (let ((result nil) (head nil) (tail gnus-parameters)) @@ -3637,6 +3913,7 @@ If you call this function inside a loop, consider using the faster (defun gnus-group-get-parameter (group &optional symbol allow-list) "Return the group parameters for GROUP. If SYMBOL, return the value of that symbol in the group parameters. +If ALLOW-LIST, also allow list as a result. Most functions should use `gnus-group-find-parameter', which also examines the topic parameters." (let ((params (gnus-info-params (gnus-get-info group)))) @@ -3646,7 +3923,8 @@ also examines the topic parameters." (defun gnus-group-parameter-value (params symbol &optional allow-list present-p) - "Return the value of SYMBOL in group PARAMS." + "Return the value of SYMBOL in group PARAMS. +If ALLOW-LIST, also allow list as a result." ;; We only wish to return group parameters (dotted lists) and ;; not local variables, which may have the same names. ;; But first we handle single elements... @@ -3841,7 +4119,7 @@ If NEWSGROUP is nil, return the global kill file name instead." (not method))) (defun gnus-server-extend-method (group method) - ;; This function "extends" a virtual server. If the server is + ;; This function "extends" a virtual server. If the server is ;; "hello", and the select method is ("hello" (my-var "something")) ;; in the group "alt.alt", this will result in a new virtual server ;; called "hello+alt.alt". @@ -3880,8 +4158,13 @@ If NEWSGROUP is nil, return the global kill file name instead." (or gnus-override-method (and (not group) gnus-select-method) - (and (not (gnus-group-entry group)) ;; a new group - (gnus-group-name-to-method group)) + (and (not (gnus-group-entry group)) + ;; Killed or otherwise unknown group. + (or + ;; If we know a virtual server by that name, return its method. + (gnus-server-to-method (gnus-group-server group)) + ;; Guess a new method as last resort. + (gnus-group-name-to-method group))) (let ((info (or info (gnus-get-info group))) method) (if (or (not info) @@ -3912,6 +4195,9 @@ If NEWSGROUP is nil, return the global kill file name instead." (setq valids (cdr valids))) outs)) +(eval-and-compile + (autoload 'message-y-or-n-p "message" nil nil 'macro)) + (defun gnus-read-group (prompt &optional default) "Prompt the user for a group name. Disallow invalid group names." @@ -3980,14 +4266,16 @@ Allow completion over sensible values." ;;; Agent functions -(defun gnus-agent-method-p (method) +(defun gnus-agent-method-p (method-or-server) "Say whether METHOD is covered by the agent." - (or (eq (car gnus-agent-method-p-cache) method) - (setq gnus-agent-method-p-cache - (cons method - (member (if (stringp method) - method - (gnus-method-to-server method)) gnus-agent-covered-methods)))) + (or (eq (car gnus-agent-method-p-cache) method-or-server) + (let* ((method (if (stringp method-or-server) + (gnus-server-to-method method-or-server) + method-or-server)) + (server (gnus-method-to-server method t))) + (setq gnus-agent-method-p-cache + (cons method-or-server + (member server gnus-agent-covered-methods))))) (cdr gnus-agent-method-p-cache)) (defun gnus-online (method) @@ -4069,9 +4357,6 @@ current display is used." (delete-frame gnus-other-frame-object)) (setq gnus-other-frame-object nil))))))) -;;(setq thing ? ; this is a comment -;; more 'yes) - ;;;###autoload (defun gnus (&optional arg dont-connect slave) "Read network news. @@ -4090,4 +4375,5 @@ prompt the user for the name of an NNTP server to use." (provide 'gnus) +;; arch-tag: acebeeab-f331-4f8f-a7ea-89c58c84f636 ;;; gnus.el ends here