*** pub/pgnus/lisp/gnus-sum.el Wed Nov 18 02:20:16 1998 --- pgnus/lisp/gnus-sum.el Wed Nov 18 05:02:45 1998 *************** *** 475,480 **** --- 475,493 ---- :group 'gnus-extract-view :type 'boolean) + (defcustom gnus-auto-expirable-marks + (list gnus-killed-mark gnus-del-mark gnus-catchup-mark + gnus-low-score-mark gnus-ancient-mark gnus-read-mark + gnus-souped-mark gnus-duplicate-mark) + "*The list of marks converted into expiration if a group is auto-expirable." + :group 'gnus-summary + :type '(repeat character)) + + (defcustom gnus-inhibit-user-auto-expire nil + "*If non-nil, user marking commands will not mark an article as expirable, even if the group has auto-expire turned on." + :group 'gnus-summary + :type 'boolean) + (defcustom gnus-view-pseudos nil "*If `automatic', pseudo-articles will be viewed automatically. If `not-confirm', pseudos will be viewed automatically, and the user *************** *** 7775,7785 **** (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) ;; Check for auto-expiry. (when (and gnus-newsgroup-auto-expire ! (or (= mark gnus-killed-mark) (= mark gnus-del-mark) ! (= mark gnus-catchup-mark) (= mark gnus-low-score-mark) ! (= mark gnus-ancient-mark) ! (= mark gnus-read-mark) (= mark gnus-souped-mark) ! (= mark gnus-duplicate-mark))) (setq mark gnus-expirable-mark) ;; Let the backend know about the mark change. (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) --- 7788,7794 ---- (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) ;; Check for auto-expiry. (when (and gnus-newsgroup-auto-expire ! (memq mark gnus-auto-expirable-marks)) (setq mark gnus-expirable-mark) ;; Let the backend know about the mark change. (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) *************** *** 7830,7854 **** "Mark ARTICLE with MARK. MARK can be any character. Four MARK strings are reserved: `? ' (unread), `?!' (ticked), `??' (dormant) and `?E' (expirable). ! If MARK is nil, then the default character `?D' is used. If ARTICLE is nil, then the article on the current line will be marked." ;; The mark might be a string. (when (stringp mark) (setq mark (aref mark 0))) ;; If no mark is given, then we check auto-expiring. ! (and (not no-expire) ! gnus-newsgroup-auto-expire ! (or (not mark) ! (and (gnus-characterp mark) ! (or (= mark gnus-killed-mark) (= mark gnus-del-mark) ! (= mark gnus-catchup-mark) (= mark gnus-low-score-mark) ! (= mark gnus-read-mark) (= mark gnus-souped-mark) ! (= mark gnus-duplicate-mark)))) ! (setq mark gnus-expirable-mark)) ! (let* ((mark (or mark gnus-del-mark)) ! (article (or article (gnus-summary-article-number))) ! (old-mark (gnus-summary-article-mark article))) ;; Allow the backend to change the mark. (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) (if (eq mark old-mark) --- 7839,7859 ---- "Mark ARTICLE with MARK. MARK can be any character. Four MARK strings are reserved: `? ' (unread), `?!' (ticked), `??' (dormant) and `?E' (expirable). ! If MARK is nil, then the default character `?r' is used. If ARTICLE is nil, then the article on the current line will be marked." ;; The mark might be a string. (when (stringp mark) (setq mark (aref mark 0))) ;; If no mark is given, then we check auto-expiring. ! (when (null mark) ! (setq mark gnus-del-mark)) ! (when (and (not no-expire) ! gnus-newsgroup-auto-expire ! (memq mark gnus-auto-expirable-marks)) ! (setq mark gnus-expirable-mark)) ! (let ((article (or article (gnus-summary-article-number))) ! (old-mark (gnus-summary-article-mark article))) ;; Allow the backend to change the mark. (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) (if (eq mark old-mark) *************** *** 7993,8006 **** The difference between N and the actual number of articles marked is returned." (interactive "p") ! (gnus-summary-mark-forward n gnus-del-mark t)) (defun gnus-summary-mark-as-read-backward (n) "Mark the N articles as read backwards. The difference between N and the actual number of articles marked is returned." (interactive "p") ! (gnus-summary-mark-forward (- n) gnus-del-mark t)) (defun gnus-summary-mark-as-read (&optional article mark) "Mark current article as read. --- 7998,8011 ---- The difference between N and the actual number of articles marked is returned." (interactive "p") ! (gnus-summary-mark-forward n gnus-del-mark gnus-inhibit-user-auto-expire)) (defun gnus-summary-mark-as-read-backward (n) "Mark the N articles as read backwards. The difference between N and the actual number of articles marked is returned." (interactive "p") ! (gnus-summary-mark-forward (- n) gnus-del-mark gnus-inhibit-user-auto-expire)) (defun gnus-summary-mark-as-read (&optional article mark) "Mark current article as read. *************** *** 8545,8561 **** (let* ((thread (intern (format "gnus-thread-sort-by-%s" predicate))) (article (intern (format "gnus-article-sort-by-%s" predicate))) (gnus-thread-sort-functions ! (list ! (if (not reverse) ! thread ! `(lambda (t1 t2) ! (,thread t2 t1))))) (gnus-article-sort-functions ! (list ! (if (not reverse) ! article ! `(lambda (t1 t2) ! (,article t2 t1))))) (buffer-read-only) (gnus-summary-prepare-hook nil)) ;; We do the sorting by regenerating the threads. --- 8550,8564 ---- (let* ((thread (intern (format "gnus-thread-sort-by-%s" predicate))) (article (intern (format "gnus-article-sort-by-%s" predicate))) (gnus-thread-sort-functions ! (if (not reverse) ! thread ! `(lambda (t1 t2) ! (,thread t2 t1)))) (gnus-article-sort-functions ! (if (not reverse) ! article ! `(lambda (t1 t2) ! (,article t2 t1)))) (buffer-read-only) (gnus-summary-prepare-hook nil)) ;; We do the sorting by regenerating the threads. *** pub/pgnus/lisp/gnus-topic.el Sun Oct 25 23:13:18 1998 --- pgnus/lisp/gnus-topic.el Wed Nov 18 05:02:46 1998 *************** *** 907,912 **** --- 907,913 ---- "=" gnus-topic-select-group "\r" gnus-topic-select-group " " gnus-topic-read-group + "\C-c\C-x" gnus-topic-expire-articles "\C-k" gnus-topic-kill-group "\C-y" gnus-topic-yank-group "\M-g" gnus-topic-get-new-news-this-topic *************** *** 1039,1044 **** --- 1040,1058 ---- (interactive "e") (mouse-set-point e) (gnus-topic-read-group nil)) + + (defun gnus-topic-expire-articles (topic) + "Expire articles in this topic or group." + (interactive (list (gnus-group-topic-name))) + (if (not topic) + (call-interactively 'gnus-group-expire-articles) + (save-excursion + (gnus-message 5 "Expiring groups in %s..." topic) + (let ((gnus-group-marked + (mapcar (lambda (entry) (car (nth 2 entry))) + (gnus-topic-find-groups topic gnus-level-killed t)))) + (gnus-group-expire-articles nil)) + (gnus-message 5 "Expiring groups in %s...done" topic)))) (defun gnus-topic-read-group (&optional all no-article group) "Read news in this newsgroup. *** pub/pgnus/lisp/gnus.el Wed Nov 18 02:20:16 1998 --- pgnus/lisp/gnus.el Wed Nov 18 05:02:46 1998 *************** *** 254,260 **** :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "0.49" "Version number for this version of Gnus.") (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number) --- 254,260 ---- :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "0.50" "Version number for this version of Gnus.") (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number) *************** *** 2684,2689 **** --- 2684,2690 ---- (let ((opened gnus-opened-servers)) (while (and method opened) (when (and (equal (cadr method) (cadaar opened)) + (equal (car method) (caaar opened)) (not (equal method (caar opened)))) (setq method nil)) (pop opened)) *** pub/pgnus/lisp/mm-decode.el Sun Nov 8 01:04:36 1998 --- pgnus/lisp/mm-decode.el Wed Nov 18 05:02:46 1998 *************** *** 50,56 **** ("image/png" mm-inline-image (featurep 'png)) ("image/gif" mm-inline-image (featurep 'gif)) ("image/tiff" mm-inline-image (featurep 'tiff)) ! ("image/xbm" mm-inline-image (eq (device-type) 'x)) ("image/xpm" mm-inline-image (featurep 'xpm)) ("image/bmp" mm-inline-image (featurep 'bmp)) ("text/plain" mm-inline-text t) --- 50,57 ---- ("image/png" mm-inline-image (featurep 'png)) ("image/gif" mm-inline-image (featurep 'gif)) ("image/tiff" mm-inline-image (featurep 'tiff)) ! ("image/xbm" mm-inline-image (and (fboundp 'device-type) ! (eq (device-type) 'x))) ("image/xpm" mm-inline-image (featurep 'xpm)) ("image/bmp" mm-inline-image (featurep 'bmp)) ("text/plain" mm-inline-text t) *************** *** 73,79 **** (defvar mm-user-automatic-display '("text/plain" "text/enriched" "text/richtext" "text/html" "image/gif" ! "message/delivery-status" "multipart/.*")) (defvar mm-alternative-precedence '("text/plain" "text/enriched" "text/richtext" "text/html") --- 74,80 ---- (defvar mm-user-automatic-display '("text/plain" "text/enriched" "text/richtext" "text/html" "image/gif" ! "image/jpeg" "message/delivery-status" "multipart/.*")) (defvar mm-alternative-precedence '("text/plain" "text/enriched" "text/richtext" "text/html") *** pub/pgnus/lisp/mml.el Wed Nov 18 02:20:17 1998 --- pgnus/lisp/mml.el Wed Nov 18 05:02:46 1998 *************** *** 97,107 **** (buffer-substring beg (goto-char (point-max)))))) (defvar mml-boundary nil) (defun mml-generate-mime () "Generate a MIME message based on the current MML document." ! (setq mml-boundary "=-=-=") ! (let ((cont (mml-parse))) (with-temp-buffer (if (and (consp (car cont)) (= (length cont) 1)) --- 97,109 ---- (buffer-substring beg (goto-char (point-max)))))) (defvar mml-boundary nil) + (defvar mml-multipart-number 0) (defun mml-generate-mime () "Generate a MIME message based on the current MML document." ! (setq mml-boundary "-=-=") ! (let ((cont (mml-parse)) ! (mml-multipart-number 0)) (with-temp-buffer (if (and (consp (car cont)) (= (length cont) 1)) *************** *** 134,140 **** (if (setq filename (cdr (assq 'filename cont))) (insert-file-contents-literally filename) (insert (cdr (assq 'contents cont)))) ! (setq coded (buffer-string)))) (when (or charset (not (equal type "text/plain"))) (insert "Content-Type: " type) --- 136,143 ---- (if (setq filename (cdr (assq 'filename cont))) (insert-file-contents-literally filename) (insert (cdr (assq 'contents cont)))) ! (setq encoding (mm-encode-buffer type) ! coded (buffer-string)))) (when (or charset (not (equal type "text/plain"))) (insert "Content-Type: " type) *************** *** 146,167 **** (insert "\n") (insert coded))) ((eq (car cont) 'multipart) ! (let ((mml-boundary (concat "=" mml-boundary))) (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n" (or (cdr (assq 'type cont)) "mixed") mml-boundary)) (insert "\n") (setq cont (cddr cont)) (while cont ! (unless (bolp) ! (insert "\n")) ! (insert "--" mml-boundary "\n") (mml-generate-mime-1 (pop cont))) ! (unless (bolp) ! (insert "\n")) ! (insert "--" mml-boundary "--\n"))) (t (error "Invalid element: %S" cont)))) (provide 'mml) --- 149,193 ---- (insert "\n") (insert coded))) ((eq (car cont) 'multipart) ! (let ((mml-boundary (mml-compute-boundary cont))) (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n" (or (cdr (assq 'type cont)) "mixed") mml-boundary)) (insert "\n") (setq cont (cddr cont)) (while cont ! (insert "\n--" mml-boundary "\n") (mml-generate-mime-1 (pop cont))) ! (insert "\n--" mml-boundary "--\n"))) (t (error "Invalid element: %S" cont)))) + + (defun mml-compute-boundary (cont) + "Return a unique boundary that does not exist in CONT." + (let ((mml-boundary (concat (make-string (incf mml-multipart-number) ?=) + mml-boundary))) + ;; This function tries again and again until it has found + ;; a unique boundary. + (while (not (catch 'not-unique + (mml-compute-boundary-1 cont)))) + mml-boundary)) + + (defun mml-compute-boundary-1 (cont) + (cond + ((eq (car cont) 'part) + (with-temp-buffer + (if (setq filename (cdr (assq 'filename cont))) + (insert-file-contents-literally filename) + (insert (cdr (assq 'contents cont)))) + (goto-char (point-min)) + (when (re-search-forward (concat "^--" mml-boundary) nil t) + (setq mml-boundary + (concat (make-string (incf mml-multipart-number) ?=) + mml-boundary)) + (throw 'not-unique nil)))) + ((eq (car cont) 'multipart) + (mapcar 'mml-compute-boundary-1 (cddr cont)))) + t) (provide 'mml) *** pub/pgnus/lisp/ChangeLog Wed Nov 18 02:20:15 1998 --- pgnus/lisp/ChangeLog Wed Nov 18 05:02:45 1998 *************** *** 1,3 **** --- 1,59 ---- + Wed Nov 18 05:06:44 1998 Lars Magne Ingebrigtsen + + * gnus.el: Pterodactyl Gnus v0.50 is released. + + 1998-11-18 04:42:01 Lars Magne Ingebrigtsen + + * mm-decode.el (mm-inline-media-tests): Check that device-type is + fbound. + + * gnus-sum.el (gnus-summary-sort): Didn't do reverse. + + 1998-11-07 23:39:48 Simon Josefsson + + * gnus.el (gnus-similar-server-opened): Compare backend. + + 1998-11-08 03:37:42 Simon Josefsson + + * gnus-topic.el (gnus-topic-expire-articles): New function. + (gnus-topic-mode-map): Bind it. + + * gnus.texi (Topic Commands): New expiry command. Reordered. + + 1998-11-10 Miles Bader + + * gnus-sum.el + (gnus-auto-expirable-marks): New variable. + (gnus-inhibit-user-auto-expire): New variable. + (gnus-summary-mark-article-as-read, gnus-summary-mark-article): + When looking to see if we should expire instead, check + gnus-auto-expirable-marks instead of using a hard-wired list. + (gnus-summary-mark-as-read-forward, + gnus-summary-mark-as-read-backward): + Pass gnus-inhibit-user-auto-expire for the no-expire argument to + gnus-summary-mark-forward, instead of `t'. + + 1998-11-18 03:30:26 Lars Magne Ingebrigtsen + + * mml.el (mml-compute-boundary): New function. + (mml-compute-boundary-1): New function. + (mml-generate-mime-1): Use it. + + 1998-11-18 Hrvoje Niksic + + * mml.el (mml-generate-mime-1): Always precede closing boundary + with newline. + + 1998-11-18 02:36:37 Lars Magne Ingebrigtsen + + * mml.el (mml-generate-mime-1): Do right boundaries when several + multiparts. + + * mm-decode.el (mm-user-automatic-display): Default to inline + jpeg. + + * mml.el (mml-generate-mime-1): Encode non-text parts. + Wed Nov 18 02:22:23 1998 Lars Magne Ingebrigtsen * gnus.el: Pterodactyl Gnus v0.49 is released. *** pub/pgnus/texi/gnus.texi Wed Nov 18 02:20:19 1998 --- pgnus/texi/gnus.texi Wed Nov 18 05:02:48 1998 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Pterodactyl Gnus 0.49 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Pterodactyl Gnus 0.50 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 318,324 **** @tex @titlepage ! @title Pterodactyl Gnus 0.49 Manual @author by Lars Magne Ingebrigtsen @page --- 318,324 ---- @tex @titlepage ! @title Pterodactyl Gnus 0.50 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 354,360 **** spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Pterodactyl Gnus 0.49. @end ifinfo --- 354,360 ---- spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Pterodactyl Gnus 0.50. @end ifinfo *************** *** 2738,2754 **** Remove the process mark from all groups in the current topic (@code{gnus-topic-unmark-topic}). - @item RET - @kindex RET (Topic) - @findex gnus-topic-select-group - @itemx SPACE - Either select a group or fold a topic (@code{gnus-topic-select-group}). - When you perform this command on a group, you'll enter the group, as - usual. When done on a topic line, the topic will be folded (if it was - visible) or unfolded (if it was folded already). So it's basically a - toggling command on topics. In addition, if you give a numerical - prefix, group on that level (and lower) will be displayed. - @item T TAB @itemx TAB @kindex T TAB (Topic) --- 2738,2743 ---- *************** *** 2764,2769 **** --- 2753,2775 ---- ``Un-indent'' the current topic so that it becomes a sub-topic of the parent of its current parent (@code{gnus-topic-unindent}). + @item RET + @kindex RET (Topic) + @findex gnus-topic-select-group + @itemx SPACE + Either select a group or fold a topic (@code{gnus-topic-select-group}). + When you perform this command on a group, you'll enter the group, as + usual. When done on a topic line, the topic will be folded (if it was + visible) or unfolded (if it was folded already). So it's basically a + toggling command on topics. In addition, if you give a numerical + prefix, group on that level (and lower) will be displayed. + + @item C-c C-x + @kindex C-c C-x (Topic) + @findex gnus-topic-expire-articles + Run all expirable articles in the current group or topic through the expiry + process (if any) (@code{gnus-topic-expire-articles}). + @item C-k @kindex C-k (Topic) @findex gnus-topic-kill-group *************** *** 10248,10253 **** --- 10254,10264 ---- with! So there! Most people make most of their mail groups total-expirable, though. + + @vindex gnus-inhibit-user-auto-expire + If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking + commands will not mark an article as expirable, even if the group has + auto-expire turned on. @node Washing Mail *** pub/pgnus/texi/message.texi Wed Nov 18 02:20:19 1998 --- pgnus/texi/message.texi Wed Nov 18 05:02:48 1998 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Pterodactyl Message 0.49 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Pterodactyl Message 0.50 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 42,48 **** @tex @titlepage ! @title Pterodactyl Message 0.49 Manual @author by Lars Magne Ingebrigtsen @page --- 42,48 ---- @tex @titlepage ! @title Pterodactyl Message 0.50 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 83,89 **** * Key Index:: List of Message mode keys. @end menu ! This manual corresponds to Pterodactyl Message 0.49. Message is distributed with the Gnus distribution bearing the same version number as this manual. --- 83,89 ---- * Key Index:: List of Message mode keys. @end menu ! This manual corresponds to Pterodactyl Message 0.50. Message is distributed with the Gnus distribution bearing the same version number as this manual. *** pub/pgnus/texi/ChangeLog Wed Nov 18 02:20:19 1998 --- pgnus/texi/ChangeLog Wed Nov 18 05:02:49 1998 *************** *** 1,6 **** --- 1,7 ---- 1998-11-18 00:52:46 Lars Magne Ingebrigtsen * gnus.texi (MIME Commands): Addition. + (Expiring Mail): Addition. 1998-11-07 17:18:07 Lars Magne Ingebrigtsen