\f
* Changes in Oort Gnus
+** Extended format specs.
+
+Format spec "%&user-date;" is added into
+gnus-summary-line-format-alist. Also, user defined extended format
+specs are supported. The extended format specs look like "%u&foo;",
+which invokes function gnus-user-format-function-foo. Because "&" is
+used as the escape character, old user defined format "%u&" is no
+longer supported.
+
** `/ *' (gnus-summary-limit-include-cached) is rewritten.
It was aliased to `Y c' (gnus-summary-insert-cached-articles). The new
+2001-10-18 Simon Josefsson <jas@extundo.com>
+
+ * gnus-sum.el (gnus-group-make-articles-read): Call g-r-set-mark
+ when undoing.
+
+2001-10-18 Simon Josefsson <jas@extundo.com>
+ From Frank Schmitt <usereplyto@Frank-Schmitt.net>
+
+ * gnus-sum.el (gnus-summary-limit-to-display-predicate): Fix typo.
+ (gnus-summary-make-menu-bar): Ditto.
+
+2001-10-17 Simon Josefsson <jas@extundo.com>
+
+ * nnimap.el (nnimap-expiry-target): Make sure it is back to the
+ server. Suggested by ShengHuo ZHU <zsh@cs.rochester.edu>.
+
+2001-10-17 17:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-line-format-alist): user-date entry.
+ * gnus-util.el (gnus-user-date): New function.
+ From Frank Schmitt <usenet@Frank-Schmitt.net>.
+
+2001-10-17 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * message.el (message-check-news-header-syntax): Special case
+ nnvirtual groups.
+
+ * gnus-sum.el (gnus-summary-respool-default-method): Changed
+ customize type to `symbol'.
+
+2001-10-17 12:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-spec.el (gnus-parse-simple-format): Support extended spec
+ %&foo;.
+ (gnus-parse-simple-format): Support user extended spec too.
+ %u&foo; invokes gnus-user-format-function-foo.
+
+2001-10-17 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnml.el (nnml-request-expire-articles): Make sure it is back to
+ the server.
+ * nnmbox.el (nnmbox-request-expire-articles): Ditto.
+ * nnfolder.el (nnfolder-request-expire-articles): Ditto.
+ * nnbabyl.el (nnbabyl-request-expire-articles): Ditto.
+ * nndiary.el (nndiary-request-expire-articles): Ditto.
+ (nndiary-schedule): Defsubst it before use it.
+ (nndiary-error): eval-and-compile.
+
2001-10-17 Per Abrahamsen <abraham@dina.kvl.dk>
* gnus-msg.el (gnus-post-method): Changed two instances of
- 'active' to 'current' and one 'null' to 'not'.
+ `active' to `current' and one `null' to `not'.
2001-10-16 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
From Katsumi Yamaoka <yamaoka@jpl.org>.
(wseek 0)
(seek 0)
(length (length string))
- (string (concat string "\0")))
+ (string (concat string "\0")))
;; Find the start position.
(while (and (< seek length)
(< wseek start))
(let (max-width
spec flist fstring elem result dontinsert user-defined
type value pad-width spec-beg cut-width ignore-value
- tilde-form tilde elem-type)
+ tilde-form tilde elem-type extended-spec)
(save-excursion
(gnus-set-work-buffer)
(insert format)
max-width nil
cut-width nil
ignore-value nil
- tilde-form nil)
+ tilde-form nil
+ extended-spec nil)
(setq spec-beg (1- (point)))
;; Parse this spec fully.
t)
(t
nil)))
- ;; User-defined spec -- find the spec name.
- (when (eq (setq spec (char-after)) ?u)
+ (cond
+ ;; User-defined spec -- find the spec name.
+ ((eq (setq spec (char-after)) ?u)
(forward-char 1)
- (setq user-defined (char-after)))
+ (when (and (eq (setq user-defined (char-after)) ?&)
+ (looking-at "&\\([^;]+\\);"))
+ (setq user-defined (match-string 1))
+ (goto-char (match-end 1))))
+ ;; extended spec
+ ((and (eq spec ?&) (looking-at "&\\([^;]+\\);"))
+ (setq extended-spec (intern (match-string 1)))
+ (goto-char (match-end 1))))
(forward-char 1)
(delete-region spec-beg (point))
(user-defined
(setq elem
(list
- (list (intern (format "gnus-user-format-function-%c"
- user-defined))
+ (list (intern (format
+ (if (stringp user-defined)
+ "gnus-user-format-function-%s"
+ "gnus-user-format-function-%c")
+ user-defined))
'gnus-tmp-header)
?s)))
;; Find the specification from `spec-alist'.
- ((setq elem (cdr (assq spec spec-alist))))
+ ((setq elem (cdr (assq (or extended-spec spec) spec-alist))))
(t
(setq elem '("*" ?s))))
(setq elem-type (cadr elem))
(setq
result
(cond
- ;; Emptyness.
+ ;; Emptiness.
((string= fstring "")
nil)
;; Not a format string.
?c)
(?u gnus-tmp-user-defined ?s)
(?P (gnus-pick-line-number) ?d)
- (?B gnus-tmp-thread-tree-header-string ?s))
+ (?B gnus-tmp-thread-tree-header-string ?s)
+ (user-date (gnus-user-date
+ ,(macroexpand '(mail-header-date gnus-tmp-header))) ?s))
"An alist of format specifications that can appear in summary lines.
These are paired with what variables they correspond with, along with
the type of the variable (string, integer, character, etc).")
["Age..." gnus-summary-limit-to-age t]
["Extra..." gnus-summary-limit-to-extra t]
["Score" gnus-summary-limit-to-score t]
- ["Score" gnus-summary-limit-to-display-predicate t]
+ ["Display Predicate" gnus-summary-limit-to-display-predicate t]
["Unread" gnus-summary-limit-to-unread t]
["Non-dormant" gnus-summary-limit-exclude-dormant t]
["Articles" gnus-summary-limit-to-articles t]
(gnus-info-set-marks ',info ',(gnus-info-marks info) t)
(gnus-info-set-read ',info ',(gnus-info-read info))
(gnus-get-unread-articles-in-group ',info (gnus-active ,group))
+ (gnus-request-set-mark group (list (list ',range 'del '(read))))
(gnus-group-update-group ,group t))))
;; Add the read articles to the range.
(gnus-info-set-read info range)
"Limit the summary buffer to the predicated in the `display' group parameter."
(interactive)
(unless gnus-newsgroup-display
- (error "There is no `diplay' group parameter"))
+ (error "There is no `display' group parameter"))
(let (articles)
(dolist (number gnus-newsgroup-articles)
(when (funcall gnus-newsgroup-display)
(gnus-summary-move-article n nil nil 'crosspost))
(defcustom gnus-summary-respool-default-method nil
- "Default method for respooling an article.
+ "Default method type for respooling an article.
If nil, use to the current newsgroup method."
- :type '(choice (gnus-select-method :value (nnml ""))
- (const nil))
+ :type 'symbol
:group 'gnus-summary-mail)
(defun gnus-summary-respool-article (&optional n method)
(yes-or-no-p prompt)
(message "")))
+;; By Frank Schmitt <ich@Frank-Schmitt.net>. Allows to have
+;; age-depending date representations. (e.g. just the time if it's
+;; from today, the day of the week if it's within the last 7 days and
+;; the full date if it's older)
+(defun gnus-seconds-today ()
+ "Returns the number of seconds passed today"
+ (let ((now (decode-time (current-time))))
+ (+ (car now) (* (car (cdr now)) 60) (* (car (nthcdr 2 now)) 3600))))
+
+(defun gnus-seconds-month ()
+ "Returns the number of seconds passed this month"
+ (let ((now (decode-time (current-time))))
+ (+ (car now) (* (car (cdr now)) 60) (* (car (nthcdr 2 now)) 3600)
+ (* (- (car (nthcdr 3 now)) 1) 3600 24))))
+
+(defun gnus-seconds-year ()
+ "Returns the number of seconds passed this year"
+ (let ((now (decode-time (current-time)))
+ (days (format-time-string "%j" (current-time))))
+ (+ (car now) (* (car (cdr now)) 60) (* (car (nthcdr 2 now)) 3600)
+ (* (- (string-to-number days) 1) 3600 24))))
+
+(defvar gnus-user-date-format-alist
+ '(((gnus-seconds-today) . "%k:%M")
+ (604800 . "%a %k:%M") ;;that's one week
+ ((gnus-seconds-month) . "%a %d")
+ ((gnus-seconds-year) . "%b %d")
+ (t . "%b %m '%y")) ;;this one is used when no other does match
+ "Alist of time in seconds and format specification used to display dates not older.
+The first element must be a number or a function returning a
+number. The second element is a format-specification as described in
+the documentation for format-time-string. The list must be ordered
+smallest number up. When there is an element, which is not a number,
+the corresponding format-specification will be used, disregarding any
+following elements. You can use the functions gnus-seconds-today,
+gnus-seconds-month, gnus-seconds-year which will return the number of
+seconds which passed today/this month/this year.")
+
+(defun gnus-user-date (messy-date)
+ "Format the messy-date acording to gnus-user-date-format-alist.
+Returns \" ? \" if there's bad input or if an other error occurs.
+Input should look like this: \"Sun, 14 Oct 2001 13:34:39 +0200\"."
+ (condition-case ()
+ (let* ((messy-date (safe-date-to-time messy-date))
+ (now (current-time))
+ ;;If we don't find something suitable we'll use this one
+ (my-format "%b %m '%y")
+ (high (lsh (- (car now) (car messy-date)) 16)))
+ (if (and (> high -1) (= (logand high 65535) 0))
+ ;;overflow and bad input
+ (let* ((difference (+ high (- (car (cdr now))
+ (car (cdr messy-date)))))
+ (templist gnus-user-date-format-alist)
+ (top (eval (caar templist))))
+ (while (if (numberp top) (< top difference) (not top))
+ (progn
+ (setq templist (cdr templist))
+ (setq top (eval (caar templist)))))
+ (if (stringp (cdr (car templist)))
+ (setq my-format (cdr (car templist))))))
+ (format-time-string (eval my-format) messy-date))
+ (error " ? ")))
+;;end of Frank's code
+
(defun gnus-dd-mmm (messy-date)
"Return a string like DD-MMM from a big messy string."
(condition-case ()
(if followup-to
(concat newsgroups "," followup-to)
newsgroups)))
- (method (if (message-functionp message-post-method)
- (funcall message-post-method)
- message-post-method))
+ (post-method (if (message-functionp message-post-method)
+ (funcall message-post-method)
+ message-post-method))
+ ;; KLUDGE to handle nnvirtual groups. Doing this right
+ ;; would probably involve a new nnoo function.
+ ;; -- Per Abrahamsen <abraham@dina.kvl.dk>, 2001-10-17.
+ (method (if (and (consp post-method)
+ (eq (car post-method) 'nnvirtual)
+ gnus-message-group-art)
+ (let ((group (car (nnvirtual-find-group-art
+ (car gnus-message-group-art)
+ (cdr gnus-message-group-art)))))
+ (gnus-find-method-for-group group))
+ post-method))
(known-groups
(mapcar (lambda (n)
- (gnus-group-name-decode
+ (gnus-group-name-decode
(gnus-group-real-name n)
(gnus-group-name-charset method n)))
(gnus-groups-from-server method)))
(current-buffer))
(let ((nnml-current-directory nil))
(nnmail-expiry-target-group
- nnmail-expiry-target newsgroup))))
+ nnmail-expiry-target newsgroup)))
+ (nnbabyl-possibly-change-newsgroup newsgroup server))
(nnheader-message 5 "Deleting article %d in %s..."
(car articles) newsgroup)
(nnbabyl-delete-mail))
;; Compatibility Functions =================================================
-(if (fboundp 'signal-error)
+(eval-and-compile
+ (if (fboundp 'signal-error)
+ (defun nndiary-error (&rest args)
+ (apply #'signal-error 'nndiary args))
(defun nndiary-error (&rest args)
- (apply #'signal-error 'nndiary args))
- (defun nndiary-error (&rest args)
- (apply #'error args)))
+ (apply #'error args))))
;; Backend behavior customization ===========================================
(interactive)
(message "NNDiary version %s" nndiary-version))
-
(defvoo nndiary-nov-file-name ".overview")
(defvoo nndiary-current-directory nil)
;; the (relative) number of seconds ahead GMT.
)
+(defsubst nndiary-schedule ()
+ (let (head)
+ (condition-case arg
+ (mapcar
+ (lambda (elt)
+ (setq head (nth 0 elt))
+ (nndiary-parse-schedule (nth 0 elt) (nth 1 elt) (nth 2 elt)))
+ nndiary-headers)
+ (t
+ (nnheader-report 'nndiary "X-Diary-%s header parse error: %s."
+ head (cdr arg))
+ nil))
+ ))
;;; Interface functions =====================================================
(with-temp-buffer
(nndiary-request-article number group server (current-buffer))
(let ((nndiary-current-directory nil))
- (nnmail-expiry-target-group nnmail-expiry-target group))))
+ (nnmail-expiry-target-group nnmail-expiry-target group)))
+ (nndiary-possibly-change-directory group server))
(nnheader-message 5 "Deleting article %s in %s" number group)
(condition-case ()
(funcall nnmail-delete-file-function article)
(nndiary-parse-schedule-value (match-string 1) min-or-values max))
))
-(defsubst nndiary-schedule ()
- (let (head)
- (condition-case arg
- (mapcar
- (lambda (elt)
- (setq head (nth 0 elt))
- (nndiary-parse-schedule (nth 0 elt) (nth 1 elt) (nth 2 elt)))
- nndiary-headers)
- (t
- (nnheader-report 'nndiary "X-Diary-%s header parse error: %s."
- head (cdr arg))
- nil))
- ))
-
(defun nndiary-max (spec)
;; Returns the max of specification SPEC, or nil for permanent schedules.
(unless (null spec)
newsgroup server (current-buffer))
(let ((nnfolder-current-directory nil))
(nnmail-expiry-target-group
- nnmail-expiry-target newsgroup))))
+ nnmail-expiry-target newsgroup)))
+ (nnfolder-possibly-change-group newsgroup server))
(nnheader-message 5 "Deleting article %d in %s..."
(car maybe-expirable) newsgroup)
(nnfolder-delete-mail)
(if (file-exists-p file)
(condition-case err
(with-temp-buffer
- (gnus-sethash file (nth 5 (file-attributes file))
+ (gnus-sethash file (nth 5 (file-attributes file))
nnfolder-marks-modtime)
(nnheader-insert-file-contents file)
(setq nnfolder-marks (read (current-buffer)))
(or (member "\\NoSelect"
(imap-mailbox-get 'list-flags group nnimap-server-buffer))
(let ((info (nnimap-find-minmax-uid group 'examine)))
- (when (> (or (imap-mailbox-get 'recent group
+ (when (> (or (imap-mailbox-get 'recent group
nnimap-server-buffer) 0)
0)
(push (list (cons group 0)) nnmail-split-history))
(let ((nnimap-current-move-article art)
(nnimap-current-move-group group)
(nnimap-current-move-server server))
- (nnmail-expiry-target-group nnmail-expiry-target group))))))
+ (nnmail-expiry-target-group nnmail-expiry-target group))))
+ ;; It is not clear if `nnmail-expiry-target' somehow cause the
+ ;; current group to be changed or not, so we make sure here.
+ (nnimap-possibly-change-group group server)))
;; Notice that we don't actually delete anything, we just mark them deleted.
(deffoo nnimap-request-expire-articles (articles group &optional server force)
(current-buffer))
(let ((nnml-current-directory nil))
(nnmail-expiry-target-group
- nnmail-expiry-target newsgroup))))
+ nnmail-expiry-target newsgroup)))
+ (nnmbox-possibly-change-newsgroup newsgroup server))
(nnheader-message 5 "Deleting article %d in %s..."
(car articles) newsgroup)
(nnmbox-delete-mail))
This variable is a virtual server slot. See the Gnus manual for details.")
(defvoo nnml-filenames-are-evil t
- "If non-nil, Gnus will not assume that the articles file name
-is the same as the article number listed in the nov database. This
+ "If non-nil, Gnus will not assume that the articles file name
+is the same as the article number listed in the nov database. This
variable should be set if any of the files are compressed.
This variable is a virtual server slot. See the Gnus manual for details.")
(let (nnml-current-directory
nnml-current-group
nnml-article-file-alist)
- (nnmail-expiry-target-group nnmail-expiry-target group))))
+ (nnmail-expiry-target-group nnmail-expiry-target group)))
+ ;; Maybe directory is changed during nnmail-expiry-target-group.
+ (nnml-possibly-change-directory group server))
(nnheader-message 5 "Deleting article %s in %s"
number group)
(condition-case ()
(defun nnml-current-group-article-to-file-alist ()
"Return an alist of article/file pairs in the current group.
Use the nov database for the current group if available."
- (if (or gnus-nov-is-evil
+ (if (or gnus-nov-is-evil
nnml-nov-is-evil
nnml-filenames-are-evil
(not (file-exists-p
+2001-10-17 21:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus.texi (Archived Messages): Add new line after @item.
+ From: Jesper Harder <harder@ifa.au.dk>
+
+2001-10-17 21:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus.texi (Formatting Basics): Extended format specs.
+
+2001-10-17 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus.texi (Summary Buffer Lines): Documment %( and %).
+
2001-09-04 21:43:05 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (Topic Sorting): Addition.
\e$B=i4|CM$NJ8;zNs$O\e(B @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n} \e$B$G$9!#\e(B
-\e$B0J2<$NMM<0;X<(J8;z$r;H$&$3$H$,$G$-$^$9\e(B:
+\e$B0J2<$NMM<0;X<(J8;z$H3HD%MM<0;X<($r;H$&$3$H$,$G$-$^$9\e(B:
@table @samp
@item N
\e$B9T?t!#\e(B
@item O
\e$B%@%&%s%m!<%I$N0u!#\e(B
+@item &user-date;
+\e$B7P2a;~4V$NMM<0!#$$$m$$$m$JMM<0$,\e(B @code{gnus-user-date-format-alist} \e$B$GDj\e(B
+\e$B5A$5$l$F$$$^$9!#\e(B
@item u
\e$BMxMQ<TDj5A;XDj;R!#%U%)!<%^%C%HJ8;zNs$NCf$N<!$NJ8;z$,1Q;z$G$"$kI,MW$,$"$j\e(B
\e$B$^$9!#$3$l$K$h$j\e(B gnus \e$B$O4X\e(B
\e$B$5$l$^$9!#\e(B
@end table
+@samp{%(} \e$B$H\e(B @samp{%)} \e$B$N4V$K$"$k%F%-%9%H$O!"$=$3$K%^%&%9$,$"$k$H$-\e(B
+\e$B$K\e(B @code{gnus-mouse-face} \e$B$G%O%$%i%$%H$5$l$^$9!#$=$&$$$&NN0h$O0l$D$@$1$G\e(B
+\e$B$9!#\e(B
+
@samp{%U} (\e$B>uBV\e(B), @samp{%R} (\e$BJVEz:Q$_\e(B), @samp{%z} (zcore) \e$B$N07$$$K$O5$$r\e(B
\e$BIU$1$kI,MW$,$"$j$^$9!#8zN($N$?$a$K!"\e(Bgnus \e$B$O$3$l$i$NJ8;z$,$I$N7e$K8=$l$k\e(B
\e$B$+$r7W;;$7!"!X%O!<%I!&%3!<%I!Y$7$^$9!#$3$l$O!"2DJQD9$N;EMM$N8e$G$O!"$3$l\e(B
\e$B$3$NJQ?t$O<!$N$h$&$J;v$r$9$k$?$a$K;H$o$l$^$9\e(B:
@itemize @bullet
-@item \e$BJ8;zNs\e(B
+@item
+\e$BJ8;zNs\e(B
\e$B%a%C%;!<%8$O$=$N%0%k!<%W$KJ]B8$5$l$^$9!#\e(B
\e$B$"$J$?$O%0%k!<%WL>$KA*BrJ}K!$r4^$a$k$3$H$,$G$-$^$9$,!"$=$&$9$k$H$=$N%a%C\e(B
\e$B$"$J$?$,\e(B @code{"nnml:foo"} \e$B$H$$$&CM$r;H$&$H!"\e(B@samp{nnml:foo} \e$B$KJ]B8$5$l\e(B
\e$B$^$9!#\e(B
@samp{nnml:foo}.
-@item \e$BJ8;zNs$N%j%9%H\e(B
+@item
+\e$BJ8;zNs$N%j%9%H\e(B
\e$B%a%C%;!<%8$O$=$l$i$NA4$F$N%0%k!<%W$KJ]B8$5$l$^$9!#\e(B
-@item \e$B@55,I=8=!"4X?t!"MM<0$NO"A[%j%9%H\e(B
+@item
+\e$B@55,I=8=!"4X?t!"MM<0$NO"A[%j%9%H\e(B
\e$B%-!<$,!X9gCW!Y$9$k$H!"7k2L$,;H$o$l$^$9!#\e(B
-@item @code{nil}
+@item
+@code{nil}
\e$B%a%C%;!<%8$NJ]B8$O9T$o$l$^$;$s!#$3$l$,%G%#%U%)%k%H$G$9!#\e(B
@end itemize
\e$B$=$N$?$a$K$O!"\e(B@samp{%4,6y} \e$B$H$9$k;v$,$G$-$F!"$3$l$O$=$NNN0h$O7h$7$F\e(B 6 \e$BJ8\e(B
\e$B;z$rD6$($kD9$5$K$O$J$i$:!"\e(B4 \e$BJ8;z$h$j>/$J$$D9$5$K$J$i$J$$$H$$$&;v$G$9!#\e(B
+gnus \e$B$O\e(B @samp{%&user-date;} \e$B$N$h$&$J!"$$$/$D$+$N3HD%MM<0;X<($b%5%]!<%H$7\e(B
+\e$B$^$9!#\e(B
+
@node Mode Line Formatting
@subsection \e$B%b!<%I9T=qK!;EMM\e(B
\e$B$h$&$K%P%C%U%!$KA^F~$5$l$^$9!#4X?t$O0UL#$NL5$$CM$H6&$K8F$P$l$k;v$b$"$j$(\e(B
\e$B$^$9$N$G!"$=$l$NBP:v$r$9$k$Y$-$G$9!#\e(B
+gnus \e$B$O\e(B @samp{%u&foo;} \e$B$N$h$&$J3HD%MxMQ<TDj5A;X<($b%5%]!<%H$7$^$9!#\e(B
+gnus \e$B$O4X?t\e(B @code{gnus-user-format-function-}@samp{foo} \e$B$r8F$S=P$7$^$9!#\e(B
+
\e$B?7$7$$4X?t$rDj5A$7$J$$$G$b!"%A%k%@=$>~\e(B
\e$B;R\e(B (@pxref{Advanced Formatting}) \e$B$r;H$C$F$[$H$s$IF1$8;v$rC#@.$9$k;v$,$G\e(B
\e$B$-$^$9!#Nc$G$9\e(B: @samp{%~(form (count-lines (point-min) (point)))@@}\e$B!#\e(B
The default string is @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n}.
-The following format specification characters are understood:
+The following format specification characters and extended format
+specification(s) are understood:
@table @samp
@item N
The line number.
@item O
Download mark.
+@item &user-date;
+Age sensitive date format. Various date format is defined in
+@code{gnus-user-date-format-alist}.
@item u
User defined specifier. The next character in the format string should
be a letter. Gnus will call the function
into the summary just like information from any other summary specifier.
@end table
+Text between @samp{%(} and @samp{%)} will be highlighted with
+@code{gnus-mouse-face} when the mouse point is placed inside the area.
+There can only be one such area.
+
The @samp{%U} (status), @samp{%R} (replied) and @samp{%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''
This variable can be used to do the following:
@itemize @bullet
-@item a string
+@item
+a string
Messages will be saved in that group.
Note that you can include a select method in the group name, then the
messages are stored in @samp{nnfolder+archive:foo}, but if you use the
value @code{"nnml:foo"}, then outgoing messages will be stored in
@samp{nnml:foo}.
-@item a list of strings
+@item
+a list of strings
Messages will be saved in all those groups.
-@item an alist of regexps, functions and forms
+@item
+an alist of regexps, functions and forms
When a key ``matches'', the result is used.
-@item @code{nil}
+@item
+@code{nil}
No message archiving will take place. This is the default.
@end itemize
means that the field will never be more than 6 characters wide and never
less than 4 characters wide.
+Also Gnus supports some extended format specifications, such as
+@samp{%&user-date;}.
@node Mode Line Formatting
@subsection Mode Line Formatting
specifier. This function may also be called with dummy values, so it
should protect against that.
+Also Gnus supports extended user-defined specs, such as @samp{%u&foo;}.
+Gnus will call the function @code{gnus-user-format-function-}@samp{foo}.
+
You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
much the same without defining new functions. Here's an example:
@samp{%~(form (count-lines (point-min) (point)))@@}. The form