;;; gnus.el --- a newsreader for GNU Emacs
;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997,
-;; 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
+;; 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
(eval-when-compile (require 'cl))
(require 'wid-edit)
(require 'mm-util)
-
-;; Make sure it was the right mm-util.
-(unless (fboundp 'mm-guess-mime-charset)
- (error "Wrong `mm-util' found in `load-path'. Make sure the Gnus one is found first."))
+(require 'nnheader)
(defgroup gnus nil
"The coffee-brewing, all singing, all dancing, kitchen sink newsreader."
(defgroup gnus-format nil
"Dealing with formatting issues."
- :group 'news
- :group 'mail)
+ :group 'gnus)
(defgroup gnus-charset nil
"Group character set issues."
(defgroup gnus-cache nil
"Cache interface."
+ :link '(custom-manual "(gnus)Article Caching")
+ :group 'gnus)
+
+(defgroup gnus-registry nil
+ "Article Registry."
:group 'gnus)
(defgroup gnus-start nil
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.08"
+(defconst gnus-version-number "5.10.3"
"Version number for this version of Gnus.")
-(defconst gnus-version (format "Oort Gnus v%s" gnus-version-number)
+(defconst gnus-version (format "Gnus v%s" gnus-version-number)
"Version string for this version of Gnus.")
(defcustom gnus-inhibit-startup-message nil
(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)
(defalias 'gnus-add-text-properties 'add-text-properties)
(defalias 'gnus-put-text-property 'put-text-property)
(defvar gnus-mode-line-image-cache t)
()))
"Face used for normal interest ancient articles.")
+(defface gnus-summary-high-undownloaded-face
+ '((((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.")
+
+(defface gnus-summary-low-undownloaded-face
+ '((((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.")
+
+(defface gnus-summary-normal-undownloaded-face
+ '((((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.")
+
(defface gnus-summary-high-unread-face
'((t
(:bold t)))
"Add the current buffer to the list of Gnus buffers."
(push (current-buffer) gnus-buffers))
+(defmacro gnus-kill-buffer (buffer)
+ "Kill BUFFER and remove from the list of Gnus buffers."
+ `(let ((buf ,buffer))
+ (when (gnus-buffer-exists-p buf)
+ (setq gnus-buffers (delete (get-buffer buf) gnus-buffers))
+ (kill-buffer buf))))
+
(defun gnus-buffers ()
"Return a list of live Gnus buffers."
(while (and gnus-buffers
(storm "#666699" "#99ccff")
(pdino "#9999cc" "#99ccff")
(purp "#9999cc" "#666699")
+ (no "#000000" "#ff0000")
(neutral "#b4b4b4" "#878787")
(september "#bf9900" "#ffcc00"))
"Color alist used for the Gnus logo.")
((and
(fboundp 'find-image)
(display-graphic-p)
- (let ((image (find-image
- `((:type xpm :file "gnus.xpm"
- :color-symbols
- (("thing" . ,(car gnus-logo-colors))
- ("shadow" . ,(cadr gnus-logo-colors))
- ("background" . ,(face-background 'default))))
- (:type pbm :file "gnus.pbm"
- ;; Account for the pbm's blackground.
- :background ,(face-foreground 'gnus-splash-face)
- :foreground ,(face-background 'default))
- (:type xbm :file "gnus.xbm"
- ;; Account for the xbm's blackground.
- :background ,(face-foreground 'gnus-splash-face)
- :foreground ,(face-background 'default))))))
+ (let* ((data-directory (nnheader-find-etc-directory "gnus"))
+ (image (find-image
+ `((:type xpm :file "gnus.xpm"
+ :color-symbols
+ (("thing" . ,(car gnus-logo-colors))
+ ("shadow" . ,(cadr gnus-logo-colors))
+ ("oort" . "#eeeeee")
+ ("background" . ,(face-background 'default))))
+ (:type pbm :file "gnus.pbm"
+ ;; Account for the pbm's blackground.
+ :background ,(face-foreground 'gnus-splash-face)
+ :foreground ,(face-background 'default))
+ (:type xbm :file "gnus.xbm"
+ ;; Account for the xbm's blackground.
+ :background ,(face-foreground 'gnus-splash-face)
+ :foreground ,(face-background 'default))))))
(when image
(let ((size (image-size image)))
(insert-char ?\n (max 0 (round (- (window-height)
(defmacro gnus-define-group-parameter (param &rest rest)
"Define a group parameter PARAM.
REST is a plist of following:
-:type One of `bool', `list' or `nil'.
+:type One of `bool', `list' or nil.
:function The name of the function.
:function-document The documentation of the function.
:parameter-type The type for customizing the parameter.
(defcustom gnus-home-directory "~/"
"Directory variable that specifies the \"home\" directory.
-All other Gnus path variables are initialized from this variable."
+All other Gnus file and directory variables are initialized from this variable."
:group 'gnus-files
:type 'directory)
This should be a mail method."
:group 'gnus-server
:group 'gnus-message
- :type 'gnus-select-method)
+ :type '(choice (const :tag "Default archive method" "archive")
+ gnus-select-method))
(defcustom gnus-message-archive-group nil
"*Name of the group in which to save the messages you've written.
list, Gnus will try all the methods in the list until it finds a match."
:group 'gnus-server
:type '(choice (const :tag "default" nil)
+ (const current)
(const :tag "Google" (nnweb "refer" (nnweb-type google)))
gnus-select-method
(repeat :menu-tag "Try multiple"
"/ftp@rtfm.mit.edu:/pub/usenet/"
"/ftp@ftp.uni-paderborn.de:/pub/FAQ/"
"/ftp@ftp.sunet.se:/pub/usenet/"
- "/ftp@nctuccca.edu.tw:/USENET/FAQ/"
+ "/ftp@nctuccca.nctu.edu.tw:/pub/Documents/rtfm/usenet-by-group/"
"/ftp@hwarang.postech.ac.kr:/pub/usenet/"
"/ftp@ftp.hk.super.net:/mirror/faqs/")
"*Directory where the group FAQs are stored.
src.doc.ic.ac.uk /usenet/news-FAQS
ftp.sunet.se /pub/usenet
ftp.pasteur.fr /pub/FAQ
- Asia: nctuccca.edu.tw /USENET/FAQ
+ Asia: nctuccca.nctu.edu.tw /pub/Documents/rtfm/usenet-by-group/
hwarang.postech.ac.kr /pub/usenet
ftp.hk.super.net /mirror/faqs"
:group 'gnus-group-various
("dk" . (concat "http://www.usenet.dk/grupper.pl?get=" name))
("england" . (concat "http://england.news-admin.org/charters/" name))
("fr" . (concat "http://www.usenet-fr.net/fur/chartes/" name ".html"))
- ("europa" . (concat "http://www.europa.usenet.eu.org/chartas/charta-en-"
+ ("europa" . (concat "http://www.europa.usenet.eu.org/chartas/charta-en-"
(gnus-replace-in-string name "europa\\." "") ".html"))
("nl" . (concat "http://www.xs4all.nl/~sister/usenet/charters/" name))
- ("aus" . (concat "http://aus.news-admin.org/groupinfo.php/" name))
+ ("aus" . (concat "http://aus.news-admin.org/groupinfo.cgi/" name))
("pl" . (concat "http://www.usenet.pl/opisy/" name))
("ch" . (concat "http://www.use-net.ch/Usenet/charter.html#" name))
("at" . (concat "http://www.usenet.at/chartas/" name "/charta"))
("uk" . (concat "http://www.usenet.org.uk/" name ".html"))
- ("wales" . (concat "http://www.wales-usenet.org/english/groups/" name ".html"))
("dfw" . (concat "http://www.cirr.com/dfw/charters/" name ".html"))
- ("se" . (concat "http://www.usenet-se.net/Reglementen/"
+ ("se" . (concat "http://www.usenet-se.net/Reglementen/"
(gnus-replace-in-string name "\\." "_") ".html"))
- ("milw" . (concat "http://usenet.mil.wi.us/"
+ ("milw" . (concat "http://usenet.mil.wi.us/"
(gnus-replace-in-string name "milw\\." "") "-charter"))
("ca" . (concat "http://www.sbay.org/ca/charter-" name ".html"))
- ("netins" . (concat "http://www.netins.net/usenet/charter/"
+ ("netins" . (concat "http://www.netins.net/usenet/charter/"
(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."
+When FORM is evaluated `name' is bound to the name of the group."
:group 'gnus-group-various
:type '(repeat (cons (string :tag "Hierarchy") (sexp :tag "Form"))))
"*The number of articles which indicates a large newsgroup.
If the number of articles in a newsgroup is greater than this value,
confirmation is required for selecting the newsgroup.
-If it is `nil', no confirmation is required."
+If it is nil, no confirmation is required."
:group 'gnus-group-select
:type '(choice (const :tag "No limit" nil)
integer))
type you're using. On `usg-unix-v' and `xenix' this variable defaults
to nil while on all other systems it defaults to t."
:group 'gnus-start
- :type 'boolean)
+ :type '(radio (sexp :format "Non-nil\n"
+ :match (lambda (widget value)
+ (and value (not (listp value))))
+ :value t)
+ (const nil)
+ (checklist (const :format "%v " not-score)
+ (const :format "%v " not-save)
+ (const not-kill))))
(defcustom gnus-kill-files-directory gnus-directory
"*Name of the directory where kill files will be stored (default \"~/News\")."
:group 'gnus-meta
:type 'boolean)
-(defcustom gnus-keep-backlog nil
+(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
read. If it is neither nil nor a number, Gnus will keep all read
:type 'hook)
(defcustom gnus-novice-user t
- "*Non-nil means that you are a usenet novice.
+ "*Non-nil means that you are a Usenet novice.
If non-nil, verbose messages may be displayed and confirmations may be
required."
:group 'gnus-meta
:type 'boolean)
(defcustom gnus-shell-command-separator ";"
- "String used to separate to shell commands."
+ "String used to separate shell commands."
:group 'gnus-files
:type 'string)
(defcustom gnus-mode-non-string-length nil
"*Max length of mode-line non-string contents.
If this is nil, Gnus will take space as is needed, leaving the rest
-of the modeline intact. Note that the default of nil is unlikely
+of the mode line intact. Note that the default of nil is unlikely
to be desirable; see the manual for further details."
:group 'gnus-various
:type '(choice (const nil)
;; There should be special validation for this.
(define-widget 'gnus-email-address 'string
- "An email address")
+ "An email address.")
(gnus-define-group-parameter
to-address
This number will be prompted as the initial value of the number of
articles to list when the group is a large newsgroup (see
-`gnus-large-newsgroup'). If it is `nil', the default value is the
+`gnus-large-newsgroup'). If it is nil, the default value is the
total number of articles in the group.")
+;; The Gnus registry's ignored groups
+(gnus-define-group-parameter
+ registry-ignore
+ :type list
+ :function-document
+ "Whether this group should be ignored by the registry."
+ :variable gnus-registry-ignored-groups
+ :variable-default nil
+ :variable-document
+ "*Groups in which the registry should be turned off."
+ :variable-group gnus-registry
+ :variable-type '(repeat
+ (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.")
+
+;; group parameters for spam processing added by Ted Zlatanov <tzz@lifelogs.com>
+(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."
+ :type 'boolean
+ :group 'gnus-start)
+
+(when gnus-install-group-spam-parameters
+ (defvar gnus-group-spam-classification-spam t
+ "Spam group classification (requires spam.el).
+This group contains spam messages. On summary entry, unread messages
+will be marked as spam. On summary exit, the specified spam
+processors will be invoked on spam-marked messages, then those
+messages will be expired, so the spam processor will only see a
+spam-marked message once.")
+
+ (defvar gnus-group-spam-classification-ham 'ask
+ "The ham value for the spam group parameter (requires spam.el).
+On summary exit, the specified ham processors will be invoked on
+ham-marked messages. Exercise caution, since the ham processor will
+see the same message more than once because there is no ham message
+registry.")
+
+ (gnus-define-group-parameter
+ spam-contents
+ :type list
+ :function-document
+ "The spam type (spam, ham, or neither) of the group."
+ :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."
+ :variable-group spam
+ :variable-type '(repeat
+ (list :tag "Group contents spam/ham classification"
+ (regexp :tag "Group")
+ (choice
+ (variable-item gnus-group-spam-classification-spam)
+ (variable-item gnus-group-spam-classification-ham)
+ (const :tag "Unclassified" nil))))
+
+ :parameter-type '(list :tag "Group contents spam/ham classification"
+ (choice :tag "Group contents classification for spam sorting"
+ (variable-item gnus-group-spam-classification-spam)
+ (variable-item gnus-group-spam-classification-ham)
+ (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.")
+
+ (defvar gnus-group-spam-exit-processor-ifile "ifile"
+ "The ifile summary exit spam processor.")
+
+ (defvar gnus-group-spam-exit-processor-stat "stat"
+ "The spam-stat summary exit spam processor.")
+
+ (defvar gnus-group-spam-exit-processor-bogofilter "bogofilter"
+ "The Bogofilter summary exit spam processor.")
+
+ (defvar gnus-group-spam-exit-processor-blacklist "blacklist"
+ "The Blacklist summary exit spam processor.")
+
+ (defvar gnus-group-spam-exit-processor-report-gmane "report-gmane"
+ "The Gmane reporting summary exit spam processor.
+Only applicable to NNTP groups with articles from Gmane. See spam-report.el")
+
+ (defvar gnus-group-spam-exit-processor-spamoracle "spamoracle-spam"
+ "The spamoracle summary exit spam processor.")
+
+ (defvar gnus-group-ham-exit-processor-ifile "ifile-ham"
+ "The ifile summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (defvar gnus-group-ham-exit-processor-bogofilter "bogofilter-ham"
+ "The Bogofilter summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (defvar gnus-group-ham-exit-processor-stat "stat-ham"
+ "The spam-stat summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (defvar gnus-group-ham-exit-processor-whitelist "whitelist"
+ "The whitelist summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (defvar gnus-group-ham-exit-processor-BBDB "bbdb"
+ "The BBDB summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (defvar gnus-group-ham-exit-processor-copy "copy"
+ "The ham copy exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (defvar gnus-group-ham-exit-processor-spamoracle "spamoracle-ham"
+ "The spamoracle summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+ (gnus-define-group-parameter
+ spam-process
+ :type list
+ :parameter-type
+ '(choice
+ :tag "Spam Summary Exit Processor"
+ :value nil
+ (list :tag "Spam Summary Exit Processor Choices"
+ (set
+ (variable-item gnus-group-spam-exit-processor-ifile)
+ (variable-item gnus-group-spam-exit-processor-stat)
+ (variable-item gnus-group-spam-exit-processor-bogofilter)
+ (variable-item gnus-group-spam-exit-processor-blacklist)
+ (variable-item gnus-group-spam-exit-processor-report-gmane)
+ (variable-item gnus-group-spam-exit-processor-spamoracle)
+ (variable-item gnus-group-ham-exit-processor-bogofilter)
+ (variable-item gnus-group-ham-exit-processor-ifile)
+ (variable-item gnus-group-ham-exit-processor-stat)
+ (variable-item gnus-group-ham-exit-processor-whitelist)
+ (variable-item gnus-group-ham-exit-processor-BBDB)
+ (variable-item gnus-group-ham-exit-processor-copy)
+ (variable-item gnus-group-ham-exit-processor-spamoracle))))
+ :function-document
+ "Which spam or ham processors will be applied when the summary is exited."
+ :variable gnus-spam-process-newsgroups
+ :variable-default nil
+ :variable-document
+ "*Groups in which to automatically process spam or ham articles with
+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
+ '(repeat :tag "Spam/Ham Processors"
+ (list :tag "Spam Summary Exit Processor Choices"
+ (regexp :tag "Group Regexp")
+ (set
+ :tag "Spam/Ham Summary Exit Processor"
+ (variable-item gnus-group-spam-exit-processor-ifile)
+ (variable-item gnus-group-spam-exit-processor-stat)
+ (variable-item gnus-group-spam-exit-processor-bogofilter)
+ (variable-item gnus-group-spam-exit-processor-blacklist)
+ (variable-item gnus-group-spam-exit-processor-spamoracle)
+ (variable-item gnus-group-spam-exit-processor-report-gmane)
+ (variable-item gnus-group-ham-exit-processor-bogofilter)
+ (variable-item gnus-group-ham-exit-processor-ifile)
+ (variable-item gnus-group-ham-exit-processor-stat)
+ (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))))
+ :parameter-document
+ "Which spam or ham processors will be applied when the summary is exited.")
+
+ (gnus-define-group-parameter
+ spam-process-destination
+ :parameter-type
+ '(choice :tag "Destination for spam-processed articles at summary exit"
+ (string :tag "Move to a group")
+ (repeat :tag "Move to multiple groups"
+ (string :tag "Destination group"))
+ (const :tag "Expire" nil))
+ :function-document
+ "Where spam-processed articles will go at summary exit."
+ :variable gnus-spam-process-destinations
+ :variable-default nil
+ :variable-document
+ "*Groups in which to explicitly send spam-processed articles to
+another group, or expire them (the default). If non-nil, this should
+be a list of group name regexps that should match all groups in which
+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
+ '(repeat
+ :tag "Spam-processed articles destination"
+ (list
+ (regexp :tag "Group Regexp")
+ (choice
+ :tag "Destination for spam-processed articles at summary exit"
+ (string :tag "Move to a group")
+ (repeat :tag "Move to multiple groups"
+ (string :tag "Destination group"))
+ (const :tag "Expire" nil))))
+ :parameter-document
+ "Where spam-processed articles will go at summary exit.")
+
+ (gnus-define-group-parameter
+ ham-process-destination
+ :parameter-type
+ '(choice
+ :tag "Destination for ham articles at summary exit from a spam group"
+ (string :tag "Move to a group")
+ (repeat :tag "Move to multiple groups"
+ (string :tag "Destination group"))
+ (const :tag "Do nothing" nil))
+ :function-document
+ "Where ham articles will go at summary exit from a spam group."
+ :variable gnus-ham-process-destinations
+ :variable-default nil
+ :variable-document
+ "*Groups in which to explicitly send ham articles to
+another group, or do nothing (the default). If non-nil, this should
+be a list of group name regexps that should match all groups in which
+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
+ '(repeat
+ :tag "Ham articles destination"
+ (list
+ (regexp :tag "Group Regexp")
+ (choice
+ :tag "Destination for ham articles at summary exit from spam group"
+ (string :tag "Move to a group")
+ (repeat :tag "Move to multiple groups"
+ (string :tag "Destination group"))
+ (const :tag "Expire" nil))))
+ :parameter-document
+ "Where ham articles will go at summary exit from a spam group.")
+
+ (gnus-define-group-parameter
+ ham-marks
+ :type 'list
+ :parameter-type '(list :tag "Ham mark choices"
+ (set
+ (variable-item gnus-del-mark)
+ (variable-item gnus-read-mark)
+ (variable-item gnus-ticked-mark)
+ (variable-item gnus-killed-mark)
+ (variable-item gnus-kill-file-mark)
+ (variable-item gnus-low-score-mark)))
+
+ :parameter-document
+ "Marks considered ham (positively not spam). Such articles will be
+processed as ham (non-spam) on group exit. When nil, the global
+spam-ham-marks variable takes precedence."
+ :variable-default '((".*" ((gnus-del-mark
+ gnus-read-mark
+ gnus-killed-mark
+ gnus-kill-file-mark
+ gnus-low-score-mark))))
+ :variable-group spam
+ :variable-document
+ "*Groups in which to explicitly set the ham marks to some value.")
+
+ (gnus-define-group-parameter
+ spam-marks
+ :type 'list
+ :parameter-type '(list :tag "Spam mark choices"
+ (set
+ (variable-item gnus-spam-mark)
+ (variable-item gnus-killed-mark)
+ (variable-item gnus-kill-file-mark)
+ (variable-item gnus-low-score-mark)))
+
+ :parameter-document
+ "Marks considered spam.
+Such articles will be processed as spam on group exit. When nil, the global
+spam-spam-marks variable takes precedence."
+ :variable-default '((".*" ((gnus-spam-mark))))
+ :variable-group spam
+ :variable-document
+ "*Groups in which to explicitly set the spam marks to some value."))
+
(defcustom gnus-group-uncollapsed-levels 1
"Number of group name elements to leave alone when making a short group name."
:group 'gnus-group-visual
"Whether Gnus is plugged or not.")
(defcustom gnus-agent-cache t
- "Whether Gnus use agent cache.
-You also need to enable `gnus-agent'."
+ "Controls use of the agent cache while plugged.
+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"
:group 'gnus-agent
:type 'boolean)
-(defcustom gnus-default-charset (mm-guess-mime-charset)
+(defcustom gnus-default-charset 'undecided
"Default charset assumed to be used when viewing non-ASCII characters.
This variable is overridden on a group-to-group basis by the
-gnus-group-charset-alist variable and is only used on groups not
+`gnus-group-charset-alist' variable and is only used on groups not
covered by that variable."
:type 'symbol
:group 'gnus-charset)
+;; Fixme: Doc reference to agent.
(defcustom gnus-agent t
"Whether we want to use the Gnus agent or not.
-Putting (gnus-agentize) in ~/.gnus is obsolete by (setq gnus-agent t)."
+
+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"
:group 'gnus-agent
:type 'boolean)
(defcustom gnus-other-frame-parameters nil
"Frame parameters used by `gnus-other-frame' to create a Gnus frame.
-This should be an alist for FSF Emacs, or a plist for XEmacs."
+This should be an alist for Emacs, or a plist for XEmacs."
:group 'gnus-start
:type (if (featurep 'xemacs)
'(repeat (list :inline t :format "%v"
(defvar gnus-agent-gcc-header "X-Gnus-Agent-Gcc")
(defvar gnus-agent-meta-information-header "X-Gnus-Agent-Meta-Information")
+(defvar gnus-agent-target-move-group-header "X-Gnus-Agent-Move-To")
(defvar gnus-draft-meta-information-header "X-Draft-From")
(defvar gnus-group-get-parameter-function 'gnus-group-get-parameter)
(defvar gnus-original-article-buffer " *Original Article*")
gnus-newsrc-alist gnus-server-alist
gnus-killed-list gnus-zombie-list
gnus-topic-topology gnus-topic-alist
- gnus-format-specs gnus-agent-covered-methods)
+ gnus-agent-covered-methods gnus-format-specs)
"Gnus variables saved in the quick startup file.")
(defvar gnus-newsrc-alist nil
"Assoc list of read articles.
-gnus-newsrc-hashtb should be kept so that both hold the same information.")
+`gnus-newsrc-hashtb' should be kept so that both hold the same information.")
+
+(defvar gnus-registry-alist nil
+ "Assoc list of registry data.
+gnus-registry.el will populate this if it's loaded.")
(defvar gnus-newsrc-hashtb nil
- "Hashtable of gnus-newsrc-alist.")
+ "Hashtable of `gnus-newsrc-alist'.")
(defvar gnus-killed-list nil
"List of killed newsgroups.")
(defvar gnus-killed-hashtb nil
- "Hash table equivalent of gnus-killed-list.")
+ "Hash table equivalent of `gnus-killed-list'.")
(defvar gnus-zombie-list nil
"List of almost dead newsgroups.")
("gnus-demon" :interactive t
gnus-demon-init gnus-demon-cancel)
("gnus-fun" gnus-convert-gray-x-face-to-xpm gnus-display-x-face-in-from
- gnus-convert-image-to-gray-x-face)
+ gnus-convert-image-to-gray-x-face gnus-convert-face-to-png
+ gnus-face-from-file)
("gnus-salt" gnus-highlight-selected-tree gnus-possibly-generate-tree
gnus-tree-open gnus-tree-close gnus-carpal-setup-buffer)
("gnus-nocem" gnus-nocem-scan-groups gnus-nocem-close
gnus-article-decode-HZ
gnus-article-wash-html
gnus-article-unsplit-urls
- gnus-article-hide-pgp
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
%V Total thread score (number).
%P The line number (number).
%O Download mark (character).
-%C If present, indicates desired cursor position
+%* If present, indicates desired cursor position
(instead of after first colon).
%u User defined specifier. The next character in the format string should
be a letter. Gnus will call the function gnus-user-format-function-X,
(defsubst gnus-method-to-full-server-name (method)
(format "%s+%s" (car method) (nth 1 method)))
-(defun gnus-group-prefixed-name (group method)
- "Return the whole name from GROUP and METHOD."
- (and (stringp method) (setq method (gnus-server-to-method method)))
+(defun gnus-group-prefixed-name (group method &optional full)
+ "Return the whole name from GROUP and METHOD.
+Call with full set to get the fully qualified group name (even if the
+server is native)."
+ (when (stringp method)
+ (setq method (gnus-server-to-method method)))
(if (or (not method)
- (gnus-server-equal method "native")
- (string-match ":" group))
+ (and (not full) (gnus-server-equal method "native"))
+ ;;;!!! This might not be right. We'll see...
+ ;(string-match ":" group)
+ )
group
(concat (gnus-method-to-server-name method) ":" group)))
+(defun gnus-group-guess-prefixed-name (group)
+ "Guess the whole name from GROUP and METHOD."
+ (gnus-group-prefixed-name group (gnus-find-method-for-group
+ group)))
+
+(defun gnus-group-full-name (group method)
+ "Return the full name from GROUP and METHOD, even if the method is native."
+ (gnus-group-prefixed-name group method t))
+
+(defun gnus-group-guess-full-name (group)
+ "Guess the full name from GROUP, even if the method is native."
+ (if (gnus-group-prefixed-p group)
+ group
+ (gnus-group-full-name group (gnus-find-method-for-group group))))
+
+(defun gnus-group-guess-full-name-from-command-method (group)
+ "Guess the full name from GROUP, even if the method is native."
+ (if (gnus-group-prefixed-p group)
+ group
+ (gnus-group-full-name group gnus-command-method)))
+
(defun gnus-group-real-prefix (group)
"Return the prefix of the current group name."
- (if (string-match "^[^:]+:" group)
- (substring group 0 (match-end 0))
- ""))
+ (if (stringp group)
+ (if (string-match "^[^:]+:" group)
+ (substring group 0 (match-end 0))
+ "")
+ nil))
+
+(defun gnus-group-short-name (group)
+ "Return the short group name."
+ (let ((prefix (gnus-group-real-prefix group)))
+ (if (< 0 (length prefix))
+ (substring group (length prefix) nil)
+ group)))
+
+(defun gnus-group-prefixed-p (group)
+ "Return the prefix of the current group name."
+ (< 0 (length (gnus-group-real-prefix group))))
+
+(defun gnus-summary-buffer-name (group)
+ "Return the summary buffer name of GROUP."
+ (concat "*Summary " (gnus-group-decoded-name group) "*"))
(defun gnus-group-method (group)
"Return the server or method used for selecting GROUP.
You should call this in the `gnus-group-buffer' buffer.
The function `gnus-group-find-parameter' will do that for you."
;; The speed trick: No cons'ing and quit early.
- (or (let ((params (funcall gnus-group-get-parameter-function group)))
- ;; Start easy, check the "real" group parameters.
- (gnus-group-parameter-value params symbol allow-list))
+ (let* ((params (funcall gnus-group-get-parameter-function group))
+ ;; Start easy, check the "real" group parameters.
+ (simple-results
+ (gnus-group-parameter-value params symbol allow-list t)))
+ (if simple-results
+ ;; Found results; return them.
+ (car simple-results)
;; We didn't found it there, try `gnus-parameters'.
(let ((result nil)
(head nil)
;; Exit the loop early.
(setq tail nil))))
;; Done.
- result)))
+ result))))
(defun gnus-group-find-parameter (group &optional symbol allow-list)
"Return the group parameters for GROUP.
(gnus-group-parameter-value params symbol allow-list)
params)))
-(defun gnus-group-parameter-value (params symbol &optional allow-list)
+(defun gnus-group-parameter-value (params symbol &optional
+ allow-list present-p)
"Return the value of SYMBOL in group PARAMS."
;; We only wish to return group parameters (dotted lists) and
;; not local variables, which may have the same names.
(eq (car elem) symbol)
(or allow-list
(atom (cdr elem))))
- (throw 'found (cdr elem))))))))
+ (throw 'found (if present-p (list (cdr elem))
+ (cdr elem)))))))))
(defun gnus-group-add-parameter (group param)
"Add parameter PARAM to GROUP."
(setq group (read-string (concat prefix prompt)
(cons (or default "") 0)
'gnus-group-history)))
- (setq prefix (format "Invalid group name: \"%s\". " group)
- group nil)))
+ (let ((match (match-string 0 group)))
+ ;; `/' may be okay (e.g. for nnimap), so ask the user:
+ (unless (and (string-match "/" match)
+ (message-y-or-n-p
+ "Proceed and create group anyway? " t
+"The group name \"" group "\" contains a forbidden character: \"" match "\".
+
+Usually, it's dangerous to create a group with this name, because it's not
+supported by all back ends and servers. On some IMAP servers, it's valid to
+use the character \"/\".
+
+If you are really sure, you can proceed anyway and create the group.
+
+You may customize the variable `gnus-invalid-group-regexp', which currently is
+set to \"" gnus-invalid-group-regexp
+"\", if you want to get rid of this query."))
+ (setq prefix (format "Invalid group name: \"%s\". " group)
+ group nil)))))
group))
(defun gnus-read-method (prompt)
(switch-to-buffer gnus-group-buffer)
(funcall gnus-other-frame-function arg)
(add-hook 'gnus-exit-gnus-hook
- (lambda nil
- (when (and (frame-live-p gnus-other-frame-object)
- (cdr (frame-list)))
- (delete-frame gnus-other-frame-object))
- (setq gnus-other-frame-object nil)))))))
+ '(lambda nil
+ (when (and (frame-live-p gnus-other-frame-object)
+ (cdr (frame-list)))
+ (delete-frame gnus-other-frame-object))
+ (setq gnus-other-frame-object nil)))))))
;;(setq thing ? ; this is a comment
;; more 'yes)