+Sun Aug 9 19:37:40 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Gnus v5.6.31 is released.
+
+1998-08-09 François Pinard <pinard@iro.umontreal.ca>
+
+ * nndoc.el: Split MIME multipart messages, maybe recursively.
+ (nndoc-mime-parts-type-p, nndoc-transform-mime-parts,
+ nndoc-generate-mime-parts-head, nndoc-dissect-mime-parts,
+ nndoc-dissect-mime-parts-sub): New functions.
+
+ * nndoc.el: Quoting boundaries is optional, for multipart digests.
+
+1998-08-09 17:51:25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-agent-save-group-info): Check whether file
+ exists.
+
+ * message.el (message-goto-signature): Return nil if no sig.
+ (message-delete-not-region): Delete properly if no sig.
+
+1998-08-09 17:26:30 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-srvr.el (gnus-browse-make-menu-bar): select did read
+
+1998-08-09 15:51:43 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (t): Added keystroke for W W C.
+
+ * gnus-cite.el (gnus-article-hide-citation-maybe): hiden->hidden.
+
Sun Aug 9 15:46:16 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Gnus v5.6.30 is released.
(file (gnus-agent-lib-file "active")))
(gnus-make-directory (file-name-directory file))
(nnheader-temp-write file
- (insert-file-contents file)
+ (when (file-exists-p file)
+ (insert-file-contents file))
(goto-char (point-min))
(when (re-search-forward (concat "^" (regexp-quote group) " ") nil t)
(gnus-delete-line))
;;; gnus-cite.el --- parse citations in articles for Gnus
;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc.
-;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
-;; Keywords: news, mail
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; Author: Per Abhiddenware; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
(atts gnus-cite-attribution-alist)
(buffer-read-only nil)
(inhibit-point-motion-hooks t)
- (hiden 0)
+ (hidden 0)
total)
(goto-char (point-max))
(gnus-article-search-signature)
(setq total (count-lines start (point)))
(while atts
- (setq hiden (+ hiden (length (cdr (assoc (cdar atts)
- gnus-cite-prefix-alist))))
+ (setq hidden (+ hidden (length (cdr (assoc (cdar atts)
+ gnus-cite-prefix-alist))))
atts (cdr atts)))
(when (or force
- (and (> (* 100 hiden) (* gnus-cite-hide-percentage total))
- (> hiden gnus-cite-hide-absolute)))
+ (and (> (* 100 hidden) (* gnus-cite-hide-percentage total))
+ (> hidden gnus-cite-hide-absolute)))
(setq atts gnus-cite-attribution-alist)
(while atts
(setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist))
atts (cdr atts))
(while total
- (setq hiden (car total)
+ (setq hidden (car total)
total (cdr total))
- (goto-line hiden)
- (unless (assq hiden gnus-cite-attribution-alist)
+ (goto-line hidden)
+ (unless (assq hidden gnus-cite-attribution-alist)
(gnus-add-text-properties
(point) (progn (forward-line 1) (point))
(nconc (list 'article-type 'cite)
'("Browse"
["Subscribe" gnus-browse-unsubscribe-current-group t]
["Read" gnus-browse-read-group t]
- ["Select" gnus-browse-read-group t]
+ ["Select" gnus-browse-select-group t]
["Next" gnus-browse-next-group t]
["Prev" gnus-browse-next-group t]
["Exit" gnus-browse-exit t]))
"b" gnus-article-hide-boring-headers
"s" gnus-article-hide-signature
"c" gnus-article-hide-citation
+ "C" gnus-article-hide-citation-in-followups
"p" gnus-article-hide-pgp
"P" gnus-article-hide-pem
"\C-c" gnus-article-hide-citation-maybe)
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "5.6.30"
+(defconst gnus-version-number "5.6.31"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Gnus v%s" gnus-version-number)
(search-forward (concat "\n" mail-header-separator "\n") nil t))
(defun message-goto-signature ()
- "Move point to the beginning of the message signature."
+ "Move point to the beginning of the message signature.
+If there is no signature in the article, go to the end and
+return nil."
(interactive)
(goto-char (point-min))
(if (re-search-forward message-signature-separator nil t)
(forward-line 1)
- (goto-char (point-max))))
+ (goto-char (point-max))
+ nil))
\f
(interactive "r")
(save-excursion
(goto-char end)
- (delete-region (point) (progn (message-goto-signature)
- (forward-line -2)
- (point)))
+ (delete-region (point) (if (not (message-goto-signature))
+ (point)
+ (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))
+ (when (message-goto-signature)
+ (forward-line -2)))
(defun message-kill-to-signature ()
"Deletes all text up to the signature."
(defvoo nndoc-article-type 'guess
"*Type of the file.
One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward',
-`rfc934', `rfc822-forward', `mime-digest', `standard-digest',
+`rfc934', `rfc822-forward', `mime-digest', `mime-parts', `standard-digest',
`slack-digest', `clari-briefs' or `guess'.")
(defvoo nndoc-post-type 'mail
(article-begin . "^--.*\n+")
(body-end . "^--.*$")
(prepare-body-function . nndoc-unquote-dashes))
+ (mime-parts
+ (generate-head-function . nndoc-generate-mime-parts-head)
+ (article-transform-function . nndoc-transform-mime-parts))
(clari-briefs
(article-begin . "^ \\*")
(body-end . "^\t------*[ \t]^*\n^ \\*")
(subtype nil))))
\f
-
(defvoo nndoc-file-begin nil)
(defvoo nndoc-first-article nil)
(defvoo nndoc-article-begin nil)
(defvoo nndoc-body-begin-function nil)
(defvoo nndoc-head-begin-function nil)
(defvoo nndoc-body-end nil)
+;; nndoc-dissection-alist is a list of sublists. Each sublist holds the
+;; following items. ARTICLE is an ordinal starting at 1. HEAD-BEGIN,
+;; HEAD-END, BODY-BEGIN and BODY-END are positions in the `nndoc' buffer.
+;; LINE-COUNT is a count of lines in the body. SUBJECT, MESSAGE-ID and
+;; REFERENCES, only present for MIME dissections, are field values.
(defvoo nndoc-dissection-alist nil)
(defvoo nndoc-prepare-body-function nil)
(defvoo nndoc-generate-head-function nil)
(defvoo nndoc-current-buffer nil
"Current nndoc news buffer.")
(defvoo nndoc-address nil)
+(defvoo nndoc-mime-header nil)
+(defvoo nndoc-mime-subject nil)
(defconst nndoc-version "nndoc 1.0"
"nndoc version.")
(save-excursion
(set-buffer nndoc-current-buffer)
(nndoc-set-delims)
- (nndoc-dissect-buffer)))
+ (if (eq nndoc-article-type 'mime-parts)
+ (nndoc-dissect-mime-parts)
+ (nndoc-dissect-buffer))))
(unless nndoc-current-buffer
(nndoc-close-server))
;; Return whether we managed to select a file.
(defun nndoc-rfc822-forward-body-end-function ()
(goto-char (point-max)))
+(defun nndoc-mime-parts-type-p ()
+ (let ((case-fold-search t)
+ (limit (search-forward "\n\n" nil t)))
+ (goto-char (point-min))
+ (when (and limit
+ (re-search-forward
+ (concat "\
+^Content-Type:[ \t]*multipart/[a-z]+;\\(.*;\\)*"
+ "[ \t\n]*[ \t]boundary=\"?[^\"\n]*[^\" \t\n]")
+ limit t))
+ t)))
+
+(defun nndoc-transform-mime-parts (article)
+ (unless (= article 1)
+ ;; Ensure some MIME-Version.
+ (goto-char (point-min))
+ (search-forward "\n\n")
+ (let ((case-fold-search nil)
+ (limit (point)))
+ (goto-char (point-min))
+ (or (save-excursion (re-search-forward "^MIME-Version:" limit t))
+ (insert "Mime-Version: 1.0\n")))
+ ;; Generate default header before entity fields.
+ (goto-char (point-min))
+ (nndoc-generate-mime-parts-head article t)))
+
+(defun nndoc-generate-mime-parts-head (article &optional full-subject)
+ (let ((entry (cdr (assq article nndoc-dissection-alist))))
+ (let ((subject (concat "<" (nth 5 entry) ">"))
+ (message-id (nth 6 entry))
+ (references (nth 7 entry)))
+ (insert nndoc-mime-header
+ "Subject: "
+ (cond ((not full-subject) subject)
+ (nndoc-mime-subject (concat nndoc-mime-subject " " subject))
+ (t subject))
+ "\n")
+ (and message-id (insert "Message-ID: " message-id "\n"))
+ (and references (insert "References: " references "\n")))))
+
(defun nndoc-clari-briefs-type-p ()
(when (let ((case-fold-search nil))
(re-search-forward "^\t[^a-z]+ ([^a-z]+) --" nil t))
(when (and
(re-search-forward
(concat "^Content-Type: *multipart/digest;[ \t\n]*[ \t]"
- "boundary=\"\\([^\"\n]*[^\" \t\n]\\)\"")
+ "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)")
nil t)
(match-beginning 1))
(setq boundary-id (match-string 1)
(while (re-search-forward "^- -"nil t)
(replace-match "-" t t)))
+;; Against compiler warnings.
+(defvar nndoc-mime-split-ordinal)
+
+(defun nndoc-dissect-mime-parts ()
+ "Go through a MIME composite article and partition it into sub-articles.
+When a MIME entity contains sub-entities, dissection produces one article for
+the header of this entity, and one article per sub-entity."
+ (setq nndoc-dissection-alist nil
+ nndoc-mime-split-ordinal 0)
+ (save-excursion
+ (set-buffer nndoc-current-buffer)
+ (message-narrow-to-head)
+ (let ((case-fold-search t)
+ (message-id (message-fetch-field "Message-ID"))
+ (references (message-fetch-field "References")))
+ (setq nndoc-mime-header (buffer-substring (point-min) (point-max))
+ nndoc-mime-subject (message-fetch-field "Subject"))
+ (while (string-match "\
+^\\(Subject\\|Message-ID\\|References\\|Lines\\|\
+MIME-Version\\|Content-Type\\|Content-Transfer-Encoding\\|\
+\\):.*\n\\([ \t].*\n\\)*"
+ nndoc-mime-header)
+ (setq nndoc-mime-header (replace-match "" t t nndoc-mime-header)))
+ (widen)
+ (nndoc-dissect-mime-parts-sub (point-min) (point-max)
+ nil message-id references))))
+
+(defun nndoc-dissect-mime-parts-sub (begin end position message-id references)
+ "Dissect an entity within a composite MIME message.
+The article, which corresponds to a MIME entity, extends from BEGIN to END.
+The string POSITION holds a dotted decimal representation of the article
+position in the hierarchical structure, it is nil for the outer entity.
+The generated article should use MESSAGE-ID and REFERENCES field values."
+ ;; Note: `case-fold-search' is already `t' from the calling function.
+ (let ((head-begin begin)
+ (body-end end)
+ head-end body-begin type subtype composite comment)
+ (save-excursion
+ ;; Gracefully handle a missing body.
+ (goto-char head-begin)
+ (if (search-forward "\n\n" body-end t)
+ (setq head-end (1- (point))
+ body-begin (point))
+ (setq head-end end
+ body-begin end))
+ ;; Save MIME attributes.
+ (goto-char head-begin)
+ (if (re-search-forward "\
+^Content-Type: *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)"
+ head-end t)
+ (setq type (downcase (match-string 1))
+ subtype (downcase (match-string 2)))
+ (setq type "text"
+ subtype "plain"))
+ (setq composite (string= type "multipart")
+ comment (concat position
+ (when (and position composite) ".")
+ (when composite "*")
+ (when (or position composite) " ")
+ (cond ((string= subtype "plain") type)
+ ((string= subtype "basic") type)
+ (t subtype))))
+ ;; Generate dissection information for this entity.
+ (push (list (incf nndoc-mime-split-ordinal)
+ head-begin head-end body-begin body-end
+ (count-lines body-begin body-end)
+ comment message-id references)
+ nndoc-dissection-alist)
+ ;; Recurse for all sub-entities, if any.
+ (goto-char head-begin)
+ (when (re-search-forward
+ (concat "\
+^Content-Type: *multipart/\\([a-z]+\\);\\(.*;\\)*"
+ "[ \t\n]*[ \t]boundary=\"?\\([^\"\n]*[^\" \t\n]\\)")
+ head-end t)
+ (let ((boundary (concat "\n--" (match-string 3) "\\(--\\)?[ \t]*\n"))
+ (part-counter 0)
+ begin end eof-flag)
+ (goto-char head-end)
+ (setq eof-flag (not (re-search-forward boundary body-end t)))
+ (while (not eof-flag)
+ (setq begin (point))
+ (cond ((re-search-forward boundary body-end t)
+ (or (not (match-string 1))
+ (string= (match-string 1) "")
+ (setq eof-flag t))
+ (forward-line -1)
+ (setq end (point))
+ (forward-line 1))
+ (t (setq end body-end
+ eof-flag t)))
+ (nndoc-dissect-mime-parts-sub begin end
+ (concat position (when position ".")
+ (format "%d"
+ (incf part-counter)))
+ (nnmail-message-id)
+ message-id)))))))
+
;;;###autoload
(defun nndoc-add-type (definition &optional position)
"Add document DEFINITION to the list of nndoc document definitions.
-@echo off\r
-\r
-rem Written by David Charlap <shamino@writeme.com>\r
-\r
-rem There are two catches, however. The emacs.bat batch file may not exist\r
-rem in all distributions. It is part of the Voelker build of Emacs 19.34\r
-rem (http://www.cs.washington.edu/homes/voelker/ntemacs.html). If the user\r
-rem installs Gnus with some other build, he may have to replace calls to\r
-rem %1\emacs.bat with something else.\r
-rem \r
-rem Also, the emacs.bat file that Voelker ships does not accept more than 9\r
-rem parameters, so the attempts to compile the .texi files will fail. To\r
-rem fix that (at least on NT. I don't know about Win95), the following\r
-rem change should be made to emacs.bat:\r
-rem \r
-rem %emacs_dir%\bin\emacs.exe %1 %2 %3 %4 %5 %6 %7 %8 %9\r
-rem \r
-rem should become\r
-rem \r
-rem %emacs_dir%\bin\emacs.exe %*\r
-rem \r
-rem which will allow the batch file to accept an unlimited number of\r
-rem parameters.\r
-\r
-if "%1" == "" goto usage\r
-\r
-cd lisp\r
-call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile\r
-if not "%2" == "copy" goto info\r
-copy *.el* %1\lisp\r
-\r
-:info\r
-cd ..\texi\r
-call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
-call %1\bin\emacs.bat -batch -q -no-site-file message.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
-if not "%2" == "copy" goto done\r
-copy gnus %1\info\r
-copy gnus-?? %1\info\r
-copy message %1\info\r
-\r
-:etc\r
-cd ..\etc\r
-copy gnus-tut.txt %1\etc\r
-\r
-:done\r
-cd ..\r
-goto end\r
-\r
-:usage\r
-echo Usage: make ^<emacs-dir^> [copy]\r
-echo.\r
-echo where: ^<emacs-dir^> is the directory you installed emacs in\r
-echo eg. d:\emacs\19.34\r
-echo copy indicates that the compiled files should be copied to your\r
-echo emacs lisp, info, and etc directories\r
-\r
-:end\r
+@echo off
+
+rem Written by David Charlap <shamino@writeme.com>
+
+rem There are two catches, however. The emacs.bat batch file may not exist
+rem in all distributions. It is part of the Voelker build of Emacs 19.34
+rem (http://www.cs.washington.edu/homes/voelker/ntemacs.html). If the user
+rem installs Gnus with some other build, he may have to replace calls to
+rem %1\emacs.bat with something else.
+rem
+rem Also, the emacs.bat file that Voelker ships does not accept more than 9
+rem parameters, so the attempts to compile the .texi files will fail. To
+rem fix that (at least on NT. I don't know about Win95), the following
+rem change should be made to emacs.bat:
+rem
+rem %emacs_dir%\bin\emacs.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
+rem
+rem should become
+rem
+rem %emacs_dir%\bin\emacs.exe %*
+rem
+rem which will allow the batch file to accept an unlimited number of
+rem parameters.
+
+if "%1" == "" goto usage
+
+cd lisp
+call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile
+if not "%2" == "copy" goto info
+copy *.el* %1\lisp
+
+:info
+cd ..\texi
+call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer
+call %1\bin\emacs.bat -batch -q -no-site-file message.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer
+if not "%2" == "copy" goto done
+copy gnus %1\info
+copy gnus-?? %1\info
+copy message %1\info
+
+:etc
+cd ..\etc
+copy gnus-tut.txt %1\etc
+
+:done
+cd ..
+goto end
+
+:usage
+echo Usage: make ^<emacs-dir^> [copy]
+echo.
+echo where: ^<emacs-dir^> is the directory you installed emacs in
+echo eg. d:\emacs\19.34
+echo copy indicates that the compiled files should be copied to your
+echo emacs lisp, info, and etc directories
+
+:end
1998-08-09 15:32:24 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (Hiding Headers): Fix.
+ (Article Hiding): Addition.
+ (Document Groups): Addition.
1998-08-08 06:06:37 Lars Magne Ingebrigtsen <larsi@gnus.org>
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Gnus 5.6.30 Manual
+@settitle Gnus 5.6.31 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Gnus 5.6.30 Manual
+@title Gnus 5.6.31 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 Gnus 5.6.30.
+This manual corresponds to Gnus 5.6.31.
@end ifinfo
@item W W a
@kindex W W a (Summary)
@findex gnus-article-hide
-Do maximum hiding on the summary buffer (@kbd{gnus-article-hide}).
+Do quote a lot of hiding on the article buffer
+(@kbd{gnus-article-hide}). In particular, this function will hide
+headers, PGP, cited text and the signature.
@item W W h
@kindex W W h (Summary)
@table @code
-@item gnus-cite-hide-percentage
-@vindex gnus-cite-hide-percentage
-If the cited text is of a bigger percentage than this variable (default
-50), hide the cited text.
-
-@item gnus-cite-hide-absolute
-@vindex gnus-cite-hide-absolute
-The cited text must have at least this length (default 10) before it
-is hidden.
-
@item gnus-cited-text-button-line-format
@vindex gnus-cited-text-button-line-format
Gnus adds buttons to show where the cited text has been hidden, and to
@end table
+@item W W C-c
+@kindex W W C-c (Summary)
+@findex gnus-article-hide-citation-maybe
+
+Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
+following two variables:
+
+@table @code
+@item gnus-cite-hide-percentage
+@vindex gnus-cite-hide-percentage
+If the cited text is of a bigger percentage than this variable (default
+50), hide the cited text.
+
+@item gnus-cite-hide-absolute
+@vindex gnus-cite-hide-absolute
+The cited text must have at least this length (default 10) before it
+is hidden.
+@end table
+
@item W W C
@kindex W W C (Summary)
@findex gnus-article-hide-citation-in-followups
@item forward
Forwarded articles.
+@item mime-parts
+MIME multipart messages, besides digests.
+
@item mime-digest
@cindex digest
@cindex MIME digest
@vindex nndoc-article-type
This should be one of @code{mbox}, @code{babyl}, @code{digest},
@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
-@code{rfc822-forward}, @code{mime-digest}, @code{standard-digest},
-@code{slack-digest}, @code{clari-briefs} or @code{guess}.
+@code{rfc822-forward}, @code{mime-parts}, @code{mime-digest},
+@code{standard-digest}, @code{slack-digest}, @code{clari-briefs} or
+@code{guess}.
@item nndoc-post-type
@vindex nndoc-post-type
January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
On September 13th 1997, Quassia Gnus was started and lasted 37
-releases. If was released as ``Gnus 5.6.30' on March 8th 1998.
+releases. If was released as ``Gnus 5.6.31' on March 8th 1998.
If you happen upon a version of Gnus that has a prefixed name --
``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' --
* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
* September Gnus:: The Thing Formally Known As Gnus 5.3/5.3.
* Red Gnus:: Third time best---Gnus 5.4/5.5.
-* Quassia Gnus:: Two times two is four, or Gnus 5.6.30.
+* Quassia Gnus:: Two times two is four, or Gnus 5.6.31.
@end menu
These lists are, of course, just @emph{short} overviews of the
@node Quassia Gnus
@subsubsection Quassia Gnus
-New features in Gnus 5.6.30:
+New features in Gnus 5.6.31:
@itemize @bullet
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 5.6.30 Manual
+@settitle Message 5.6.31 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Message 5.6.30 Manual
+@title Message 5.6.31 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message 5.6.30. Message is distributed with
+This manual corresponds to Message 5.6.31. Message is distributed with
the Gnus distribution bearing the same version number as this manual
has.