** Gnus changes.
-*** `gnus-select-method' now defaults to `(nntp "news")' instead
-of `(nntp "localhost")'.
+*** New functionality for using Gnus as an offline newsreader has been
+added. A plethora of new commands and modes have been added. See the
+Gnus manual for the full story.
-*** `gnus-read-active-file' now defaults to `some' instead of t.
+*** The nndraft backend has returned, but works differently than
+before. All Message buffers are now also articles in the nndraft
+group, which is created automatically.
-*** nntp.el has been totally rewritten in an asynchronous fashion.
+*** `gnus-alter-header-function' can now be used to alter header
+values.
-*** Article prefetching functionality has been moved up into
-Gnus.
+*** `gnus-summary-goto-article' now accept Message-ID's.
-*** Scoring can now be performed with logical operators like
-`and', `or', `not', and parent redirection.
-
-*** Article washing status can be displayed in the
-article mode line.
-
-*** gnus.el has been split into many smaller files.
-
-*** Suppression of duplicate articles based on Message-ID.
-
-(setq gnus-suppress-duplicates t)
-
-*** New variables for specifying what score and adapt files
-are to be considered home score and adapt files. See
-`gnus-home-score-file' and `gnus-home-adapt-files'.
-
-*** Groups can inherit group parameters from parent topics.
-
-*** Article editing has been revamped and is now usable.
-
-*** Signatures can be recognized in more intelligent fashions.
-See `gnus-signature-separator' and `gnus-signature-limit'.
-
-*** Summary pick mode has been made to look more nn-like.
-Line numbers are displayed and the `.' command can be
-used to pick articles.
-
-*** Commands for moving the .newsrc.eld from one server to
-another have been added.
-
- `M-x gnus-change-server'
-
-*** A way to specify that "uninteresting" fields be suppressed when
-generating lines in buffers.
-
-*** Several commands in the group buffer can be undone with
-`M-C-_'.
-
-*** Scoring can be done on words using the new score type `w'.
-
-*** Adaptive scoring can be done on a Subject word-by-word basis:
-
- (setq gnus-use-adaptive-scoring '(word))
-
-*** Scores can be decayed.
-
- (setq gnus-decay-scores t)
-
-*** Scoring can be performed using a regexp on the Date header. The
-Date is normalized to compact ISO 8601 format first.
-
-*** A new command has been added to remove all data on articles from
-the native server.
-
- `M-x gnus-group-clear-data-on-native-groups'
-
-*** A new command for reading collections of documents
-(nndoc with nnvirtual on top) has been added -- `M-C-d'.
-
-*** Process mark sets can be pushed and popped.
-
-*** A new mail-to-news backend makes it possible to post
-even when the NNTP server doesn't allow posting.
-
-*** A new backend for reading searches from Web search engines
-(DejaNews, Alta Vista, InReference) has been added.
-
- Use the `G w' command in the group buffer to create such
- a group.
-
-*** Groups inside topics can now be sorted using the standard
-sorting functions, and each topic can be sorted independently.
-
- See the commands under the `T S' submap.
-
-*** Subsets of the groups can be sorted independently.
-
- See the commands under the `G P' submap.
-
-*** Cached articles can be pulled into the groups.
-
- Use the `Y c' command.
-
-*** Score files are now applied in a more reliable order.
-
-*** Reports on where mail messages end up can be generated.
-
- `M-x nnmail-split-history'
-
-*** More hooks and functions have been added to remove junk
-from incoming mail before saving the mail.
-
- See `nnmail-prepare-incoming-header-hook'.
-
-*** The nnml mail backend now understands compressed article files.
+*** A new Message command for deleting text in the body of a message
+outside the region: `C-c C-v'.
+Wed Sep 17 03:28:36 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Quassia Gnus v0.6 is released.
+
+1997-08-17 SL Baur <steve@altair.xemacs.org>
+
+ * dgnushack.el (dgnushack-compile): Ignore .el files beginning
+ with an `=' character.
+
+Wed Sep 17 02:30:04 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-build-sparse-threads): Allow display of looped
+ References.
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): Separated out into
+ function.
+
+ * message.el (message-delete-not-region): New command and
+ keystroke.
+
+Tue Sep 16 00:58:26 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nndraft.el (nndraft-directory): Changed value.
+
+ * message.el (message-kill-buffer): Disassociate draft.
+ (message-mode): Use kill hook to disassociate.
+ (message-disassociate-draft): Double-check.
+
+ * gnus-agent.el (gnus-agentize): Don't set twice.
+
+ * gnus-art.el (gnus-article-prepare): Go to the right line before
+ marking.
+
+ * gnus-start.el: Renamed the drafts group.
+
+ * gnus-agent.el (gnus-agent-lib-file): Changed name of directory.
+
+ * gnus-draft.el (gnus-draft-mode): Simplify.
+
Tue Sep 16 00:18:11 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Quassia Gnus v0.5 is released.
(defun dgnushack-compile ()
;;(setq byte-compile-dynamic t)
- (let ((files (directory-files "." nil ".el$"))
+ (let ((files (directory-files "." nil "^[^=].*\\.el$"))
(xemacs (string-match "XEmacs" emacs-version))
;;(byte-compile-generate-call-tree t)
byte-compile-warnings file elc)
(defun gnus-agent-lib-file (file)
"The full path of the Gnus agent library FILE."
- (concat (gnus-agent-directory) "lib/" file))
+ (concat (gnus-agent-directory) "agent.lib/" file))
;;;
;;; Mode infestation
agent minor mode in all Gnus buffers."
(interactive)
(add-hook 'gnus-before-startup-hook 'gnus-open-agent)
- (setq gnus-agent-send-mail-function message-send-mail-function
- message-send-mail-function 'gnus-agent-send-mail))
+ (unless gnus-agent-send-mail-function
+ (setq gnus-agent-send-mail-function message-send-mail-function
+ message-send-mail-function 'gnus-agent-send-mail))
+ (unless gnus-agent-covered-methods
+ (setq gnus-agent-covered-methods (list gnus-select-method))))
(defun gnus-agent-send-mail ()
(if gnus-plugged
(interactive (list (gnus-group-group-name)))
(unless group
(error "No group on the current line"))
- (let ((articles (gnus-list-of-unread-articles group))
- (gnus-command-method (gnus-find-method-for-group group)))
- (gnus-agent-with-fetch
- (gnus-agent-fetch-articles group articles))))
+ (gnus-agent-with-fetch
+ (gnus-agent-fetch-group-1 group (gnus-find-method-for-group group))))
(defun gnus-agent-add-group (category arg)
"Add the current group to an agent category."
(unless gnus-plugged
(error "Can't fetch articles while Gnus is unplugged"))
(let ((methods gnus-agent-covered-methods)
- gnus-newsgroup-dependencies gnus-newsgroup-headers
- gnus-newsgroup-scored
- gnus-headers gnus-score
- gnus-use-cache
- gnus-command-method groups group articles score arts
- category predicate info marks score-param)
+ method groups group)
(save-excursion
(while methods
- (setq gnus-command-method (car methods)
+ (setq method (car methods)
groups (gnus-groups-from-server (pop methods)))
(gnus-agent-with-fetch
(while (setq group (pop groups))
- ;; Fetch headers.
- (when (and (setq articles (gnus-list-of-unread-articles group))
- (gnus-agent-fetch-headers group articles))
- ;; Parse them and see which articles we want to fetch.
- (setq gnus-newsgroup-dependencies
- (make-vector (length articles) 0))
- (setq gnus-newsgroup-headers
- (gnus-get-newsgroup-headers-xover articles nil nil group))
- (setq category (gnus-group-category group))
- (setq predicate
- (gnus-get-predicate
- (or (gnus-group-get-parameter group 'agent-predicate)
- (cadr category))))
- (setq score-param
- (or (gnus-group-get-parameter group 'agent-score)
- (caddr category)))
- (when score-param
- (gnus-score-headers (list (list score-param))))
- (setq arts nil)
- (while (setq gnus-headers (pop gnus-newsgroup-headers))
- (setq gnus-score
- (or (cdr (assq (mail-header-number gnus-headers)
- gnus-newsgroup-scored))
- gnus-summary-default-score))
- (when (funcall predicate)
- (push (mail-header-number gnus-headers)
- arts)))
- ;; Fetch the articles.
- (when arts
- (gnus-agent-fetch-articles group arts)))
- ;; Perhaps we have some additional articles to fetch.
- (setq arts (assq 'download (gnus-info-marks
- (setq info (gnus-get-info group)))))
- (when (cdr arts)
- (gnus-agent-fetch-articles
- group (gnus-uncompress-range (cdr arts)))
- (setq marks (delq arts (gnus-info-marks info)))
- (gnus-info-set-marks info marks)))))
+ (gnus-agent-fetch-group-1 group method))))
(gnus-message 6 "Finished fetching articles into the Gnus agent"))))
+(defun gnus-agent-fetch-group-1 (group method)
+ "Fetch GROUP."
+ (let ((gnus-command-method method)
+ gnus-newsgroup-dependencies gnus-newsgroup-headers
+ gnus-newsgroup-scored gnus-headers gnus-score
+ gnus-use-cache articles score arts
+ category predicate info marks score-param)
+ ;; Fetch headers.
+ (when (and (setq articles (gnus-list-of-unread-articles group))
+ (gnus-agent-fetch-headers group articles))
+ ;; Parse them and see which articles we want to fetch.
+ (setq gnus-newsgroup-dependencies
+ (make-vector (length articles) 0))
+ (setq gnus-newsgroup-headers
+ (gnus-get-newsgroup-headers-xover articles nil nil group))
+ (setq category (gnus-group-category group))
+ (setq predicate
+ (gnus-get-predicate
+ (or (gnus-group-get-parameter group 'agent-predicate)
+ (cadr category))))
+ (setq score-param
+ (or (gnus-group-get-parameter group 'agent-score)
+ (caddr category)))
+ (when score-param
+ (gnus-score-headers (list (list score-param))))
+ (setq arts nil)
+ (while (setq gnus-headers (pop gnus-newsgroup-headers))
+ (setq gnus-score
+ (or (cdr (assq (mail-header-number gnus-headers)
+ gnus-newsgroup-scored))
+ gnus-summary-default-score))
+ (when (funcall predicate)
+ (push (mail-header-number gnus-headers)
+ arts)))
+ ;; Fetch the articles.
+ (when arts
+ (gnus-agent-fetch-articles group arts)))
+ ;; Perhaps we have some additional articles to fetch.
+ (setq arts (assq 'download (gnus-info-marks
+ (setq info (gnus-get-info group)))))
+ (when (cdr arts)
+ (gnus-agent-fetch-articles
+ group (gnus-uncompress-range (cdr arts)))
+ (setq marks (delq arts (gnus-info-marks info)))
+ (gnus-info-set-marks info marks))))
+
;;;
;;; Agent Category Mode
;;;
(setq file (concat dir (number-to-string article))))
(delete-file file))))))
(gnus-agent-save-alist nil nil nil dir))))
-
+
(provide 'gnus-agent)
;;; gnus-agent.el ends here
(cons gnus-newsgroup-name gnus-current-article))
(unless (vectorp gnus-current-headers)
(setq gnus-current-headers nil))
+ (gnus-summary-goto-subject gnus-current-article)
(gnus-summary-show-thread)
(run-hooks 'gnus-mark-article-hook)
(gnus-set-mode-line 'summary)
(gnus-article-search-signature)
(push (cons (point-marker) "") marks)
;; Sort the marks.
- (setq marks (sort marks (lambda (m1 m2) (< (car m1) (car m2)))))
+ (setq marks (sort marks 'car-less-than-car))
(let ((omarks marks))
(setq marks nil)
(while (cdr omarks)
\\{gnus-draft-mode-map}"
(interactive "P")
(when (eq major-mode 'gnus-summary-mode)
- (if (not (set (make-local-variable 'gnus-draft-mode)
+ (when (set (make-local-variable 'gnus-draft-mode)
(if (null arg) (not gnus-draft-mode)
- (> (prefix-numeric-value arg) 0))))
- (remove-hook 'gnus-message-setup-hook 'gnus-draft-setup-message)
+ (> (prefix-numeric-value arg) 0)))
;; Set up the menu.
(when (gnus-visual-p 'draft-menu 'menu)
(gnus-draft-make-menu-bar))
(defun gnus-group-send-drafts ()
"Send all sendable articles from the draft group."
(interactive)
- (gnus-request-group "nndraft:draft")
+ (gnus-request-group "nndraft:drafts")
(save-excursion
(let ((articles (nndraft-articles))
(unsendable (gnus-uncompress-range
- (cdr (assq 'unsend (gnus-info-marks
- (gnus-get-info "nndraft:draft"))))))
+ (cdr (assq 'unsend
+ (gnus-info-marks
+ (gnus-get-info "nndraft:drafts"))))))
article)
(while (setq article (pop articles))
(unless (memq article unsendable)
(message-mail)
(erase-buffer)
(if (not (gnus-request-restore-buffer
- article (or gnus-newsgroup-name "nndraft:draft")))
+ article (or gnus-newsgroup-name "nndraft:drafts")))
(error "Couldn't restore the article")
;; Insert the separator.
(goto-char (point-min))
files)))
(mapcar
(lambda (f) (cdr f))
- (sort alist (lambda (f1 f2) (< (car f1) (car f2))))))))
+ (sort alist 'car-less-than-car)))))
(defun gnus-score-find-alist (group)
"Return list of score files for GROUP.
(defun gnus-start-draft-setup ()
"Make sure the draft group exists."
- (unless (gnus-gethash "nndraft:draft" gnus-newsrc-hashtb)
- (gnus-request-create-group "draft" '(nndraft ""))
+ (unless (gnus-gethash "nndraft:drafts" gnus-newsrc-hashtb)
+ (gnus-request-create-group "drafts" '(nndraft ""))
(let ((gnus-level-default-subscribed 1))
- (gnus-subscribe-group "nndraft:draft" nil '(nndraft "")))
+ (gnus-subscribe-group "nndraft:drafts" nil '(nndraft "")))
(gnus-group-set-parameter
- "nndraft:draft" 'gnus-dummy '((gnus-draft-mode)))))
+ "nndraft:drafts" 'gnus-dummy '((gnus-draft-mode)))))
;;;###autoload
(defun gnus-unload ()
(while (search-backward ">" nil t)
(setq end (1+ (point)))
(when (search-backward "<" nil t)
- (push (list (incf generation)
- child (setq child (buffer-substring (point) end))
- subject)
- relations)))
+ (unless (string= (setq new-child (buffer-substring (point) end))
+ child)
+ (push (list (incf generation)
+ child (setq child new-child)
+ subject)
+ relations))))
(push (list (1+ generation) child nil subject) relations)
(erase-buffer)))
(kill-buffer (current-buffer)))
;; Sort over trustworthiness.
- (setq relations (sort relations (lambda (r1 r2) (< (car r1) (car r2)))))
+ (setq relations (sort relations 'car-less-than-car))
(while (setq relation (pop relations))
(when (if (boundp (setq cthread (intern (cadr relation) deps)))
(unless (car (symbol-value cthread))
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.5"
+(defconst gnus-version-number "0.6"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number)
(define-key message-mode-map "\C-c\C-d" 'message-dont-send)
(define-key message-mode-map "\C-c\C-e" 'message-elide-region)
+ (define-key message-mode-map "\C-c\C-v" 'message-delete-not-region)
(define-key message-mode-map "\t" 'message-tab))
["Caesar (rot13) Message" message-caesar-buffer-body t]
["Caesar (rot13) Region" message-caesar-region (mark t)]
["Elide Region" message-elide-region (mark t)]
+ ["Delete Outside Region" message-delete-not-region (mark t)]
["Rename buffer" message-rename-buffer t]
["Spellcheck" ispell-message t]
"----"
(make-local-variable 'message-kill-actions)
(make-local-variable 'message-postpone-actions)
(make-local-variable 'message-draft-article)
+ (make-local-hook 'kill-buffer-hook)
+ (add-hook 'kill-buffer-hook 'message-disassociate-draft)
(set-syntax-table message-mode-syntax-table)
(use-local-map message-mode-map)
(setq local-abbrev-table message-mode-abbrev-table)
;;; Various commands
+(defun message-delete-not-region (beg end)
+ "Delete everything in the body of the current message that is outside of the region."
+ (interactive "r")
+ (save-excursion
+ (goto-char end)
+ (delete-region (point) (progn (message-goto-signature)
+ (forward-line -2)
+ (point)))
+ (insert "\n")
+ (goto-char beg)
+ (delete-region beg (progn (message-goto-body)
+ (forward-line 2)
+ (point))))
+ (message-goto-signature)
+ (forward-line -2))
+
(defun message-insert-signature (&optional force)
"Insert a signature. See documentation for the `message-signature' variable."
(interactive (list 0))
(when (or (not (buffer-modified-p))
(yes-or-no-p "Message modified; kill anyway? "))
(let ((actions message-kill-actions))
+ (setq buffer-file-name nil)
(kill-buffer (current-buffer))
(message-do-actions actions))))
(defun message-disassociate-draft ()
"Disassociate the message buffer from the drafts directory."
- (nndraft-request-expire-articles
- (list message-draft-article) "drafts" nil t))
+ (when message-draft-article
+ (nndraft-request-expire-articles
+ (list message-draft-article) "drafts" nil t)))
\f
nil)
(deffoo nnagent-request-post (&optional server)
- (gnus-request-accept-article "nndraft:draft"))
+ (gnus-request-accept-article "nndraft:drafts"))
;; Use nnml functions for just about everything.
(nnoo-import nnagent
(error "Document is not of any recognized type"))
(if result
(car entry)
- (cadar (sort results (lambda (r1 r2) (< (car r1) (car r2))))))))
+ (cadar (sort results 'car-less-than-car)))))
;;;
;;; Built-in type predicates and functions
(nnoo-declare nndraft
nnmh)
-(defvoo nndraft-directory (nnheader-concat message-directory "drafts/")
+(defvoo nndraft-directory (nnheader-concat message-directory "message-drafts/")
"Where nndraft will store its files."
nnmh-current-directory)
(deffoo nndraft-request-update-info (group info &optional server)
(gnus-info-set-read
info
- (gnus-update-read-articles "nndraft:draft" (nndraft-articles) t))
+ (gnus-update-read-articles "nndraft:drafts" (nndraft-articles) t))
(let (marks)
(when (setq marks (nth 3 info))
(setcar (nthcdr 3 info)
(defun nndraft-articles ()
"Return the list of messages in the group."
(sort
- (mapcar
- (lambda (file)
- (string-to-int file))
- (directory-files nndraft-directory nil "^[0-9]+$" t))
+ (mapcar 'string-to-int
+ (directory-files nndraft-directory nil "\\`[0-9]+\\'" t))
'<))
(nnoo-map-functions nndraft
(setq nnml-article-file-alist
(sort
(nnheader-article-to-file-alist nnml-current-directory)
- (lambda (a1 a2) (< (car a1) (car a2))))))
+ 'car-less-than-car)))
(setq active
(if nnml-article-file-alist
(cons (caar nnml-article-file-alist)
(nnml-generate-nov-databases-1 dir seen))))
;; Do this directory.
(let ((files (sort (nnheader-article-to-file-alist dir)
- (lambda (a b) (< (car a) (car b))))))
+ 'car-less-than-car)))
(when files
(funcall nnml-generate-active-function dir)
;; Generate the nov file.
(url-insert-file-contents more)))
;; Return the articles in the right order.
(setq nnweb-articles
- (sort (nconc nnweb-articles map)
- (lambda (s1 s2) (< (car s1) (car s2)))))))))
+ (sort (nconc nnweb-articles map) 'car-less-than-car))))))
(defun nnweb-dejanews-wash-article ()
(let ((case-fold-search t))
(setq more nil))
;; Return the articles in the right order.
(setq nnweb-articles
- (sort (nconc nnweb-articles map)
- (lambda (s1 s2) (< (car s1) (car s2)))))))))
+ (sort (nconc nnweb-articles map) 'car-less-than-car))))))
(defun nnweb-reference-wash-article ()
(let ((case-fold-search t))
(setq more nil)))
;; Return the articles in the right order.
(setq nnweb-articles
- (sort (nconc nnweb-articles map)
- (lambda (s1 s2) (< (car s1) (car s2))))))))))
+ (sort (nconc nnweb-articles map) 'car-less-than-car)))))))
(defun nnweb-altavista-wash-article ()
(goto-char (point-min))
+Wed Sep 17 02:32:56 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Customizing Threading): Broken up into five nodes.
+ (Article Washing): Addition.
+
+ * message.texi (Various Commands): Add.
+
+Tue Sep 16 04:04:03 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Example Setup): New.
+
Mon Sep 15 23:10:05 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi (Customizing Threading): Addition.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Quassia Gnus 0.5 Manual
+@settitle Quassia Gnus 0.6 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Quassia Gnus 0.5 Manual
+@title Quassia Gnus 0.6 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.5.
+This manual corresponds to Quassia Gnus 0.6.
@end ifinfo
@node Customizing Threading
@subsection Customizing Threading
@cindex customizing threading
+
+@menu
+* Loose Threads:: How Gnus gathers loose threads into bigger threads.
+* Filling In Threads:: Making the threads displayed look fuller.
+* More Threading:: Even more variables for fiddling with threads.
+* Low-Level Threading:: You thought it was over... but you were wrong!
+@end menu
+
+
+@node Loose Threads
+@subsubsection Loose Threads
@cindex <
@cindex >
+@cindex loose threads
@table @code
+@item gnus-summary-make-false-root
+@vindex gnus-summary-make-false-root
+If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
+and create a dummy root at the top. (Wait a minute. Root at the top?
+Yup.) Loose subtrees occur when the real root has expired, or you've
+read or killed the root in a previous session.
-@item gnus-show-threads
-@vindex gnus-show-threads
-If this variable is @code{nil}, no threading will be done, and all of
-the rest of the variables here will have no effect. Turning threading
-off will speed group selection up a bit, but it is sure to make reading
-slower and more awkward.
+When there is no real root of a thread, Gnus will have to fudge
+something. This variable says what fudging method Gnus should use.
+There are four possible values:
-@item gnus-fetch-old-headers
-@vindex gnus-fetch-old-headers
-If non-@code{nil}, Gnus will attempt to build old threads by fetching
-more old headers---headers to articles marked as read. If you
-would like to display as few summary lines as possible, but still
-connect as many loose threads as possible, you should set this variable
-to @code{some} or a number. If you set it to a number, no more than
-that number of extra old headers will be fetched. In either case,
-fetching old headers only works if the backend you are using carries
-overview files---this would normally be @code{nntp}, @code{nnspool} and
-@code{nnml}. Also remember that if the root of the thread has been
-expired by the server, there's not much Gnus can do about that.
+@iftex
+@iflatex
+\gnusfigure{The Summary Buffer}{390}{
+\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}
+\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}
+\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}
+\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}
+}
+@end iflatex
+@end iftex
-@item gnus-build-sparse-threads
-@vindex gnus-build-sparse-threads
-Fetching old headers can be slow. A low-rent similar effect can be
-gotten by setting this variable to @code{some}. Gnus will then look at
-the complete @code{References} headers of all articles and try to string
-together articles that belong in the same thread. This will leave
-@dfn{gaps} in the threading display where Gnus guesses that an article
-is missing from the thread. (These gaps appear like normal summary
-lines. If you select a gap, Gnus will try to fetch the article in
-question.) If this variable is @code{t}, Gnus will display all these
-``gaps'' without regard for whether they are useful for completing the
-thread or not. Finally, if this variable is @code{more}, Gnus won't cut
-off sparse leaf nodes that don't lead anywhere. This variable is
-@code{nil} by default.
+@cindex adopting articles
+
+@table @code
+
+@item adopt
+Gnus will make the first of the orphaned articles the parent. This
+parent will adopt all the other articles. The adopted articles will be
+marked as such by pointy brackets (@samp{<>}) instead of the standard
+square brackets (@samp{[]}). This is the default method.
+
+@item dummy
+@vindex gnus-summary-dummy-line-format
+Gnus will create a dummy summary line that will pretend to be the
+parent. This dummy line does not correspond to any real article, so
+selecting it will just select the first real article after the dummy
+article. @code{gnus-summary-dummy-line-format} is used to specify the
+format of the dummy roots. It accepts only one format spec: @samp{S},
+which is the subject of the article. @xref{Formatting Variables}.
+
+@item empty
+Gnus won't actually make any article the parent, but simply leave the
+subject field of all orphans except the first empty. (Actually, it will
+use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
+Buffer Format}).)
+
+@item none
+Don't make any article parent at all. Just gather the threads and
+display them after one another.
+
+@item nil
+Don't gather loose threads.
+@end table
@item gnus-summary-gather-subject-limit
@vindex gnus-summary-gather-subject-limit
'gnus-gather-threads-by-references)
@end lisp
-@item gnus-summary-make-false-root
-@vindex gnus-summary-make-false-root
-If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
-and create a dummy root at the top. (Wait a minute. Root at the top?
-Yup.) Loose subtrees occur when the real root has expired, or you've
-read or killed the root in a previous session.
-
-When there is no real root of a thread, Gnus will have to fudge
-something. This variable says what fudging method Gnus should use.
-There are four possible values:
+@end table
-@iftex
-@iflatex
-\gnusfigure{The Summary Buffer}{390}{
-\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}
-\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}
-\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}
-\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}
-}
-@end iflatex
-@end iftex
-@cindex adopting articles
+@node Filling In Threads
+@subsubsection Filling In Threads
@table @code
+@item gnus-fetch-old-headers
+@vindex gnus-fetch-old-headers
+If non-@code{nil}, Gnus will attempt to build old threads by fetching
+more old headers---headers to articles marked as read. If you
+would like to display as few summary lines as possible, but still
+connect as many loose threads as possible, you should set this variable
+to @code{some} or a number. If you set it to a number, no more than
+that number of extra old headers will be fetched. In either case,
+fetching old headers only works if the backend you are using carries
+overview files---this would normally be @code{nntp}, @code{nnspool} and
+@code{nnml}. Also remember that if the root of the thread has been
+expired by the server, there's not much Gnus can do about that.
-@item adopt
-Gnus will make the first of the orphaned articles the parent. This
-parent will adopt all the other articles. The adopted articles will be
-marked as such by pointy brackets (@samp{<>}) instead of the standard
-square brackets (@samp{[]}). This is the default method.
+@item gnus-build-sparse-threads
+@vindex gnus-build-sparse-threads
+Fetching old headers can be slow. A low-rent similar effect can be
+gotten by setting this variable to @code{some}. Gnus will then look at
+the complete @code{References} headers of all articles and try to string
+together articles that belong in the same thread. This will leave
+@dfn{gaps} in the threading display where Gnus guesses that an article
+is missing from the thread. (These gaps appear like normal summary
+lines. If you select a gap, Gnus will try to fetch the article in
+question.) If this variable is @code{t}, Gnus will display all these
+``gaps'' without regard for whether they are useful for completing the
+thread or not. Finally, if this variable is @code{more}, Gnus won't cut
+off sparse leaf nodes that don't lead anywhere. This variable is
+@code{nil} by default.
-@item dummy
-@vindex gnus-summary-dummy-line-format
-Gnus will create a dummy summary line that will pretend to be the
-parent. This dummy line does not correspond to any real article, so
-selecting it will just select the first real article after the dummy
-article. @code{gnus-summary-dummy-line-format} is used to specify the
-format of the dummy roots. It accepts only one format spec: @samp{S},
-which is the subject of the article. @xref{Formatting Variables}.
+@end table
-@item empty
-Gnus won't actually make any article the parent, but simply leave the
-subject field of all orphans except the first empty. (Actually, it will
-use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
-Buffer Format}).)
-@item none
-Don't make any article parent at all. Just gather the threads and
-display them after one another.
+@node More Threading
+@subsubsection More Threading
-@item nil
-Don't gather loose threads.
-@end table
+@table @code
+@item gnus-show-threads
+@vindex gnus-show-threads
+If this variable is @code{nil}, no threading will be done, and all of
+the rest of the variables here will have no effect. Turning threading
+off will speed group selection up a bit, but it is sure to make reading
+slower and more awkward.
@item gnus-thread-hide-subtree
@vindex gnus-thread-hide-subtree
This is a number that says how much each sub-thread should be indented.
The default is 4.
+@end table
+
+
+@node Low-Level Threading
+@subsubsection Low-Level Threading
+
+@table @code
+
@item gnus-parse-headers-hook
@vindex gnus-parse-headers-hook
Hook run before parsing any headers. The default value is
(defun my-alter-message-id (header)
(let ((id (mail-header-id header)))
(when (string-match
- "\\(<[^<>@]*\\)\\.?cygnus\\..*@\\([^<>@]*>\\)" id)
+ "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
(mail-header-set-id
- (concat (match-string 1 id) "@" (match-string 2 id))
+ (concat (match-string 1 id) "@@" (match-string 2 id))
header))))
@end lisp
store them in the cache. You should only ever, ever ever ever, use this
command if 1) your connection to the @sc{nntp} server is really, really,
really slow and 2) you have a really, really, really huge disk.
-Seriously.
+Seriously. One way to cut down on the number of articles downloaded is
+to score unwanted articles down and have them marked as read. They will
+not then be downloaded by this command.
@vindex gnus-uncacheable-groups
It is likely that you do not want caching on some groups. For instance,
@c @icon{gnus-summary-caesar-message}
Do a Caesar rotate (rot13) on the article buffer
(@code{gnus-summary-caesar-message}).
+Unreadable articles that tell you to read them with Caesar rotate or rot13.
+(Typically offensive jokes and such.)
+
+It's commonly called ``rot13'' because each letter is rotated 13
+positions in the alphabet, e. g. @samp{B} (letter #2) -> @sam{O} (letter
+#15). It is sometimes referred to as ``Caesar rotate'' because Caesar
+is rumoured to have employed this form of, uh, somewhat weak encryption.
@item W t
@kindex W t (Summary)
* Agent Commands:: New commands for all the buffers.
* Outgoing Messages:: What happens when you post/mail something?
* Agent Variables:: Customizing is fun.
+* Example Setup:: An example @file{.gnus.el} file for offline people.
@end menu
@end table
+@node Example Setup
+@subsection Example Setup
+
+If you don't want to read this manual, and you have a fairly standard
+setup, you may be able to use something like the following as your
+@file{.gnus.el} file to get started.
+
+@lisp
+;;; Define how Gnus is to fetch news. We do this over NNTP
+;;; from your ISP's server.
+(setq gnus-select-method '(nntp "nntp.your-isp.com"))
+
+;;; Define how Gnus is to read your mail. We read mail from
+;;; your ISP's POP server.
+(setenv "MAILSERVER" "pop.your-isp.com")
+(setq nnmail-spool-file "po:username")
+
+;;; Say how Gnus is to store the mail. We use nnml groups.
+(setq gnus-secondary-select-methods '((nnml "")))
+
+;;; Make Gnus into an offline newsreader.
+(gnus-agentize)
+@end lisp
+
+That should be it, basically. Put that in your @file{~/.gnus.el} file,
+edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
+gnus}.
+
+If this is the first time you've run Gnus, you will be subscribed
+automatically to a few default newsgroups. You'll probably want to
+subscribe to more groups, and to do that, you have to query the
+@sc{nntp} server for a complete list of groups with the @kbd{A A}
+command. This usually takes quite a while, but you only have to do it
+once.
+
+After reading and parsing a while, you'll be presented with a list of
+groups. Subscribe to the ones you want to read with the @kbd{u}
+command. @kbd{l} to make all the killed groups disappear after you've
+subscribe to all the groups you want to read. (@kbd{A k} will bring
+back all the killed groups.)
+
+You can now read the groups at once, or you can download the articles
+with the @kbd{J s} command. And then read the rest of this manual to
+find out which of the other gazillion things you want to customize.
+
+
@node Scoring
@chapter Scoring
@cindex scoring
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 0.5 Manual
+@settitle Message 0.6 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Message 0.5 Manual
+@title Message 0.6 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message 0.5. Message is distributed with
+This manual corresponds to Message 0.6. Message is distributed with
the Gnus distribution bearing the same version number as this manual
has.
The text is killed and an ellipsis (@samp{[...]}) will be inserted in
its place.
+@item C-c C-v
+@kindex C-c C-v
+@findex message-delete-not-region
+Delete all text in the body of the message that is outside the region
+(@code{message-delete-not-region}).
+
@item C-c C-t
@kindex C-c C-t
@findex message-insert-to