\f
* Changes in Oort Gnus
+** Menu bar: "Misc" -> "Gnus".
+
** gnus-group-charset-alist and gnus-group-ignored-charsets-alist
The regexps in these variables are compared with full group names
+2001-08-04 Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com>
+ Committed by ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-show-article): Call
+ gnus-summary-update-secondary-secondary-mark.
+ * gnus-sum.el (gnus-summary-edit-article-done): Ditto.
+ * gnus-sum.el (gnus-summary-reparent-thread): Ditto.
+
+2001-08-07 16:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-make-menu-bar): Misc -> Gnus.
+
+ * gnus-group.el (gnus-group-make-menu-bar): Ditto.
+
+ * mm-uu.el (mm-uu-dissect): Autoload. From Gerd M\e,Av\e(Bllmann
+ <gerd@gnu.org>.
+
+ * gnus-art.el (gnus-output-to-file): Bind file-name-coding-system.
+
+ * gnus-util.el (gnus-output-to-rmail): Ditto.
+ (gnus-output-to-mail): Ditto.
+
+ * nnmail.el (nnmail-pathname-coding-system): Set default to nil.
+
+2001-08-06 Florian Weimer <fw@deneb.enyo.de>
+
+ * message.el (message-indent-citation): Use
+ `message-yank-cited-prefix' for empty lines.
+
+2001-08-05 Florian Weimer <fw@deneb.enyo.de>
+
+ * message.el (message-indent-citation): Quote only lines starting
+ with ">" using `message-yank-cited-prefix'.
+
+2001-08-05 Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com>
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Use
+ gnus-cache-fully-p.
+
+2001-08-04 Simon Josefsson <jas@extundo.com>
+
+ * gnus-cache.el (gnus-cache-possibly-update-active): Create active
+ file if it doesn't exist (by calling gnus-cache-read-active).
+
+2001-08-04 Simon Josefsson <jas@extundo.com>
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Revert.
+ (gnus-cache-passively-or-fully-p): Removed.
+ (gnus-cache-fully-p): Fix it.
+
+ * mm-view.el (mm-pkcs7-signed-magic): Support more ASN.1 lengths.
+
+2001-08-04 Simon Josefsson <jas@extundo.com>
+
+ * gnus-cache.el (gnus-cache-fully-p)
+ (gnus-cache-passively-or-fully-p): New functions.
+ (gnus-cache-possibly-enter-article): Cosmetic change, use
+ `g-c-p-o-f-p'.
+ (gnus-cache-possibly-enter-article): Use `g-c-p-u-a'; last change
+ was bogus (`g-c-p-a-a' does not change active info, just change
+ the functions parameters).
+ (gnus-cache-possibly-remove-articles-1): Make sure articles are
+ not removed in groups that match `gnus-uncacheable-groups'.
+
+ Reported and modifications based on discussions with Nuutti
+ Kotivuori <nuutti.kotivuori@smarttrust.com>.
+
+2001-08-04 Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com>
+ Committed by Simon Josefsson <jas@extundo.com>
+
+ * gnus-cache.el (gnus-cache-possibly-update-active): New function;
+ calls `gnus-cache-update-active' if bounds has been extended.
+
+2001-08-04 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-mime-security-verify-or-decrypt): Insert
+ before remove.
+ (gnus-mime-security-show-details): Ditto.
+
+2001-08-04 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * nnmail.el (nnmail-split-fancy-with-parent): Correct `mapconcat'
+ syntax. Protect string-match against nil string and regexp.
+
+2001-08-03 19:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-find-charset-region): Remove control-1.
+
+2001-08-03 17:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-readable-p): Emacs 20 takes one argument.
+
+2001-08-04 Simon Josefsson <jas@extundo.com>
+
+ * smime.el (smime-sign-region, smime-encrypt-region): Fix details
+ buffer. Delete MIME-Version header.
+
+2001-08-03 Simon Josefsson <jas@extundo.com>
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): The article
+ that is entered does not necessarily have the highest article
+ number in the group, so use `gnus-cache-possibly-alter-active'
+ instead of `gnus-cache-update-active'.
+
+2001-08-03 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * mml2015.el (mml2015-gpg-extract-signature-details): Don't barf.
+
+2001-08-03 Simon Josefsson <jas@extundo.com>
+
+ * mml.el (mml-menu): Rename from MML to Mime. Collapse Security
+ menu.
+
2001-08-02 Katsumi Yamaoka <yamaoka@jpl.org>
* gnus.el (post-method): New group parameter. It also provides
;; save it to file.
(goto-char (point-max))
(insert "\n")
- (write-region-as-binary (point-min) (point-max) file-name 'append)
+ (let ((file-name-coding-system nnmail-pathname-coding-system)
+ (pathname-coding-system nnmail-pathname-coding-system))
+ (write-region-as-binary (point-min) (point-max) file-name 'append))
t)))
(defun gnus-narrow-to-page (&optional arg)
(if (not (string-match "[:/]" address))
;; This is just a simple group url.
(gnus-group-read-ephemeral-group address gnus-select-method)
- (if (not
- (string-match
+ (if (not
+ (string-match
"^\\([^:/]+\\)\\(:\\([^/]+\\)\\)?/\\([^/]+\\)\\(/\\([0-9]+\\)\\)?"
address))
(error "Can't parse %s" address)
(defun gnus-mime-security-verify-or-decrypt (handle)
(mm-remove-parts (cdr handle))
(let ((region (mm-handle-multipart-ctl-parameter handle 'gnus-region))
- buffer-read-only)
+ point buffer-read-only)
+ (if region
+ (goto-char (car region)))
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (with-current-buffer (mm-handle-multipart-original-buffer handle)
+ (let* ((mm-verify-option 'known)
+ (mm-decrypt-option 'known)
+ (nparts (mm-possibly-verify-or-decrypt (cdr handle) handle)))
+ (unless (eq nparts (cdr handle))
+ (mm-destroy-parts (cdr handle))
+ (setcdr handle nparts))))
+ (setq point (point))
+ (gnus-mime-display-security handle)
+ (goto-char (point-max)))
(when region
- (delete-region (car region) (cdr region))
+ (delete-region (point) (cdr region))
(set-marker (car region) nil)
- (set-marker (cdr region) nil)))
- (with-current-buffer (mm-handle-multipart-original-buffer handle)
- (let* ((mm-verify-option 'known)
- (mm-decrypt-option 'known)
- (nparts (mm-possibly-verify-or-decrypt (cdr handle) handle)))
- (unless (eq nparts (cdr handle))
- (mm-destroy-parts (cdr handle))
- (setcdr handle nparts))))
- (let ((point (point))
- buffer-read-only)
- (gnus-mime-display-security handle)
+ (set-marker (cdr region) nil))
(goto-char point)))
(defun gnus-mime-security-show-details (handle)
gnus-mime-security-button-line-format)
(forward-char -1))
(forward-char)
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (gnus-insert-mime-security-button handle))
(delete-region (point)
(or (text-property-not-all
(point) (point-max)
'gnus-line-format
gnus-mime-security-button-line-format)
- (point-max)))
- (gnus-insert-mime-security-button handle))
+ (point-max))))
(if (gnus-buffer-live-p gnus-mime-security-details-buffer)
(with-current-buffer gnus-mime-security-details-buffer
(erase-buffer)
(when (and number
(> number 0) ; Reffed article.
(or force
- (and (or (not gnus-cacheable-groups)
- (string-match gnus-cacheable-groups group))
- (or (not gnus-uncacheable-groups)
- (not (string-match
- gnus-uncacheable-groups group)))
+ (and (gnus-cache-fully-p group)
(gnus-cache-member-of-class
gnus-cache-enter-articles ticked dormant unread)))
(not (file-exists-p (setq file (gnus-cache-file-name
(nnheader-insert-nov headers)
;; Update the active info.
(set-buffer gnus-summary-buffer)
- (gnus-cache-update-active group number)
+ (gnus-cache-possibly-update-active group (cons number number))
(push article gnus-newsgroup-cached)
(gnus-summary-update-secondary-mark article))
t))))))
(defun gnus-cache-possibly-remove-articles-1 ()
"Possibly remove some of the removable articles."
- (unless (eq gnus-use-cache 'passive)
+ (when (gnus-cache-fully-p gnus-newsgroup-name)
(let ((articles gnus-cache-removable-articles)
(cache-articles gnus-newsgroup-cached)
article)
;; Mark the active hashtb as unaltered.
(setq gnus-cache-active-altered nil)))
+(defun gnus-cache-possibly-update-active (group active)
+ "Update active info bounds of GROUP with ACTIVE if necessary.
+The update is performed if ACTIVE contains a higher or lower bound
+than the current."
+ (let ((lower t) (higher t))
+ (if gnus-cache-active-hashtb
+ (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb)))
+ (when cache-active
+ (unless (< (car active) (car cache-active))
+ (setq lower nil))
+ (unless (> (cdr active) (cdr cache-active))
+ (setq higher nil))))
+ (gnus-cache-read-active))
+ (when lower
+ (gnus-cache-update-active group (car active) t))
+ (when higher
+ (gnus-cache-update-active group (cdr active)))))
+
(defun gnus-cache-update-active (group number &optional low)
"Update the upper bound of the active info of GROUP to NUMBER.
If LOW, update the lower bound instead."
(interactive "FMove the cache tree to: ")
(rename-file gnus-cache-directory dir))
+(defun gnus-cache-fully-p (&optional group)
+ "Returns non-nil if the cache should be fully used.
+If GROUP is non-nil, also cater to `gnus-cacheable-groups' and
+`gnus-uncacheable-groups'."
+ (and gnus-use-cache
+ (not (eq gnus-use-cache 'passive))
+ (if (null group)
+ t
+ (and (or (not gnus-cacheable-groups)
+ (string-match gnus-cacheable-groups group))
+ (or (not gnus-uncacheable-groups)
+ (not (string-match gnus-uncacheable-groups group)))))))
+
(provide 'gnus-cache)
;;; gnus-cache.el ends here
(easy-menu-define
gnus-group-misc-menu gnus-group-mode-map ""
- `("Misc"
+ `("Gnus"
("SOUP"
["Pack replies" nnsoup-pack-replies (fboundp 'nnsoup-request-group)]
["Send replies" gnus-soup-send-replies
(easy-menu-define
gnus-summary-misc-menu gnus-summary-mode-map ""
- `("Misc"
+ `("Gnus"
("Mark Read"
["Mark as read" gnus-summary-mark-as-read-forward t]
["Mark same subject and select"
(gnus-data-find (cdr gnus-article-current))
header)
(gnus-summary-update-article-line
- (cdr gnus-article-current) header))))
+ (cdr gnus-article-current) header)
+ (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t)
+ (gnus-summary-update-secondary-mark
+ (cdr gnus-article-current))))))
((not arg)
;; Select the article the normal way.
(gnus-summary-select-article nil 'force))
(gnus-data-find (cdr gnus-article-current))
header)
(gnus-summary-update-article-line
- (cdr gnus-article-current) header))))))
+ (cdr gnus-article-current) header)
+ (if (gnus-summary-goto-subject
+ (cdr gnus-article-current) nil t)
+ (gnus-summary-update-secondary-mark
+ (cdr gnus-article-current))))))))
;; Update threads.
(set-buffer (or buffer gnus-summary-buffer))
- (gnus-summary-update-article (cdr gnus-article-current)))
+ (gnus-summary-update-article (cdr gnus-article-current))
+ (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t)
+ (gnus-summary-update-secondary-mark
+ (cdr gnus-article-current))))
;; Prettify the article buffer again.
(unless no-highlight
(save-excursion
(set-buffer gnus-summary-buffer)
(gnus-summary-unmark-all-processable)
(gnus-summary-update-article current-article)
+ (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t)
+ (gnus-summary-update-secondary-mark (cdr gnus-article-current)))
(gnus-summary-rethread-current)
(gnus-message 3 "Article %d is now the child of article %d"
current-article parent-article)))))
;; Decide whether to append to a file or to an Emacs buffer.
(let ((outbuf (get-file-buffer filename)))
(if (not outbuf)
- (write-region-as-binary (point-min) (point-max) filename 'append)
+ (let ((file-name-coding-system nnmail-pathname-coding-system)
+ (pathname-coding-system nnmail-pathname-coding-system))
+ (write-region-as-binary (point-min) (point-max)
+ filename 'append))
;; File has been visited, in buffer OUTBUF.
(set-buffer outbuf)
(let ((buffer-read-only nil)
(insert "\n"))
(insert "\n"))
(goto-char (point-max))
- (write-region-as-binary (point-min) (point-max)
- filename 'append)))
+ (let ((file-name-coding-system nnmail-pathname-coding-system)
+ (pathname-coding-system nnmail-pathname-coding-system))
+ (write-region-as-binary (point-min) (point-max)
+ filename 'append))))
;; File has been visited, in buffer OUTBUF.
(set-buffer outbuf)
(let ((buffer-read-only nil))
:group 'message-insertion)
(defcustom message-yank-cited-prefix ">"
- "*Prefix inserted on cited lines of yanked messages.
+ "*Prefix inserted on cited or empty lines of yanked messages.
Fix `message-cite-prefix-regexp' if it is set to an abnormal value.
See also `message-yank-prefix'."
:type 'string
(indent-rigidly start (mark t) message-indentation-spaces)
(save-excursion
(goto-char start)
- (while (< (point) (mark t))
- (if (looking-at message-cite-prefix-regexp)
+ (let (last-line)
+ ;; `last-line' describes the contents of the last line
+ ;; encountered in the loop below. nil means "empty line",
+ ;; spaces "line consisting entirely of whitespace",
+ ;; right-angle "line starts with >", quoted "quote character
+ ;; at the beginning of the line", text "the remaining cases".
+ (while (< (point) (mark t))
+ (cond
+ ((eolp)
(insert message-yank-cited-prefix)
- (insert message-yank-prefix))
- (forward-line 1))))
+ (setq last-line nil))
+ ((looking-at ">")
+ (if (memq last-line '(nil spaces right-angle quoted))
+ (progn
+ (insert message-yank-cited-prefix)
+ (setq last-line 'quoted))
+ (insert message-yank-prefix)
+ (setq last-line 'right-angle)))
+ ((looking-at "\\s-+$")
+ (insert message-yank-prefix)
+ (setq last-line 'spaces))
+ (t
+ (insert message-yank-prefix)
+ (setq last-line 'text)))
+ (forward-line 1)))))
(goto-char start)))
(defun message-list-references (refs-list &rest refs-strs)
(defun mm-readable-p (handle)
"Say whether the content of HANDLE is readable."
- (and (< (buffer-size (mm-handle-buffer handle)) 10000)
+ (and (< (with-current-buffer (mm-handle-buffer handle)
+ (buffer-size)) 10000)
(mm-with-unibyte-buffer
(mm-insert-part handle)
(and (eq (mm-body-7-or-8) '7bit)
;; Remove eight-bit-*, treat them as ascii.
(let ((css (find-charset-region b e)))
(mapcar (lambda (cs) (setq css (delq cs css)))
- '(composition eight-bit-control eight-bit-graphic))
+ '(composition eight-bit-control eight-bit-graphic
+ control-1))
css))
(t
;; We are in a unibyte buffer or XEmacs non-mule, so we futz around a bit.
(mm-make-handle buf
'("application/pgp-keys"))))
-;;;### autoload
+;;;###autoload
(defun mm-uu-dissect ()
"Dissect the current buffer and return a list of uu handles."
(let ((case-fold-search t)
(mm-string-as-unibyte
(apply 'concat
(mapcar 'char-to-string
- (list ?\x30 ?\x82 ?\x2e ?\x2e ?\x06 ?\x09 ?\x5c ?\x2a
- ?\x86 ?\x48 ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x02)))))
+ (list ?\x30 ?\x5c ?\x28 ?\x80 ?\x5c ?\x7c ?\x81 ?\x2e ?\x5c
+ ?\x7c ?\x82 ?\x2e ?\x2e ?\x5c ?\x7c ?\x83 ?\x2e ?\x2e
+ ?\x2e ?\x5c ?\x29 ?\x06 ?\x09 ?\x5c ?\x2a ?\x86 ?\x48
+ ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x02)))))
;; id-envelopedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)
;; us(840) rsadsi(113549) pkcs(1) pkcs7(7) 3 }
(mm-string-as-unibyte
(apply 'concat
(mapcar 'char-to-string
- (list ?\x30 ?\x82 ?\x2e ?\x2e ?\x06 ?\x09 ?\x5c ?\x2a
- ?\x86 ?\x48 ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x03)))))
+ (list ?\x30 ?\x5c ?\x28 ?\x80 ?\x5c ?\x7c ?\x81 ?\x2e ?\x5c
+ ?\x7c ?\x82 ?\x2e ?\x2e ?\x5c ?\x7c ?\x83 ?\x2e ?\x2e
+ ?\x2e ?\x5c ?\x29 ?\x06 ?\x09 ?\x5c ?\x2a ?\x86 ?\x48
+ ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x03)))))
(defun mm-view-pkcs7-get-type (handle)
(mm-with-unibyte-buffer
(easy-menu-define
mml-menu mml-mode-map ""
- '("MML"
+ '("Mime"
("Attach"
["File" mml-attach-file t]
["Buffer" mml-attach-buffer t]
["Multipart" mml-insert-multipart t]
["Part" mml-insert-part t])
("Security"
- ("Sign"
- ["PGP/MIME" mml-secure-sign-pgpmime t]
- ["S/MIME" mml-secure-sign-smime t])
- ("Encrypt"
- ["PGP/MIME" mml-secure-encrypt-pgpmime t]
- ["S/MIME" mml-secure-encrypt-smime t]))
+ ["Sign PGP/MIME" mml-secure-sign-pgpmime t]
+ ["Sign S/MIME" mml-secure-sign-smime t]
+ ["Encrypt PGP/MIME" mml-secure-encrypt-pgpmime t]
+ ["Encrypt S/MIME" mml-secure-encrypt-smime t])
;;["Narrow" mml-narrow-to-part t]
["Quote" mml-quote-region t]
["Validate" mml-validate t]
(unless trust-good-enough-p
(concat "\nUntrusted, Fingerprint: "
(mml2015-gpg-pretty-print-fpr fprint))))
- (error "From unknown user")))
+ "From unknown user"))
(if (re-search-forward "^gpg: Good signature from \"\\(.*\\)\"$" nil t)
(match-string 1)
"From unknown user")))
nnheader-text-coding-system
"Coding system used in reading inbox")
-(defvar nnmail-pathname-coding-system 'binary
+(defvar nnmail-pathname-coding-system nil
"*Coding system for pathname.")
(defun nnmail-find-file (file)
(references nil)
(res nil)
(regexp (if (consp nnmail-split-fancy-with-parent-ignore-groups)
- (mapconcat 'nnmail-split-fancy-with-parent-ignore-groups " *\\|")
+ (mapconcat
+ (lambda (x) (format "\\(%s\\)" x))
+ nnmail-split-fancy-with-parent-ignore-groups
+ "\\|")
nnmail-split-fancy-with-parent-ignore-groups)))
(when refstr
(setq references (nreverse (gnus-split-references refstr)))
(mapcar (lambda (x)
(setq res (or (nnmail-cache-fetch-group x) res))
(when (or (string= "drafts" res)
- (and regexp (string-match regexp res)))
+ (and regexp res (string-match regexp res)))
(setq res nil)))
references)
res)))
;; environment variables to pass the password to OpenSSL, which is
;; slightly insecure. Hence a new todo: use a better -passin method.
;;
+;; Cache password for e.g. 1h
+;;
;; Suggestions and comments are appreciated, mail me at simon@josefsson.org.
;; <rant>
have proper MIME tags. KEYFILES is expected to contain a PEM encoded
private key and certificate as its car, and a list of additional certificates
to include in its caar."
+ (smime-new-details-buffer)
(let ((keyfile (car keyfiles))
(certfiles (and (cdr keyfiles) (cadr keyfiles)))
(buffer (generate-new-buffer (generate-new-buffer-name " *smime*")))
(delete-file tmpfile)))
(delete-region b e)
(insert-buffer-substring buffer)
+ (goto-char b)
(when (looking-at "^MIME-Version: 1.0$")
(delete-region (point) (progn (forward-line 1) (point))))
t)
- (with-current-buffer (get-buffer-create smime-details-buffer)
+ (with-current-buffer smime-details-buffer
(goto-char (point-max))
(insert-buffer-substring buffer))
(kill-buffer buffer))))
If encryption fails, the buffer is not modified. Region is assumed to
have proper MIME tags. CERTFILES is a list of filenames, each file
is expected to contain of a PEM encoded certificate."
+ (smime-new-details-buffer)
(let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*")))
(tmpfile (make-temp-file "smime")))
(prog1
(delete-file tmpfile)))
(delete-region b e)
(insert-buffer-substring buffer)
+ (goto-char b)
(when (looking-at "^MIME-Version: 1.0$")
(delete-region (point) (progn (forward-line 1) (point))))
t)
- (with-current-buffer (get-buffer-create smime-details-buffer)
+ (with-current-buffer smime-details-buffer
(goto-char (point-max))
(insert-buffer-substring buffer))
(kill-buffer buffer))))
+2001-08-04 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * gnus.texi (Summary Buffer Lines): Mention `gnus-goto-colon'.
+
+2001-08-03 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * gnus.texi (Backend Interface): Explain about article numbers.
+ Suggested by Paul Jarc.
+
2001-08-02 22:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
* emacs-mime.texi (Non-MIME): Addition.
\e$B$HF1$8$h$&$KF0:n$7$^$9!#\e(B
\e$B9T$K$O>o$K%3%m%s$,B8:_$7$F$$$J$1$l$P$J$j$^$;$s!#A`:n$7$?8e$K!"%+!<%=%k$O\e(B
-\e$B$$$D$b%3%m%s$N>l=j$K0\F0$7$^$9!#\e(B
+\e$B$$$D$b%3%m%s$N>l=j$K0\F0$7$^$9!#\e(B(\e$B$b$A$m$s!"$3$NF0:n$rJQ$($k$3$H$,$G$-$J\e(B
+\e$B$$$H$7$?$i\e(B Gnus \e$B$K$O$"$k$^$8$-$3$H$G$9!#4X?t\e(B @code{gnus-goto-colon} \e$B$r!"\e(B
+\e$B$"$J$?$,9%$-$J%+!<%=%k$NF0$-$K$J$k$h$&$K!"?7$?$K=q$1$PNI$$$N$G$9!#\e(B)
\e$B=i4|CM$NJ8;zNs$O\e(B @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n} \e$B$G$9!#\e(B
\e$B$;$s!#$3$N%5!<%P!<$H$O!"%0%k!<%W$r;}$A!"$=$N%0%k!<%W$K>pJs$rG[Aw$9$k$b$N\e(B
\e$B$G!"$=$l0J>e$N$b$N$G$O$"$j$^$;$s!#\e(B
+Gnus \e$B$O%0%k!<%WL>$H5-;vHV9f$K$h$C$F$=$l$>$l$N%a%C%;!<%8$rFCDj$7$^$9!#$=\e(B
+\e$B$l$i5-;vHV9f$K4X$9$k$A$g$C$H$7$?@bL@$r$9$k$3$H$OM-1W$+$b$7$l$^$;$s!#$^$:\e(B
+\e$BBh0l$K!"$=$N?t;z$O@5$N@0?t$G$9!#BhFs$K!"\e(BGnus \e$B$r:.Mp$5$;$k$3$H$J$/8E$$5-\e(B
+\e$B;vHV9f$r8e$G:F;HMQ$9$k$3$H$OIaDL$O$G$-$^$;$s!#$=$l$O!"$b$7$"$k%0%k!<%W$,\e(B
+\e$B$+$D$F\e(B 42 \e$BHV$N5-;v$r;}$C$F$$$?$H$7$?$i!"$=$NHV9f$GB>$N5-;v$r;}$D$3$H$O$G\e(B
+\e$B$-$J$$$+!"$^$?$O\e(B Gnus \e$B$,:.Mp$7$F$7$^$&$+$b$7$l$J$$$H$$$&$3$H$G$9!#\e(B
+@footnote{See the function @code{nnchoke-request-update-info},
+@ref{Optional Backend Functions}\e$B!#\e(B} \e$BBh;0$K!"5-;vHV9f$O$=$N%0%k!<%W$G$NE~\e(B
+\e$BCe=g$K$J$C$F$$$J$1$l$P$J$i$J$$$3$H$G$9!#$H$O8@$(%a%C%;!<%8$NF|IU$bE~Ce=g\e(B
+\e$B$G$"$kI,MW$O$"$j$^$;$s$,!#\e(B
+
+\e$B$9$G$KA0$N@a$G!"5-;vHV9f$O0l2s;H$o$l$?$@$1$GLrL\$r=*$o$i$J$1$l$P$J$i$J\e(B
+\e$B$$\e(B `\e$B87$7$$\e(B' \e$B@)8B$K$D$$$F@bL@$7$^$7$?!#$7$+$7!"5-;vHV9f$NJB$S$KH4$1$,$"$k\e(B
+\e$B$H\e(B Gnus \e$B$O$H$F$b:.Mp$7$F$7$^$&$N$G!"\e(B@emph{\e$BDL$7\e(B} \e$BHV9f$rIU$1$k$3$H$,M-MQ$J\e(B
+\e$B$N$+$b$7$l$^$;$s!#$?$@$7\e(B `\e$B:F;HMQIT2D\e(B' \e$B$N@)8B$,$"$k$N$G!"$$$D$G$bHV9f$NH4\e(B
+\e$B$1$r2sHr$G$-$k$H$O8B$j$^$;$s!#$^$?!"2DG=$J8B$j5-;vHV9f$r\e(B 1 \e$B$+$i;O$a$k$3\e(B
+\e$B$H$O!"HV9f$r;H$$@Z$C$F$7$^$&$3$H$rHr$1$k$?$a$KLrN)$A$^$9!#\e(B
+
\e$B$3$3$G$NNc$HDj5A$G$O!"A[A|>e$N%P%C%/%(%s%I\e(B @code{nnchoke} \e$B$r0z$-9g$$$K=P\e(B
\e$B$9$3$H$K$7$^$9!#\e(B
(@pxref{Formatting Variables}).
There should always be a colon on the line; the cursor always moves to
-the colon after performing an operation.
+the colon after performing an operation. (Of course, Gnus wouldn't be
+Gnus if it wasn't possible to change this. Just write a new function
+@code{gnus-goto-colon} which does whatever you like with the cursor.)
The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
-- they have a group, and they deliver info on that group and nothing
more.
+Gnus identifies each message by way of group name and article number. A
+few remarks about these article numbers might be useful. First of all,
+the numbers are positive integers. Secondly, it is normally not
+possible for later articles to `re-use' older article numbers without
+confusing Gnus. That is, if a group has ever contained a message
+numbered 42, then no other message may get that number, or Gnus will get
+mightily confused.@footnote{See the function
+@code{nnchoke-request-update-info}, @ref{Optional Backend Functions}.}
+Third, article numbers must be assigned in order of arrival in the
+group; this is not necessarily the same as the date of the message.
+
+The previous paragraph already mentions all the `hard' restrictions that
+article numbers must fulfill. But it seems that it might be useful to
+assign @emph{consecutive} article numbers, for Gnus gets quite confused
+if there are holes in the article numbering sequence. However, due to
+the `no-reuse' restriction, holes cannot be avoided altogether. It's
+also useful for the article numbers to start at 1 to avoid running out
+of numbers as long as possible.
+
In the examples and definitions I will refer to the imaginary backend
@code{nnchoke}.