+2000-08-13 18:53:08 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-topic.el (gnus-topic-select-group): Touch the dribble
+ buffer.
+ (gnus-topic-hide-topic): Take a PERMANENT parameter.
+ (gnus-topic-show-topic): Ditto.
+
+ * gnus-dup.el (gnus-dup-suppress-articles): Do auto-expiry.
+
+2000-08-12 21:48:00 John H. Palmieri <palmieri@math.washington.edu>
+
+ * mail-source.el (mail-source-incoming-file-prefix): New
+ variable.
+
+2000-08-12 20:29:53 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-start.el (gnus-check-first-time-used): Clean up a bit.
+
+ * mailcap.el (mailcap-maybe-eval): Be even more warning.
+
+2000-08-11 Florian Weimer <fw@deneb.enyo.de>
+
+ * message.el (message-syntax-checks): New check quotin-style:
+ Text must be written below quoted text.
+ (message-check-news-body-syntax): Check it.
+
+2000-08-11 Simon Josefsson <simon@josefsson.org>
+
+ * imap.el (imap-authenticator-alist): Fix typo.
+ (imap-gssapi-open): Copy krb4 fixes for modern imtest's, thanks to
+ Jonas Oberg for debugging.
+
+2000-08-11 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-async.el (gnus-asynchronous): Disable by default.
+
+2000-08-10 20:22:09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-view.el (mm-inline-text): Bind fill-column.
+
+ * nnvirtual.el (nnvirtual-request-expire-articles): Return the
+ list of unexpired articles.
+
+ * gnus-group.el (gnus-group-expire-articles-1): Return the list of
+ un-expired articles.
+
+ * gnus-sum.el (gnus-summary-reparent-thread): Narrow to the
+ headers.
+
+ * gnus-topic.el (gnus-topic-kill-group): Move up one line so that
+ we update the right topic..
+
+ * mm-decode.el (mm-display-external): Put point at start.
+
+2000-08-10 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * nnmail.el (nnmail-expiry-target): More explicit documentation.
+
+ * gnus-cus.el (gnus-group-parameters): Add parameter `expiry-wait'.
+
+2000-08-09 Simon Josefsson <simon@josefsson.org>
+
+ * imap.el (imap-parse-body):
+ (imap-parse-string-list): Add bug workarounds for Stalker
+ Communigate Pro 3.0 server.
+ (imap-body-lines): Remove bogus comment.
+
+ * imap.el (imap-range-to-message-set): Move from nnimap.el.
+
+ * nnimap.el (nnimap-retrieve-which-headers):
+ (nnimap-retrieve-headers-from-server):
+ (nnimap-request-set-mark):
+ (nnimap-request-expire-articles): Use `i-r-t-m-set' instead.
+
2000-08-08 00:53:41 ShengHuo ZHU <zsh@cs.rochester.edu>
* message.el (message-dont-reply-to-names):
"Support for asynchronous operations."
:group 'gnus)
-(defcustom gnus-asynchronous t
+(defcustom gnus-asynchronous nil
"*If nil, inhibit all Gnus asynchronicity.
If non-nil, let the other asynch variables be heeded."
:group 'gnus-asynchronous
days (not necessarily an integer) or the symbols `never' or
`immediate'.")
+ (expiry-target (choice :tag "Expiry Target"
+ :value delete
+ (const delete)
+ (function :format "%v" nnmail-)
+ string) "\
+Where expired messages end up.
+
+Overrides `nnmail-expiry-target', which see.")
+
(score-file (file :tag "Score File") "\
Make the specified file into the current score file.
This means that all score commands you issue will end up in this file.")
(gnus-dup-open))
(gnus-message 6 "Suppressing duplicates...")
(let ((headers gnus-newsgroup-headers)
+ (auto (and gnus-newsgroup-auto-expire
+ (memq gnus-duplicate-mark gnus-auto-expirable-marks)))
number header)
(while (setq header (pop headers))
(when (and (intern-soft (mail-header-id header) gnus-dup-hashtb)
(setq gnus-newsgroup-unreads
(delq (setq number (mail-header-number header))
gnus-newsgroup-unreads))
- (push (cons number gnus-duplicate-mark)
- gnus-newsgroup-reads))))
+ (if (not auto)
+ (push (cons number gnus-duplicate-mark) gnus-newsgroup-reads)
+ (push number gnus-newsgroup-expirable)
+ (push (cons number gnus-expirable-mark) gnus-newsgroup-reads)))))
(gnus-message 6 "Suppressing duplicates...done"))
(defun gnus-dup-unsuppress-article (article)
(gnus-request-expire-articles
(gnus-uncompress-sequence (cdr expirable)) group))))
(gnus-close-group group))
- (gnus-message 6 "Expiring articles in %s...done" group))))
+ (gnus-message 6 "Expiring articles in %s...done" group)
+ ;; Return the list of un-expired articles.
+ (cdr expirable))))
(defun gnus-group-expire-all-groups ()
"Expire all expirable articles in all newsgroups."
(defun gnus-add-marked-articles (group type articles &optional info force)
;; Add ARTICLES of TYPE to the info of GROUP.
- ;; If INFO is non-nil, use that info. If FORCE is non-nil, don't
+ ;; If INFO is non-nil, use that info. If FORCE is non-nil, don't
;; add, but replace marked articles of TYPE with ARTICLES.
(let ((info (or info (gnus-get-info group)))
marked m)
mailcap-maybe-eval-warning))
(goto-char (point-min))
(display-buffer buffer)
- (yes-or-no-p "This is emacs-lisp code, evaluate it? "))
+ (yes-or-no-p "This is potentially dangerous emacs-lisp code, evaluate it? "))
(kill-buffer buffer))))
(eval-buffer (current-buffer)))
(when (buffer-live-p lisp-buffer)
(defun gnus-check-first-time-used ()
(catch 'ended
- (let ((files (list gnus-current-startup-file
- (concat gnus-current-startup-file ".el")
- (concat gnus-current-startup-file ".eld")
- gnus-startup-file
- (concat gnus-startup-file ".el")
- (concat gnus-startup-file ".eld"))))
- (while files
- (when (file-exists-p (pop files))
- (throw 'ended nil))))
+ ;; First check if any of the following files exist. If they do,
+ ;; it's not the first time the user has used Gnus.
+ (dolist (file (list gnus-current-startup-file
+ (concat gnus-current-startup-file ".el")
+ (concat gnus-current-startup-file ".eld")
+ gnus-startup-file
+ (concat gnus-startup-file ".el")
+ (concat gnus-startup-file ".eld")))
+ (when (file-exists-p file)
+ (throw 'ended nil)))
(gnus-message 6 "First time user; subscribing you to default groups")
(unless (gnus-read-active-file-p)
(let ((gnus-read-active-file t))
(gnus-read-active-file)))
(setq gnus-newsrc-last-checked-date (current-time-string))
- (let ((groups gnus-default-subscribed-newsgroups)
+ ;; Subscribe to the default newsgroups.
+ (let ((groups (or gnus-default-subscribed-newsgroups
+ gnus-backup-default-subscribed-newsgroups))
group)
- (if (eq groups t)
- nil
- (setq groups (or groups gnus-backup-default-subscribed-newsgroups))
+ (when (eq groups t)
+ ;; If t, we subscribe (or not) all groups as if they were new.
(mapatoms
(lambda (sym)
- (if (null (setq group (symbol-name sym)))
- ()
+ (when (setq group (symbol-name sym))
(let ((do-sub (gnus-matches-options-n group)))
(cond
((eq do-sub 'subscribe)
(t
(push group gnus-killed-list))))))
gnus-active-hashtb)
- (while groups
- (when (gnus-active (car groups))
+ (dolist (group groups)
+ ;; Only subscribe the default groups that are activated.
+ (when (gnus-active group)
(gnus-group-change-level
- (car groups) gnus-level-default-subscribed gnus-level-killed))
- (setq groups (cdr groups)))
+ group gnus-level-default-subscribed gnus-level-killed)))
(save-excursion
(set-buffer gnus-group-buffer)
(gnus-group-make-help-group))
(when gnus-novice-user
(gnus-message 7 "`A k' to list killed groups"))))))
-
(defun gnus-subscribe-group (group &optional previous method)
"Subcribe GROUP and put it after PREVIOUS."
(gnus-group-change-level
(unless (and message-id (not (equal message-id "")))
(error "No message-id in desired parent"))
(gnus-with-article current-article
- (goto-char (point-min))
- (if (re-search-forward "^References: " nil t)
- (progn
- (re-search-forward "^[^ \t]" nil t)
- (forward-line -1)
- (end-of-line)
- (insert " " message-id))
- (insert "References: " message-id "\n")))
+ (save-restriction
+ (goto-char (point-min))
+ (message-narrow-to-head)
+ (if (re-search-forward "^References: " nil t)
+ (progn
+ (re-search-forward "^[^ \t]" nil t)
+ (forward-line -1)
+ (end-of-line)
+ (insert " " message-id))
+ (insert "References: " message-id "\n"))))
(set-buffer gnus-summary-buffer)
(gnus-summary-unmark-all-processable)
(gnus-summary-update-article current-article)
(if (gnus-group-topic-p)
(let ((gnus-group-list-mode
(if all (cons (if (numberp all) all 7) t) gnus-group-list-mode)))
- (gnus-topic-fold all))
+ (gnus-topic-fold all)
+ (gnus-dribble-touch))
(gnus-group-select-group all)))
(defun gnus-mouse-pick-topic (e)
(gnus-topic-find-topology topic nil nil gnus-topic-topology)
(gnus-topic-enter-dribble))
(gnus-group-kill-group n discard)
- (gnus-topic-update-topic)))
+ (if (not (gnus-group-topic-p))
+ (gnus-topic-update-topic)
+ ;; Move up one line so that we update the right topic.
+ (forward-line -1)
+ (gnus-topic-update-topic)
+ (forward-line 1))))
(defun gnus-topic-yank-group (&optional arg)
"Yank the last topic."
(setq alist (cdr alist))))))
(gnus-topic-update-topic)))
-(defun gnus-topic-hide-topic ()
- "Hide the current topic."
- (interactive)
+(defun gnus-topic-hide-topic (&optional permanent)
+ "Hide the current topic.
+If PERMANENT, make it stay hidden in subsequent sessions as well."
+ (interactive "P")
(when (gnus-current-topic)
(gnus-topic-goto-topic (gnus-current-topic))
+ (setcar (cddr (assoc (gnus-current-topic) gnus-topic-topology)) 'hidden)
(gnus-topic-remove-topic nil nil)))
-(defun gnus-topic-show-topic ()
- "Show the hidden topic."
- (interactive)
+(defun gnus-topic-show-topic (&optional permanent)
+ "Show the hidden topic.
+If PERMANENT, make it stay shown in subsequent sessions as well."
+ (interactive "P")
(when (gnus-group-topic-p)
+ (setcar (cddr (assoc (gnus-current-topic) gnus-topic-topology)) nil)
(gnus-topic-remove-topic t nil)))
(defun gnus-topic-mark-topic (topic &optional unmark)
"Priority of authenticators to consider when authenticating to server.")
(defvar imap-authenticator-alist
- '((gssapi imap-gssapi-auth-p imap-gssapia-auth)
+ '((gssapi imap-gssapi-auth-p imap-gssapi-auth)
(kerberos4 imap-kerberos4-auth-p imap-kerberos4-auth)
(cram-md5 imap-cram-md5-p imap-cram-md5-auth)
(login imap-login-p imap-login-auth)
(setq imap-client-eol "\n")
(while (and (memq (process-status process) '(open run))
(goto-char (point-min))
+ ;; cyrus 1.6.x (13? < x <= 22) queries capabilities
+ (or (while (looking-at "^C:")
+ (forward-line))
+ t)
;; cyrus 1.6 imtest print "S: " before server greeting
(or (not (looking-at "S: "))
(forward-char 3)
(list list))
","))
+(defun imap-range-to-message-set (range)
+ (mapconcat
+ (lambda (item)
+ (if (consp item)
+ (format "%d:%d"
+ (car item) (cdr item))
+ (format "%d" item)))
+ (if (and (listp range) (not (listp (cdr range))))
+ (list range) ;; make (1 . 2) into ((1 . 2))
+ range)
+ ","))
+
(defun imap-fetch-asynch (uids props &optional nouidfetch buffer)
(with-current-buffer (or buffer (current-buffer))
(imap-send-command (format "%sFETCH %s %s" (if nouidfetch "" "UID ")
"Return number of lines in article by looking at the mime bodystructure BODY."
(if (listp body)
(if (stringp (car body))
- ;; upcase for bug in courier imap server
(cond ((and (string= (upcase (car body)) "TEXT")
(numberp (nth 7 body)))
(nth 7 body))
(imap-forward)
(while (setq str (imap-parse-string))
(push str strlist)
- (imap-forward))
+ ;; buggy stalker communigate pro 3.0 doesn't print SPC
+ ;; between body-fld-param's sometimes
+ (or (eq (char-after) ?\")
+ (imap-forward)))
(nreverse strlist)))
((imap-parse-nil)
nil)))
(let (subbody)
(while (and (eq (char-after) ?\()
(setq subbody (imap-parse-body)))
+ ;; buggy stalker communigate pro 3.0 insert a SPC between
+ ;; parts in multiparts
+ (when (and (eq (char-after) ?\ )
+ (eq (char-after (1+ (point))) ?\())
+ (imap-forward))
(push subbody body))
(imap-forward)
(push (imap-parse-string) body);; media-subtype
(push (imap-parse-envelope) body);; envelope
(imap-forward)
(push (imap-parse-body) body);; body
- (imap-forward)
- (push (imap-parse-number) body));; body-fld-lines
- ((setq lines (imap-parse-number));; body-type-text:
- (push lines body));; body-fld-lines
+ ;; buggy stalker communigate pro 3.0 doesn't print
+ ;; number of lines in message/rfc822 attachment
+ (if (eq (char-after) ?\))
+ (push 0 body)
+ (imap-forward)
+ (push (imap-parse-number) body))) ;; body-fld-lines
+ ((setq lines (imap-parse-number)) ;; body-type-text:
+ (push lines body)) ;; body-fld-lines
(t
- (backward-char)))));; no match...
+ (backward-char))))) ;; no match...
;; ...and then parse the third one here...
:group 'mail-source
:type 'boolean)
+(defcustom mail-source-incoming-file-prefix "Incoming"
+ "Prefix for file name for storing incoming mail"
+ :group 'mail-source
+ :type 'string)
+
(defcustom mail-source-report-new-mail-interval 5
"Interval in minutes between checks for new mail."
:group 'mail-source
(let ((incoming
(mail-source-make-complex-temp-name
(expand-file-name
- "Incoming" mail-source-directory))))
+ mail-source-incoming-file-prefix
+ mail-source-directory))))
(unless (file-exists-p (file-name-directory incoming))
(make-directory (file-name-directory incoming) t))
(rename-file mail-source-crash-box incoming t)))))))
Don't touch this variable unless you really know what you're doing.
Checks include subject-cmsg multiple-headers sendsys message-id from
-long-lines control-chars size new-text redirected-followup signature
-approved sender empty empty-headers message-id from subject
-shorten-followup-to existing-newsgroups buffer-file-name unchanged
-newsgroups."
+long-lines control-chars size new-text quoting-style
+redirected-followup signature approved sender empty empty-headers
+message-id from subject shorten-followup-to existing-newsgroups
+buffer-file-name unchanged newsgroups."
:group 'message-news
:type '(repeat sexp))
(message-check 'signature
(goto-char (point-max))
(if (> (count-lines (point) (point-max)) 5)
- (y-or-n-p
- (format
- "Your .sig is %d lines; it should be max 4. Really post? "
- (1- (count-lines (point) (point-max)))))
- t))))
+ (y-or-n-p
+ (format
+ "Your .sig is %d lines; it should be max 4. Really post? "
+ (1- (count-lines (point) (point-max)))))
+ t))
+ ;; Ensure that text follows last quoted portion.
+ (message-check 'quoting-style
+ (goto-char (point-max))
+ (let ((no-problem t))
+ (when (search-backward-regexp "^>[^\n]*\n>" nil t)
+ (setq no-problem nil)
+ (while (not (eobp))
+ (when (and (not (eolp)) (looking-at "[^> \t]"))
+ (setq no-problem t))
+ (forward-line)))
+ (if no-problem
+ t
+ (y-or-n-p "Your text should follow quoted text. Really post? "))))))
(defun message-check-mail-syntax ()
"Check the syntax of the message."
(buffer-disable-undo)
(mm-set-buffer-file-coding-system mm-binary-coding-system)
(insert-buffer-substring cur)
+ (goto-char (point-min))
(message "Viewing with %s" method)
(let ((mm (current-buffer))
(non-viewer (assq 'non-viewer
(save-window-excursion
(save-restriction
(let ((w3-strict-width width)
+ ;; Don't let w3 set the global version of
+ ;; this variable.
+ (fill-column fill-column)
(url-standalone-mode t))
(condition-case var
(w3-region (point-min) (point-max))
(if (numberp (car-safe articles))
(imap-search
(concat "UID "
- (nnimap-range-to-string
+ (imap-range-to-message-set
(gnus-compress-sequence
(append (gnus-uncompress-sequence
(and fetch-old
(let ((imap-fetch-data-hook '(nnimap-retrieve-headers-progress))
(nnimap-length (gnus-range-length articles))
(nnimap-counter 0))
- (imap-fetch (nnimap-range-to-string articles)
+ (imap-fetch (imap-range-to-message-set articles)
(concat "(UID RFC822.SIZE BODY "
(let ((headers
(append '(Subject From Date Message-Id
(when (and range marks)
(cond ((eq what 'del)
(imap-message-flags-del
- (nnimap-range-to-string range)
+ (imap-range-to-message-set range)
(nnimap-mark-to-flag marks nil t)))
((eq what 'add)
(imap-message-flags-add
- (nnimap-range-to-string range)
+ (imap-range-to-message-set range)
(nnimap-mark-to-flag marks nil t)))
((eq what 'set)
(imap-message-flags-set
- (nnimap-range-to-string range)
+ (imap-range-to-message-set range)
(nnimap-mark-to-flag marks nil t)))))))
(gnus-message 7 "nnimap: Setting marks in %s...done" group))))
nil)
(with-current-buffer nnimap-server-buffer
(if force
(and (imap-message-flags-add
- (nnimap-range-to-string artseq) "\\Deleted")
+ (imap-range-to-message-set artseq) "\\Deleted")
(setq articles nil))
(let ((days (or (and nnmail-expiry-wait-function
(funcall nnmail-expiry-wait-function group))
nnmail-expiry-wait)))
(cond ((eq days 'immediate)
(and (imap-message-flags-add
- (nnimap-range-to-string artseq) "\\Deleted")
+ (imap-range-to-message-set artseq) "\\Deleted")
(setq articles nil)))
((numberp days)
(let ((oldarts (imap-search
(format "UID %s NOT SINCE %s"
- (nnimap-range-to-string artseq)
+ (imap-range-to-message-set artseq)
(nnimap-date-days-ago days))))
(imap-fetch-data-hook
'(nnimap-request-expire-articles-progress)))
(and oldarts
(imap-message-flags-add
- (nnimap-range-to-string
+ (imap-range-to-message-set
(gnus-compress-sequence oldarts))
"\\Deleted")
(setq articles (gnus-set-difference
(cons (cons key value) (nnimap-remassoc key alist))
(nnimap-remassoc key alist)))
-(defun nnimap-range-to-string (range)
- (mapconcat
- (lambda (item)
- (if (consp item)
- (format "%d:%d"
- (car item) (cdr item))
- (format "%d" item)))
- (if (and (listp range) (not (listp (cdr range))))
- (list range);; make (1 . 2) into ((1 . 2))
- range)
- ","))
-
(when nnimap-debug
(require 'trace)
(buffer-disable-undo (get-buffer-create nnimap-debug))
nnimap-mark-permanent-p
nnimap-remassoc
nnimap-update-alist-soft
- nnimap-range-to-string
)))
(provide 'nnimap)
(function :format "%v" nnmail-)))
(defcustom nnmail-expiry-target 'delete
- "*Variable that says where expired messages should end up."
+ "*Variable that says where expired messages should end up.
+The default value is `delete' (which says to delete the messages),
+but it can also be a string or a function. If it is a string, expired
+messages end up in that group. If it is a function, the function is
+called in a buffer narrowed to the message in question. The function
+receives one argument, the name of the group the message comes from.
+The return value should be `delete' or a group name (a string)."
:group 'nnmail-expire
:type '(choice (const delete)
(function :format "%v" nnmail-)
(nnvirtual-possibly-change-server server)
(setq nnvirtual-component-groups
(delete (nnvirtual-current-group) nnvirtual-component-groups))
- (dolist (group nnvirtual-component-groups)
- (gnus-group-expire-articles-1 group)))
+ (let (unexpired)
+ (dolist (group nnvirtual-component-groups)
+ (setq unexpired (nconc unexpired
+ (mapcar
+ #'(lambda (article)
+ (nnvirtual-reverse-map-article
+ group article))
+ (gnus-group-expire-articles-1 group)))))
+ (sort unexpired '<)))
\f
;;; Internal functions.
+2000-08-13 20:00:35 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus.texi (Topic Commands): Fix typo.
+
+2000-08-13 20:20:56 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Topic Commands): Addition.
+
+2000-08-11 Kai Grossjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * gnus.texi (Expiring Mail): Extend documentation of variable
+ `nnmail-expiry-target' and of group parameter `expiry-target'.
+ Explain interaction between these. Add Lisp example for setting
+ `nnmail-expiry-target'.
+
+2000-05-07 Pavel Janik <Pavel.Janik@inet.cz>
+
+ * gnus.texi: direntry added.
+
+ * message.texi: direntry added.
+
+ * emacs-mime.texi: direntry added.
+
2000-08-04 Andreas Oeldenberger <andreas.oeldenberger@gmx.net>
* message.texi (Forwarding): Fix.
* gnus.texi (Mail Source Specifiers): Update maildir.
+2000-05-07 Pavel Janik <Pavel.Janik@inet.cz>
+
+ * gnus.texi: direntry added.
+
+ * message.texi: direntry added.
+
+ * emacs-mime.texi: direntry added.
+
2000-05-02 Pavel Janik <Pavel.Janik@inet.cz>
* gnus.texi (MIME comands): Spelling fix.
rm -f gnus.*.bak *.ky *.cp *.fn *.cps *.kys *.log *.aux *.dvi *.vr \
*.pdf *.tp *.toc *.pg gnus.latexi *.aux *.[cgk]idx \
gnus.ilg gnus.ind gnus.[cgk]ind gnus.idx \
- gnus.tmptexi *.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej \
+ gnustmp.texi *.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej \
gnus.latexi*~* tmp/*.ps xface.tex picons.tex smiley.tex *.latexi \
gnus.info* gnus-ja.info* message.info* message-ja.info* \
emacs-mime.info
@synindex fn cp
@synindex vr cp
@synindex pg cp
-@c @direntry
-@c * Emacs MIME: (emacs-mime). The MIME de/composition library.
-@c @end direntry
+@dircategory Editors
+@direntry
+* Emacs MIME: (emacs-mime). The MIME de/composition library.
+@end direntry
@iftex
@finalout
@end iftex
@synindex fn cp
@synindex vr cp
@synindex pg cp
-@c @direntry
-@c * Gnus-ja: (gnus-ja). The news reader gnus (\e$BF|K\8lHG\e(B).
-@c @end direntry
+@dircategory Editors
+@direntry
+* Gnus-ja: (gnus-ja). The newsreader gnus (\e$BF|K\8lHG\e(B).
+@end direntry
@iftex
@finalout
@end iftex
(@code{gnus-topic-copy-group})\e$B!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&%W\e(B
\e$B%l%U%#%C%/%9%k!<%k$K=>$$$^$9\e(B (@pxref{Process/Prefix})\e$B!#\e(B
+@item T h
+@kindex T h (Topic)
+@findex gnus-topic-hide-topic
+\e$B8=:_$N%H%T%C%/$r1#$7$^$9!#$b$7%W%l%U%#%C%/%9$,M?$($i$l$?$J$i!"$=$N%H%T%C\e(B
+\e$B%/$r1J5W$K1#$7$^$9!#\e(B
+
+@item T s
+@kindex T s (Topic)
+@findex gnus-topic-show-topic
+\e$B8=:_$N%H%T%C%/$rI=<($7$^$9!#$b$7%W%l%U%#%C%/%9$,M?$($i$l$?$J$i!"$=$N%H%T%C\e(B
+\e$B%/$r1J5W$KI=<($7$^$9!#\e(B
+
@item T D
@kindex T D (Topic)
@findex gnus-topic-remove-group
@vindex nnmail-expiry-target
\e$B5-;v$N4|8B@Z$l>C5n$NIaDL$NF0:n$O$=$l$i$r>C5n$9$k$3$H$G$9!#$7$+$7!">l9g$K\e(B
\e$B$h$C$F$O$=$l$i$r>C5n$9$k$h$j$bJL$N%0%k!<%W$K0\F0$7$?J}$,M-0U5A$+$b$7$l$^\e(B
-\e$B$;$s!#\e(B@code{nnmail-expiry-target} (\e$B$H%0%k!<%W%Q%i%a!<%?\e(B
-@code{expiry-target}) \e$B$O$3$l$r@)8f$7$^$9!#%G%#%U%)%k%H$NCM$O\e(B
+\e$B$;$s!#JQ?t\e(B @code{nnmail-expiry-target} (\e$B$H%0%k!<%W%Q%i%a!<%?\e(B
+@code{expiry-target}) \e$B$O$3$l$r@)8f$7$^$9!#$3$NJQ?t$NCM$O$9$Y$F$N%0%k!<%W\e(B
+\e$B$KBP$9$k%G%#%U%)%k%H$K$J$j$^$9$,!"FCDj$N%0%k!<%W$4$H$K%0%k!<%W%Q%i%a!<%?\e(B
+\e$B$r;H$C$F;XDj$9$l$P>e=q$-$9$k$3$H$,$G$-$^$9!#%G%#%U%)%k%H$NCM$O\e(B
@code{delete} \e$B$G$9$,!"J8;zNs\e(B (\e$B5-;v$r0\F0$9$k@h$N%0%k!<%WL>\e(B) \e$B$^$?$O0\F0@h\e(B
\e$B$N%0%k!<%WL>$+\e(B @code{delete} \e$B$rJV$94X?t\e(B (\e$B5-;v$KHO0O$r69$a$?%P%C%U%!$G!"\e(B
\e$B$=$N5-;v$,B8:_$7$F$$$k%0%k!<%WL>$,0z?t$H$7$FM?$($i$l$^$9\e(B) \e$B$K$9$k$3$H$,$G\e(B
\e$B$-$^$9!#\e(B
+\e$B%0%k!<%WL>$r;XDj$9$k>l9g$NNc\e(B:
+@lisp
+(setq nnmail-expiry-target "nnml:expired")
+@end lisp
+
+
@vindex nnmail-keep-last-article
@code{nnmail-keep-last-article} \e$B$,\e(B @code{nil} \e$B$G$J$$$H!"\e(Bgnus \e$B$O%a!<%k%K%e!<\e(B
\e$B%9%0%k!<%W$N:G8e$N5-;v$r7h$7$F4|8B@Z$l>C5n$7$^$;$s!#$3$l$O\e(B procmail \e$B$NMx\e(B
@end lisp
@item
+Be able to run `J u' from summary buffers.
+
+@item
Solve the halting problem.
@c TODO
@synindex fn cp
@synindex vr cp
@synindex pg cp
-@c @direntry
-@c * Gnus: (gnus). The newsreader Gnus.
-@c @end direntry
+@dircategory Editors
+@direntry
+* Gnus: (gnus). The newsreader Gnus.
+@end direntry
@iftex
@finalout
@end iftex
(@code{gnus-topic-copy-group}). This command uses the process/prefix
convention (@pxref{Process/Prefix}).
+@item T h
+@kindex T h (Topic)
+@findex gnus-topic-hide-topic
+Hide the current topic (@code{gnus-topic-hide-topic}). If given
+a prefix, hide the topic permanently.
+
+@item T s
+@kindex T s (Topic)
+@findex gnus-topic-show-topic
+Show the current topic (@code{gnus-topic-show-topic}). If given
+a prefix, show the topic permanently.
+
@item T D
@kindex T D (Topic)
@findex gnus-topic-remove-group
@node MIME Commands
@section @sc{mime} Commands
@cindex MIME decoding
+@cindex attachments
+@cindex viewing attachments
The following commands all understand the numerical prefix. For
instance, @kbd{3 b} means ``view the third @sc{mime} part''.
@vindex nnmail-expiry-target
The normal action taken when expiring articles is to delete them.
However, in some circumstances it might make more sense to move them to
-other groups instead of deleting them. The @code{nnmail-expiry-target}
+other groups instead of deleting them. The variable @code{nnmail-expiry-target}
(and the @code{expiry-target} group parameter) controls this. The
+variable supplies a default value for all groups, which can be
+overridden for specific groups by the group parameter.
default value is @code{delete}, but this can also be a string (which
should be the name of the group the message should be moved to), or a
function (which will be called in a buffer narrowed to the message in
question, and with the name of the group being moved from as its
parameter) which should return a target -- either a group name or
-@code{delete}.
+@code{delete}.
+
+Here's an example for specifying a group name:
+@lisp
+(setq nnmail-expiry-target "nnml:expired")
+@end lisp
+
@vindex nnmail-keep-last-article
If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
@end lisp
@item
+Be able to run `J u' from summary buffers.
+
+@item
Solve the halting problem.
@c TODO
@synindex fn cp
@synindex vr cp
@synindex pg cp
-@c @direntry
-@c * Message: (message). Mail and news composition mode that goes with Gnus.
-@c @end direntry
+@dircategory Editors
+@direntry
+* Message: (message). Mail and news composition mode that goes with Gnus.
+@end direntry
@iftex
@finalout
@end iftex
@kindex C-c C-e
@findex message-elide-region
\e$B%]%$%s%H$H%^!<%/$N4V$NJ8$r>J$-$^$9\e(B (@code{message-elide-region})\e$B!#J8>O$O\e(B
-\e$B@Z$i$l$F\e(B (killed) \e$B>JN,Id9f\e(B (@samp{[...]} \e$B$,$=$N>l=j$KA^F~$5$l$^$9!#\e(B
+\e$B@Z$i$l$F\e(B (killed) \e$BJQ?t\e(B @code{message-elide-ellipsis} \e$B$NCM$GCV$-49$($i$l\e(B
+\e$B$^$9!#%G%#%U%)%k%H$N>JN,Id9f$H$7$F;H$o$l$kCM$O\e(B (@samp{[...]}) \e$B$G$9!#\e(B
@item C-c C-z
@kindex C-c C-x
@synindex fn cp
@synindex vr cp
@synindex pg cp
-@c @direntry
-@c * Message: (message). Mail and news composition mode that goes with Gnus.
-@c @end direntry
+@dircategory Editors
+@direntry
+* Message: (message). Mail and news composition mode that goes with Gnus.
+@end direntry
@iftex
@finalout
@end iftex
@kindex C-c C-e
@findex message-elide-region
Elide the text between point and mark (@code{message-elide-region}).
-The text is killed and an ellipsis (@samp{[...]}) will be inserted in
-its place.
+The text is killed and replaced with the contents of the variable
+@code{message-elide-ellipsis}. The default value is to use an ellipsis
+(@samp{[...]}).
@item C-c C-z
@kindex C-c C-x