Synch with Oort Gnus.
authoryamaoka <yamaoka>
Thu, 18 Oct 2001 23:31:55 +0000 (23:31 +0000)
committeryamaoka <yamaoka>
Thu, 18 Oct 2001 23:31:55 +0000 (23:31 +0000)
15 files changed:
GNUS-NEWS
lisp/ChangeLog
lisp/gnus-spec.el
lisp/gnus-sum.el
lisp/gnus-util.el
lisp/message.el
lisp/nnbabyl.el
lisp/nndiary.el
lisp/nnfolder.el
lisp/nnimap.el
lisp/nnmbox.el
lisp/nnml.el
texi/ChangeLog
texi/gnus-ja.texi
texi/gnus.texi

index bfb5e60..9aca31f 100644 (file)
--- a/GNUS-NEWS
+++ b/GNUS-NEWS
@@ -8,6 +8,15 @@ For older news, see Gnus info node "New Features".
 \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
index 10acb92..e58570e 100644 (file)
@@ -1,7 +1,55 @@
+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>.
index 966cf60..bbab0bc 100644 (file)
        (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))
@@ -480,7 +480,7 @@ characters when given a pad value."
   (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)
@@ -492,7 +492,8 @@ characters when given a pad value."
              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.
@@ -533,10 +534,18 @@ characters when given a pad value."
              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))
 
@@ -554,12 +563,15 @@ characters when given a pad value."
           (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))
@@ -596,7 +608,7 @@ characters when given a pad value."
     (setq
      result
      (cond
-      ;; Emptyness.
+      ;; Emptiness.
       ((string= fstring "")
        nil)
       ;; Not a format string.
index 82613a0..e8ad47d 100644 (file)
@@ -1130,7 +1130,9 @@ that were fetched.  Say, for nnultimate groups."
        ?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).")
@@ -2078,7 +2080,7 @@ increase the score of each group you read."
        ["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]
@@ -5156,6 +5158,7 @@ The resulting hash table is returned, or nil if no Xrefs were found."
             (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)
@@ -6926,7 +6929,7 @@ articles that are younger than AGE days."
   "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)
@@ -8357,10 +8360,9 @@ re-spool using this method."
   (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)
index fdf0c08..f22a062 100644 (file)
       (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 ()
index d6f446c..8522623 100644 (file)
@@ -3495,12 +3495,23 @@ This sub function is for exclusive use of `message-send-news'."
                     (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)))
index 6e4f883..e8add07 100644 (file)
@@ -297,7 +297,8 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
                                             (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))
index 309365e..4616805 100644 (file)
 
 ;; 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 ===========================================
@@ -371,7 +372,6 @@ all.  This may very well take some time.")
   (interactive)
   (message "NNDiary version %s" nndiary-version))
 
-
 (defvoo nndiary-nov-file-name ".overview")
 
 (defvoo nndiary-current-directory nil)
@@ -479,6 +479,19 @@ all.  This may very well take some time.")
   ;; 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 =====================================================
 
@@ -691,7 +704,8 @@ all.  This may very well take some time.")
              (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)
@@ -1337,20 +1351,6 @@ all.  This may very well take some time.")
       (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)
index 28b0f4f..7f5d10d 100644 (file)
@@ -431,7 +431,8 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
                                          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)
@@ -1229,7 +1230,7 @@ This command does not work if you use short group names."
     (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)))
index b1d9167..ae1d5e7 100644 (file)
@@ -866,7 +866,7 @@ function is generally only called when Gnus is shutting down."
        (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))
@@ -1154,7 +1154,10 @@ function is generally only called when Gnus is shutting down."
        (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)
index d20ae3d..a20777f 100644 (file)
@@ -284,7 +284,8 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
                                            (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))
index 5cae12c..3740e16 100644 (file)
@@ -90,8 +90,8 @@ marks file will be regenerated properly by Gnus.
 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.")
@@ -339,7 +339,9 @@ 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 ()
@@ -914,7 +916,7 @@ Use the nov database for that directory if available."
 (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
index 8e8c8db..ee2e88d 100644 (file)
@@ -1,3 +1,16 @@
+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.
index 2035399..15961c1 100644 (file)
@@ -4226,7 +4226,7 @@ Gnus \e$B$OJQ?t\e(B @code{gnus-extract-address-components} \e$B$NCM$r\e(B @code{From
 
 \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
@@ -4314,6 +4314,9 @@ Gnus \e$B$OJQ?t\e(B @code{gnus-extract-address-components} \e$B$NCM$r\e(B @code{From
 \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
@@ -4323,6 +4326,10 @@ Gnus \e$B$OJQ?t\e(B @code{gnus-extract-address-components} \e$B$NCM$r\e(B @code{From
 \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
@@ -9784,7 +9791,8 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\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
@@ -9797,11 +9805,14 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\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
 
@@ -17784,6 +17795,9 @@ Gnus \e$B$O$"$J$?<+?H$N=qK!;EMM;XDj$r:n$k<jEA$$$r$9$kL?Na$rHw$($F$$$^$9!#\e(B
 \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
 
@@ -17876,6 +17890,9 @@ Emacs \e$B$,\e(B @samp{%b} \e$B$r<u$1<h$k$H!"\e(BEmacs \e$B$N%b!<%I9TI=<($NItJ,$,$=$l
 \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
index 0c3ae50..aac3b0c 100644 (file)
@@ -4178,7 +4178,8 @@ possible to change this.  Just write a new function
 
 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
@@ -4268,6 +4269,9 @@ article has any children.
 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
@@ -4277,6 +4281,10 @@ argument.  The function should return a string, which will be inserted
 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''
@@ -10295,7 +10303,8 @@ determined by the @code{gnus-message-archive-group} variable.
 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
@@ -10307,11 +10316,14 @@ has the default value shown above.  Then setting
 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
 
@@ -18173,6 +18185,8 @@ particularly wide values.  For that you can say @samp{%4,6y}, which
 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
@@ -18275,6 +18289,9 @@ be inserted into the buffer just like information from any other
 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