-Sat Sep 13 21:21:38 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+Wed Nov 26 17:40:57 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus.el: Quassia Gnus v0.1 is released.
+ * gnus.el: Quassia Gnus v0.17 is released.
+
+Wed Nov 26 16:04:25 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-summary-move-article): Don't work on canceled
+ articles.
+
+ * gnus-start.el (gnus-subscribe-hierarchical-interactive): Use
+ `read-char-exclusive'.
+
+ * gnus-sum.el (gnus-summary-mode): Localize
+ gnus-summary-dummy-line-format.
+
+ * nnml.el (nnml-open-nov): Check that the file exists before
+ inserting it.
+
+ * gnus-art.el (article-date-ut): Insert a newline if needed.
+
+ * gnus-score.el (gnus-score-edit-current-scores): Protect against
+ nil score files.
+
+ * gnus-start.el (gnus-newsrc-parse-options): Be more correct --
+ match only hierarchies.
+ (gnus-gnus-to-quick-newsrc-format): Changed warning.
+
+Wed Nov 26 15:47:40 1997 Greg Klanderman <greg@alphatech.com>
+
+ * messagexmas.el (message-xmas-maybe-fontify): New definition.
+
+Wed Nov 26 15:43:53 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-start.el (gnus-setup-news): Protect against nil
+ gnus-message-archive-method.
+
+1997-11-26 Christoph Wedler <wedler@fmi.uni-passau.de>
+
+ * gnus-art.el (gnus-article-edit-done): Update headers "Lines:",
+ "Content-Length:" and "X-Content-Length:" when present.
+
+Wed Nov 26 15:08:17 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnmail.el (nnmail-process-unix-mail-format): Pop to the right
+ buffer on error.
+ (nnmail-process-mmdf-mail-format): Ditto.
+
+Wed Nov 26 13:54:04 1997 Joe Reiss <jreiss@sprynet.com>
+
+ * gnus-art.el (gnus-summary-save-in-rmail): Return the name of the
+ file.
+
+Wed Nov 26 13:50:01 1997 Alastair Burt <alastair.burt@dfki.de>
+
+ * smiley.el: Balloon help, etc.
+
+Wed Nov 26 13:45:35 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-util.el (gnus-kill-all-overlays): Remove check for XEmacs.
+
+1997-09-30 Dave Love <d.love@dl.ac.uk>
+
+ * message.el: Don't require rmail.
+
+Wed Nov 26 13:37:50 1997 Kurt Swanson <kurt@dna.lth.se>
+
+ * gnus-group.el (gnus-group-setup-buffer): set-buffer.
+
+Wed Nov 26 13:31:54 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-score.el (gnus-score-load-file): Don't create empty score
+ files when doing decays.
+
+Wed Nov 26 13:28:04 1997 Renaud Rioboo <rioboo@calfor.lip6.fr>
+
+ * nnmail.el (nnmail-move-inbox): Only bind default-directory when
+ calling external function.
+
+Wed Nov 26 13:03:45 1997 IWAMURO Motonori <iwa@mmp.fujitsu.co.jp>
+
+ * gnus-kill.el (gnus-batch-score): Newsrc thinko.
+
+Wed Nov 26 10:31:17 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnheader.el (nnheader-parse-head): Would break on Message-ID's
+ that spanned several lines.
+
+ * gnus-util.el (gnus-date-iso8601): Didn't pick out the date
+ header.
+
+ * gnus-demon.el (gnus-demon-scan-mail): Clean inboxes.
+
+1997-11-25 Christoph Wedler <wedler@fmi.uni-passau.de>
+
+ * gnus-picon.el (gnus-picons-x-face-sentinel): Would bug out in
+ headers with two X-Face lines.
+
+Wed Nov 26 08:54:26 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-summary-update-info): Would use wrong group
+ name.
+
+1997-11-26 Hrvoje Niksic <hniksic@srce.hr>
+
+ * gnus-spec.el (gnus-compile): Avoid multiple `c*addr's.
+ (gnus-compile): Require `bytecomp'.
+
+1997-11-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * gnus-util.el (gnus-prin1): Bind `print-readably' to t.
+
+ * gnus-xmas.el (gnus-xmas-kill-all-overlays): New function.
+ (gnus-xmas-define): Use it.
+
+ * gnus-art.el (gnus-stop-date-timer): Use `nnheader-cancel-timer'.
+
+ * message.el (message-header-lines): Specify format.
+
+ * gnus-xmas.el (gnus-xmas-move-overlay): Use BUFFER.
+ (gnus-byte-code): Use `indirect-function'.
+
+ * gnus-cite.el (gnus-cite-add-face): Would assign free variable.
+
+Wed Nov 26 08:31:28 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-art.el (gnus-stop-date-timer): Cancel instead of delete.
+ (gnus-start-date-timer): Use the numerical prefix.
+
+Tue Nov 25 20:03:34 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-draft.el (gnus-group-send-drafts): Activate group first.
+
+Tue Nov 25 19:57:55 1997 Dan Christensen <jdc@chow.mat.jhu.edu>
+
+ * gnus-group.el (gnus-group-process-prefix): Skip topics.
+
+Tue Nov 25 19:54:00 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-move.el (gnus-move-group-to-server): Protect agains
+ nil-ness.
+
+Tue Nov 25 19:03:38 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Quassia Gnus v0.16 is released.
+
+Tue Nov 25 16:05:01 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-read-header): Remove thread entry before
+ rebuilding.
+
+ * gnus-cite.el (gnus-cite-add-face): Keep track of all overlays.
+
+ * gnus-art.el (article-update-date-lapsed): New function.
+ (gnus-start-date-timer): New command.
+ (article-date-ut): Put the face in the right place.
+ (article-date-ut): Would move around.
+
+ * gnus-group.el (gnus-group-read-ephemeral-group): Accept server
+ names.
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Use proper server
+ names.
+
+ * gnus.el (gnus-group-prefixed-name): Give the right result for
+ native groups.
+
+ * nnheader.el (nnheader-directory-files): New function.
+
+ * nnmh.el (nnmh-request-list-1): Reversed check.
+
+ * nnfolder.el (nnfolder-delete-mail): Would skip backwards one
+ line too much.
+
+Tue Nov 25 14:44:02 1997 SeokChan LEE <chan@xfer.kren.nm.kr>
+
+ * message.el (message-ignored-supersedes-headers): Typo.
Mon Nov 24 18:46:37 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
header))
(date-regexp "^Date:[ \t]\\|^X-Sent:[ \t]")
(inhibit-point-motion-hooks t)
- bface eface)
+ bface eface newline)
(when (and date (not (string= date "")))
(save-excursion
(save-restriction
(delete-region (progn (beginning-of-line) (point))
(progn (end-of-line) (point)))
(beginning-of-line))
- (goto-char (point-max)))
+ (goto-char (point-max))
+ (setq newline t))
(insert (article-make-date-line date type))
;; Do highlighting.
(beginning-of-line)
(put-text-property (match-beginning 1) (1+ (match-end 1))
'face bface)
(put-text-property (match-beginning 2) (match-end 2)
- 'face eface))))))))
+ 'face eface))
+ (when newline
+ (end-of-line)
+ (insert "\n"))))))))
(defun article-make-date-line (date type)
"Return a DATE line of TYPE."
(defun article-update-date-lapsed ()
"Function to be run from a timer to update the lapsed time line."
(save-excursion
- (when (gnus-buffer-live-p gnus-article-buffer)
- (set-buffer gnus-article-buffer)
- (goto-char (point-min))
- (when (re-search-forward "^X-Sent:" nil t)
- (article-date-lapsed t)))))
+ (ignore-errors
+ (when (gnus-buffer-live-p gnus-article-buffer)
+ (set-buffer gnus-article-buffer)
+ (goto-char (point-min))
+ (when (re-search-forward "^X-Sent:" nil t)
+ (article-date-lapsed t))))))
-(defun gnus-start-date-timer ()
- "Start a timer to update the X-Sent header in the article buffers."
- (interactive)
+(defun gnus-start-date-timer (&optional n)
+ "Start a timer to update the X-Sent header in the article buffers.
+The numerical prefix says how frequently (in seconds) the function
+is to run."
+ (interactive "p")
+ (unless n
+ (setq n 1))
(gnus-stop-date-timer)
(setq article-lapsed-timer
- (nnheader-run-at-time 1 1 'article-update-date-lapsed)))
+ (nnheader-run-at-time 1 n 'article-update-date-lapsed)))
(defun gnus-stop-date-timer ()
"Stop the X-Sent timer."
(interactive)
(when article-lapsed-timer
- (nnheader-delete-timer article-lapsed-timer)
+ (nnheader-cancel-timer article-lapsed-timer)
(setq article-lapsed-timer nil)))
(defun article-date-user (&optional highlight)
(save-excursion
(save-restriction
(widen)
- (gnus-output-to-rmail filename)))))
+ (gnus-output-to-rmail filename))))
+ filename)
(defun gnus-summary-save-in-mail (&optional filename)
"Append this article to Unix mail file.
(if (and (file-readable-p filename)
(mail-file-babyl-p filename))
(gnus-output-to-rmail filename t)
- (gnus-output-to-mail filename))))))
+ (gnus-output-to-mail filename)))))
+ filename)
(defun gnus-summary-save-in-file (&optional filename overwrite)
"Append this article to file.
(when (and overwrite
(file-exists-p filename))
(delete-file filename))
- (gnus-output-to-file filename)))))
+ (gnus-output-to-file filename))))
+ filename)
(defun gnus-summary-write-to-file (&optional filename)
"Write this article to a file.
(goto-char (point-min))
(when (search-forward "\n\n" nil t)
(narrow-to-region (point) (point-max)))
- (gnus-output-to-file filename)))))
+ (gnus-output-to-file filename))))
+ filename)
(defun gnus-summary-save-in-pipe (&optional command)
"Pipe this article to subprocess."
(defun gnus-article-edit-done (&optional arg)
"Update the article edits and exit."
(interactive "P")
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (when (search-forward "\n\n" nil 1)
+ (let ((lines (count-lines (point) (point-max)))
+ (length (- (point-max) (point)))
+ (case-fold-search t)
+ (body (copy-marker (point))))
+ (goto-char (point-min))
+ (when (re-search-forward "^content-length:[ \t]\\([0-9]+\\)" body t)
+ (delete-region (match-beginning 1) (match-end 1))
+ (insert (number-to-string length)))
+ (goto-char (point-min))
+ (when (re-search-forward
+ "^x-content-length:[ \t]\\([0-9]+\\)" body t)
+ (delete-region (match-beginning 1) (match-end 1))
+ (insert (number-to-string length)))
+ (goto-char (point-min))
+ (when (re-search-forward "^lines:[ \t]\\([0-9]+\\)" body t)
+ (delete-region (match-beginning 1) (match-end 1))
+ (insert (number-to-string lines)))))))
(let ((func gnus-article-edit-done-function)
(buf (current-buffer))
(start (window-start)))
;; At line NUMBER, ignore PREFIX and add FACE to the rest of the line.
(when face
(let ((inhibit-point-motion-hooks t)
- from to)
+ from to overlay)
(goto-line number)
(unless (eobp) ; Sometimes things become confused.
(forward-char (length prefix))
(save-window-excursion
(let ((servers gnus-opened-servers)
server)
+ (gnus-clear-inboxes-moved)
(while (setq server (car (pop servers)))
(and (gnus-check-backend-function 'request-scan (car server))
(or (gnus-server-opened server)
"Enter a mail/post buffer to edit and send the draft."
(interactive)
(let ((article (gnus-summary-article-number)))
+ (gnus-summary-mark-as-read article gnus-canceled-mark)
(gnus-draft-setup article gnus-newsgroup-name)
(push
`((lambda ()
(when (buffer-name (get-buffer ,gnus-summary-buffer))
(save-excursion
(set-buffer (get-buffer ,gnus-summary-buffer))
- (gnus-cache-possibly-remove-article ,article nil nil nil t)
- (gnus-summary-mark-as-read ,article gnus-canceled-mark)))))
+ (gnus-cache-possibly-remove-article ,article nil nil nil t)))))
message-send-actions)))
(defun gnus-draft-send-message (&optional n)
(defun gnus-group-send-drafts ()
"Send all sendable articles from the queue group."
(interactive)
- (gnus-request-group "nndraft:queue")
+ (gnus-activate-group "nndraft:queue")
(save-excursion
(let ((articles (nndraft-articles))
(unsendable (gnus-uncompress-range
(or level gnus-group-default-list-level gnus-level-subscribed))))
(defun gnus-group-setup-buffer ()
- (switch-to-buffer (get-buffer-create gnus-group-buffer))
+ (set-buffer (get-buffer-create gnus-group-buffer))
(unless (eq major-mode 'gnus-group-mode)
(gnus-add-current-to-buffer-list)
(gnus-group-mode)
(n (abs n))
group groups)
(save-excursion
- (while (and (> n 0)
- (setq group (gnus-group-group-name)))
- (push group groups)
+ (while (> n 0)
+ (if (setq group (gnus-group-group-name))
+ (push group groups))
(setq n (1- n))
(gnus-group-next-group way)))
(nreverse groups)))
(defun gnus-group-catchup-current (&optional n all)
"Mark all articles not marked as unread in current newsgroup as read.
-If prefix argument N is numeric, the ARG next newsgroups will be
+If prefix argument N is numeric, the next N newsgroups will be
caught up. If ALL is non-nil, marked articles will also be marked as
read. Cross references (Xref: header) of articles are ignored.
-The difference between N and actual number of newsgroups that were
-caught up is returned."
+The number of newsgroups that this function was unable to catch
+up is returned."
(interactive "P")
- (unless (gnus-group-group-name)
- (error "No group on the current line"))
(let ((groups (gnus-group-process-prefix n))
(ret 0))
+ (unless groups (error "No groups selected"))
(if (not
(or (not gnus-interactive-catchup) ;Without confirmation?
gnus-expert-user
;;;###autoload
(defun gnus-batch-score ()
"Run batched scoring.
-Usage: emacs -batch -l gnus -f gnus-batch-score <newsgroups> ...
-Newsgroups is a list of strings in Bnews format. If you want to score
-the comp hierarchy, you'd say \"comp.all\". If you would not like to
-score the alt hierarchy, you'd say \"!alt.all\"."
+Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score"
(interactive)
(let* ((gnus-newsrc-options-n
(gnus-newsrc-parse-options
(nnmail-spool-file nil)
(gnus-use-dribble-file nil)
(gnus-batch-mode t)
- group newsrc entry
+ info group newsrc entry
;; Disable verbose message.
gnus-novice-user gnus-large-newsgroup
gnus-options-subscribe gnus-auto-subscribed-groups
(gnus-slave)
;; Apply kills to specified newsgroups in command line arguments.
(setq newsrc (cdr gnus-newsrc-alist))
- (while (setq group (car (pop newsrc)))
- (setq entry (gnus-gethash group gnus-newsrc-hashtb))
- (when (and (<= (gnus-info-level (car newsrc)) gnus-level-subscribed)
+ (while (setq info (pop newsrc))
+ (setq group (gnus-info-group info)
+ entry (gnus-gethash group gnus-newsrc-hashtb))
+ (when (and (<= (gnus-info-level info) gnus-level-subscribed)
(and (car entry)
(or (eq (car entry) t)
- (not (zerop (car entry)))))
- ;;(eq (gnus-matches-options-n group) 'subscribe)
- )
+ (not (zerop (car entry))))))
(gnus-summary-read-group group nil t nil t)
(when (eq (current-buffer) (get-buffer gnus-summary-buffer))
(gnus-summary-exit))))
(goto-char (point-min))
(while (looking-at
"^[0-9]+\t[^\t]*\t[^\t]*\t[^\t]*\t\\([^\t]*\\)\t")
- (setq to-article
- (gnus-gethash
- (buffer-substring (match-beginning 1) (match-end 1))
- hashtb))
- ;; Add this article to the list of read articles.
- (push to-article to-reads)
- ;; See if there are any marks and then add them.
- (when (setq mark (assq (read (current-buffer)) marks))
- (setq marks (delq mark marks))
- (setcar mark to-article)
- (push mark to-marks))
- (forward-line 1))
+ (when (setq to-article
+ (gnus-gethash
+ (buffer-substring (match-beginning 1) (match-end 1))
+ hashtb))
+ ;; Add this article to the list of read articles.
+ (push to-article to-reads)
+ ;; See if there are any marks and then add them.
+ (when (setq mark (assq (read (current-buffer)) marks))
+ (setq marks (delq mark marks))
+ (setcar mark to-article)
+ (push mark to-marks))
+ (forward-line 1)))
;; Now we know what the read articles are and what the
;; article marks are. We transform the information
;; into the Gnus info format.
If ARG, post to the group under point.
If ARG is 1, prompt for a group name."
(interactive "P")
- ;; Bind this variable here to make message mode hooks
- ;; work ok.
+ ;; Bind this variable here to make message mode hooks work ok.
(let ((gnus-newsgroup-name
(if arg
(if (= 1 (prefix-numeric-value arg))
(annot (cdr env)))
(setq gnus-picons-processes-alist
(remassq process gnus-picons-processes-alist))
- (when annot
+ (when (annotationp annot)
(set-annotation-glyph annot
(make-glyph gnus-picons-x-face-file-name))
(if (memq annot gnus-x-face-annotations)
(defun gnus-score-edit-current-scores (file)
"Edit the current score alist."
(interactive (list gnus-current-score-file))
- (let ((winconf (current-window-configuration)))
- (when (buffer-name gnus-summary-buffer)
- (gnus-score-save))
- (gnus-make-directory (file-name-directory file))
- (setq gnus-score-edit-buffer (find-file-noselect file))
- (gnus-configure-windows 'edit-score)
- (gnus-score-mode)
- (setq gnus-score-edit-exit-function 'gnus-score-edit-done)
- (make-local-variable 'gnus-prev-winconf)
- (setq gnus-prev-winconf winconf))
- (gnus-message
- 4 (substitute-command-keys
- "\\<gnus-score-mode-map>\\[gnus-score-edit-exit] to save edits")))
+ (if (not gnus-current-score-file)
+ (error "No current score file")
+ (let ((winconf (current-window-configuration)))
+ (when (buffer-name gnus-summary-buffer)
+ (gnus-score-save))
+ (gnus-make-directory (file-name-directory file))
+ (setq gnus-score-edit-buffer (find-file-noselect file))
+ (gnus-configure-windows 'edit-score)
+ (gnus-score-mode)
+ (setq gnus-score-edit-exit-function 'gnus-score-edit-done)
+ (make-local-variable 'gnus-prev-winconf)
+ (setq gnus-prev-winconf winconf))
+ (gnus-message
+ 4 (substitute-command-keys
+ "\\<gnus-score-mode-map>\\[gnus-score-edit-exit] to save edits"))))
(defun gnus-score-edit-file (file)
"Edit a score file."
(eval (car (gnus-score-get 'eval alist))))
;; Perform possible decays.
(when (and gnus-decay-scores
+ (or cached (file-exists-p file))
(or (not decay)
(gnus-decay-scores alist decay)))
(gnus-score-set 'touched '(t) alist)
(defun gnus-compile ()
"Byte-compile the user-defined format specs."
(interactive)
+ (require 'bytecomp)
(let ((entries gnus-format-specs)
(byte-compile-warnings '(unresolved callargs redefine))
entry gnus-tmp-func)
(setq entry (pop entries))
(if (eq (car entry) 'version)
(setq gnus-format-specs (delq entry gnus-format-specs))
- (when (and (listp (caddr entry))
- (not (eq 'byte-code (caaddr entry)))
- ;; Under XEmacs, it's (funcall #<compiled-function ...>)
- (not (and (eq 'funcall (caaddr entry))
- (compiled-function-p (car (cdaddr entry))))))
- (fset 'gnus-tmp-func `(lambda () ,(caddr entry)))
- (byte-compile 'gnus-tmp-func)
- (setcar (cddr entry) (gnus-byte-code 'gnus-tmp-func)))))
+ (let ((form (caddr entry)))
+ (when (and (listp form)
+ ;; Under GNU Emacs, it's (byte-code ...)
+ (not (eq 'byte-code (car form)))
+ ;; Under XEmacs, it's (funcall #<compiled-function ...>)
+ (not (and (eq 'funcall (car form))
+ (compiled-function-p (cadr form)))))
+ (fset 'gnus-tmp-func `(lambda () ,form))
+ (byte-compile 'gnus-tmp-func)
+ (setcar (cddr entry) (gnus-byte-code 'gnus-tmp-func))))))
(push (cons 'version emacs-version) gnus-format-specs)
;; Mark the .newsrc.eld file as "dirty".
(push prefix prefixes)
(message "Descend hierarchy %s? ([y]nsq): "
(substring prefix 1 (1- (length prefix))))
- (while (not (memq (setq ans (read-char)) '(?y ?\n ?\r ?n ?s ?q)))
+ (while (not (memq (setq ans (read-char-exclusive))
+ '(?y ?\n ?\r ?n ?s ?q)))
(ding)
(message "Descend hierarchy %s? ([y]nsq): "
(substring prefix 1 (1- (length prefix)))))
(setq groups (cdr groups))))
(t nil)))
(message "Subscribe %s? ([n]yq)" (car groups))
- (while (not (memq (setq ans (read-char)) '(?y ?\n ?\r ?q ?n)))
+ (while (not (memq (setq ans (read-char-exclusive))
+ '(?y ?\n ?\r ?q ?n)))
(ding)
(message "Subscribe %s? ([n]yq)" (car groups)))
(setq group (car groups))
(gnus-read-newsrc-file rawfile))
;; Make sure the archive server is available to all and sundry.
- (setq gnus-server-alist (delq (assoc "archive" gnus-server-alist)
- gnus-server-alist))
- (when (gnus-archive-server-wanted-p)
- (push (cons "archive" gnus-message-archive-method)
- gnus-server-alist))
+ (when gnus-message-archive-method
+ (setq gnus-server-alist (delq (assoc "archive" gnus-server-alist)
+ gnus-server-alist))
+ (when (gnus-archive-server-wanted-p)
+ (push (cons "archive" gnus-message-archive-method)
+ gnus-server-alist)))
;; If we don't read the complete active file, we fill in the
;; hashtb here.
(push (cons (concat
"^" (buffer-substring
(1+ (match-beginning 0))
- (match-end 0)))
+ (match-end 0))
+ "\\($\\|\\.\\)")
'ignore)
out)
;; There was no bang, so this is a "yes" spec.
- (push (cons (concat "^" (match-string 0))
+ (push (cons (concat "^" (match-string 0) "\\($\\|\\.\\)")
'subscribe)
out))))
(print-escape-newlines t))
(insert ";; -*- emacs-lisp -*-\n")
(insert ";; Gnus startup file.\n")
- (insert
- ";; Never delete this file - touch .newsrc instead to force Gnus\n")
- (insert ";; to read .newsrc.\n")
+ (insert "\
+;; Never delete this file -- if you want to force Gnus to read the
+;; .newsrc file (if you have one), touch .newsrc instead.\n")
(insert "(setq gnus-newsrc-file-version "
(prin1-to-string gnus-version) ")\n")
(let* ((gnus-killed-list
(setq gnus-newsgroup-name group)
(make-local-variable 'gnus-summary-line-format)
(make-local-variable 'gnus-summary-line-format-spec)
+ (make-local-variable 'gnus-summary-dummy-line-format)
+ (make-local-variable 'gnus-summary-dummy-line-format-spec)
(make-local-variable 'gnus-summary-mark-positions)
(make-local-hook 'post-command-hook)
(add-hook 'post-command-hook 'gnus-clear-inboxes-moved nil t)
(defun gnus-summary-update-info (&optional non-destructive)
(save-excursion
(let ((group gnus-newsgroup-name))
- (when gnus-newsgroup-kill-headers
- (setq gnus-newsgroup-killed
- (gnus-compress-sequence
- (nconc
- (gnus-set-sorted-intersection
- (gnus-uncompress-range gnus-newsgroup-killed)
- (setq gnus-newsgroup-unselected
- (sort gnus-newsgroup-unselected '<)))
- (setq gnus-newsgroup-unreads
- (sort gnus-newsgroup-unreads '<)))
- t)))
- (unless (listp (cdr gnus-newsgroup-killed))
- (setq gnus-newsgroup-killed (list gnus-newsgroup-killed)))
- (let ((headers gnus-newsgroup-headers))
- (when (and (not gnus-save-score)
- (not non-destructive))
- (setq gnus-newsgroup-scored nil))
- ;; Set the new ranges of read articles.
- (save-excursion
+ (when group
+ (when gnus-newsgroup-kill-headers
+ (setq gnus-newsgroup-killed
+ (gnus-compress-sequence
+ (nconc
+ (gnus-set-sorted-intersection
+ (gnus-uncompress-range gnus-newsgroup-killed)
+ (setq gnus-newsgroup-unselected
+ (sort gnus-newsgroup-unselected '<)))
+ (setq gnus-newsgroup-unreads
+ (sort gnus-newsgroup-unreads '<)))
+ t)))
+ (unless (listp (cdr gnus-newsgroup-killed))
+ (setq gnus-newsgroup-killed (list gnus-newsgroup-killed)))
+ (let ((headers gnus-newsgroup-headers))
+ (when (and (not gnus-save-score)
+ (not non-destructive))
+ (setq gnus-newsgroup-scored nil))
+ ;; Set the new ranges of read articles.
+ (save-excursion
+ (set-buffer gnus-group-buffer)
+ (gnus-undo-force-boundary))
+ (gnus-update-read-articles
+ group (append gnus-newsgroup-unreads gnus-newsgroup-unselected))
+ ;; Set the current article marks.
+ (gnus-update-marks)
+ ;; Do the cross-ref thing.
+ (when gnus-use-cross-reference
+ (gnus-mark-xrefs-as-read group headers gnus-newsgroup-unreads))
+ ;; Do not switch windows but change the buffer to work.
(set-buffer gnus-group-buffer)
- (gnus-undo-force-boundary))
- (gnus-update-read-articles
- group (append gnus-newsgroup-unreads gnus-newsgroup-unselected))
- ;; Set the current article marks.
- (gnus-update-marks)
- ;; Do the cross-ref thing.
- (when gnus-use-cross-reference
- (gnus-mark-xrefs-as-read group headers gnus-newsgroup-unreads))
- ;; Do not switch windows but change the buffer to work.
- (set-buffer gnus-group-buffer)
- (unless (gnus-ephemeral-group-p gnus-newsgroup-name)
- (gnus-group-update-group group))))))
+ (unless (gnus-ephemeral-group-p group)
+ (gnus-group-update-group group)))))))
(defun gnus-summary-save-newsrc (&optional force)
"Save the current number of read/marked articles in the dribble buffer.
((eq action 'copy)
(save-excursion
(set-buffer copy-buf)
- (gnus-request-article-this-buffer article gnus-newsgroup-name)
- (gnus-request-accept-article
- to-newsgroup select-method (not articles))))
+ (when (gnus-request-article-this-buffer article gnus-newsgroup-name)
+ (gnus-request-accept-article
+ to-newsgroup select-method (not articles)))))
;; Crosspost the article.
((eq action 'crosspost)
(let ((xref (message-tokenize-header
(defun gnus-date-iso8601 (header)
"Convert the date field in HEADER to YYMMDDTHHMMSS"
(condition-case ()
- (gnus-time-iso8601 (gnus-date-get-time header))
+ (gnus-time-iso8601 (gnus-date-get-time (mail-header-date header)))
(error "")))
(defun gnus-mode-string-quote (string)
(defun gnus-kill-all-overlays ()
"Delete all overlays in the current buffer."
- (unless gnus-xemacs
- (let* ((overlayss (overlay-lists))
- (buffer-read-only nil)
- (overlays (delq nil (nconc (car overlayss) (cdr overlayss)))))
- (while overlays
- (delete-overlay (pop overlays))))))
+ (let* ((overlayss (overlay-lists))
+ (buffer-read-only nil)
+ (overlays (delq nil (nconc (car overlayss) (cdr overlayss)))))
+ (while overlays
+ (delete-overlay (pop overlays)))))
(defvar gnus-work-buffer " *gnus work*")
(defun gnus-prin1 (form)
"Use `prin1' on FORM in the current buffer.
-Bind `print-quoted' to t while printing."
+Bind `print-quoted' and `print-readably' to t while printing."
(let ((print-quoted t)
+ (print-readably t)
print-level print-length)
(prin1 form (current-buffer))))
(funcall fun data))))
(defun gnus-xmas-move-overlay (extent start end &optional buffer)
- (set-extent-endpoints extent start end))
+ (set-extent-endpoints extent start end buffer))
+
+(defun gnus-xmas-kill-all-overlays ()
+ "Delete all extents in the current buffer."
+ (map-extents (lambda (extent ignore)
+ (delete-extent extent)
+ nil)))
;; Fixed by Christopher Davis <ckd@loiosh.kei.com>.
(defun gnus-xmas-article-add-button (from to fun &optional data)
(fset 'gnus-overlay-put 'set-extent-property)
(fset 'gnus-move-overlay 'gnus-xmas-move-overlay)
(fset 'gnus-overlay-end 'extent-end-position)
+ (fset 'gnus-kill-all-overlays 'gnus-xmas-kill-all-overlays)
(fset 'gnus-extent-detached-p 'extent-detached-p)
(fset 'gnus-add-text-properties 'gnus-xmas-add-text-properties)
(fset 'gnus-put-text-property 'gnus-xmas-put-text-property)
(fset 'gnus-deactivate-mark 'ignore)
(fset 'gnus-window-edges 'window-pixel-edges)
- (require 'text-props)
(if (and (<= emacs-major-version 19)
(< emacs-minor-version 14))
(fset 'gnus-set-text-properties 'gnus-xmas-set-text-properties))
(defun gnus-byte-code (func)
"Return a form that can be `eval'ed based on FUNC."
- (let ((fval (symbol-function func)))
- (if (byte-code-function-p fval)
+ (let ((fval (indirect-function func)))
+ (if (compiled-function-p fval)
(list 'funcall fval)
(cons 'progn (cdr (cdr fval))))))
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.16"
+(defconst gnus-version-number "0.17"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number)
(eval-when-compile (require 'cl))
(require 'mailheader)
-(condition-case nil
- (require 'rmail)
- (t (message "Ignore any errors about rmail from this file")))
(require 'nnheader)
(require 'timezone)
(require 'easymenu)
(define-widget 'message-header-lines 'text
"All header lines must be LFD terminated."
:valid-regexp "^\\'"
+ :format "%t:\n%v"
:error "All header lines must be newline terminated")
(defcustom message-default-headers ""
(0 'message-cited-text-face))))
"Additional expressions to highlight in Message mode.")
+(put 'message-mode 'font-lock-defaults '(message-font-lock-keywords t))
+
(defvar message-face-alist
'((bold . bold-region)
(underline . underline-region)
(setq major-mode 'message-mode)
(setq mode-name "Message")
(setq buffer-offer-save t)
- (make-local-variable 'font-lock-defaults)
- (setq font-lock-defaults '(message-font-lock-keywords t))
(make-local-variable 'facemenu-add-face-function)
(make-local-variable 'facemenu-remove-face-function)
(setq facemenu-add-face-function
(fset 'message-exchange-point-and-mark 'message-xmas-exchange-point-and-mark)
(defun message-xmas-maybe-fontify ()
- (when (and (featurep 'font-lock)
- font-lock-auto-fontify)
- (turn-on-font-lock)))
+ (when (featurep 'font-lock)
+ (font-lock-set-defaults)))
(defun message-xmas-make-caesar-translation-table (n)
"Create a rot table with offset N."
(goto-char p)
(if (search-forward "\nmessage-id:" nil t)
(buffer-substring
- (1- (or (search-forward "<" nil t) (point)))
- (or (search-forward ">" nil t) (point)))
+ (1- (or (search-forward "<" (gnus-point-at-eol) t)
+ (point)))
+ (or (search-forward ">" (gnus-point-at-eol) t) (point)))
;; If there was no message-id, we just fake one to make
;; subsequent routines simpler.
(nnheader-generate-fake-message-id)))
(defvar nnmail-split-history nil
"List of group/article elements that say where the previous split put messages.")
+(defvar nnmail-current-spool nil)
+
(defvar nnmail-pop-password nil
"*Password to use when reading mail from a POP server, if required.")
(save-excursion
(setq errors (generate-new-buffer " *nnmail loss*"))
(buffer-disable-undo errors)
- (let ((default-directory "/"))
- (if (nnheader-functionp nnmail-movemail-program)
- (condition-case err
- (progn
- (funcall nnmail-movemail-program inbox tofile)
- (setq result 0))
- (error
- (save-excursion
- (set-buffer errors)
- (insert (prin1-to-string err))
- (setq result 255))))
+ (if (nnheader-functionp nnmail-movemail-program)
+ (condition-case err
+ (progn
+ (funcall nnmail-movemail-program inbox tofile)
+ (setq result 0))
+ (error
+ (save-excursion
+ (set-buffer errors)
+ (insert (prin1-to-string err))
+ (setq result 255))))
+ (let ((default-directory "/"))
(setq result
(apply
'call-process
(goto-char (match-beginning 0))))
;; Possibly wrong format?
(progn
- (pop-to-buffer (current-buffer))
+ (pop-to-buffer (find-file-noselect nnmail-current-spool))
(error "Error, unknown mail format! (Possibly corrupted.)"))
;; Carry on until the bitter end.
(while (not (eobp))
(forward-line 1)))
;; Possibly wrong format?
(progn
- (pop-to-buffer (current-buffer))
+ (pop-to-buffer (find-file-noselect nnmail-current-spool))
(error "Error, unknown mail format! (Possibly corrupted.)"))
;; Carry on until the bitter end.
(while (not (eobp))
(setq nnmail-split-history nil))
(let* ((spools (nnmail-get-spool-files group))
(group-in group)
- incoming incomings spool)
+ nnmail-current-spool incoming incomings spool)
(when (and (nnmail-get-value "%s-get-new-mail" method)
nnmail-spool-file)
;; We first activate all the groups.
(nnheader-message 3 "%s: Reading incoming mail..." method)
(when (and (nnmail-move-inbox spool)
(file-exists-p nnmail-crash-box))
+ (setq nnmail-current-spool spool)
;; There is new mail. We first find out if all this mail
;; is supposed to go to some specific group.
(setq group (nnmail-get-split-group spool group-in))
(concat (nnmail-group-pathname group nnml-directory)
nnml-nov-file-name))
(erase-buffer)
- (nnheader-insert-file-contents nnml-nov-buffer-file-name))
+ (when (file-exists-p nnml-nov-buffer-file-name)
+ (nnheader-insert-file-contents nnml-nov-buffer-file-name)))
(push (cons group buffer) nnml-nov-buffer-alist)
buffer)))
(nconc bstate (list (cons current state))))))
(defsubst nnoo-current-server-p (backend server)
- (equal (nnoo-current-server backend) server))
+ (equal (nnoo-current-server backend)
+ (if nnoo-parent-backend
+ (format "%s+%s" nnoo-parent-backend server)
+ server)))
(defun nnoo-current-server (backend)
(nth 1 (assq backend nnoo-state-alist)))
:type 'face
:group 'smiley)
-
(defvar smiley-glyph-cache nil)
(defvar smiley-running-xemacs (string-match "XEmacs" emacs-version))
"Keymap to toggle smiley states.")
(define-key smiley-map [(button2)] 'smiley-toggle-extent)
+(define-key smiley-map [(button3)] 'smiley-popup-menu)
+
+(defun smiley-popup-menu (e)
+ (interactive "e")
+ (popup-menu
+ `("Smilies"
+ ["Toggle This Smiley" (smiley-toggle-extent ,e) t]
+ ["Toggle All Smilies" (smiley-toggle-extents ,e) t])))
(defun smiley-create-glyph (smiley pixmap)
(and
(reveal-annotation ant)
(set-extent-property ext 'invisible t)))))))
+(defun smiley-toggle-extents (e)
+ (interactive "e")
+ (map-extents
+ '(lambda (e void)
+ (let (ant)
+ (if (annotationp (setq ant (extent-property e 'smiley-annotation)))
+ (progn
+ (if (eq (extent-property e 'invisible) nil)
+ (progn
+ (reveal-annotation ant)
+ (set-extent-property e 'invisible t)
+ )
+ (hide-annotation ant)
+ (set-extent-property e 'invisible nil))))
+ nil))
+ (event-buffer e)))
+
;;;###autoload
(defun smiley-buffer (&optional buffer st nd)
(interactive)
smiley-regexp-alist))
(case-fold-search nil)
entry regexp beg group file)
+ (map-extents
+ '(lambda (e void)
+ (when (or (extent-property e 'smiley-extent)
+ (extent-property e 'smiley-annotation))
+ (delete-extent e)))
+ buffer st nd)
(goto-char (or st (point-min)))
(setq beg (point))
;; loop through alist
(set-extent-property ant 'keymap smiley-map)
;; remember each other
(set-extent-property ant 'smiley-extent ext)
- (set-extent-property ext 'smiley-annotation ant))
+ (set-extent-property ext 'smiley-annotation ant)
+ ;; Help
+ (set-extent-property ext 'balloon-help
+ "Mouse button2 - toggle smiley
+Mouse button3 - menu")
+ (set-extent-property ant 'balloon-help
+ "Mouse button2 - toggle smiley
+Mouse button3 - menu"))
(when (smiley-end-paren-p start end)
(make-annotation ")" end 'text))
(goto-char end)))))))))
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Quassia Gnus 0.16 Manual
+@settitle Quassia Gnus 0.17 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Quassia Gnus 0.16 Manual
+@title Quassia Gnus 0.17 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Quassia Gnus 0.16.
+This manual corresponds to Quassia Gnus 0.17.
@end ifinfo
variables in your @file{~/.gnus} file. This file is similar to
@file{~/.emacs}, but is read when gnus starts.
+If you puzzle at any terms used in this manual, please refer to the
+terminology section (@pxref{Terminology}).
+
@menu
* Finding the News:: Choosing a method for getting news.
* The First Time:: What does Gnus do the first time you start it?
@node Group Score
@section Group Score
@cindex group score
+@cindex group rank
+@cindex rank
You would normally keep important groups on high levels, but that scheme
is somewhat restrictive. Don't you wish you could have Gnus sort the
@item gnus-group-sort-by-score
@findex gnus-group-sort-by-score
-Sort by group score.
+Sort by group score. @xref{Group Score}.
@item gnus-group-sort-by-rank
@findex gnus-group-sort-by-rank
Sort by group score and then the group level. The level and the score
-are, when taken together, the group's @dfn{rank}.
+are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
@item gnus-group-sort-by-unread
@findex gnus-group-sort-by-unread
@kindex G S v (Group)
@findex gnus-group-sort-groups-by-score
Sort the group buffer by group score
-(@code{gnus-group-sort-groups-by-score}).
+(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
@item G S r
@kindex G S r (Group)
@findex gnus-group-sort-groups-by-rank
Sort the group buffer by group rank
-(@code{gnus-group-sort-groups-by-rank}).
+(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
@item G S m
@kindex G S m (Group)
@kindex G P v (Group)
@findex gnus-group-sort-selected-groups-by-score
Sort the process/prefixed groups in the group buffer by group score
-(@code{gnus-group-sort-selected-groups-by-score}).
+(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
@item G P r
@kindex G P r (Group)
@findex gnus-group-sort-selected-groups-by-rank
Sort the process/prefixed groups in the group buffer by group rank
-(@code{gnus-group-sort-selected-groups-by-rank}).
+(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
@item G P m
@kindex G P m (Group)
@kindex T S v (Topic)
@findex gnus-topic-sort-groups-by-score
Sort the current topic by group score
-(@code{gnus-topic-sort-groups-by-score}).
+(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
@item T S r
@kindex T S r (Topic)
@findex gnus-topic-sort-groups-by-rank
Sort the current topic by group rank
-(@code{gnus-topic-sort-groups-by-rank}).
+(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
@item T S m
@kindex T S m (Topic)
@end table
+You can do scoring from the command line by saying something like:
+
+@findex gnus-batch-score
+@cindex batch scoring
+@example
+$ emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score
+@end example
+
@node Score Variables
@section Score Variables
François Felix Ingrand,
Ishikawa Ichiro, @c Ishikawa
Lee Iverson,
+Iwamuro Motonori, @c Iwamuro
Rajappa Iyer,
Andreas Jaeger,
Randell Jesup,
server (i.e., it isn't in the active file), is a @emph{bogus group}.
This means that the group probably doesn't exist (any more).
+@item activating
+@cindex activating groups
+The act of asking the server for info on a group and computing the
+number of unread articles is called @dfn{activating the group}.
+Un-activated groups are listed with @samp{*} in the group buffer.
+
@item server
@cindex server
A machine one can connect to and get news (or mail) from.
The first element is the @dfn{group name}---as Gnus knows the group,
anyway. The second element is the @dfn{subscription level}, which
-normally is a small integer. The third element is a list of ranges of
-read articles. The fourth element is a list of lists of article marks
-of various kinds. The fifth element is the select method (or virtual
-server, if you like). The sixth element is a list of @dfn{group
-parameters}, which is what this section is about.
+normally is a small integer. (It can also be the @dfn{rank}, which is a
+cons cell where the @code{car} is the level and the @code{cdr} is the
+score.) The third element is a list of ranges of read articles. The
+fourth element is a list of lists of article marks of various kinds.
+The fifth element is the select method (or virtual server, if you like).
+The sixth element is a list of @dfn{group parameters}, which is what
+this section is about.
Any of the last three elements may be missing if they are not required.
In fact, the vast majority of groups will normally only have the first
Here's a BNF definition of the group info format:
@example
-info = "(" group space level space read
+info = "(" group space ralevel space read
[ "" / [ space marks-list [ "" / [ space method [ "" /
space parameters ] ] ] ] ] ")"
group = quote <string> quote
+ralevel = rank / level
level = <integer in the range of 1 to inf>
+rank = "(" level "." score ")"
+score = <integer in the range of 1 to inf>
read = range
marks-lists = nil / "(" *marks ")"
marks = "(" <string> range ")"
@itemx gnus-info-set-rank
@findex gnus-info-rank
@findex gnus-info-set-rank
-Get/set the group rank.
+Get/set the group rank (@pxref{Group Score}).
@item gnus-info-level
@itemx gnus-info-set-level
@itemx gnus-info-set-score
@findex gnus-info-score
@findex gnus-info-set-score
-Get/set the group score.
+Get/set the group score (@pxref{Group Score}).
@item gnus-info-read
@itemx gnus-info-set-read
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 0.16 Manual
+@settitle Message 0.17 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Message 0.16 Manual
+@title Message 0.17 Manual
@author by Lars Magne Ingebrigtsen
@page
@node Top
@top Message
-All message composition (both mail and news) takes place in Message mode
-buffers.
+All message composition from Gnus (both mail and news) takes place in
+Message mode buffers.
@menu
* Interface:: Setting up message buffers.
* Commands:: Commands you can execute in message mode buffers.
* Variables:: Customizing the message buffers.
* Compatibility:: Making Message backwards compatible.
+* Appendices:: More technical things.
* Index:: Variable, function and concept index.
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message 0.16. Message is distributed with
+This manual corresponds to Message 0.17. Message is distributed with
the Gnus distribution bearing the same version number as this manual
has.
Two optional parameters are accepted: The first will be used as the
@code{To} header and the second as the @code{Subject} header. If these
-aren't present, those two headers will be empty.
+are @code{nil}, those two headers will be empty.
@node New News Message
This function accepts two optional parameters. The first will be used
as the @code{Newsgroups} header and the second as the @code{Subject}
-header. If these aren't present, those two headers will be empty.
+header. If these are @code{nil}, those two headers will be empty.
@node Reply
reply to the message in the current buffer.
@vindex message-reply-to-function
-Message uses the normal methods to determine where replies are to go,
-but you can change the behavior to suit your needs by fiddling with the
-@code{message-reply-to-function} variable.
+Message uses the normal methods to determine where replies are to go
+(@pxref{Responding}), but you can change the behavior to suit your needs
+by fiddling with the @code{message-reply-to-function} variable.
If you want the replies to go to the @code{Sender} instead of the
@code{From}, you could do something like this:
@item C-c C-q
@kindex C-c C-q
@findex message-fill-yanked-message
-Fill the yanked message (@code{message-fill-yanked-message}).
+Fill the yanked message (@code{message-fill-yanked-message}). Warning:
+Can severely mess up the yanked text if its quoting conventions are
+strange. You'll quickly get a feel for when it's safe, though. Anyway,
+just remember that @kbd{C-x u} (@code{undo}) is available and you'll be
+all right.
+
@item C-c C-w
@kindex C-c C-w
@item message-citation-line-function
@vindex message-citation-line-function
Function called to insert the citation line. The default is
-@code{message-insert-citation-line}.
+@code{message-insert-citation-line}, which will lead to citation lines
+that look like:
+
+@example
+Hallvard B Furuseth <h.b.furuseth@usit.uio.no> writes:
+@end example
+
+Point will be at the beginning of the body of the message when this
+function is called.
@item message-yank-prefix
@vindex message-yank-prefix
@findex sc-cite-original
@cindex Supercite
Function for citing an original message. The default is
-@code{message-cite-original}. You can also set it to
+@code{message-cite-original}, which simply inserts the original message
+and prepends @samp{> } to each line. You can also set it to
@code{sc-cite-original} to use Supercite.
@item message-indent-citation-function
@node Message Headers
@section Message Headers
-Message is quite aggressive on the message generation front. It has
-to be -- it's a combined news and mail agent. To be able to send
-combined messages, it has to generate all headers itself to ensure that
-mail and news copies of messages look sufficiently similar.
+Message is quite aggressive on the message generation front. It has to
+be -- it's a combined news and mail agent. To be able to send combined
+messages, it has to generate all headers itself (instead of letting the
+mail/news system do it) to ensure that mail and news copies of messages
+look sufficiently similar.
@table @code
@vindex message-mh-deletable-headers
Most versions of MH doesn't like being fed messages that contain the
headers in this variable. If this variable is non-@code{nil} (which is
-the default), these headers will be removed before mailing. Set it to
-@code{nil} if your MH can handle these headers.
+the default), these headers will be removed before mailing when sending
+messages via MH. Set it to @code{nil} if your MH can handle these
+headers.
@end table
@item message-post-method
@vindex message-post-method
-Method used for posting a prepared news message.
+Gnusish @dfn{select method} (see the Gnus manual for details) used for
+posting a prepared news message.
@end table
corresponding mail variables.
+@node Appendices
+@chapter Appendices
+
+@menu
+* Responses:: Standard rules for determining where responses go.
+@end menu
+
+
+@node Responses
+@section Responses
+
+To determine where a message is to go, the following algorithm is used
+by default.
+
+@table @def
+@item reply
+A @dfn{reply} is when you want to respond @emph{just} to the person who
+sent the message via mail. There will only be one recipient. To
+determine who the recipient will be, the following headers are
+consulted, in turn:
+
+@table @code
+@item Reply-To
+
+@item From
+@end table
+
+
+@item wide reply
+A @dfn{wide reply} is a mail response that includes @emph{all} entities
+mentioned in the message you are responded to. All mailboxes from the
+following headers will be concatenated to form the outgoing
+@code{To}/@code{Cc} headers:
+
+@table
+@item From
+(unless there's a @code{Reply-To}, in which case that is used instead).
+
+@item Cc
+
+@item To
+@end table
+
+If a @code{Mail-Copies-To} header is present, it will also be included
+in the list of mailboxes. If this header is @samp{never}, that means
+that the @code{From} (or @code{Reply-To}) mailbox will be suppressed.
+
+
+@item followup
+A @dfn{followup} is a response sent via news. The following headers
+(listed in order of precedence) determine where the response is to be
+sent:
+
+@table @code
+
+@item Followup-To
+
+@item Newsgroups
+
+@end table
+
+If a @code{Mail-Copies-To} header is present, it will be used as the
+basis of the new @code{Cc} header, except if this header is
+@samp{never}.
+
+@end table
+
+
@node Index
@chapter Index