From bb58610dc0061148843df9cebd2a912a813238e2 Mon Sep 17 00:00:00 2001 From: yamaoka Date: Tue, 13 May 2003 00:51:06 +0000 Subject: [PATCH] Synch to Gnus 200305130005. --- lisp/ChangeLog | 46 ++++++++++++++++++++++++ lisp/dgnushack.el | 4 +-- lisp/gnus-agent.el | 42 +++++++++++----------- lisp/gnus-clfns.el | 12 +++++++ lisp/gnus-cus.el | 96 ++++++++++++++++++++++++++----------------------- lisp/gnus-registry.el | 53 +++++++++++++++++++-------- lisp/gnus-sum.el | 13 +++++-- lisp/gnus.el | 2 +- lisp/lpath.el | 4 +-- lisp/rfc2047.el | 40 ++++++++++++--------- texi/ChangeLog | 4 +++ texi/gnus-ja.texi | 65 +++++++++++++++++++++++++++++++++ texi/gnus.texi | 64 +++++++++++++++++++++++++++++++++ 13 files changed, 341 insertions(+), 104 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 0d4c8b6..0499206 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,49 @@ +2003-05-13 Katsumi Yamaoka + + * dgnushack.el (assq-delete-all): New compiler macro for Emacs 20. + +2003-05-12 Katsumi Yamaoka + + * lpath.el: Fbind find-coding-system. + + * dgnushack.el (dgnushack-make-load): Remove redundant format call + in message. Suggested by Yoichi NAKAYAMA . + * pop3.el (pop3-movemail): Ditto. + +2003-05-12 Colin Marquardt (tiny change) + + * gnus.el (gnus-agent): Docstring fix. + +2003-05-12 Teodor Zlatanov + + * gnus-registry.el (gnus-registry-install): new variable + (gnus-registry-fetch-extra, gnus-registry-fetch-extra-entry) + (gnus-registry-store-extra-entry, gnus-registry-delete-group) + (gnus-registry-add-group): add a modification timestamp to each entry + (gnus-registry-install-hooks): new function + +2003-05-12 Kevin Greiner + + * gnus-agent.el (gnus-agent-cat-name): Eval macro while compiling. + (gnus-agent-cat-disable-undownloaded-faces): New function. + Accessor for new agent property + 'agent-disable-undownloaded-faces'. + gnus-cus.el (gnus-agent-parameters): Added + agent-disable-undownloaded-faces and corrected documentation. + (gnus-agent-cat-prepare-category-field, + gnus-agent-customize-category): Changed to avoid creating free + references to each field's symbol. + gnus-sum.el (gnus-summary-use-undownloaded-faces): New local variable. + (gnus-select-newgroup): Initialize it. + (gnus-summary-highlight-line): Use it. + +2003-05-12 Dave Love + + * rfc2047.el (rfc2047-point-at-bol, rfc2047-point-at-bol): Eval + and compile. + (rfc2047-syntax-table): Fix building table to work in Emacs 22. + (rfc2047-unfold-region): Delete unused var `leading'. + 2003-05-12 Simon Josefsson * pgg.el (pgg-temp-buffer-show-function): Reuse existing visible diff --git a/lisp/dgnushack.el b/lisp/dgnushack.el index 505f844..8711dc4 100644 --- a/lisp/dgnushack.el +++ b/lisp/dgnushack.el @@ -741,7 +741,7 @@ Modify to suit your needs.")) (batch-update-autoloads)))) (defun dgnushack-make-load () - (message (format "Generating %s..." dgnushack-gnus-load-file)) + (message "Generating %s..." dgnushack-gnus-load-file) (with-temp-file dgnushack-gnus-load-file (if (file-exists-p dgnushack-cus-load-file) (progn @@ -811,7 +811,7 @@ Modify to suit your needs.")) (search-forward "\n;;; Code:" nil t) (forward-line 1) (insert "\n(autoload 'custom-add-loads \"cus-load\")\n")))) - (message (format "Compiling %s..." dgnushack-gnus-load-file)) + (message "Compiling %s..." dgnushack-gnus-load-file) (byte-compile-file dgnushack-gnus-load-file)) diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 0885214..8066cc2 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -322,29 +322,31 @@ manipulated as follows: value)) (list (quote ,name) --category--temp--) ; access-form ))))) - - (defmacro gnus-agent-cat-name (category) - `(car ,category)) ) +(defmacro gnus-agent-cat-name (category) + `(car ,category)) + +(gnus-agent-cat-defaccessor + gnus-agent-cat-days-until-old agent-days-until-old) (gnus-agent-cat-defaccessor - gnus-agent-cat-days-until-old agent-days-until-old) + gnus-agent-cat-enable-expiration agent-enable-expiration) (gnus-agent-cat-defaccessor - gnus-agent-cat-enable-expiration agent-enable-expiration) + gnus-agent-cat-groups agent-groups) (gnus-agent-cat-defaccessor - gnus-agent-cat-groups agent-groups) + gnus-agent-cat-high-score agent-high-score) (gnus-agent-cat-defaccessor - gnus-agent-cat-high-score agent-high-score) + gnus-agent-cat-length-when-long agent-length-when-long) (gnus-agent-cat-defaccessor - gnus-agent-cat-length-when-long agent-length-when-long) + gnus-agent-cat-length-when-short agent-length-when-short) (gnus-agent-cat-defaccessor - gnus-agent-cat-length-when-short agent-length-when-short) + gnus-agent-cat-low-score agent-low-score) (gnus-agent-cat-defaccessor - gnus-agent-cat-low-score agent-low-score) + gnus-agent-cat-predicate agent-predicate) (gnus-agent-cat-defaccessor - gnus-agent-cat-predicate agent-predicate) + gnus-agent-cat-score-file agent-score-file) (gnus-agent-cat-defaccessor - gnus-agent-cat-score-file agent-score-file) + gnus-agent-cat-disable-undownloaded-faces agent-disable-undownloaded-faces) (eval-when-compile (defsetf gnus-agent-cat-groups (category) (groups) @@ -1468,14 +1470,14 @@ variables. Returns the first non-nil value found." (symbol-value (cdr (assq symbol - '((agent-short-article . gnus-agent-short-article) - (agent-long-article . gnus-agent-long-article) - (agent-low-score . gnus-agent-low-score) - (agent-high-score . gnus-agent-high-score) - (agent-days-until-old . gnus-agent-expire-days) - (agent-enable-expiration - . gnus-agent-enable-expiration) - (agent-predicate . gnus-agent-predicate))))))) + '((agent-short-article . gnus-agent-short-article) + (agent-long-article . gnus-agent-long-article) + (agent-low-score . gnus-agent-low-score) + (agent-high-score . gnus-agent-high-score) + (agent-days-until-old . gnus-agent-expire-days) + (agent-enable-expiration + . gnus-agent-enable-expiration) + (agent-predicate . gnus-agent-predicate))))))) (defun gnus-agent-fetch-headers (group &optional force) "Fetch interesting headers into the agent. The group's overview diff --git a/lisp/gnus-clfns.el b/lisp/gnus-clfns.el index db33634..2931d2e 100644 --- a/lisp/gnus-clfns.el +++ b/lisp/gnus-clfns.el @@ -35,6 +35,18 @@ (eval-when-compile (require 'cl)) (require 'pym) + (define-compiler-macro assq-delete-all (&whole form key alist) + (if (>= emacs-major-version 21) + form + `(let* ((key ,key) + (alist ,alist) + (tail alist)) + (while tail + (if (and (consp (car tail)) (eq (car (car tail)) key)) + (setq alist (delq (car tail) alist))) + (setq tail (cdr tail))) + alist))) + (define-compiler-macro butlast (&whole form x &optional n) (if (>= emacs-major-version 21) form diff --git a/lisp/gnus-cus.el b/lisp/gnus-cus.el index f991297..fceeead 100644 --- a/lisp/gnus-cus.el +++ b/lisp/gnus-cus.el @@ -310,16 +310,26 @@ has been stored locally for at least this many days." gnus-agent-cat-days-until-old) (agent-enable-expiration (radio :tag "Expire in this Group or Topic" :value nil -; (const :format "Inherit " nil) (const :format "Enable " ENABLE) (const :format "Disable " DISABLE)) "\nEnable, or disable, agent expiration in this group or topic." - gnus-agent-cat-enable-expiration) ) + gnus-agent-cat-enable-expiration) + (agent-disable-undownloaded-faces + (boolean :tag "Disable Agent Faces") + "Have the summary buffer ignore the agent's undownloaded faces. +These faces, when used, act as a warning that an article has not been +fetched into either the agent nor the cache. This is of most use to +users who use the agent as a cache (i.e. they only operate on articles +that have been downloaded). Disable to display normal article faces +even when the article hasn't been downloaded." + gnus-agent-cat-disable-undownloaded-faces)) "Alist of group parameters that are not also topic parameters. -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.")) +Each entry has the form (NAME TYPE DOC ACCESSOR), where NAME is the +parameter itself (a symbol), TYPE is the parameters type (a sexp +widget), DOC is a documentation string for the parameter, and ACCESSOR +is a function (symbol) that extracts the current value from the +category.")) (defvar gnus-custom-params) (defvar gnus-custom-method) @@ -879,16 +889,6 @@ articles in the thread. (eval-when-compile (defvar category-fields nil) - (defvar gnus-agent-cat-predicate nil) - (defvar gnus-agent-cat-score-file nil) - (defvar gnus-agent-cat-length-when-short nil) - (defvar gnus-agent-cat-length-when-long nil) - (defvar gnus-agent-cat-low-score nil) - (defvar gnus-agent-cat-high-score nil) - (defvar gnus-agent-cat-groups nil) - (defvar gnus-agent-cat-enable-expiration nil) - (defvar gnus-agent-cat-days-until-old nil) - (defvar gnus-agent-cat-name nil) ) (defun gnus-trim-whitespace (s) @@ -906,7 +906,8 @@ articles in the thread. (val (,field info)) (deflt (if (,field defaults) (concat " [" (gnus-trim-whitespace - (pp-to-string (,field defaults))) "]")))) + (pp-to-string (,field defaults))) "]"))) + symb) (if (eq (car type) 'radio) (let* ((rtype (nreverse type)) @@ -929,13 +930,14 @@ articles in the thread. (widget-insert "\n") - (set (make-local-variable ',field) - (if val - (widget-create type :value val) - (widget-create type))) - (widget-put ,field :default val) - (widget-put ,field :accessor ',field) - (push ,field category-fields)))) + (setq val (if val + (widget-create type :value val) + (widget-create type)) + symb (set (make-local-variable ',field) val)) + + (widget-put symb :default val) + (widget-put symb :accessor ',field) + (push symb category-fields)))) (defun gnus-agent-customize-category (category) "Edit the CATEGORY." @@ -1002,28 +1004,32 @@ articles in the thread. ;; gnus-agent-cat-prepare-category-field as I don't want the ;; group list to appear when customizing a topic. (widget-insert "\n") - (set (make-local-variable 'gnus-agent-cat-groups) - (widget-create - `(choice - :format "%[Select Member Groups%]\n%v" :value ignore - (const :menu-tag "do not change" :tag "" :value ignore) - (checklist :entry-format "%b %v" - :menu-tag "display group selectors" - :greedy t - :value ,(delq nil - (mapcar - (lambda (newsrc) - (car (member - (gnus-info-group newsrc) - (gnus-agent-cat-groups info)))) - (cdr gnus-newsrc-alist))) - ,@(mapcar (lambda (newsrc) - `(const ,(gnus-info-group newsrc))) - (cdr gnus-newsrc-alist)))))) - - (widget-put gnus-agent-cat-groups :default (gnus-agent-cat-groups info)) - (widget-put gnus-agent-cat-groups :accessor 'gnus-agent-cat-groups) - (push gnus-agent-cat-groups category-fields) + + (let ((symb + (set + (make-local-variable 'gnus-agent-cat-groups) + (widget-create + `(choice + :format "%[Select Member Groups%]\n%v" :value ignore + (const :menu-tag "do not change" :tag "" :value ignore) + (checklist :entry-format "%b %v" + :menu-tag "display group selectors" + :greedy t + :value + ,(delq nil + (mapcar + (lambda (newsrc) + (car (member + (gnus-info-group newsrc) + (gnus-agent-cat-groups info)))) + (cdr gnus-newsrc-alist))) + ,@(mapcar (lambda (newsrc) + `(const ,(gnus-info-group newsrc))) + (cdr gnus-newsrc-alist)))))))) + + (widget-put symb :default (gnus-agent-cat-groups info)) + (widget-put symb :accessor 'gnus-agent-cat-groups) + (push symb category-fields)) (widget-insert "\nExpiration Settings ") diff --git a/lisp/gnus-registry.el b/lisp/gnus-registry.el index 19ff62e..606317c 100644 --- a/lisp/gnus-registry.el +++ b/lisp/gnus-registry.el @@ -46,6 +46,11 @@ The group names are matched, they don't have to be fully qualified." :group 'gnus-registry :type '(repeat string)) +(defcustom gnus-registry-install nil + "Whether the registry should be installed." + :group 'gnus-registry + :type 'boolean) + (defcustom gnus-registry-cache-file "~/.gnus.registry.eld" "File where the Gnus registry will be stored." :group 'gnus-registry @@ -267,13 +272,19 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (string-match x word)) list))))) -(defun gnus-registry-fetch-extra (id) +(defun gnus-registry-fetch-extra (id &optional entry) "Get the extra data of a message, based on the message ID. Returns the first place where the trail finds a nonstring." (let ((trail (gethash id gnus-registry-hashtb))) (dolist (crumb trail) (unless (stringp crumb) - (return crumb))))) + (return (gnus-registry-fetch-extra-entry crumb entry)))))) + +(defun gnus-registry-fetch-extra-entry (alist &optional entry) + "Get the extra data of a message, or a specific entry in it." + (if entry + (assq entry alist) + alist)) (defun gnus-registry-store-extra (id extra) "Store the extra data of a message, based on the message ID. @@ -285,6 +296,13 @@ The message must have at least one group name." (puthash id (cons extra (delete old-extra trail)) gnus-registry-hashtb)))) +(defun gnus-registry-store-extra-entry (id key value) + "Put a specific entry in the extras field of the registry entry for id." + (let* ((extra (gnus-registry-fetch-extra id)) + (alist (cons (cons key value) + (assq-delete-all key (gnus-registry-fetch-extra id))))) + (gnus-registry-store-extra id alist))) + (defun gnus-registry-fetch-group (id) "Get the group of a message, based on the message ID. Returns the first place where the trail finds a group name." @@ -314,7 +332,8 @@ Returns the first place where the trail finds a group name." gnus-registry-hashtb)) ;; now, clear the entry if there are no more groups (unless (gnus-registry-group-count id) - (remhash id gnus-registry-hashtb))))) + (remhash id gnus-registry-hashtb)) + (gnus-registry-store-extra-entry id 'mtime (current-time))))) (defun gnus-registry-add-group (id group &rest extra) "Add a group for a message, based on the message ID." @@ -329,7 +348,8 @@ Returns the first place where the trail finds a group name." (cons group trail) (list group)) gnus-registry-hashtb) - (when extra (gnus-registry-store-extra id extra))))))) + (when extra (gnus-registry-store-extra id extra)) + (gnus-registry-store-extra-entry id 'mtime (current-time))))))) (defun gnus-registry-clear () "Clear the Gnus registry." @@ -337,16 +357,21 @@ Returns the first place where the trail finds a group name." (setq gnus-registry-alist nil) (setq gnus-registry-hashtb (alist-to-hashtable gnus-registry-alist))) -; also does copy, respool, and crosspost -(add-hook 'gnus-summary-article-move-hook 'gnus-register-action) -(add-hook 'gnus-summary-article-delete-hook 'gnus-register-action) -(add-hook 'gnus-summary-article-expire-hook 'gnus-register-action) -(add-hook 'nnmail-spool-hook 'gnus-register-spool-action) - -(add-hook 'gnus-save-newsrc-hook 'gnus-registry-save) -(add-hook 'gnus-read-newsrc-el-hook 'gnus-registry-read) - -(add-hook 'gnus-summary-prepare-hook 'gnus-registry-register-message-ids) +(defun gnus-registry-install-hooks () + "Install the registry hooks." + (interactive) + (add-hook 'gnus-summary-article-move-hook 'gnus-register-action) + (add-hook 'gnus-summary-article-delete-hook 'gnus-register-action) + (add-hook 'gnus-summary-article-expire-hook 'gnus-register-action) + (add-hook 'nnmail-spool-hook 'gnus-register-spool-action) + + (add-hook 'gnus-save-newsrc-hook 'gnus-registry-save) + (add-hook 'gnus-read-newsrc-el-hook 'gnus-registry-read) + + (add-hook 'gnus-summary-prepare-hook 'gnus-registry-register-message-ids)) + +(when gnus-registry-install + (gnus-registry-install-hooks)) ;; TODO: a lot of things diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 9a9f688..7ebf459 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -1277,6 +1277,7 @@ end position and text.") (defvar gnus-newsgroup-data-reverse nil) (defvar gnus-newsgroup-limit nil) (defvar gnus-newsgroup-limits nil) +(defvar gnus-summary-use-undownloaded-faces nil) (defvar gnus-newsgroup-unreads nil "Sorted list of unread articles in the current newsgroup.") @@ -1421,6 +1422,7 @@ This list will always be a subset of gnus-newsgroup-undownloaded.") gnus-newsgroup-data gnus-newsgroup-data-reverse gnus-newsgroup-limit gnus-newsgroup-limits gnus-newsgroup-charset gnus-newsgroup-display + gnus-summary-use-undownloaded-faces gnus-newsgroup-incorporated) "Variables that are buffer-local to the summary buffers.") @@ -5025,7 +5027,12 @@ If SELECT-ARTICLES, only select those articles from GROUP." (active (gnus-active group))) (if (and (car alist) (< (caar alist) (car active))) - (gnus-set-active group (cons (caar alist) (cdr active)))))) + (gnus-set-active group (cons (caar alist) (cdr active))))) + + (setq gnus-summary-use-undownloaded-faces + (not (gnus-agent-find-parameter + group + 'agent-disable-undownloaded-faces)))) (setq gnus-newsgroup-name group gnus-newsgroup-unselected nil @@ -11289,8 +11296,8 @@ If REVERSE, save parts that do not match TYPE." (default gnus-summary-default-score) (default-high gnus-summary-default-high-score) (default-low gnus-summary-default-low-score) - (uncached (memq article gnus-newsgroup-undownloaded)) - (downloaded (not uncached))) + (uncached (and gnus-summary-use-undownloaded-faces + (memq article gnus-newsgroup-undownloaded)))) (let ((face (funcall (gnus-summary-highlight-line-0)))) (unless (eq face (get-text-property beg 'face)) (gnus-put-text-property-excluding-characters-with-faces diff --git a/lisp/gnus.el b/lisp/gnus.el index 3168ac3..b0c4620 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -2191,7 +2191,7 @@ covered by that variable." (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)." +Putting (gnus-agentize) in ~/.gnus is obsoleted by (setq gnus-agent t)." :version "21.3" :group 'gnus-agent :type 'boolean) diff --git a/lisp/lpath.el b/lisp/lpath.el index fc48c59..5a7970c 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -11,8 +11,8 @@ (maybe-fbind '(Info-directory Info-menu bbdb-create-internal bbdb-records create-image - display-graphic-p display-time-event-handler find-image - image-size image-type-available-p insert-image + display-graphic-p display-time-event-handler find-coding-system + find-image image-size image-type-available-p insert-image make-mode-line-mouse-map make-temp-file open-ssl-stream propertize put-image replace-regexp-in-string rmail-msg-is-pruned rmail-msg-restore-non-pruned-header diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el index a92701f..968d51a 100644 --- a/lisp/rfc2047.el +++ b/lisp/rfc2047.el @@ -55,16 +55,17 @@ Value is what BODY returns." (require 'base64) (autoload 'mm-body-7-or-8 "mm-bodies") -;; Avoid gnus-util for mm- code. -(defalias 'rfc2047-point-at-bol - (if (fboundp 'point-at-bol) - 'point-at-bol - 'line-beginning-position)) +(eval-and-compile + ;; Avoid gnus-util for mm- code. + (defalias 'rfc2047-point-at-bol + (if (fboundp 'point-at-bol) + 'point-at-bol + 'line-beginning-position)) -(defalias 'rfc2047-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position)) + (defalias 'rfc2047-point-at-eol + (if (fboundp 'point-at-eol) + 'point-at-eol + 'line-end-position))) (defvar rfc2047-header-encoding-alist '(("Newsgroups" . nil) @@ -263,12 +264,18 @@ The buffer may be narrowed." ;; skip to the end of regions appropriately. Nb. ietf-drums does ;; things differently. (defconst rfc2047-syntax-table - ;; This is what we should do, but XEmacs doesn't support the optional - ;; arg of `make-syntax-table': -;; (let ((table (make-char-table 'syntax-table '(2)))) + ;; (make-char-table 'syntax-table '(2)) only works in Emacs. (let ((table (make-syntax-table))) - ;; N.b. this currently doesn't work in Emacs 22. - (map-char-table (lambda (k v) (modify-syntax-entry k "w" table)) table) + ;; The following is done to work for setting all elements of the table + ;; in Emacs 21 and 22 and XEmacs; it appears to be the cleanest way. + ;; Play safe and don't assume the form of the word syntax entry -- + ;; copy it from ?a. + (if (fboundp 'set-char-table-range) ; Emacs + (set-char-table-range table t (aref (standard-syntax-table) ?a)) + (if (fboundp 'put-char-table) + (if (fboundp 'get-char-table) ; warning avoidance + (put-char-table t (get-char-table ?a (standard-syntax-table)) + table)))) (modify-syntax-entry ?\\ "\\" table) (modify-syntax-entry ?\" "\"" table) (modify-syntax-entry ?\( "." table) @@ -305,7 +312,7 @@ Dynamically bind `rfc2047-encoding-type' to change that." ;; token, either immediately or separated by space. last-encoded) (goto-char (point-min)) - (condition-case nil ; in case of unbalanced quotes + (condition-case nil ; in case of unbalanced quotes ;; Look for rfc2822-style: sequences of atoms, quoted ;; strings, specials, whitespace. (Specials mustn't be ;; encoded.) @@ -516,8 +523,7 @@ By default, the region is treated as containing addresses (see (let ((bol (save-restriction (widen) (rfc2047-point-at-bol))) - (eol (rfc2047-point-at-eol)) - leading) + (eol (rfc2047-point-at-eol))) (forward-line 1) (while (not (eobp)) (if (and (looking-at "[ \t]") diff --git a/texi/ChangeLog b/texi/ChangeLog index 3e02824..3ac2e82 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,7 @@ +2003-05-12 Kevin Greiner + + * gnus.texi (Agent Visuals): Add. + 2003-05-09 Simon Josefsson * pgg.texi (Default user identity): Add. diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index ee4c42f..104d7a0 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -815,6 +815,7 @@ Gnus Unplugged * Agent Basics:: $B$3$l$i$O$I$&F0$/$N$+(B * Agent Categories:: $B2?$r%@%&%s%m!<%I$9$k$+$r(B gnus $B%(!<%8%'%s%H$K65$($kJ}K!(B * Agent Commands:: $B3F%P%C%U%!!<$G$N?7$7$$L?Na(B +* Agent Visuals:: $B%(!<%8%'%s%H$,35N,%P%C%U%!$KJQ2=$r$b$?$i$9$+$b$7$l$J$$J}K!(B * Agent as Cache:: $B%(!<%8%'%s%H$OBg$-$J%-%c%C%7%e$G$b$"$k(B * Agent Expiry:: $B8E$$5-;v$r>C$9J}K!(B * Agent Regeneration:: $BDL?.@ZCG$dB>$N;v8N$+$i2sI|$9$kJ}K!(B @@ -16698,6 +16699,7 @@ Gnus $B$r(B ``$B%*%U%i%$%s(B'' $B$N%K%e!<%9%j!<%@!<$H$7$F;EN)$F$k$N$O6K$a$F * Agent Basics:: $B$3$l$i$O$I$&F0$/$N$+(B * Agent Categories:: $B2?$r%@%&%s%m!<%I$9$k$+$r(B gnus $B%(!<%8%'%s%H$K65$($kJ}K!(B * Agent Commands:: $B3F%P%C%U%!!<$G$N?7$7$$L?Na(B +* Agent Visuals:: $B%(!<%8%'%s%H$,35N,%P%C%U%!$KJQ2=$r$b$?$i$9$+$b$7$l$J$$J}K!(B * Agent as Cache:: $B%(!<%8%'%s%H$OBg$-$J%-%c%C%7%e$G$b$"$k(B * Agent Expiry:: $B8E$$5-;v$r>C$9J}K!(B * Agent Regeneration:: $BDL?.@ZCG$dB>$N;v8N$+$i2sI|$9$kJ}K!(B @@ -17404,6 +17406,69 @@ parameters at one time (@code{gnus-category-customize-category}). $B$k(B (@code{gnus-agent-remove-server})$B!#(B @end table +@c TRANSLATEME +@node Agent Visuals +@subsection Agent Visuals + +If you open a summary while unplugged and, Gnus knows from the group's +active range that there are more articles than the headers currently +stored in the Agent, you may see some articles whose subject looks +something like @samp{[Undownloaded article #####]}. These are +placeholders for the missing headers. Aside from setting a mark, +there is not much that can be done with one of these placeholders. +When Gnus finally gets a chance to fetch the group's headers, the +placeholders will automatically be replaced by the actual headers. +You can configure the summary buffer's maneuvering to skip over the +placeholders if you care (See @code{gnus-auto-goto-ignores}). + +While it may be obvious to all, the only headers and articles +available while unplugged are those headers and articles that were +fetched into the Agent while previously plugged. To put it another +way, "If you forget to fetch something while plugged, you might have a +less than satisfying unplugged session". For this reason, the Agent +adds two visual effects to your summary buffer. These effects display +the download status of each article so that you always know which +articles will be available when unplugged. + +The first visual effect is the @samp{%O} spec. If you customize +gnus-summary-line-format to include this specifier, you will add a +single character field that indicates an article's download status. +Articles that have been fetched into either the Agent or the Cache, +will display @code{gnus-downloaded-mark} (defaults to @samp{+}). All +other articles will display @code{gnus-undownloaded-mark} (defaults to +@samp{-}). If you open a group that has not been agentized, a space +(@samp{ }) will be displayed. + +The second visual effect are the undownloaded faces. The faces, there +are three indicating the article's score (low, normal, high), seem to +result in a love/hate response from many Gnus users. The problem is +that the face selection is controlled by a list of condition tests and +face names (See @code{gnus-summary-highlight}). Each condition is +tested in the order in which it appears in the list so early +conditions have precedence over later conditions. All of this means +that, if you tick an undownloaded article, the article will continue +to be displayed in the undownloaded face rather than the ticked face. + +If you use the Agent as a cache (to avoid downloading the same article +each time you visit it or to minimize your connection time), the +undownloaded face will probably seem like a good idea. The reason +being that you do all of our work (marking, reading, deleting) with +downloaded articles so the normal faces always appear. + +For occasional Agent users, the undownloaded faces may appear to be an +absolutely horrible idea. The issue being that, since most of their +articles have not been fetched into the Agent, most of the normal +faces will be obscured by the undownloaded faces. If this is your +situation, you have two choices available. First, you can completely +disable the undownload faces by customizing +@code{gnus-summary-highlight} to delete the three cons-cells that +refer to the gnus-summary*-undownloaded-face faces. Second, if you +prefer to take a more fine-grained approach, you may set the +@code{agent-disable-undownloaded-faces} group parameter to t. This +parameter, like all other agent parameters, may be set on an Agent +Category (@pxref{Agent Categories}), a Group Topic (@pxref{Topic +Parameters}), or an individual group (@pxref{Group Parameters}). + @node Agent as Cache @subsection $B%-%c%C%7%e$H$7$F$N%(!<%8%'%s%H(B diff --git a/texi/gnus.texi b/texi/gnus.texi index 86f8257..f76bb42 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -764,6 +764,7 @@ Gnus Unplugged * Agent Basics:: How it all is supposed to work. * Agent Categories:: How to tell the Gnus Agent what to download. * Agent Commands:: New commands for all the buffers. +* Agent Visuals:: Ways that the agent may effect your summary buffer. * Agent as Cache:: The Agent is a big cache too. * Agent Expiry:: How to make old articles go away. * Agent Regeneration:: How to recover from lost connections and other accidents. @@ -17241,6 +17242,7 @@ Of course, to use it as such, you have to learn a few new commands. * Agent Basics:: How it all is supposed to work. * Agent Categories:: How to tell the Gnus Agent what to download. * Agent Commands:: New commands for all the buffers. +* Agent Visuals:: Ways that the agent may effect your summary buffer. * Agent as Cache:: The Agent is a big cache too. * Agent Expiry:: How to make old articles go away. * Agent Regeneration:: How to recover from lost connections and other accidents. @@ -17980,6 +17982,68 @@ Agent (@code{gnus-agent-remove-server}). @end table +@node Agent Visuals +@subsection Agent Visuals + +If you open a summary while unplugged and, Gnus knows from the group's +active range that there are more articles than the headers currently +stored in the Agent, you may see some articles whose subject looks +something like @samp{[Undownloaded article #####]}. These are +placeholders for the missing headers. Aside from setting a mark, +there is not much that can be done with one of these placeholders. +When Gnus finally gets a chance to fetch the group's headers, the +placeholders will automatically be replaced by the actual headers. +You can configure the summary buffer's maneuvering to skip over the +placeholders if you care (See @code{gnus-auto-goto-ignores}). + +While it may be obvious to all, the only headers and articles +available while unplugged are those headers and articles that were +fetched into the Agent while previously plugged. To put it another +way, "If you forget to fetch something while plugged, you might have a +less than satisfying unplugged session". For this reason, the Agent +adds two visual effects to your summary buffer. These effects display +the download status of each article so that you always know which +articles will be available when unplugged. + +The first visual effect is the @samp{%O} spec. If you customize +gnus-summary-line-format to include this specifier, you will add a +single character field that indicates an article's download status. +Articles that have been fetched into either the Agent or the Cache, +will display @code{gnus-downloaded-mark} (defaults to @samp{+}). All +other articles will display @code{gnus-undownloaded-mark} (defaults to +@samp{-}). If you open a group that has not been agentized, a space +(@samp{ }) will be displayed. + +The second visual effect are the undownloaded faces. The faces, there +are three indicating the article's score (low, normal, high), seem to +result in a love/hate response from many Gnus users. The problem is +that the face selection is controlled by a list of condition tests and +face names (See @code{gnus-summary-highlight}). Each condition is +tested in the order in which it appears in the list so early +conditions have precedence over later conditions. All of this means +that, if you tick an undownloaded article, the article will continue +to be displayed in the undownloaded face rather than the ticked face. + +If you use the Agent as a cache (to avoid downloading the same article +each time you visit it or to minimize your connection time), the +undownloaded face will probably seem like a good idea. The reason +being that you do all of our work (marking, reading, deleting) with +downloaded articles so the normal faces always appear. + +For occasional Agent users, the undownloaded faces may appear to be an +absolutely horrible idea. The issue being that, since most of their +articles have not been fetched into the Agent, most of the normal +faces will be obscured by the undownloaded faces. If this is your +situation, you have two choices available. First, you can completely +disable the undownload faces by customizing +@code{gnus-summary-highlight} to delete the three cons-cells that +refer to the gnus-summary*-undownloaded-face faces. Second, if you +prefer to take a more fine-grained approach, you may set the +@code{agent-disable-undownloaded-faces} group parameter to t. This +parameter, like all other agent parameters, may be set on an Agent +Category (@pxref{Agent Categories}), a Group Topic (@pxref{Topic +Parameters}), or an individual group (@pxref{Group Parameters}). + @node Agent as Cache @subsection Agent as Cache -- 1.7.10.4