*** pub/pgnus/lisp/gnus-art.el Sat May 1 22:33:10 1999 --- pgnus/lisp/gnus-art.el Sat Jun 12 02:21:36 1999 *************** *** 193,199 **** :group 'gnus-article-hiding) (defcustom gnus-article-x-face-command ! "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | xv -quit -" "*String or function to be executed to display an X-Face header. If it is a string, the command will be executed in a sub-shell asynchronously. The compressed face will be piped to this command." --- 193,199 ---- :group 'gnus-article-hiding) (defcustom gnus-article-x-face-command ! "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | eae -" "*String or function to be executed to display an X-Face header. If it is a string, the command will be executed in a sub-shell asynchronously. The compressed face will be piped to this command." *************** *** 890,895 **** --- 890,896 ---- (gnus-treat-fill-long-lines gnus-article-fill-long-lines) (gnus-treat-strip-cr gnus-article-remove-cr) (gnus-treat-emphasize gnus-article-emphasize) + (gnus-treat-display-xface gnus-article-display-x-face) (gnus-treat-hide-headers gnus-article-maybe-hide-headers) (gnus-treat-hide-boring-headers gnus-article-hide-boring-headers) (gnus-treat-hide-signature gnus-article-hide-signature) *************** *** 914,920 **** (gnus-treat-strip-blank-lines gnus-article-strip-blank-lines) (gnus-treat-overstrike gnus-article-treat-overstrike) (gnus-treat-buttonize-head gnus-article-add-buttons-to-head) - (gnus-treat-display-xface gnus-article-display-x-face) (gnus-treat-display-smileys gnus-smiley-display) (gnus-treat-display-picons gnus-article-display-picons) (gnus-treat-play-sounds gnus-earcon-display))) --- 915,920 ---- *************** *** 1781,1786 **** --- 1781,1788 ---- (delete-region (progn (beginning-of-line) (point)) (progn (forward-line 1) (point)))) (setq newline nil)) + (if (re-search-forward tdate-regexp nil t) + (forward-line 1)) (insert (article-make-date-line date type)) (when newline (insert "\n") *** pub/pgnus/lisp/gnus-cite.el Sun Apr 18 14:44:05 1999 --- pgnus/lisp/gnus-cite.el Sat Jun 12 02:21:36 1999 *************** *** 104,110 **** :type 'integer) (defcustom gnus-cite-attribution-prefix ! "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\| > -----Original Message-----" "*Regexp matching the beginning of an attribution line." :group 'gnus-cite :type 'regexp) --- 104,110 ---- :type 'integer) (defcustom gnus-cite-attribution-prefix ! "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\|-----Original Message-----" "*Regexp matching the beginning of an attribution line." :group 'gnus-cite :type 'regexp) *** pub/pgnus/lisp/gnus-group.el Sun Apr 18 14:44:06 1999 --- pgnus/lisp/gnus-group.el Sat Jun 12 02:21:36 1999 *************** *** 3287,3345 **** (gnus-browse-foreign-server method)) (defun gnus-group-set-info (info &optional method-only-group part) ! (let* ((entry (gnus-gethash ! (or method-only-group (gnus-info-group info)) ! gnus-newsrc-hashtb)) ! (part-info info) ! (info (if method-only-group (nth 2 entry) info)) ! method) ! (when method-only-group (unless entry ! (error "Trying to change non-existent group %s" method-only-group)) ! ;; We have received parts of the actual group info - either the ! ;; select method or the group parameters. We first check ! ;; whether we have to extend the info, and if so, do that. ! (let ((len (length info)) ! (total (if (eq part 'method) 5 6))) ! (when (< len total) ! (setcdr (nthcdr (1- len) info) ! (make-list (- total len) nil))) ! ;; Then we enter the new info. ! (setcar (nthcdr (1- total) info) part-info))) ! (unless entry ! ;; This is a new group, so we just create it. ! (save-excursion ! (set-buffer gnus-group-buffer) ! (setq method (gnus-info-method info)) ! (when (gnus-server-equal method "native") ! (setq method nil)) (save-excursion (set-buffer gnus-group-buffer) ! (if method ! ;; It's a foreign group... ! (gnus-group-make-group ! (gnus-group-real-name (gnus-info-group info)) ! (if (stringp method) method ! (prin1-to-string (car method))) ! (and (consp method) ! (nth 1 (gnus-info-method info)))) ! ;; It's a native group. ! (gnus-group-make-group (gnus-info-group info)))) ! (gnus-message 6 "Note: New group created") ! (setq entry ! (gnus-gethash (gnus-group-prefixed-name ! (gnus-group-real-name (gnus-info-group info)) ! (or (gnus-info-method info) gnus-select-method)) ! gnus-newsrc-hashtb)))) ! ;; Whether it was a new group or not, we now have the entry, so we ! ;; can do the update. ! (if entry ! (progn ! (setcar (nthcdr 2 entry) info) ! (when (and (not (eq (car entry) t)) ! (gnus-active (gnus-info-group info))) ! (setcar entry (length (gnus-list-of-unread-articles (car info)))))) ! (error "No such group: %s" (gnus-info-group info))))) (defun gnus-group-set-method-info (group select-method) (gnus-group-set-info select-method group 'method)) --- 3287,3346 ---- (gnus-browse-foreign-server method)) (defun gnus-group-set-info (info &optional method-only-group part) ! (when info ! (let* ((entry (gnus-gethash ! (or method-only-group (gnus-info-group info)) ! gnus-newsrc-hashtb)) ! (part-info info) ! (info (if method-only-group (nth 2 entry) info)) ! method) ! (when method-only-group ! (unless entry ! (error "Trying to change non-existent group %s" method-only-group)) ! ;; We have received parts of the actual group info - either the ! ;; select method or the group parameters. We first check ! ;; whether we have to extend the info, and if so, do that. ! (let ((len (length info)) ! (total (if (eq part 'method) 5 6))) ! (when (< len total) ! (setcdr (nthcdr (1- len) info) ! (make-list (- total len) nil))) ! ;; Then we enter the new info. ! (setcar (nthcdr (1- total) info) part-info))) (unless entry ! ;; This is a new group, so we just create it. (save-excursion (set-buffer gnus-group-buffer) ! (setq method (gnus-info-method info)) ! (when (gnus-server-equal method "native") ! (setq method nil)) ! (save-excursion ! (set-buffer gnus-group-buffer) ! (if method ! ;; It's a foreign group... ! (gnus-group-make-group ! (gnus-group-real-name (gnus-info-group info)) ! (if (stringp method) method ! (prin1-to-string (car method))) ! (and (consp method) ! (nth 1 (gnus-info-method info)))) ! ;; It's a native group. ! (gnus-group-make-group (gnus-info-group info)))) ! (gnus-message 6 "Note: New group created") ! (setq entry ! (gnus-gethash (gnus-group-prefixed-name ! (gnus-group-real-name (gnus-info-group info)) ! (or (gnus-info-method info) gnus-select-method)) ! gnus-newsrc-hashtb)))) ! ;; Whether it was a new group or not, we now have the entry, so we ! ;; can do the update. ! (if entry ! (progn ! (setcar (nthcdr 2 entry) info) ! (when (and (not (eq (car entry) t)) ! (gnus-active (gnus-info-group info))) ! (setcar entry (length (gnus-list-of-unread-articles (car info)))))) ! (error "No such group: %s" (gnus-info-group info)))))) (defun gnus-group-set-method-info (group select-method) (gnus-group-set-info select-method group 'method)) *** pub/pgnus/lisp/gnus-range.el Sat Apr 17 07:44:52 1999 --- pgnus/lisp/gnus-range.el Sat Jun 12 02:21:36 1999 *************** *** 227,244 **** (defun gnus-remove-from-range (range1 range2) "Return a range that has all articles from RANGE2 removed from RANGE1. The returned range is always a list. RANGE2 can also be a ! unsorted list of articles." (if (or (null range1) (null range2)) range1 (let (out r1 r2 r1_min r1_max r2_min r2_max ! (range1 range1) ! (range2 (if (listp (cdr range2)) ! (sort range2 (lambda (e1 e2) ! (< (if (consp e1) (car e1) e1) ! (if (consp e2) (car e2) e2)))) ! range2))) (setq range1 (if (listp (cdr range1)) range1 (list range1)) ! range2 (if (listp (cdr range2)) range2 (list range2)) r1 (car range1) r2 (car range2) r1_min (if (consp r1) (car r1) r1) --- 227,243 ---- (defun gnus-remove-from-range (range1 range2) "Return a range that has all articles from RANGE2 removed from RANGE1. The returned range is always a list. RANGE2 can also be a ! unsorted list of articles. RANGE1 is modified by side effects, RANGE2 ! is not modified." (if (or (null range1) (null range2)) range1 (let (out r1 r2 r1_min r1_max r2_min r2_max ! (range2 (gnus-copy-sequence range2))) (setq range1 (if (listp (cdr range1)) range1 (list range1)) ! range2 (sort (if (listp (cdr range2)) range2 (list range2)) ! (lambda (e1 e2) ! (< (if (consp e1) (car e1) e1) ! (if (consp e2) (car e2) e2)))) r1 (car range1) r2 (car range2) r1_min (if (consp r1) (car r1) r1) *** pub/pgnus/lisp/gnus-start.el Sun Apr 18 14:44:07 1999 --- pgnus/lisp/gnus-start.el Sat Jun 12 02:21:37 1999 *************** *** 2499,2504 **** --- 2499,2506 ---- (gnus-message 5 "Reading descriptions file via %s..." (car method)) (cond + ((null (gnus-get-function method 'request-list-newsgroups t)) + t) ((not (gnus-check-server method)) (gnus-message 1 "Couldn't open server") nil) *** pub/pgnus/lisp/gnus-sum.el Sat May 1 22:33:12 1999 --- pgnus/lisp/gnus-sum.el Sat Jun 12 02:21:38 1999 *************** *** 4289,4315 **** (setq arts (cdr arts))) (setq list (cdr all))))) ! (when (gnus-check-backend-function 'request-set-mark ! gnus-newsgroup-name) ! ;; uncompressed:s are not proper flags (they are cons cells) ! ;; cache is a internal gnus flag ! (unless (memq (cdr type) (cons 'cache uncompressed)) ! (let* ((old (cdr (assq (cdr type) (gnus-info-marks info)))) ! (list (gnus-compress-sequence (sort list '<))) ! (del (gnus-remove-from-range old list)) ! (add (gnus-remove-from-range list old))) ! (if add ! (push (list add 'add (list (cdr type))) delta-marks)) ! (if del ! (push (list del 'del (list (cdr type))) delta-marks))))) (when list ! (push (cons (cdr type) ! (if (memq (cdr type) uncompressed) list ! (gnus-compress-sequence ! (set symbol (sort list '<)) t))) ! newmarked))) ! (when delta-marks (unless (gnus-check-group gnus-newsgroup-name) --- 4289,4312 ---- (setq arts (cdr arts))) (setq list (cdr all))))) ! (or (memq (cdr type) uncompressed) ! (setq list (gnus-compress-sequence (set symbol (sort list '<)) t))) ! ! (when (gnus-check-backend-function 'request-set-mark ! gnus-newsgroup-name) ! ;; uncompressed:s are not proper flags (they are cons cells) ! ;; cache is a internal gnus flag ! (unless (memq (cdr type) (cons 'cache uncompressed)) ! (let* ((old (cdr (assq (cdr type) (gnus-info-marks info)))) ! (del (gnus-remove-from-range (gnus-copy-sequence old) list)) ! (add (gnus-remove-from-range (gnus-copy-sequence list) old))) ! (if add ! (push (list add 'add (list (cdr type))) delta-marks)) ! (if del ! (push (list del 'del (list (cdr type))) delta-marks))))) (when list ! (push (cons (cdr type) list) newmarked))) (when delta-marks (unless (gnus-check-group gnus-newsgroup-name) *************** *** 4872,4878 **** `(let ((,articles (gnus-summary-work-articles ,arg))) (while ,articles (gnus-summary-goto-subject (car ,articles)) ! ,@forms)))) (put 'gnus-summary-iterate 'lisp-indent-function 1) (put 'gnus-summary-iterate 'edebug-form-spec '(form body)) --- 4869,4876 ---- `(let ((,articles (gnus-summary-work-articles ,arg))) (while ,articles (gnus-summary-goto-subject (car ,articles)) ! ,@forms ! (pop ,articles))))) (put 'gnus-summary-iterate 'lisp-indent-function 1) (put 'gnus-summary-iterate 'edebug-form-spec '(form body)) *************** *** 6141,6147 **** "Limit the summary buffer to articles that are older than (or equal) AGE days. If YOUNGER-P (the prefix) is non-nil, limit the summary buffer to articles that are younger than AGE days." ! (interactive "nTime in days: \nP") (prog1 (let ((data gnus-newsgroup-data) (cutoff (days-to-time age)) --- 6139,6145 ---- "Limit the summary buffer to articles that are older than (or equal) AGE days. If YOUNGER-P (the prefix) is non-nil, limit the summary buffer to articles that are younger than AGE days." ! (interactive "nLimit to articles older than (in days): \nP") (prog1 (let ((data gnus-newsgroup-data) (cutoff (days-to-time age)) *************** *** 8793,8803 **** (and (boundp group) (symbol-name group) (symbol-value group) ! (memq 'respool ! (assoc (symbol-name ! (car (gnus-find-method-for-group ! (symbol-name group)))) ! gnus-valid-select-methods)))) (defun gnus-read-move-group-name (prompt default articles prefix) "Read a group name." --- 8791,8798 ---- (and (boundp group) (symbol-name group) (symbol-value group) ! (gnus-get-function (gnus-find-method-for-group ! (symbol-name group)) 'request-accept-article t))) (defun gnus-read-move-group-name (prompt default articles prefix) "Read a group name." *************** *** 8847,8852 **** --- 8842,8880 ---- (error "Couldn't create group %s" to-newsgroup))) (error "No such group: %s" to-newsgroup))) to-newsgroup)) + + (defun gnus-summary-save-parts (type dir n reverse) + "Save parts matching a type." + (interactive + (list (read-string "Save parts of type: " "image/.*") + (read-file-name "Save to directory: " t nil t) + current-prefix-arg)) + (gnus-summary-iterate n + (let ((gnus-display-mime-function nil) + (gnus-inhibit-treatment t)) + (gnus-summary-select-article)) + (save-excursion + (set-buffer gnus-article-buffer) + (let ((handles (or (mm-dissect-buffer) (mm-uu-dissect)))) + (when handles + (gnus-summary-save-parts-1 type dir handles reverse)))))) + + (defun gnus-summary-save-parts-1 (type dir handle reverse) + (if (stringp (car handle)) + (mapcar (lambda (h) (gnus-summary-save-parts-1 type dir h reverse)) + (cdr handle)) + (when (if reverse + (not (string-match type (car (mm-handle-type handle)))) + (string-match type (car (mm-handle-type handle)))) + (let ((file (expand-file-name + (file-name-nondirectory + (or + (mail-content-type-get + (mm-handle-disposition handle) 'filename) + (concat gnus-newsgroup-name "." gnus-current-article))) + dir))) + (unless (file-exists-p file) + (mm-save-part-to-file handle file)))))) ;; Summary extract commands *** pub/pgnus/lisp/gnus-uu.el Sun Apr 18 14:44:09 1999 --- pgnus/lisp/gnus-uu.el Sat Jun 12 02:21:38 1999 *************** *** 58,65 **** '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed 's/\r$//'") ("\\.pas$" "cat %s | sed 's/\r$//'") ("\\.[1-9]$" "groff -mandoc -Tascii %s | sed s/\b.//g") ! ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "xv") ! ("\\.tga$" "tgatoppm %s | xv -") ("\\.\\(wav\\|aiff\\|hcom\\|u[blw]\\|s[bfw]\\|voc\\|smp\\)$" "sox -v .5 %s -t .au -u - > /dev/audio") ("\\.au$" "cat %s > /dev/audio") --- 58,65 ---- '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed 's/\r$//'") ("\\.pas$" "cat %s | sed 's/\r$//'") ("\\.[1-9]$" "groff -mandoc -Tascii %s | sed s/\b.//g") ! ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "ee") ! ("\\.tga$" "tgatoppm %s | ee -") ("\\.\\(wav\\|aiff\\|hcom\\|u[blw]\\|s[bfw]\\|voc\\|smp\\)$" "sox -v .5 %s -t .au -u - > /dev/audio") ("\\.au$" "cat %s > /dev/audio") *************** *** 369,375 **** "k" gnus-summary-kill-process-mark "y" gnus-summary-yank-process-mark "w" gnus-summary-save-process-mark ! "i" gnus-uu-invert-processable) (gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map) ;;"x" gnus-uu-extract-any --- 369,376 ---- "k" gnus-summary-kill-process-mark "y" gnus-summary-yank-process-mark "w" gnus-summary-save-process-mark ! "i" gnus-uu-invert-processable ! "m" gnus-summary-save-parts) (gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map) ;;"x" gnus-uu-extract-any *************** *** 1398,1404 **** ;; We replace certain characters that could make things messy. (setq gnus-uu-file-name (let ((nnheader-file-name-translation-alist ! '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_)))) (nnheader-translate-file-chars (match-string 1)))) (replace-match (concat "begin 644 " gnus-uu-file-name) t t) --- 1399,1405 ---- ;; We replace certain characters that could make things messy. (setq gnus-uu-file-name (let ((nnheader-file-name-translation-alist ! '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_)))) (nnheader-translate-file-chars (match-string 1)))) (replace-match (concat "begin 644 " gnus-uu-file-name) t t) *** pub/pgnus/lisp/gnus-xmas.el Sat Jan 23 15:30:43 1999 --- pgnus/lisp/gnus-xmas.el Sat Jun 12 02:21:38 1999 *************** *** 77,83 **** (if (or (featurep 'xface) (featurep 'xpm)) 'gnus-xmas-article-display-xface ! "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | xv -quit -") "*String or function to be executed to display an X-Face header. If it is a string, the command will be executed in a sub-shell asynchronously. The compressed face will be piped to this command." --- 77,83 ---- (if (or (featurep 'xface) (featurep 'xpm)) 'gnus-xmas-article-display-xface ! "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | ee -") "*String or function to be executed to display an X-Face header. If it is a string, the command will be executed in a sub-shell asynchronously. The compressed face will be piped to this command." *** pub/pgnus/lisp/gnus.el Sat May 1 22:33:13 1999 --- pgnus/lisp/gnus.el Sat Jun 12 02:21:38 1999 *************** *** 260,266 **** :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "0.84" "Version number for this version of Gnus.") (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number) --- 260,266 ---- :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "0.85" "Version number for this version of Gnus.") (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number) *** pub/pgnus/lisp/mail-source.el Sat May 1 22:33:13 1999 --- pgnus/lisp/mail-source.el Sat Jun 12 02:21:38 1999 *************** *** 392,401 **** (if result (prog1 (mail-source-callback callback server) ! (when prescript (if (and (symbolp postscript) (fboundp postscript)) ! (funcall prescript) (call-process shell-file-name nil 0 nil shell-command-switch (format-spec --- 392,401 ---- (if result (prog1 (mail-source-callback callback server) ! (when postscript (if (and (symbolp postscript) (fboundp postscript)) ! (funcall postscript) (call-process shell-file-name nil 0 nil shell-command-switch (format-spec *** pub/pgnus/lisp/mailcap.el Wed Jan 20 01:52:14 1999 --- pgnus/lisp/mailcap.el Sat Jun 12 02:21:39 1999 *************** *** 133,154 **** (viewer . mm-view-message) (test . (and (featurep 'gnus) (gnus-alive-p))) ! (type . "message/rfc-822")) ("rfc-*822" (viewer . vm-mode) (test . (fboundp 'vm-mode)) ! (type . "message/rfc-822")) ("rfc-*822" (viewer . w3-mode) (test . (fboundp 'w3-mode)) ! (type . "message/rfc-822")) ("rfc-*822" (viewer . view-mode) (test . (fboundp 'view-mode)) ! (type . "message/rfc-822")) ("rfc-*822" (viewer . fundamental-mode) ! (type . "message/rfc-822"))) ("image" ("x-xwd" (viewer . "xwud -in %s") --- 133,154 ---- (viewer . mm-view-message) (test . (and (featurep 'gnus) (gnus-alive-p))) ! (type . "message/rfc822")) ("rfc-*822" (viewer . vm-mode) (test . (fboundp 'vm-mode)) ! (type . "message/rfc822")) ("rfc-*822" (viewer . w3-mode) (test . (fboundp 'w3-mode)) ! (type . "message/rfc822")) ("rfc-*822" (viewer . view-mode) (test . (fboundp 'view-mode)) ! (type . "message/rfc822")) ("rfc-*822" (viewer . fundamental-mode) ! (type . "message/rfc822"))) ("image" ("x-xwd" (viewer . "xwud -in %s") *************** *** 183,189 **** (test . (eq (mm-device-type) 'x)) ("needsx11")) (".*" ! (viewer . "xv -perfect %s") (type . "image/*") (test . (eq (mm-device-type) 'x)) ("needsx11"))) --- 183,189 ---- (test . (eq (mm-device-type) 'x)) ("needsx11")) (".*" ! (viewer . "ee %s") (type . "image/*") (test . (eq (mm-device-type) 'x)) ("needsx11"))) *** pub/pgnus/lisp/mm-bodies.el Sat May 1 22:33:14 1999 --- pgnus/lisp/mm-bodies.el Sat Jun 12 02:21:39 1999 *************** *** 161,167 **** ((eq encoding 'quoted-printable) (quoted-printable-decode-region (point-min) (point-max))) ((eq encoding 'base64) ! (base64-decode-region (point-min) (point-max))) ((memq encoding '(7bit 8bit binary)) ) ((null encoding) --- 161,174 ---- ((eq encoding 'quoted-printable) (quoted-printable-decode-region (point-min) (point-max))) ((eq encoding 'base64) ! (base64-decode-region (point-min) ! ;; Some mailers insert whitespace ! ;; junk at the end which ! ;; base64-decode-region dislikes. ! (save-excursion ! (goto-char (point-max)) ! (skip-chars-backward "\n\t ") ! (point)))) ((memq encoding '(7bit 8bit binary)) ) ((null encoding) *** pub/pgnus/lisp/mm-decode.el Sat May 1 22:33:14 1999 --- pgnus/lisp/mm-decode.el Sat Jun 12 02:21:39 1999 *************** *** 505,532 **** (or filename name "") (or mm-default-directory default-directory)))) (setq mm-default-directory (file-name-directory file)) ! (mm-with-unibyte-buffer ! (mm-insert-part handle) ! (when (or (not (file-exists-p file)) ! (yes-or-no-p (format "File %s already exists; overwrite? " ! file))) ! ;; Now every coding system is 100% binary within mm-with-unibyte-buffer ! ;; Is text still special? ! (let ((coding-system-for-write ! (if (equal "text" (car (split-string ! (car (mm-handle-type handle)) "/"))) ! buffer-file-coding-system ! 'binary)) ! ;; Don't re-compress .gz & al. Arguably we should make ! ;; `file-name-handler-alist' nil, but that would chop ! ;; ange-ftp which it's reasonable to use here. ! (inhibit-file-name-operation 'write-region) ! (inhibit-file-name-handlers ! (if (equal (car (mm-handle-type handle)) ! "application/octet-stream") ! (cons 'jka-compr-handler inhibit-file-name-handlers) ! inhibit-file-name-handlers))) ! (write-region (point-min) (point-max) file)))))) (defun mm-pipe-part (handle) "Pipe HANDLE to a process." --- 505,535 ---- (or filename name "") (or mm-default-directory default-directory)))) (setq mm-default-directory (file-name-directory file)) ! (when (or (not (file-exists-p file)) ! (yes-or-no-p (format "File %s already exists; overwrite? " ! file))) ! (mm-save-part-to-file handle file)))) ! ! (defun mm-save-part-to-file (handle file) ! (mm-with-unibyte-buffer ! (mm-insert-part handle) ! ;; Now every coding system is 100% binary within mm-with-unibyte-buffer ! ;; Is text still special? ! (let ((coding-system-for-write ! (if (equal "text" (car (split-string ! (car (mm-handle-type handle)) "/"))) ! buffer-file-coding-system ! 'binary)) ! ;; Don't re-compress .gz & al. Arguably we should make ! ;; `file-name-handler-alist' nil, but that would chop ! ;; ange-ftp which it's reasonable to use here. ! (inhibit-file-name-operation 'write-region) ! (inhibit-file-name-handlers ! (if (equal (car (mm-handle-type handle)) ! "application/octet-stream") ! (cons 'jka-compr-handler inhibit-file-name-handlers) ! inhibit-file-name-handlers))) ! (write-region (point-min) (point-max) file)))) (defun mm-pipe-part (handle) "Pipe HANDLE to a process." *** pub/pgnus/lisp/nndoc.el Sat Apr 17 07:44:58 1999 --- pgnus/lisp/nndoc.el Sat Jun 12 02:21:39 1999 *************** *** 39,45 **** "*Type of the file. One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward', `rfc934', `rfc822-forward', `mime-parts', `standard-digest', ! `slack-digest', `clari-briefs' or `guess'.") (defvoo nndoc-post-type 'mail "*Whether the nndoc group is `mail' or `post'.") --- 39,45 ---- "*Type of the file. One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward', `rfc934', `rfc822-forward', `mime-parts', `standard-digest', ! `slack-digest', `clari-briefs', `nsmail' or `guess'.") (defvoo nndoc-post-type 'mail "*Whether the nndoc group is `mail' or `post'.") *************** *** 53,58 **** --- 53,60 ---- `((mmdf (article-begin . "^\^A\^A\^A\^A\n") (body-end . "^\^A\^A\^A\^A\n")) + (nsmail + (article-begin . "^From - ")) (news (article-begin . "^Path:")) (rnews *************** *** 449,455 **** (when (and limit (re-search-forward (concat "\ ! ^Content-Type:[ \t]*multipart/[a-z]+ *;\\(\\(\n[ \t]\\)?.*;\\)*" "\\(\n[ \t]\\)?[ \t]*boundary=\"?[^\"\n]*[^\" \t\n]") limit t)) t))) --- 451,457 ---- (when (and limit (re-search-forward (concat "\ ! ^Content-Type:[ \t]*multipart/[a-z]+ *; *\\(\\(\n[ \t]\\)?.*;\\)*" "\\(\n[ \t]\\)?[ \t]*boundary=\"?[^\"\n]*[^\" \t\n]") limit t)) t))) *************** *** 552,560 **** (insert "From: " (or from "unknown") "\nSubject: " (or subject "(no subject)") "\n"))) (deffoo nndoc-request-accept-article (group &optional server last) nil) - ;;; --- 554,565 ---- (insert "From: " (or from "unknown") "\nSubject: " (or subject "(no subject)") "\n"))) + (defun nndoc-nsmail-type-p () + (when (looking-at "From - ") + t)) + (deffoo nndoc-request-accept-article (group &optional server last) nil) ;;; *** pub/pgnus/lisp/nnmail.el Sat Apr 17 18:45:21 1999 --- pgnus/lisp/nnmail.el Sat Jun 12 02:21:39 1999 *************** *** 1401,1407 **** (incf total new) (incf i)))) ;; If we did indeed read any incoming spools, we save all info. ! (unless (zerop i) (nnmail-save-active (nnmail-get-value "%s-group-alist" method) (nnmail-get-value "%s-active-file" method)) --- 1401,1407 ---- (incf total new) (incf i)))) ;; If we did indeed read any incoming spools, we save all info. ! (unless (zerop new) (nnmail-save-active (nnmail-get-value "%s-group-alist" method) (nnmail-get-value "%s-active-file" method)) *** pub/pgnus/lisp/ChangeLog Sat May 1 22:33:10 1999 --- pgnus/lisp/ChangeLog Sat Jun 12 02:21:34 1999 *************** *** 1,3 **** --- 1,87 ---- + Sat Jun 12 00:19:57 1999 Lars Magne Ingebrigtsen + + * gnus.el: Pterodactyl Gnus v0.85 is released. + + 1999-04-20 Michael Cook + + * gnus-cite.el (gnus-cite-attribution-prefix): Tweak for MS + Outlook citation regex. + + 1999-06-12 02:09:49 Lars Magne Ingebrigtsen + + * nndoc.el (nndoc-mime-parts-type-p): Accept space before + semicolon. + + 1999-05-24 Simon Josefsson + + * gnus-range.el (gnus-remove-from-range): Document range1 + modification, protect range2. + + 1999-05-24 Simon Josefsson + + * gnus-sum.el (gnus-update-marks): Protect lists from + gnus-remove-from-range, don't sort twice. + + 1999-05-21 Simon Josefsson + + * gnus-start.el (gnus-read-descriptions-file): Protect if no + function in backend. + + 1999-05-15 Simon Josefsson + + * gnus-sum.el (gnus-valid-move-group-p): Check for a + request-accept-article function in the backend instead of using + the 'respool capability. + + 1999-04-18 Hrvoje Niksic + + * mm-bodies.el (mm-decode-content-transfer-encoding): Handle + spurious whitespace at eob. + + 1999-06-12 02:02:06 Adrian Aichner + + * nnmail.el (nnmail-get-new-mail): Check right variable. + + 1999-06-12 01:57:39 Karl Kleinpaste + + * mailcap.el (mailcap-mime-data): Fix rfc822. + + 1999-06-11 23:48:50 TOZAWA Akihiko + + * nndoc.el (nndoc-nsmail-type-p): New function. + (nndoc-type-alist): Recognize nsmail. + + 1999-05-12 Mike McEwan + + * gnus-art.el (gnus-treatment-function-alist): Display `x-face' + *before* `article-hide-headers' deletes the information. + + 1999-05-22 00:26:46 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-save-parts): New command and + keystroke. + (gnus-summary-save-parts-1): New function. + (gnus-summary-iterate): Buggy. + + * mm-decode.el (mm-save-part-to-file): Made into own function. + + 1999-05-11 05:53:16 Lars Magne Ingebrigtsen + + * gnus-group.el (gnus-group-set-info): Resist nils. + + 1999-05-04 19:26:08 Lars Magne Ingebrigtsen + + * mailcap.el (mailcap-mime-data): Ditto. + + * gnus-uu.el (gnus-uu-default-view-rules): Ditto. + + * gnus-art.el (gnus-article-x-face-command): Default to ee. + + 1999-05-02 Gareth Jones + + * gnus-art.el (article-make-date-line): Put X-Sent below Date if + gnus-article-date-lapsed-new-header is t. + Sat May 1 20:27:43 1999 Lars Magne Ingebrigtsen * gnus.el: Pterodactyl Gnus v0.84 is released. *** pub/pgnus/texi/gnus.texi Sat May 1 22:33:18 1999 --- pgnus/texi/gnus.texi Sat Jun 12 02:21:42 1999 *************** *** 1,8 **** ! ! \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Pterodactyl Gnus 0.84 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- ! @c \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Pterodactyl Gnus 0.85 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 51,56 **** --- 50,56 ---- \newcommand{\gnussc}[1]{\textsc{#1}} \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}} \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}} + \newcommand{\gnusresult}[1]{\gnustt{=> #1}} \newcommand{\gnusbullet}{{${\bullet}$}} \newcommand{\gnusdollar}{\$} *************** *** 319,325 **** @tex @titlepage ! @title Pterodactyl Gnus 0.84 Manual @author by Lars Magne Ingebrigtsen @page --- 319,325 ---- @tex @titlepage ! @title Pterodactyl Gnus 0.85 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 355,361 **** spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Pterodactyl Gnus 0.84. @end ifinfo --- 355,361 ---- spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Pterodactyl Gnus 0.85. @end ifinfo *************** *** 993,998 **** --- 993,1002 ---- at all. In any case, @code{some} should be faster than @code{nil}, and is certainly faster than @code{t} over slow lines. + Some news servers (Leafnode and old versions of INN, for instance) do + not support the @code{LIST ACTIVE group}. For these servers, @code{nil} + is probably the most effficient value for this variable. + If this variable is @code{nil}, Gnus will ask for group info in total lock-step, which isn't very fast. If it is @code{some} and you use an @sc{nntp} server, Gnus will pump out commands as fast as it can, and *************** *** 1000,1005 **** --- 1004,1012 ---- performance, but if the server does not support the aforementioned @code{LIST ACTIVE group} command, this isn't very nice to the server. + If you think that starting up Gnus takes too long, try all the three + different values for this variable and see what works best for you. + In any case, if you use @code{some} or @code{nil}, you should definitely kill all groups that you aren't interested in to speed things up. *************** *** 1742,1754 **** group buffer according to how often you read groups, perhaps? Within reason? ! This is what @dfn{group score} is for. You can assign a score to each ! group. You can then sort the group buffer based on this score. ! Alternatively, you can sort on score and then level. (Taken together, ! the level and the score is called the @dfn{rank} of the group. A group ! that is on level 4 and has a score of 1 has a higher rank than a group ! on level 5 that has a score of 300. (The level is the most significant ! part and the score is the least significant part.)) @findex gnus-summary-bubble-group If you want groups you read often to get higher scores than groups you --- 1749,1762 ---- group buffer according to how often you read groups, perhaps? Within reason? ! This is what @dfn{group score} is for. You can have Gnus assign a score ! to each group through the mechanism described below. You can then sort ! the group buffer based on this score. Alternatively, you can sort on ! score and then level. (Taken together, the level and the score is ! called the @dfn{rank} of the group. A group that is on level 4 and has ! a score of 1 has a higher rank than a group on level 5 that has a score ! of 300. (The level is the most significant part and the score is the ! least significant part.)) @findex gnus-summary-bubble-group If you want groups you read often to get higher scores than groups you *************** *** 1928,1936 **** command, you will be prompted for a file name and a file type. Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, ! @code{rfc934}, @code{rfc822-forward}, and @code{forward}. If you run ! this command without a prefix, Gnus will guess at the file type. ! @xref{Document Groups}. @item G u @kindex G u (Group) --- 1936,1944 ---- command, you will be prompted for a file name and a file type. Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, ! @code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}. ! If you run this command without a prefix, Gnus will guess at the file ! type. @xref{Document Groups}. @item G u @kindex G u (Group) *************** *** 10849,10854 **** --- 10857,10863 ---- * Mail Spool:: Store your mail in a private spool? * MH Spool:: An mhspool-like backend. * Mail Folders:: Having one file for each group. + * Comparing Mail Backends:: An in-depth looks at pros and cons. @end menu *************** *** 11078,11083 **** --- 11087,11213 ---- @code{nnfolder-directory}. This only works if you use long file names, though. + @node Comparing Mail Backends + @subsubsection Comparing Mail Backends + + First, just for terminology, the @dfn{backend} is the common word for a + low-level access method---a transport, if you will, by which something + is acquired. The sense is that one's mail has to come from somewhere, + and so selection of a suitable backend is required in order to get that + mail within spitting distance of Gnus. + + The same concept exists for Usenet itself: Though access to articles is + typically done by NNTP these days, once upon a midnight dreary, everyone + in the world got at Usenet by running a reader on the machine where the + articles lay (the machine which today we call an NNTP server), and + access was by the reader stepping into the articles' directory spool + area directly. One can still select between either the @code{nntp} or + @code{nnspool} backends, to select between these methods, if one happens + actually to live on the server (or can see its spool directly, anyway, + via NFS). + + The goal in selecting a mail backend is to pick one which + simultaneously represents a suitable way of dealing with the original + format plus leaving mail in a form that is convenient to use in the + future. Here are some high and low points on each: + + @table @code + @item nnmbox + + UNIX systems have historically had a single, very common, and well- + defined format. All messages arrive in a single @dfn{spool file}, and + they are delineated by a line whose regular expression matches + @samp{^From_}. (My notational use of @samp{_} is to indicate a space, + to make it clear in this instance that this is not the RFC-specified + @samp{From:} header.) Because Emacs and therefore Gnus emanate + historically from the Unix environment, it is simplest if one does not + mess a great deal with the original mailbox format, so if one chooses + this backend, Gnus' primary activity in getting mail from the real spool + area to Gnus' preferred directory is simply to copy it, with no + (appreciable) format change in the process. It is the ``dumbest'' way + to move mail into availability in the Gnus environment. This makes it + fast to move into place, but slow to parse, when Gnus has to look at + what's where. + + @item nnbabyl + + Once upon a time, there was the DEC-10 and DEC-20, running operating + systems called TOPS and related things, and the usual (only?) mail + reading environment was a thing called Babyl. I don't know what format + was used for mail landing on the system, but Babyl had its own internal + format to which mail was converted, primarily involving creating a + spool-file-like entity with a scheme for inserting Babyl-specific + headers and status bits above the top of each message in the file. + RMAIL was Emacs' first mail reader, it was written by Richard Stallman, + and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL + to understand the mail files folks already had in existence. Gnus (and + VM, for that matter) continue to support this format because it's + perceived as having some good qualities in those mailer-specific + headers/status bits stuff. RMAIL itself still exists as well, of + course, and is still maintained by Stallman. + + Both of the above forms leave your mail in a single file on your + filesystem, and they must parse that entire file each time you take a + look at your mail. + + @item nnml + + @code{nnml} is the backend which smells the most as though you were + actually operating with an @code{nnspool}-accessed Usenet system. (In + fact, I believe @code{nnml} actually derived from @code{nnspool} code, + lo these years ago.) One's mail is taken from the original spool file, + and is then cut up into individual message files, 1:1. It maintains a + Usenet-style active file (analogous to what one finds in an INN- or + CNews-based news system in (for instance) @file{/var/lib/news/active}, + or what is returned via the @samp{NNTP LIST} verb) and also creates + @dfn{overview} files for efficient group entry, as has been defined for + @sc{nntp} servers for some years now. It is slower in mail-splitting, + due to the creation of lots of files, updates to the @code{nnml} active + file, and additions to overview files on a per-message basis, but it is + extremely fast on access because of what amounts to the indexing support + provided by the active file and overviews. + + @code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the + resource which defines available places in the filesystem to put new + files. Sysadmins take a dim view of heavy inode occupation within + tight, shared filesystems. But if you live on a personal machine where + the filesystem is your own and space is not at a premium, @code{nnml} + wins big. + + It is also problematic using this backend if you are living in a + FAT16-based Windows world, since much space will be wasted on all these + tiny files. + + @item nnmh + + The Rand MH mail-reading system has been around UNIX systems for a very + long time; it operates by splitting one's spool file of messages into + individual files, but with little or no indexing support -- @code{nnmh} + is considered to be semantically equivalent to ``@code{nnml} without + active file or overviews''. This is arguably the worst choice, because + one gets the slowness of individual file creation married to the + slowness of access parsing when learning what's new in one's groups. + + @item nnfolder + + Basically the effetc of @code{nnfolder} is @code{nnmbox} (the first + method described above) on a per-group basis. That is, @code{nnmbox} + itself puts *all* one's mail in one file; @code{nnfolder} provides a + little bit of optimization to this so that each of one's mail groups has + a Unix mail box file. It's faster than @code{nnmbox} because each group + can be parsed separately, and still provides the simple Unix mail box + format requiring minimal effort in moving the mail around. In addition, + it maintains an ``active'' file making it much faster for Gnus to figure + out how many messages there are in each separate group. + + If you have groups that are expected to have a massive amount of + messages, @code{nnfolder} is not the best choice, but if you receive + only a moderate amount of mail, @code{nnfolder} is probably the most + friendly mail backend all over. + + @end table + + @node Other Sources @section Other Sources *************** *** 11224,11229 **** --- 11354,11362 ---- @item forward Forwarded articles. + @item nsmail + Netscape mail boxes. + @item mime-parts MIME multipart messages. *************** *** 11262,11268 **** 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-parts}, @code{standard-digest}, ! @code{slack-digest}, @code{clari-briefs} or @code{guess}. @item nndoc-post-type @vindex nndoc-post-type --- 11395,11401 ---- 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-parts}, @code{standard-digest}, ! @code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}. @item nndoc-post-type @vindex nndoc-post-type *************** *** 18819,18824 **** --- 18952,18971 ---- Is the "+" character illegal in newsgroup names? Is there any way in Gnus to work around this? (gnus 5.6.45 - XEmacs 20.4) + @item + + When `#F', do: + + @example + Subject: Answer to your mails 01.01.1999-01.05.1999 + --text follows this line-- + Sorry I killfiled you... + + Under the subject "foo", you wrote on 01.01.1999: + > bar + Under the subject "foo1", you wrote on 01.01.1999: + > bar 1 + @end example @item Solve the halting problem. *** pub/pgnus/texi/message.texi Sat May 1 22:33:18 1999 --- pgnus/texi/message.texi Sat Jun 12 02:21:42 1999 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Pterodactyl Message 0.84 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Pterodactyl Message 0.85 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 42,48 **** @tex @titlepage ! @title Pterodactyl Message 0.84 Manual @author by Lars Magne Ingebrigtsen @page --- 42,48 ---- @tex @titlepage ! @title Pterodactyl Message 0.85 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.84. 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.85. Message is distributed with the Gnus distribution bearing the same version number as this manual. *** pub/pgnus/texi/ChangeLog Sat May 1 22:33:18 1999 --- pgnus/texi/ChangeLog Sat Jun 12 02:21:42 1999 *************** *** 1,3 **** --- 1,17 ---- + 1999-06-12 00:13:25 Lars Magne Ingebrigtsen + + * gnus.texi (Comparing Mail Backends): Slight edits. + + 1999-06-12 00:13:20 Karl Kleinpaste + + * gnus.texi (Comparing Mail Backends): New. + + 1999-06-11 21:47:22 Lars Magne Ingebrigtsen + + * gnus.texi (Group Score): Doc fix. + (The Active File): Addition. + (Document Groups): Addition. + 1999-04-18 Didier Verna * gnus.texi (Article treatment): document the new variable