From 09868cf7efbfa51562d76580eafc9a7b6b0c8d72 Mon Sep 17 00:00:00 2001 From: yamaoka Date: Sun, 4 Jul 1999 23:51:58 +0000 Subject: [PATCH] Importing Pterodactyl Gnus v0.91. --- GNUS-NEWS | 15 ++++- lisp/ChangeLog | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++ lisp/base64.el | 9 ++- lisp/gnus-agent.el | 99 ++++++++++++++++----------- lisp/gnus-art.el | 6 +- lisp/gnus-cache.el | 13 +--- lisp/gnus-msg.el | 5 +- lisp/gnus-srvr.el | 3 + lisp/gnus-start.el | 58 ++++++++-------- lisp/gnus-sum.el | 54 +++++++++------ lisp/gnus-util.el | 10 +++ lisp/gnus.el | 2 +- lisp/lpath.el | 4 +- lisp/mailcap.el | 2 +- lisp/message.el | 10 ++- lisp/mm-decode.el | 65 +++++++----------- lisp/mm-encode.el | 7 +- lisp/mm-util.el | 54 +++++++++------ lisp/mm-uu.el | 50 +++++++++----- lisp/mm-view.el | 3 +- lisp/mml.el | 6 +- lisp/nndoc.el | 3 +- lisp/nnfolder.el | 52 ++++++++++----- lisp/nnheader.el | 8 +-- lisp/nnkiboze.el | 6 +- lisp/nnmail.el | 23 +++---- lisp/nnmbox.el | 63 ++++++++++++------ lisp/nnml.el | 12 ++-- lisp/nnsoup.el | 4 +- lisp/nnspool.el | 4 +- lisp/nnweb.el | 3 +- lisp/qp.el | 2 +- lisp/rfc2047.el | 22 ++++-- lisp/smiley.el | 4 +- texi/ChangeLog | 5 ++ texi/emacs-mime.texi | 59 ++++++++++++++++- texi/gnus.texi | 78 +++++++++++++++++++--- texi/message.texi | 6 +- 38 files changed, 724 insertions(+), 285 deletions(-) diff --git a/GNUS-NEWS b/GNUS-NEWS index ee7fbc6..a725d82 100644 --- a/GNUS-NEWS +++ b/GNUS-NEWS @@ -1,9 +1,17 @@ ** Gnus changes. +The Gnus NEWS entries are short, but they reflect sweeping changes in +four areas: Article display treatment, MIME treatment, +internationalization and mail-fetching. + *** The mail-fetching functions have changed. See the manual for the many details. In particular, all procmail fetching variables are gone. -*** Gnus is now a MIME-capable reader. See the manual for details. +*** Gnus is now a MIME-capable reader. This affects many parts of +Gnus, and adds a slew of new commands. See the manual for details. + +*** Gnus has also been multilingualized. This also affects too +many parts of Gnus to summarize here, and adds many new variables. *** gnus-auto-select-first can now be a function to be called to position point. @@ -12,5 +20,8 @@ called to position point. summary buffers and NOV files. *** `gnus-article-display-hook' has been removed. Instead, a number -of variables starting with `gnus-treat-'. +of variables starting with `gnus-treat-' have been added. + +*** The Gnus posting styles have been redone again and now works in a +subtly different manner. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b807b2d..9ce3a5b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,183 @@ +Sun Jul 4 06:31:01 1999 Lars Magne Ingebrigtsen + + * gnus.el: Pterodactyl Gnus v0.91 is released. + +1999-07-04 04:35:28 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-save-active-1): New function. + (gnus-agent-save-active): use it. + (gnus-agent-save-groups): Ditto. + + * gnus-cache.el (gnus-cache-write-active): Use it. + + * gnus-agent.el (gnus-agent-write-active): Use it. + + * gnus-util.el (gnus-write-active-file): New function. + + * gnus-agent.el (gnus-agent-write-active): New function to keep + lower boundaries and canceled groups. + (gnus-agent-save-groups): Use it. + (gnus-agent-save-active): Use it. + (gnus-agent-save-group-info): Only write active files. + (gnus-agent-expire): Update active file. + + * mm-decode.el (mm-inlinable-part-p): Removed. + (mm-user-display-methods): Default to nil. + (mm-user-display-methods): Removed. + (add-mime-display-method): Removed. + (mm-automatic-display): Renamed. + (mm-automatic-display-p): Use it. + (mm-inlined-types): New variable. + (mm-inlined-p): New function. + + * message.el (message-reply): Bind message-this-is-mail. + +1999-07-03 13:16:31 Michael Klingbeil + + * smiley.el (smiley-buffer): Fix for NT. + +1999-07-03 11:26:47 Lars Magne Ingebrigtsen + + * mm-encode.el (mm-encode-buffer): Check whether we have 7bit. + + * message.el (message-check-news-header-syntax): Protect against + nil froms. + + * mm-util.el (mm-auto-mode-alist): New. + + * mml.el (mml-generate-mime-1): Ditto. + + * gnus.el: Use mm-insert-file-contents throughout instead of + nnheader. + + * mm-util.el (mm-insert-file-contents): New function. + +Sat Jul 3 07:35:35 1999 Lars Magne Ingebrigtsen + + * gnus.el: Pterodactyl Gnus v0.90 is released. + +1999-07-03 09:31:10 Sven Fischer + + * mailcap.el (mailcap-possible-viewers): Use string=. + +1999-07-01 Shenghuo ZHU + + * mm-uu.el (mm-uu-forward-begin-line): New variable. + (mm-uu-forward-end-line): New variable. + (mm-uu-begin-line): Handle forwarded message. + (mm-uu-identifier-alist): Ditto. + (mm-uu-dissect): Ditto. + +1999-06-29 Shenghuo ZHU + + * lpath.el: Two free variables. + +1999-07-02 Shenghuo ZHU + + * nnheader.el (nnheader-file-coding-system): Use raw-text. + * gnus-agent.el (gnus-agent-file-coding-system): Ditto. + * gnus-cache.el (gnus-cache-coding-system): Ditto. + + * nnfolder.el (nnfolder-file-coding-system): Use mm-text-coding-system. + (nnfolder-file-coding-system-for-write): New variable. + (nnfolder-active-file-coding-system): New variable. + (nnfolder-active-file-coding-system-for-write): New variable. + (nnfolder-save-active): New function. + (nnfolder-save-buffer): Use them. + (nnfolder-possibly-change-group): Ditto. + (nnfolder-request-list-newsgroups): Ditto. + (nnfolder-request-create-group): Ditto. + (nnfolder-request-expire-articles): Ditto. + (nnfolder-request-move-article): Ditto. + (nnfolder-request-accept-article): Ditto. + (nnfolder-request-delete-group): Ditto. + (nnfolder-request-rename-group): Ditto. + (nnfolder-possibly-change-folder): Ditto. + (nnfolder-read-folder): Ditto. + (nnfolder-request-list): Remove pathname-coding-system. + (nnfolder-possibly-change-group): Use nnmail-pathname-coding-system. + + * nnmail.el (nnmail-file-coding-system): Use raw-text. + (nnmail-file-coding-system-1): Removed. + (nnmail-find-file): Use nnmail-pathname-coding-system. + (nnmail-write-region): Ditto. + + * nnmbox.el (nnmbox-file-coding-system): New variable. + (nnmbox-file-coding-system-for-write): New variable. + (nnmbox-active-file-coding-system): New variable. + (nnmbox-active-file-coding-system-for-write): New variable. + (nnmbox-save-buffer): New function. + (nnmbox-save-active): New function. + (nnmbox-request-scan): Use them. + (nnmbox-request-expire-articles): Ditto. + (nnmbox-request-move-article): Ditto. + (nnmbox-request-accept-article): Ditto. + (nnmbox-request-replace-article): Ditto. + (nnmbox-request-delete-group): Ditto. + (nnmbox-request-rename-group): Ditto. + (nnmbox-request-create-group): Ditto. + + * mm-util.el (mm-text-coding-system): raw-text or -dos. + (mm-running-ntemacs): Removed. + + * nnml.el (nnml-file-coding-system): Use nnmail-file-coding-system. + +1999-07-02 Shenghuo ZHU + + * nnfolder.el (nnfolder-read-folder): Use nnheader-file-coding-system. + +1999-07-01 Shenghuo ZHU + + * qp.el (quoted-printable-encoding-characters): Support lower case. + +1999-07-01 Shenghuo ZHU + + * rfc2047.el (rfc2047-encode): Fold before B-encoding. + (rfc2047-b-encode-region): Encode line by line. + +1999-07-03 09:20:16 Lars Magne Ingebrigtsen + + * mm-util.el (mm-find-mime-charset-region): Fix. + +1999-06-30 KOSEKI Yoshinori + + * mm-util.el (mm-mime-mule-charset-alist): Fix iso-2022-jp(-2) bug. + (mm-find-mime-charset-region): Ditto. + +1999-07-03 09:15:35 Simon Josefsson + + * gnus-sum.el (gnus-summary-move-article): Fix something or + other. + +1999-06-29 Shenghuo ZHU + + * gnus-sum.el (gnus-newsgroup-ephemeral-charset): New variable. + (gnus-newsgroup-ephemeral-ignored-charsets): New variable. + (gnus-summary-enter-digest-group): Use them. + (gnus-summary-setup-default-charset): Ditto. + +1999-06-15 Shenghuo ZHU + + * base64.el (base64-run-command-on-region): Use unibyte buffer. + +1999-06-15 Shenghuo ZHU + + * gnus-msg.el (gnus-configure-posting-styles): Fix bug when + gnus-newsgroup-name is nil. + +1999-06-15 Shenghuo ZHU + + * rfc2047.el (rfc2047-encode): Chop the tail newline. + +1999-06-15 Shenghuo ZHU + + * gnus-art.el (article-emphasize): Use correct + gnus-article-emphasis-alist. + +1999-06-15 Shenghuo ZHU + + * mm-view.el (mm-inline-text): Fix text/html bug. + Mon Jun 28 17:54:01 1999 Lars Magne Ingebrigtsen * gnus.el: Pterodactyl Gnus v0.89 is released. diff --git a/lisp/base64.el b/lisp/base64.el index 6766e6f..0eec5f4 100644 --- a/lisp/base64.el +++ b/lisp/base64.el @@ -73,9 +73,13 @@ base64-encoder-program.") (setq p (cdr p))) v)) +(defvar base64-binary-coding-system 'binary) + (defun base64-run-command-on-region (start end output-buffer command &rest arg-list) - (let ((tempfile nil) status errstring default-process-coding-system) + (let ((tempfile nil) status errstring default-process-coding-system + (coding-system-for-write base64-binary-coding-system) + (coding-system-for-read base64-binary-coding-system)) (unwind-protect (progn (setq tempfile (make-temp-name "base64")) @@ -103,7 +107,8 @@ base64-encoder-program.") (if (or (null buffer) (eq buffer (current-buffer))) (insert-char char count) (with-current-buffer buffer - (insert-char char count))))) + (insert-char char count)))) + (setq base64-binary-coding-system 'no-conversion)) (defun base64-decode-region (start end) (interactive "r") diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index efe869a..57f0f59 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -92,7 +92,7 @@ If nil, only read articles will be expired." (defvar gnus-agent-spam-hashtb nil) (defvar gnus-agent-file-name nil) (defvar gnus-agent-send-mail-function nil) -(defvar gnus-agent-file-coding-system 'binary) +(defvar gnus-agent-file-coding-system 'raw-text) (defconst gnus-agent-scoreable-headers '("subject" "from" "date" "message-id" "references" "chars" "lines" "xref") @@ -135,7 +135,7 @@ If nil, only read articles will be expired." "Load FILE and do a `read' there." (with-temp-buffer (ignore-errors - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) (goto-char (point-min)) (read (current-buffer))))) @@ -546,46 +546,54 @@ the actual number of articles toggled is returned." ;;; (defun gnus-agent-save-active (method) + (gnus-agent-save-active-1 method 'gnus-active-to-gnus-format)) + +(defun gnus-agent-save-active-1 (method function) (when (gnus-agent-method-p method) (let* ((gnus-command-method method) + (new (gnus-make-hashtable (count-lines (point-min) (point-max)))) (file (gnus-agent-lib-file "active"))) - (gnus-make-directory (file-name-directory file)) - (let ((coding-system-for-write gnus-agent-file-coding-system)) - (write-region (point-min) (point-max) file nil 'silent)) - (when (file-exists-p (gnus-agent-lib-file "groups")) - (delete-file (gnus-agent-lib-file "groups")))))) - -(defun gnus-agent-save-groups (method) - (let* ((gnus-command-method method) - (file (gnus-agent-lib-file "groups"))) + (funcall function nil new) + (gnus-agent-write-active file new) + (erase-buffer) + (insert-file-contents-literally file)))) + +(defun gnus-agent-write-active (file new) + (let ((orig (gnus-make-hashtable (count-lines (point-min) (point-max)))) + (file (gnus-agent-lib-file "active")) + elem) + (when (file-exists-p file) + (with-temp-buffer + (insert-file-contents file) + (gnus-active-to-gnus-format nil orig)) + (mapatoms + (lambda (sym) + (when (and sym (boundp sym)) + (if (setq elem (symbol-value (intern (symbol-name sym) orig))) + (setcdr elem (cdr (symbol-value sym))) + (set (intern (symbol-name sym) orig) (symbol-value sym))))) + new)) (gnus-make-directory (file-name-directory file)) (let ((coding-system-for-write gnus-agent-file-coding-system)) - (write-region (point-min) (point-max) file nil 'silent)) - (when (file-exists-p (gnus-agent-lib-file "active")) - (delete-file (gnus-agent-lib-file "active"))))) + (gnus-write-active-file file orig)))) + +(defun gnus-agent-save-groups (method) + (gnus-agent-save-active-1 method 'gnus-groups-to-gnus-format)) (defun gnus-agent-save-group-info (method group active) (when (gnus-agent-method-p method) (let* ((gnus-command-method method) - (file (if nntp-server-list-active-group - (gnus-agent-lib-file "active") - (gnus-agent-lib-file "groups")))) + (file (gnus-agent-lib-file "active"))) (gnus-make-directory (file-name-directory file)) (with-temp-file file (when (file-exists-p file) - (nnheader-insert-file-contents file)) + (mm-insert-file-contents file)) (goto-char (point-min)) - (if nntp-server-list-active-group - (progn - (when (re-search-forward - (concat "^" (regexp-quote group) " ") nil t) - (gnus-delete-line)) - (insert group " " (number-to-string (cdr active)) " " - (number-to-string (car active)) " y\n")) - (when (re-search-forward - (concat (regexp-quote group) "\\($\\| \\)") nil t) - (gnus-delete-line)) - (insert-buffer-substring nntp-server-buffer)))))) + (when (re-search-forward + (concat "^" (regexp-quote group) " ") nil t) + (gnus-delete-line)) + (insert group " " (number-to-string (cdr active)) " " + (number-to-string (car active)) " y\n"))))) (defun gnus-agent-group-path (group) "Translate GROUP into a path." @@ -764,7 +772,7 @@ the actual number of articles toggled is returned." (when (= (point-max) (point-min)) (push (cons group (current-buffer)) gnus-agent-buffer-alist) (ignore-errors - (nnheader-insert-file-contents + (mm-insert-file-contents (gnus-agent-article-name ".overview" group)))) (nnheader-find-nov-line (string-to-number (cdar crosses))) (insert (string-to-number (cdar crosses))) @@ -844,7 +852,7 @@ the actual number of articles toggled is returned." (goto-char (point-min)) (set-buffer nntp-server-buffer) (erase-buffer) - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) (goto-char (point-max)) (if (or (= (point-min) (point-max)) (progn @@ -1353,8 +1361,13 @@ The following commands are available: (day (- (time-to-days (current-time)) gnus-agent-expire-days)) gnus-command-method sym group articles history overview file histories elem art nov-file low info - unreads marked article) + unreads marked article orig lowest highest) (save-excursion + (with-temp-buffer + (insert-file-contents file) + (gnus-active-to-gnus-format + nil (setq orig (gnus-make-hashtable + (count-lines (point-min) (point-max)))))) (setq overview (gnus-get-buffer-create " *expire overview*")) (while (setq gnus-command-method (pop methods)) (let ((expiry-hashtb (gnus-make-hashtable 1023))) @@ -1393,13 +1406,15 @@ The following commands are available: (gnus-uncompress-range (cdr (assq 'dormant (gnus-info-marks info))))) - nov-file (gnus-agent-article-name ".overview" group)) + nov-file (gnus-agent-article-name ".overview" group) + lowest nil + highest nil) (gnus-agent-load-alist group) (gnus-message 5 "Expiring articles in %s" group) (set-buffer overview) (erase-buffer) (when (file-exists-p nov-file) - (nnheader-insert-file-contents nov-file)) + (mm-insert-file-contents nov-file)) (goto-char (point-min)) (setq article 0) (while (setq elem (pop articles)) @@ -1417,7 +1432,11 @@ The following commands are available: (if (file-exists-p (gnus-agent-article-name (number-to-string art) group)) - (forward-line 1) + (progn + (unless lowest + (setq lowest art)) + (setq highest art) + (forward-line 1)) ;; Remove old NOV lines that have no articles. (gnus-delete-line))) (if (or (eobp) @@ -1479,7 +1498,11 @@ The following commands are available: (gnus-dribble-enter (concat "(gnus-group-set-info '" (gnus-prin1-to-string info) - ")")))) + ")"))) + (when lowest + (if (gnus-gethash group orig) + (setcar (gnus-gethash group orig) lowest) + (gnus-sethash group (cons lowest highest) orig)))) expiry-hashtb) (set-buffer history) (setq histories (nreverse (sort histories '<))) @@ -1487,7 +1510,9 @@ The following commands are available: (goto-char (pop histories)) (gnus-delete-line)) (gnus-agent-save-history) - (gnus-agent-close-history)) + (gnus-agent-close-history) + (gnus-write-active-file + (gnus-agent-lib-file "active") orig)) (gnus-message 4 "Expiry...done")))))) ;;;###autoload diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index eab0013..ceb0e48 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -2004,7 +2004,9 @@ This format is defined by the `gnus-article-time-format' variable." (interactive (gnus-article-hidden-arg)) (unless (gnus-article-check-hidden-text 'emphasis arg) (save-excursion - (let ((alist (or gnus-article-emphasis-alist gnus-emphasis-alist)) + (let ((alist (or (with-current-buffer gnus-summary-buffer + gnus-article-emphasis-alist) + gnus-emphasis-alist)) (buffer-read-only nil) (props (append '(article-type emphasis) gnus-hidden-properties)) @@ -3098,7 +3100,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." "inline") (mm-attachment-override-p type))) (mm-automatic-display-p type) - (or (mm-inlinable-part-p type) + (or (mm-inlined-p type) (mm-automatic-external-display-p type))) (setq display t) (when (equal (car (split-string type "/")) diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el index 2d54bc7..0f009f3 100644 --- a/lisp/gnus-cache.el +++ b/lisp/gnus-cache.el @@ -77,7 +77,7 @@ it's not cached." (defvar gnus-cache-overview-coding-system 'raw-text "Coding system used on Gnus cache files.") -(defvar gnus-cache-coding-system 'binary +(defvar gnus-cache-coding-system 'raw-text "Coding system used on Gnus cache files.") @@ -394,7 +394,7 @@ Returns the list of articles removed." (erase-buffer) (let ((file (gnus-cache-file-name group ".overview"))) (when (file-exists-p file) - (nnheader-insert-file-contents file))) + (mm-insert-file-contents file))) ;; We have a fresh (empty/just loaded) buffer, ;; mark it as unmodified to save a redundant write later. (set-buffer-modified-p nil)))) @@ -592,14 +592,7 @@ $ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" (when (or force (and gnus-cache-active-hashtb gnus-cache-active-altered)) - (with-temp-file gnus-cache-active-file - (mapatoms - (lambda (sym) - (when (and sym (boundp sym)) - (insert (format "%s %d %d y\n" - (symbol-name sym) (cdr (symbol-value sym)) - (car (symbol-value sym)))))) - gnus-cache-active-hashtb)) + (gnus-write-active-file gnus-cache-active-file gnus-cache-active-hashtb) ;; Mark the active hashtb as unaltered. (setq gnus-cache-active-altered nil))) diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index ad27d85..e418e67 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -1104,7 +1104,7 @@ this is a reply." (when (cond ((stringp match) ;; Regexp string match on the group name. - (string-match match gnus-newsgroup-name)) + (string-match match group)) ((or (symbolp match) (gnus-functionp match)) (cond @@ -1154,8 +1154,7 @@ this is a reply." (insert-file-contents v) (buffer-string)))) (setq results (delq (assoc element results) results)) - (push (cons element - v) results)))) + (push (cons element v) results)))) ;; Now we have all the styles, so we insert them. (setq name (assq 'name results) address (assq 'address results)) diff --git a/lisp/gnus-srvr.el b/lisp/gnus-srvr.el index 4c65009..0ae565a 100644 --- a/lisp/gnus-srvr.el +++ b/lisp/gnus-srvr.el @@ -135,6 +135,9 @@ The following specs are understood: "D" gnus-server-deny-server "R" gnus-server-remove-denials + "n" next-line + "p" previous-line + "g" gnus-server-regenerate-server "\C-c\C-i" gnus-info-find-node diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index 37a9b0b..aa9b648 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -804,8 +804,8 @@ prompt the user for the name of an NNTP server to use." ;; Load whichever file is newest -- the auto save file ;; or the "real" file. (if (file-newer-than-file-p auto dribble-file) - (nnheader-insert-file-contents auto) - (nnheader-insert-file-contents dribble-file)) + (mm-insert-file-contents auto) + (mm-insert-file-contents dribble-file)) (unless (zerop (buffer-size)) (set-buffer-modified-p t)) ;; Set the file modes to reflect the .newsrc file modes. @@ -1828,39 +1828,41 @@ newsgroup." (gnus-group-prefixed-name "" method)))) ;; Let the Gnus agent save the active file. - (when (and gnus-agent real-active) - (gnus-agent-save-groups method)) + (if (and gnus-agent real-active) + (progn + (gnus-agent-save-groups method) + (gnus-active-to-gnus-format method hashtb nil real-active)) - (goto-char (point-min)) - ;; We split this into to separate loops, one with the prefix - ;; and one without to speed the reading up somewhat. - (if prefix - (let (min max opoint group) + (goto-char (point-min)) + ;; We split this into to separate loops, one with the prefix + ;; and one without to speed the reading up somewhat. + (if prefix + (let (min max opoint group) + (while (not (eobp)) + (condition-case () + (progn + (read cur) (read cur) + (setq min (read cur) + max (read cur) + opoint (point)) + (skip-chars-forward " \t") + (insert prefix) + (goto-char opoint) + (set (let ((obarray hashtb)) (read cur)) + (cons min max))) + (error (and group (symbolp group) (set group nil)))) + (forward-line 1))) + (let (min max group) (while (not (eobp)) (condition-case () - (progn + (when (eq (char-after) ?2) (read cur) (read cur) (setq min (read cur) - max (read cur) - opoint (point)) - (skip-chars-forward " \t") - (insert prefix) - (goto-char opoint) - (set (let ((obarray hashtb)) (read cur)) + max (read cur)) + (set (setq group (let ((obarray hashtb)) (read cur))) (cons min max))) (error (and group (symbolp group) (set group nil)))) - (forward-line 1))) - (let (min max group) - (while (not (eobp)) - (condition-case () - (when (eq (char-after) ?2) - (read cur) (read cur) - (setq min (read cur) - max (read cur)) - (set (setq group (let ((obarray hashtb)) (read cur))) - (cons min max))) - (error (and group (symbolp group) (set group nil)))) - (forward-line 1)))))) + (forward-line 1))))))) (defun gnus-read-newsrc-file (&optional force) "Read startup file. diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 3320a50..b53eca2 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -1028,6 +1028,8 @@ variable (string, integer, character, etc).") (defvar gnus-last-article nil) (defvar gnus-newsgroup-history nil) (defvar gnus-newsgroup-charset nil) +(defvar gnus-newsgroup-ephemeral-charset nil) +(defvar gnus-newsgroup-ephemeral-ignored-charsets nil) (defconst gnus-summary-local-variables '(gnus-newsgroup-name @@ -6752,11 +6754,14 @@ to guess what the document format is." (delete-matching-lines "^\\(Path\\):\\|^From ") (widen)) (unwind-protect - (if (gnus-group-read-ephemeral-group - name `(nndoc ,name (nndoc-address ,(get-buffer dig)) - (nndoc-article-type - ,(if force 'digest 'guess))) t) - ;; Make all postings to this group go to the parent group. + (if (let ((gnus-newsgroup-ephemeral-charset gnus-newsgroup-charset) + (gnus-newsgroup-ephemeral-ignored-charsets + gnus-newsgroup-ignored-charsets)) + (gnus-group-read-ephemeral-group + name `(nndoc ,name (nndoc-address ,(get-buffer dig)) + (nndoc-article-type + ,(if force 'digest 'guess))) t)) + ;; Make all postings to this group go to the parent group. (nconc (gnus-info-params (gnus-get-info name)) params) ;; Couldn't select this doc group. @@ -7274,7 +7279,8 @@ and `request-accept' functions." (entry (gnus-gethash pto-group gnus-newsrc-hashtb)) (info (nth 2 entry)) - (to-group (gnus-info-group info))) + (to-group (gnus-info-group info)) + to-marks) ;; Update the group that has been moved to. (when (and info (memq action '(move copy))) @@ -7282,6 +7288,7 @@ and `request-accept' functions." (push to-group to-groups)) (unless (memq article gnus-newsgroup-unreads) + (push 'read to-marks) (gnus-info-set-read info (gnus-add-to-range (gnus-info-read info) (list (cdr art-group))))) @@ -7309,6 +7316,7 @@ and `request-accept' functions." (when (memq article (symbol-value (intern (format "gnus-newsgroup-%s" (caar marks))))) + (push (cdar marks) to-marks) ;; If the other group is the same as this group, ;; then we have to add the mark to the list. (when (equal to-group gnus-newsgroup-name) @@ -7322,6 +7330,10 @@ and `request-accept' functions." to-group (cdar marks) (list to-article) info)) (setq marks (cdr marks))) + (gnus-request-set-mark to-group (list (list (list to-article) + 'set + to-marks))) + (gnus-dribble-enter (concat "(gnus-group-set-info '" (gnus-prin1-to-string (gnus-get-info to-group)) @@ -9277,21 +9289,23 @@ If REVERSE, save parts that do not match TYPE." (let* ((name (and gnus-newsgroup-name (gnus-group-real-name gnus-newsgroup-name))) (ignored-charsets - (append - (and gnus-newsgroup-name - (or (gnus-group-find-parameter gnus-newsgroup-name - 'ignored-charsets t) - (let ((alist gnus-group-ignored-charsets-alist) - elem (charsets nil)) - (while (setq elem (pop alist)) - (when (and name - (string-match (car elem) name)) - (setq alist nil - charsets (cdr elem)))) - charsets))) - gnus-newsgroup-ignored-charsets))) + (or gnus-newsgroup-ephemeral-ignored-charsets + (append + (and gnus-newsgroup-name + (or (gnus-group-find-parameter gnus-newsgroup-name + 'ignored-charsets t) + (let ((alist gnus-group-ignored-charsets-alist) + elem (charsets nil)) + (while (setq elem (pop alist)) + (when (and name + (string-match (car elem) name)) + (setq alist nil + charsets (cdr elem)))) + charsets)))) + gnus-newsgroup-ignored-charsets))) (setq gnus-newsgroup-charset - (or (and gnus-newsgroup-name + (or gnus-newsgroup-ephemeral-charset + (and gnus-newsgroup-name (or (gnus-group-find-parameter gnus-newsgroup-name 'charset) (let ((alist gnus-group-charset-alist) diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index 0c22d41..61975ef 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -936,6 +936,16 @@ ARG is passed to the first function." (throw 'found nil))) t)) +(defun gnus-write-active-file (file hashtb) + (with-temp-file file + (mapatoms + (lambda (sym) + (when (and sym (boundp sym)) + (insert (format "%s %d %d y\n" + (symbol-name sym) (cdr (symbol-value sym)) + (car (symbol-value sym)))))) + hashtb))) + (provide 'gnus-util) ;;; gnus-util.el ends here diff --git a/lisp/gnus.el b/lisp/gnus.el index 11230d4..1e3e7c5 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -260,7 +260,7 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "0.89" +(defconst gnus-version-number "0.91" "Version number for this version of Gnus.") (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number) diff --git a/lisp/lpath.el b/lisp/lpath.el index 4b89027..920a29b 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -61,6 +61,8 @@ enable-multibyte-characters browse-url-browser-function adaptive-fill-first-line-regexp adaptive-fill-regexp url-current-mime-headers help-echo-owns-message + w3-meta-content-type-charset-regexp + w3-meta-charset-content-type-regexp babel-translations babel-history)) (maybe-fbind '(color-instance-rgb-components temp-directory glyph-width annotation-glyph window-pixel-width glyph-height @@ -81,7 +83,7 @@ mm-copy-tree url-view-url w3-prepare-buffer mule-write-region-no-coding-system char-int annotationp delete-annotation make-image-specifier - make-annotation + make-annotation events-to-keys w3-do-setup w3-region w3-coding-system-for-mime-charset rmail-summary-exists rmail-select-summary rmail-update-summary diff --git a/lisp/mailcap.el b/lisp/mailcap.el index b576100..2ecff33 100644 --- a/lisp/mailcap.el +++ b/lisp/mailcap.el @@ -486,7 +486,7 @@ If FORCE, re-parse even if already parsed." (cond ((equal (car (car major)) minor) (setq exact (cons (cdr (car major)) exact))) - ((and minor (string-match (car (car major)) minor)) + ((and minor (string= (car (car major)) minor)) (setq wildcard (cons (cdr (car major)) wildcard)))) (setq major (cdr major))) (nconc (nreverse exact) (nreverse wildcard)))) diff --git a/lisp/message.el b/lisp/message.el index ccd5df2..a359b71 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -1036,7 +1036,7 @@ The cdr of ech entry is a function for applying the face to a region.") (file-readable-p file) (file-regular-p file)) (with-temp-buffer - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) (goto-char (point-min)) (looking-at message-unix-mail-delimiter)))) @@ -2510,12 +2510,15 @@ to find out how to use this." (message-check 'from (let* ((case-fold-search t) (from (message-fetch-field "from")) - (ad (nth 1 (mail-extract-address-components from)))) + ad) (cond ((not from) (message "There is no From line. Posting is denied.") nil) - ((or (not (string-match "@[^\\.]*\\." ad)) ;larsi@ifi + ((or (not (string-match + "@[^\\.]*\\." + (setq ad (nth 1 (mail-extract-address-components + from))))) ;larsi@ifi (string-match "\\.\\." ad) ;larsi@ifi..uio (string-match "@\\." ad) ;larsi@.ifi.uio (string-match "\\.$" ad) ;larsi@ifi.uio. @@ -3384,6 +3387,7 @@ OTHER-HEADERS is an alist of header/value pairs." from subject date reply-to to cc references message-id follow-to (inhibit-point-motion-hooks t) + (message-this-is-mail t) mct never-mct gnus-warning) (save-restriction (message-narrow-to-head) diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 0538fb5..856a538 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -85,26 +85,25 @@ ("multipart/related" ignore t)) "Alist of media types/test that say whether the media types can be displayed inline.") -(defvar mm-user-display-methods - '(("image/.*" . inline) - ("text/.*" . inline) - ("message/delivery-status" . inline) - ("message/rfc822" . inline))) - -(defvar mm-user-automatic-display +(defvar mm-inlined-types + '("image/.*" "text/.*" "message/delivery-status" "message/rfc822") + "List of media types that are to be displayed inline.") + +(defvar mm-automatic-display '("text/plain" "text/enriched" "text/richtext" "text/html" "text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*" - "message/rfc822")) + "message/rfc822") + "A list of MIME types to be displayed automatically.") (defvar mm-attachment-override-types '("text/plain" "text/x-vcard") "Types that should have \"attachment\" ignored if they can be displayed inline.") -(defvar mm-user-automatic-external-display nil +(defvar mm-automatic-external-display nil "List of MIME type regexps that will be displayed externally automatically.") (defvar mm-discouraged-alternatives nil - "List of MIME types that are discouraged when viewing multiapart/alternative. + "List of MIME types that are discouraged when viewing multipart/alternative. Viewing agents are supposed to view the last possible part of a message, as that is supposed to be the richest. However, users may prefer other types instead, and this list says what types are most unwanted. If, @@ -226,10 +225,6 @@ to: (insert-buffer-substring obuf beg) (current-buffer)))) -(defun mm-inlinable-part-p (type) - "Say whether TYPE can be displayed inline." - (eq (mm-user-method type) 'inline)) - (defun mm-display-part (handle &optional no-default) "Display the MIME part represented by HANDLE. Returns nil if the part is removed; inline if displayed inline; @@ -239,26 +234,22 @@ external if displayed external." (if (mm-handle-displayed-p handle) (mm-remove-part handle) (let* ((type (car (mm-handle-type handle))) - (method (mailcap-mime-info type)) - (user-method (mm-user-method type))) - (if (eq user-method 'inline) + (method (mailcap-mime-info type))) + (if (mm-inlined-p type) (progn (forward-line 1) (mm-display-inline handle) 'inline) - (when (or user-method - method + (when (or method (not no-default)) - (if (and (not user-method) - (not method) + (if (and (not method) (equal "text" (car (split-string type)))) (progn (forward-line 1) (mm-insert-inline handle (mm-get-part handle)) 'inline) (mm-display-external - handle (or user-method method - 'mailcap-save-binary-file)) + handle (or method 'mailcap-save-binary-file)) 'external))))))) (defun mm-display-external (handle method) @@ -397,21 +388,20 @@ external if displayed external." (pop alist)) test)) -(defun mm-user-method (type) - "Return the user-defined method for TYPE." - (let ((methods mm-user-display-methods) +(defun mm-automatic-display-p (type) + "Say whether the user wants TYPE to be displayed automatically." + (let ((methods mm-automatic-display) method result) (while (setq method (pop methods)) - (when (string-match (car method) type) - (when (or (not (eq (cdr method) 'inline)) - (mm-inlinable-p type)) - (setq result (cdr method) - methods nil)))) + (when (and (string-match method type) + (mm-inlinable-p type)) + (setq result t + methods nil))) result)) -(defun mm-automatic-display-p (type) - "Return the user-defined method for TYPE." - (let ((methods mm-user-automatic-display) +(defun mm-inlined-p (type) + "Say whether the user wants TYPE to be displayed automatically." + (let ((methods mm-inlined-types) method result) (while (setq method (pop methods)) (when (and (string-match method type) @@ -432,7 +422,7 @@ external if displayed external." (defun mm-automatic-external-display-p (type) "Return the user-defined method for TYPE." - (let ((methods mm-user-automatic-external-display) + (let ((methods mm-automatic-external-display) method result) (while (setq method (pop methods)) (when (string-match method type) @@ -440,11 +430,6 @@ external if displayed external." methods nil))) result)) -(defun add-mime-display-method (type method) - "Make parts of TYPE be displayed with METHOD. -This overrides entries in the mailcap file." - (push (cons type method) mm-user-display-methods)) - (defun mm-destroy-part (handle) "Destroy the data structures connected to HANDLE." (when (listp handle) diff --git a/lisp/mm-encode.el b/lisp/mm-encode.el index 587abf8..fbc2d7c 100644 --- a/lisp/mm-encode.el +++ b/lisp/mm-encode.el @@ -87,7 +87,12 @@ The encoding used is returned." (encoding (or (and (listp type) (cadr (assq 'encoding type))) - (mm-content-transfer-encoding mime-type)))) + (mm-content-transfer-encoding mime-type))) + (bits (mm-body-7-or-8))) + ;; We force buffers that are 7bit to be unencoded, no matter + ;; what the preferred encoding is. + (when (eq bits '7bit) + (setq encoding bits)) (mm-encode-content-transfer-encoding encoding mime-type) encoding)) diff --git a/lisp/mm-util.el b/lisp/mm-util.el index 966cb91..774e3b0 100644 --- a/lisp/mm-util.el +++ b/lisp/mm-util.el @@ -24,27 +24,18 @@ ;;; Code: -(defvar mm-running-xemacs (string-match "XEmacs" emacs-version)) +(defconst mm-running-xemacs (string-match "XEmacs" emacs-version)) -(defvar mm-running-ntemacs - (and (not mm-running-xemacs) - (string-match "nt\\|windows" system-configuration))) - -(defvar mm-binary-coding-system +(defconst mm-binary-coding-system (if mm-running-xemacs 'binary 'no-conversion) "100% binary coding system.") -(defvar mm-text-coding-system - (cond - ((not (fboundp 'coding-system-p)) nil) - (mm-running-xemacs ;; XEmacs - 'no-conversion) - (mm-running-ntemacs ;; NTEmacs - (and (coding-system-p 'raw-text-dos) 'raw-text-dos)) - ((coding-system-p 'raw-text) 'raw-text) ;; Emacs - (t nil)) - "100% text coding system, for removing ^M.") +(defconst mm-text-coding-system + (and (fboundp 'coding-system-list) + (if (memq system-type '(windows-nt ms-dos ms-windows)) + 'raw-text-dos 'raw-text)) + "Text-safe coding system (For removing ^M).") (defvar mm-mime-mule-charset-alist '((us-ascii ascii) @@ -59,9 +50,7 @@ (iso-8859-8 hebrew-iso8859-8) (iso-8859-9 latin-iso8859-9) (viscii vietnamese-viscii-lower) - (iso-2022-jp-2 japanese-jisx0208) - (iso-2022-jp latin-jisx0201 - japanese-jisx0208-1978) + (iso-2022-jp latin-jisx0201 japanese-jisx0208 japanese-jisx0208-1978) (euc-kr korean-ksc5601) (cn-gb-2312 chinese-gb2312) (cn-big5 chinese-big5-1 chinese-big5-2) @@ -215,6 +204,8 @@ used as the line break code type of the coding system." (mapcar 'mm-mime-charset (delq 'ascii (mm-find-charset-region b e))))) + (when (memq 'iso-2022-jp-2 charsets) + (setq charsets (delq 'iso-2022-jp charsets))) (delete-duplicates charsets))) (defsubst mm-multibyte-p () @@ -299,6 +290,31 @@ See also `with-temp-file' and `with-output-to-string'." arg (apply 'concat (nconc (nreverse accum) (list (substring arg pos))))))) +(defun mm-auto-mode-alist () + "Return an `auto-mode-alist' with only the .gz (etc) thingies." + (let ((alist auto-mode-alist) + out) + (while alist + (when (listp (cdar alist)) + (push (car alist) out)) + (pop alist)) + (nreverse out))) + +(defun mm-insert-file-contents (filename &optional visit beg end replace) + "Like `insert-file-contents', q.v., but only reads in the file. +A buffer may be modified in several ways after reading into the buffer due +to advanced Emacs features, such as file-name-handlers, format decoding, +find-file-hooks, etc. + This function ensures that none of these modifications will take place." + (let ((format-alist nil) + (auto-mode-alist (mm-auto-mode-alist)) + (default-major-mode 'fundamental-mode) + (enable-local-variables nil) + (after-insert-file-functions nil) + (enable-local-eval nil) + (find-file-hooks nil)) + (insert-file-contents filename visit beg end replace))) + (provide 'mm-util) ;;; mm-util.el ends here diff --git a/lisp/mm-uu.el b/lisp/mm-uu.el index e664119..010d3f7 100644 --- a/lisp/mm-uu.el +++ b/lisp/mm-uu.el @@ -1,13 +1,11 @@ ;;; mm-uu.el -- Return uu stuffs as mm handles -;; Copyright (c) 1998 by Shenghuo Zhu +;; Copyright (c) 1998,99 by Shenghuo Zhu ;; Author: Shenghuo Zhu -;; $Revision: 1.1.1.14 $ -;; Keywords: news postscript uudecode binhex shar +;; Keywords: postscript uudecode binhex shar forward + +;; This file is part of pgnus. -;; This file is not part of GNU Emacs, but the same permissions -;; apply. -;; ;; GNU Emacs is free software; 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) @@ -17,17 +15,23 @@ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. -;; + ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: -;; + ;;; Code: +(require 'mail-parse) +(require 'message) +(require 'nnheader) +(require 'mm-decode) +(require 'mailcap) + (eval-and-compile (autoload 'binhex-decode-region "binhex") (autoload 'binhex-decode-region-external "binhex") @@ -59,14 +63,21 @@ (defconst mm-uu-shar-begin-line "^#! */bin/sh") (defconst mm-uu-shar-end-line "^exit 0") -(defvar mm-uu-begin-line +;;; Thanks to Edward J. Sabol and +;;; Peter von der Ah\'e +(defconst mm-uu-forward-begin-line "^-+ \\(Start of \\)?Forwarded message") +(defconst mm-uu-forward-end-line "^-+ End of forwarded message") + +(defconst mm-uu-begin-line (concat mm-uu-postscript-begin-line "\\|" mm-uu-uu-begin-line "\\|" mm-uu-binhex-begin-line "\\|" - mm-uu-shar-begin-line)) + mm-uu-shar-begin-line "\\|" + mm-uu-forward-begin-line)) -(defvar mm-uu-identifier-alist - '((?% . postscript) (?b . uu) (?: . binhex) (?# . shar))) +(defconst mm-uu-identifier-alist + '((?% . postscript) (?b . uu) (?: . binhex) (?# . shar) + (?- . forward))) (defvar mm-dissect-disposition "inline" "The default disposition of uu parts. @@ -77,7 +88,9 @@ This can be either \"inline\" or \"attachment\".") (defun mm-uu-dissect () "Dissect the current buffer and return a list of uu handles." (let (ct ctl cte charset text-start start-char end-char - type file-name end-line result text-plain-type) + type file-name end-line result text-plain-type + start-char-1 end-char-1 + (case-fold-search t)) (save-excursion (save-restriction (mail-narrow-to-head) @@ -97,9 +110,9 @@ This can be either \"inline\" or \"attachment\".") (if charset (list (cons 'charset charset))))) (while (re-search-forward mm-uu-begin-line nil t) - (beginning-of-line) - (setq start-char (point)) + (setq start-char (match-beginning 0)) (forward-line) ;; in case of failure + (setq start-char-1 (point)) (setq type (cdr (assq (aref (match-string 0) 0) mm-uu-identifier-alist))) (setq file-name @@ -112,6 +125,7 @@ This can be either \"inline\" or \"attachment\".") (intern (concat "mm-uu-" (symbol-name type) "-end-line")))) (when (re-search-forward end-line nil t) + (setq end-char-1 (match-beginning 0)) (forward-line) (setq end-char (point)) (when (or (not (eq type 'binhex)) @@ -128,6 +142,9 @@ This can be either \"inline\" or \"attachment\".") ((eq type 'postscript) (mm-make-handle (mm-uu-copy-to-buffer start-char end-char) '("application/postscript"))) + ((eq type 'forward) + (mm-make-handle (mm-uu-copy-to-buffer start-char-1 end-char-1) + '("message/rfc822"))) ((eq type 'uu) (mm-make-handle (mm-uu-copy-to-buffer start-char end-char) (list (or (and file-name @@ -172,7 +189,8 @@ This can be either \"inline\" or \"attachment\".") (mail-narrow-to-head) (goto-char (point-max))) (forward-line) - (let (type end-line result) + (let (type end-line result + (case-fold-search t)) (while (and (not result) (re-search-forward mm-uu-begin-line nil t)) (forward-line) (setq type (cdr (assq (aref (match-string 0) 0) diff --git a/lisp/mm-view.el b/lisp/mm-view.el index d1993a4..5c7a56e 100644 --- a/lisp/mm-view.el +++ b/lisp/mm-view.el @@ -89,7 +89,8 @@ (buffer-substring-no-properties (match-beginning 2) (match-end 2))))) - (mm-decode-body charset) + (delete-region (point-min) (point-max)) + (insert (mm-decode-string text charset)) (save-window-excursion (save-restriction (let ((w3-strict-width width) diff --git a/lisp/mml.el b/lisp/mml.el index 16c7341..a77c615 100644 --- a/lisp/mml.el +++ b/lisp/mml.el @@ -208,7 +208,7 @@ ((cdr (assq 'buffer cont)) (insert-buffer-substring (cdr (assq 'buffer cont)))) ((setq filename (cdr (assq 'filename cont))) - (insert-file-contents filename)) + (mm-insert-file-contents filename)) (t (save-restriction (narrow-to-region (point) (point)) @@ -227,7 +227,7 @@ ((cdr (assq 'buffer cont)) (insert-buffer-substring (cdr (assq 'buffer cont)))) ((setq filename (cdr (assq 'filename cont))) - (insert-file-contents filename)) + (mm-insert-file-contents filename)) (t (insert (cdr (assq 'contents cont))))) (setq encoding (mm-encode-buffer type) @@ -300,7 +300,7 @@ ((cdr (assq 'buffer cont)) (insert-buffer-substring (cdr (assq 'buffer cont)))) ((setq filename (cdr (assq 'filename cont))) - (insert-file-contents filename)) + (mm-insert-file-contents filename)) (t (insert (cdr (assq 'contents cont))))) (goto-char (point-min)) diff --git a/lisp/nndoc.el b/lisp/nndoc.el index fc7a6ed..81b0fea 100644 --- a/lisp/nndoc.el +++ b/lisp/nndoc.el @@ -31,6 +31,7 @@ (require 'nnmail) (require 'nnoo) (require 'gnus-util) +(require 'mm-util) (eval-when-compile (require 'cl)) (nnoo-declare nndoc) @@ -289,7 +290,7 @@ from the document.") (mm-enable-multibyte) (erase-buffer) (if (stringp nndoc-address) - (nnheader-insert-file-contents nndoc-address) + (mm-insert-file-contents nndoc-address) (insert-buffer-substring nndoc-address)) (run-hooks 'nndoc-open-document-hook)))) ;; Initialize the nndoc structures according to this new document. diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 72770a9..3168ac5 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -90,7 +90,13 @@ time saver for large mailboxes.") (defvoo nnfolder-buffer-alist nil) (defvoo nnfolder-scantime-alist nil) (defvoo nnfolder-active-timestamp nil) -(defvoo nnfolder-file-coding-system nnmail-file-coding-system-1) +(defvoo nnfolder-active-file-coding-system mm-text-coding-system) +(defvoo nnfolder-active-file-coding-system-for-write + nnmail-active-file-coding-system) +(defvoo nnfolder-file-coding-system mm-text-coding-system) +(defvoo nnfolder-file-coding-system-for-write nnheader-file-coding-system + "Coding system for save nnfolder file. +If NIL, NNFOLDER-FILE-CODING-SYSTEM is used.") @@ -267,15 +273,14 @@ time saver for large mailboxes.") (when group (unless (assoc group nnfolder-group-alist) (push (list group (cons 1 0)) nnfolder-group-alist) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) (nnfolder-read-folder group))) t) (deffoo nnfolder-request-list (&optional server) (nnfolder-possibly-change-group nil server) (save-excursion - (let ((nnmail-file-coding-system nnmail-active-file-coding-system) - (pathname-coding-system 'binary)) + (let ((nnmail-file-coding-system nnfolder-active-file-coding-system)) (nnmail-find-file nnfolder-active-file) (setq nnfolder-group-alist (nnmail-get-active))) t)) @@ -287,7 +292,8 @@ time saver for large mailboxes.") (deffoo nnfolder-request-list-newsgroups (&optional server) (nnfolder-possibly-change-group nil server) (save-excursion - (nnmail-find-file nnfolder-newsgroups-file))) + (let ((nnmail-file-coding-system nnfolder-file-coding-system)) + (nnmail-find-file nnfolder-newsgroups-file)))) (deffoo nnfolder-request-expire-articles (articles newsgroup &optional server force) @@ -320,7 +326,7 @@ time saver for large mailboxes.") (nnheader-message 5 "Deleting articles...done")) (nnfolder-save-buffer) (nnfolder-adjust-min-active newsgroup) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) (nconc rest articles)))) (deffoo nnfolder-request-move-article (article group server @@ -352,7 +358,7 @@ time saver for large mailboxes.") (when last (nnfolder-save-buffer) (nnfolder-adjust-min-active group) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)))) result))) (deffoo nnfolder-request-accept-article (group &optional server last) @@ -390,7 +396,7 @@ time saver for large mailboxes.") (nnfolder-save-buffer) (when nnmail-cache-accepted-message-ids (nnmail-cache-close))))) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) (unless result (nnheader-report 'nnfolder "Couldn't store article")) result))) @@ -433,7 +439,7 @@ time saver for large mailboxes.") nnfolder-current-group nil nnfolder-current-buffer nil) ;; Save the active file. - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) t) (deffoo nnfolder-request-rename-group (group new-name &optional server) @@ -452,7 +458,7 @@ time saver for large mailboxes.") (setq nnfolder-current-buffer nil nnfolder-current-group nil) ;; Save the new group alist. - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) ;; We kill the buffer instead of renaming it and stuff. (kill-buffer (current-buffer)) t)))) @@ -541,14 +547,14 @@ deleted. Point is left where the deleted region was." ;; Change group. (when (and group (not (equal group nnfolder-current-group))) - (let ((pathname-coding-system 'binary)) + (let ((pathname-coding-system nnmail-pathname-coding-system)) (nnmail-activate 'nnfolder) (when (and (not (assoc group nnfolder-group-alist)) (not (file-exists-p (nnfolder-group-pathname group)))) ;; The group doesn't exist, so we create a new entry for it. (push (list group (cons 1 0)) nnfolder-group-alist) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)) (if dont-check (setq nnfolder-current-group group @@ -578,7 +584,10 @@ deleted. Point is left where the deleted region was." ;; See whether we need to create the new file. (unless (file-exists-p file) (gnus-make-directory (file-name-directory file)) - (nnmail-write-region 1 1 file t 'nomesg)) + (let ((nnmail-file-coding-system + (or nnfolder-file-coding-system-for-write + nnfolder-file-coding-system-for-write))) + (nnmail-write-region 1 1 file t 'nomesg))) (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) (set-buffer nnfolder-current-buffer) (push (list group nnfolder-current-buffer) @@ -666,7 +675,7 @@ deleted. Point is left where the deleted region was." (when inf (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist))) (when nnfolder-group-alist - (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)) (push (list group (nnfolder-read-folder group)) nnfolder-buffer-alist)))) @@ -688,7 +697,7 @@ deleted. Point is left where the deleted region was." (defun nnfolder-read-folder (group) (let* ((file (nnfolder-group-pathname group)) (buffer (set-buffer - (let ((nnmail-file-coding-system + (let ((nnheader-file-coding-system nnfolder-file-coding-system)) (nnheader-find-file-noselect file))))) (if (equal (cadr (assoc group nnfolder-scantime-alist)) @@ -772,7 +781,7 @@ deleted. Point is left where the deleted region was." (set-marker end nil) ;; Make absolutely sure that the active list reflects reality! - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) ;; Set the scantime for this group. (setq newscantime (visited-file-modtime)) (if scantime @@ -823,7 +832,16 @@ This command does not work if you use short group names." (when (buffer-modified-p) (run-hooks 'nnfolder-save-buffer-hook) (gnus-make-directory (file-name-directory (buffer-file-name))) - (save-buffer))) + (let ((coding-system-for-write + (or nnfolder-file-coding-system-for-write + nnfolder-file-coding-system))) + (save-buffer)))) + +(defun nnfolder-save-active (group-alist active-file) + (let ((nnmail-active-file-coding-system + (or nnfolder-active-file-coding-system-for-write + nnfolder-active-file-coding-system))) + (nnmail-save-active group-alist active-file))) (provide 'nnfolder) diff --git a/lisp/nnheader.el b/lisp/nnheader.el index ede54a2..696f7c9 100644 --- a/lisp/nnheader.el +++ b/lisp/nnheader.el @@ -471,12 +471,12 @@ the line could be found." (when (file-exists-p file) (if (eq nnheader-max-head-length t) ;; Just read the entire file. - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) ;; Read 1K blocks until we find a separator. (let ((beg 0) format-alist) (while (and (eq nnheader-head-chop-length - (nth 1 (nnheader-insert-file-contents + (nth 1 (mm-insert-file-contents file nil beg (incf beg nnheader-head-chop-length)))) (prog1 (not (search-forward "\n\n" nil t)) @@ -762,10 +762,10 @@ If FILE, find the \".../etc/PACKAGE\" file instead." (when (string-match (car ange-ftp-path-format) path) (ange-ftp-re-read-dir path))))) -(defvar nnheader-file-coding-system 'binary +(defvar nnheader-file-coding-system 'raw-text "Coding system used in file backends of Gnus.") -(defun nnheader-insert-file-contents (filename &optional visit beg end replace) +(defun mm-insert-file-contents (filename &optional visit beg end replace) "Like `insert-file-contents', q.v., but only reads in the file. A buffer may be modified in several ways after reading into the buffer due to advanced Emacs features, such as file-name-handlers, format decoding, diff --git a/lisp/nnkiboze.el b/lisp/nnkiboze.el index 3211d69..8818e50 100644 --- a/lisp/nnkiboze.el +++ b/lisp/nnkiboze.el @@ -80,7 +80,7 @@ (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) - (nnheader-insert-file-contents nov) + (mm-insert-file-contents nov) (nnheader-nov-delete-outside-range (car articles) (car (last articles))) 'nov)))))) @@ -119,7 +119,7 @@ (nnkiboze-request-scan group)) (if (not (file-exists-p nov-file)) (nnheader-report 'nnkiboze "Can't select group %s" group) - (nnheader-insert-file-contents nov-file) + (mm-insert-file-contents nov-file) (if (zerop (buffer-size)) (nnheader-insert "211 0 0 0 %s\n" group) (goto-char (point-min)) @@ -138,7 +138,7 @@ nnkiboze-remove-read-articles) (with-temp-file (nnkiboze-nov-file-name) (let ((cur (current-buffer))) - (nnheader-insert-file-contents (nnkiboze-nov-file-name)) + (mm-insert-file-contents (nnkiboze-nov-file-name)) (goto-char (point-min)) (while (not (eobp)) (if (not (gnus-article-read-p (read cur))) diff --git a/lisp/nnmail.el b/lisp/nnmail.el index 3bd4cfb..f196095 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -420,18 +420,16 @@ parameter. It should return nil, `warn' or `delete'." (defun nnmail-request-post (&optional server) (mail-send-and-exit nil)) -(defvar nnmail-file-coding-system 'binary +(defvar nnmail-file-coding-system 'raw-text "Coding system used in nnmail.") -(defvar nnmail-file-coding-system-1 - (if (string-match "nt\\|windows" system-configuration) - 'raw-text-dos 'binary) - "Another coding system used in nnmail.") - (defvar nnmail-incoming-coding-system mm-text-coding-system "Coding system used in reading inbox") +(defvar nnmail-pathname-coding-system 'binary + "*Coding system for pathname.") + (defun nnmail-find-file (file) "Insert FILE in server buffer safely." (set-buffer nntp-server-buffer) @@ -441,14 +439,11 @@ parameter. It should return nil, `warn' or `delete'." (condition-case () (let ((coding-system-for-read nnmail-file-coding-system) (auto-mode-alist (nnheader-auto-mode-alist)) - (pathname-coding-system nnmail-file-coding-system)) + (pathname-coding-system nnmail-pathname-coding-system)) (insert-file-contents file) t) (file-error nil)))) -(defvar nnmail-pathname-coding-system 'binary - "*Coding system for pathname.") - (defun nnmail-group-pathname (group dir &optional file) "Make pathname for GROUP." (concat @@ -483,7 +478,7 @@ nn*-request-list should have been called before calling this function." group-assoc))) group-assoc)) -(defvar nnmail-active-file-coding-system 'binary +(defvar nnmail-active-file-coding-system 'raw-text "*Coding system for active file.") (defun nnmail-save-active (group-assoc file-name) @@ -840,7 +835,7 @@ FUNC will be called with the buffer narrowed to each mail." (set-buffer (get-buffer-create " *nnmail incoming*")) (erase-buffer) (let ((nnheader-file-coding-system nnmail-incoming-coding-system)) - (nnheader-insert-file-contents incoming)) + (mm-insert-file-contents incoming)) (prog1 (if (zerop (buffer-size)) 0 @@ -1240,7 +1235,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (setq nnmail-cache-buffer (get-buffer-create " *nnmail message-id cache*"))) (when (file-exists-p nnmail-message-id-cache-file) - (nnheader-insert-file-contents nnmail-message-id-cache-file)) + (mm-insert-file-contents nnmail-message-id-cache-file)) (set-buffer-modified-p nil) (current-buffer)))) @@ -1461,7 +1456,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (defun nnmail-write-region (start end filename &optional append visit lockname) "Do a `write-region', and then set the file modes." (let ((coding-system-for-write nnmail-file-coding-system) - (pathname-coding-system 'binary)) + (pathname-coding-system nnmail-pathname-coding-system)) (write-region start end filename append visit lockname) (set-file-modes filename nnmail-default-file-modes))) diff --git a/lisp/nnmbox.el b/lisp/nnmbox.el index 914adfd..38f36c2 100644 --- a/lisp/nnmbox.el +++ b/lisp/nnmbox.el @@ -59,6 +59,11 @@ (defvoo nnmbox-group-alist nil) (defvoo nnmbox-active-timestamp nil) +(defvoo nnmbox-file-coding-system mm-text-coding-system) +(defvoo nnmbox-file-coding-system-for-write nil) +(defvoo nnmbox-active-file-coding-system mm-text-coding-system) +(defvoo nnmbox-active-file-coding-system-for-write nil) + ;;; Interface functions @@ -181,6 +186,18 @@ (1+ (- (cdr active) (car active))) (car active) (cdr active) group))))) +(defun nnmbox-save-buffer () + (let ((coding-system-for-write + (or nnmbox-file-coding-system-for-write + nnmbox-file-coding-system))) + (save-buffer))) + +(defun nnmbox-save-active (group-alist active-file) + (let ((nnmail-active-file-coding-system + (or nnmbox-active-file-coding-system-for-write + nnmbox-active-file-coding-system))) + (nnmail-save-active group-alist active-file))) + (deffoo nnmbox-request-scan (&optional group server) (nnmbox-possibly-change-newsgroup group server) (nnmbox-read-mbox) @@ -189,7 +206,7 @@ (lambda () (save-excursion (set-buffer nnmbox-mbox-buffer) - (save-buffer))) + (nnmbox-save-buffer))) (file-name-directory nnmbox-mbox-file) group (lambda () @@ -198,7 +215,7 @@ (set-buffer nnmbox-mbox-buffer) (goto-char (point-max)) (insert-buffer-substring in-buf))) - (nnmail-save-active nnmbox-group-alist nnmbox-active-file)))) + (nnmbox-save-active nnmbox-group-alist nnmbox-active-file)))) (deffoo nnmbox-close-group (group &optional server) t) @@ -208,12 +225,14 @@ (unless (assoc group nnmbox-group-alist) (push (list group (cons 1 0)) nnmbox-group-alist) - (nnmail-save-active nnmbox-group-alist nnmbox-active-file)) + (nnmbox-save-active nnmbox-group-alist nnmbox-active-file)) t) (deffoo nnmbox-request-list (&optional server) (save-excursion - (nnmail-find-file nnmbox-active-file) + (let ((nnmail-file-coding-system + nnmbox-active-file-coding-system)) + (nnmail-find-file nnmbox-active-file)) (setq nnmbox-group-alist (nnmail-get-active)) t)) @@ -246,7 +265,7 @@ (nnmbox-delete-mail)) (push (car articles) rest))) (setq articles (cdr articles))) - (save-buffer) + (nnmbox-save-buffer) ;; Find the lowest active article in this group. (let ((active (nth 1 (assoc newsgroup nnmbox-group-alist)))) (goto-char (point-min)) @@ -255,7 +274,7 @@ (<= (car active) (cdr active))) (setcar active (1+ (car active))) (goto-char (point-min)))) - (nnmail-save-active nnmbox-group-alist nnmbox-active-file) + (nnmbox-save-active nnmbox-group-alist nnmbox-active-file) (nconc rest articles)))) (deffoo nnmbox-request-move-article @@ -283,7 +302,7 @@ (goto-char (point-min)) (when (search-forward (nnmbox-article-string article) nil t) (nnmbox-delete-mail)) - (and last (save-buffer)))) + (and last (nnmbox-save-buffer)))) result)) (deffoo nnmbox-request-accept-article (group &optional server last) @@ -323,8 +342,8 @@ (when last (when nnmail-cache-accepted-message-ids (nnmail-cache-close)) - (nnmail-save-active nnmbox-group-alist nnmbox-active-file) - (save-buffer)))) + (nnmbox-save-active nnmbox-group-alist nnmbox-active-file) + (nnmbox-save-buffer)))) result)) (deffoo nnmbox-request-replace-article (article group buffer) @@ -336,7 +355,7 @@ nil (nnmbox-delete-mail t t) (insert-buffer-substring buffer) - (save-buffer) + (nnmbox-save-buffer) t))) (deffoo nnmbox-request-delete-group (group &optional force server) @@ -354,13 +373,13 @@ (setq found t) (nnmbox-delete-mail)) (when found - (save-buffer))))) + (nnmbox-save-buffer))))) ;; Remove the group from all structures. (setq nnmbox-group-alist (delq (assoc group nnmbox-group-alist) nnmbox-group-alist) nnmbox-current-group nil) ;; Save the active file. - (nnmail-save-active nnmbox-group-alist nnmbox-active-file) + (nnmbox-save-active nnmbox-group-alist nnmbox-active-file) t) (deffoo nnmbox-request-rename-group (group new-name &optional server) @@ -375,13 +394,13 @@ (replace-match new-ident t t) (setq found t)) (when found - (save-buffer)))) + (nnmbox-save-buffer)))) (let ((entry (assoc group nnmbox-group-alist))) (when entry (setcar entry new-name)) (setq nnmbox-current-group nil) ;; Save the new group alist. - (nnmail-save-active nnmbox-group-alist nnmbox-active-file) + (nnmbox-save-active nnmbox-group-alist nnmbox-active-file) t)) @@ -425,8 +444,10 @@ (not (buffer-name nnmbox-mbox-buffer))) (save-excursion (set-buffer (setq nnmbox-mbox-buffer - (nnheader-find-file-noselect - nnmbox-mbox-file nil t))) + (let ((nnheader-file-coding-system + nnmbox-file-coding-system)) + (nnheader-find-file-noselect + nnmbox-mbox-file nil t)))) (mm-enable-multibyte) (buffer-disable-undo))) (when (not nnmbox-group-alist) @@ -497,7 +518,9 @@ (defun nnmbox-create-mbox () (when (not (file-exists-p nnmbox-mbox-file)) - (nnmail-write-region 1 1 nnmbox-mbox-file t 'nomesg))) + (let ((nnmail-file-coding-system + nnmbox-file-coding-system-for-write)) + (nnmail-write-region 1 1 nnmbox-mbox-file t 'nomesg)))) (defun nnmbox-read-mbox () (nnmail-activate 'nnmbox) @@ -513,8 +536,10 @@ (alist nnmbox-group-alist) start end number) (set-buffer (setq nnmbox-mbox-buffer - (nnheader-find-file-noselect - nnmbox-mbox-file nil t))) + (let ((nnheader-file-coding-system + nnmbox-file-coding-system)) + (nnheader-find-file-noselect + nnmbox-mbox-file nil t)))) (mm-enable-multibyte) (buffer-disable-undo) diff --git a/lisp/nnml.el b/lisp/nnml.el index e47448c..5429682 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -86,7 +86,7 @@ all. This may very well take some time.") (defvar nnml-nov-buffer-file-name nil) -(defvoo nnml-file-coding-system nnmail-file-coding-system-1) +(defvoo nnml-file-coding-system nnmail-file-coding-system) @@ -463,7 +463,7 @@ all. This may very well take some time.") (nnheader-report 'nnml "File %s does not exist" file)) (t (with-temp-file file - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) (nnmail-replace-status name value)) t)))) @@ -519,7 +519,7 @@ all. This may very well take some time.") nnml-nov-file-name)) number found) (when (file-exists-p nov) - (nnheader-insert-file-contents nov) + (mm-insert-file-contents nov) (while (and (not found) (search-forward id nil t)) ; We find the ID. ;; And the id is in the fourth field. @@ -541,7 +541,7 @@ all. This may very well take some time.") (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) - (nnheader-insert-file-contents nov) + (mm-insert-file-contents nov) (if (and fetch-old (not (numberp fetch-old))) t ; Don't remove anything. @@ -677,7 +677,7 @@ all. This may very well take some time.") nnml-nov-file-name)) (erase-buffer) (when (file-exists-p nnml-nov-buffer-file-name) - (nnheader-insert-file-contents nnml-nov-buffer-file-name))) + (mm-insert-file-contents nnml-nov-buffer-file-name))) (push (cons group buffer) nnml-nov-buffer-alist) buffer))) @@ -767,7 +767,7 @@ all. This may very well take some time.") (while files (unless (file-directory-p (setq file (concat dir (cdar files)))) (erase-buffer) - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) (narrow-to-region (goto-char (point-min)) (progn diff --git a/lisp/nnsoup.el b/lisp/nnsoup.el index 031c0ac..22c22da 100644 --- a/lisp/nnsoup.el +++ b/lisp/nnsoup.el @@ -535,7 +535,7 @@ backend for the messages.") (set-buffer (get-buffer-create buffer-name)) (buffer-disable-undo) (push (cons nnsoup-current-group (current-buffer)) nnsoup-buffers) - (nnheader-insert-file-contents (concat nnsoup-directory file)) + (mm-insert-file-contents (concat nnsoup-directory file)) (current-buffer)))))) (defun nnsoup-file (prefix &optional message) @@ -752,7 +752,7 @@ backend for the messages.") (while files (nnheader-message 5 "Doing %s..." (car files)) (erase-buffer) - (nnheader-insert-file-contents (car files)) + (mm-insert-file-contents (car files)) (goto-char (point-min)) (if (not (re-search-forward "^[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t *\\(Xref: \\)? *[^ ]* \\([^ ]+\\):[0-9]" nil t)) (setq group "unknown") diff --git a/lisp/nnspool.el b/lisp/nnspool.el index 9ad2b4f..2f5ee8c 100644 --- a/lisp/nnspool.el +++ b/lisp/nnspool.el @@ -366,7 +366,7 @@ there.") (erase-buffer) (if nnspool-sift-nov-with-sed (nnspool-sift-nov-with-sed articles nov) - (nnheader-insert-file-contents nov) + (mm-insert-file-contents nov) (if (and fetch-old (not (numberp fetch-old))) t ; We want all the headers. @@ -439,7 +439,7 @@ there.") (erase-buffer) (condition-case () (let ((nnheader-file-coding-system nnspool-file-coding-system)) - (nnheader-insert-file-contents file) + (mm-insert-file-contents file) t) (file-error nil))) diff --git a/lisp/nnweb.el b/lisp/nnweb.el index d46aefd..843e220 100644 --- a/lisp/nnweb.el +++ b/lisp/nnweb.el @@ -35,6 +35,7 @@ (require 'gnus-util) (require 'gnus) (require 'nnmail) +(require 'mm-util) (eval-when-compile (ignore-errors (require 'w3) @@ -227,7 +228,7 @@ and `altavista'.") "Read the overview of GROUP and build the map." (when (file-exists-p (nnweb-overview-file group)) (with-temp-buffer - (nnheader-insert-file-contents (nnweb-overview-file group)) + (mm-insert-file-contents (nnweb-overview-file group)) (goto-char (point-min)) (let (header) (while (not (eobp)) diff --git a/lisp/qp.el b/lisp/qp.el index e50a5a4..50fd046 100644 --- a/lisp/qp.el +++ b/lisp/qp.el @@ -24,7 +24,7 @@ ;;; Code: (defvar quoted-printable-encoding-characters - (mapcar 'identity "0123456789ABCDEF")) + (mapcar 'identity "0123456789ABCDEFabcdef")) (defun quoted-printable-decode-region (from to) "Decode quoted-printable in the region between FROM and TO." diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el index a389d36..6e7512c 100644 --- a/lisp/rfc2047.el +++ b/lisp/rfc2047.el @@ -195,7 +195,14 @@ Should be called narrowed to the head of the message." (first t)) (save-restriction (narrow-to-region b e) - (mm-encode-coding-region b e mime-charset) + (when (eq encoding 'B) + ;; break into lines before encoding + (goto-char (point-min)) + (while (not (eobp)) + (goto-char (min (point-max) (+ 15 (point)))) + (unless (eobp) + (insert "\n")))) + (mm-encode-coding-region (point-min) (point-max) mime-charset) (funcall (cdr (assq encoding rfc2047-encoding-function-alist)) (point-min) (point-max)) (goto-char (point-min)) @@ -231,12 +238,13 @@ Should be called narrowed to the head of the message." (defun rfc2047-b-encode-region (b e) "Encode the header contained in REGION with the B encoding." - (base64-encode-region b e t) - (goto-char (point-min)) - (while (not (eobp)) - (goto-char (min (point-max) (+ 64 (point)))) - (unless (eobp) - (insert "\n")))) + (save-restriction + (narrow-to-region (goto-char b) e) + (while (not (eobp)) + (base64-encode-region (point) (progn (end-of-line) (point)) t) + (if (and (bolp) (eolp)) + (delete-backward-char 1)) + (forward-line)))) (defun rfc2047-q-encode-region (b e) "Encode the header contained in REGION with the Q encoding." diff --git a/lisp/smiley.el b/lisp/smiley.el index 184cc64..a05d47f 100644 --- a/lisp/smiley.el +++ b/lisp/smiley.el @@ -180,6 +180,8 @@ above them." (glyph (make-glyph (list (cons 'x (expand-file-name pixmap smiley-data-directory)) + (cons 'mswindows + (expand-file-name pixmap smiley-data-directory)) (cons 'tty smiley))))) (setq smiley-glyph-cache (cons (cons pixmap glyph) smiley-glyph-cache)) (set-glyph-face glyph 'default) @@ -228,7 +230,7 @@ above them." ;;;###autoload (defun smiley-buffer (&optional buffer st nd) (interactive) - (when (featurep 'x) + (when (featurep '(or x mswindows)) (save-excursion (when buffer (set-buffer buffer)) diff --git a/texi/ChangeLog b/texi/ChangeLog index 2d6386b..83731fa 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,8 @@ +1999-07-04 04:33:50 Lars Magne Ingebrigtsen + + * gnus.texi (Posting Styles): Fix. + (Mail in a Newsreader): New. + 1999-06-13 02:29:22 Lars Magne Ingebrigtsen * gnus.texi (MIME Commands): Addition. diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi index e40194a..5e805fa 100644 --- a/texi/emacs-mime.texi +++ b/texi/emacs-mime.texi @@ -742,9 +742,10 @@ other programs to do things based on the list of @dfn{handles} that are returned as a result of this analysis. @menu -* Dissection:: Analyzing a @sc{mime} message. -* Handles:: Handle manipulations. -* Display:: Displaying handles. +* Dissection:: Analyzing a @sc{mime} message. +* Handles:: Handle manipulations. +* Display:: Displaying handles. +* Customization:: Variables that affect display. @end menu @@ -843,6 +844,58 @@ Prompt for a mailcap method to use to view the part. @end table +@node Customization +@section Customization + +@table @code + +@item mm-inline-media-tests +This is an alist where the key is a @sc{mime} type, the second element +is a function to display the part @dfn{inline} (i.e., inside Emacs), and +the third element is a form to be @code{eval}ed to say whether the part +can be displayed inline. + +This variable specifies whether a part @emph{can} be displayed inline, +and, if so, how to do it. It does not say whether parts are +@emph{actually} displayed inline. + +@item mm-inlines-types +This, on the other hand, says what types are to be displayed inline, if +they satisfy the conditions set by the variable above. It's a list of +@sc{mime} media types. + +@item mm-automatic-display +This is a list of types that are to be displayed ``automatically'', but +only if the above variable allows it. That is, only inlinable parts are +usually displayed automatically, but in the end, this is up to the +display agent that's using the @sc{mime} library. + +@item mm-attachment-override-types +Some @sc{mime} agents create parts that have a content-disposition of +@samp{attachment}. This variable allows overriding that disposition and +displaying the part inline. + +@item mm-discouraged-alternatives +List of @sc{mime} types that are discouraged when viewing +@samp{multipart/alternative}. Viewing agents are supposed to view the +last possible part of a message, as that is supposed to be the richest. +However, users may prefer other types instead, and this list says what +types are most unwanted. If, for instance, @samp{text/html} parts are +very unwanted, and @samp{text/richtech} parts are somewhat unwanted, +then the value of this variable should be set to: + +@lisp +("text/html" "text/richtext") +@end lisp + +@item mm-all-images-fit +If non-@code{nil}, all images will be deemed to fit into the buffer, +even when they don't. + +@end table + + + @node Composing @chapter Composing @cindex Composing diff --git a/texi/gnus.texi b/texi/gnus.texi index a09423a..b1ad151 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -1,7 +1,7 @@ @c \input texinfo @c -*-texinfo-*- @setfilename gnus -@settitle Pterodactyl Gnus 0.89 Manual +@settitle Pterodactyl Gnus 0.91 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -319,7 +319,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Pterodactyl Gnus 0.89 Manual +@title Pterodactyl Gnus 0.91 Manual @author by Lars Magne Ingebrigtsen @page @@ -355,7 +355,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local spool or your mbox file. All at the same time, if you want to push your luck. -This manual corresponds to Pterodactyl Gnus 0.89. +This manual corresponds to Pterodactyl Gnus 0.91. @end ifinfo @@ -8947,11 +8947,10 @@ list (it will be @code{eval}ed and the return value will be used). If you wish to check whether the message you are about to compose is meant to be a news article or a mail message, you can check the values -of the two dynamically bound variables @code{message-this-is-news} and -@code{message-this-is-mail}. +of the @code{message-news-p} and @code{message-mail-p} functions. -@vindex message-this-is-mail -@vindex message-this-is-news +@findex message-mail-p +@findex message-news-p So here's a new example: @@ -8966,9 +8965,9 @@ So here's a new example: (signature my-funny-signature-randomizer)) ((equal (system-name) "gnarly") (signature my-quote-randomizer)) - (message-this-is-news + ((message-news-p) (signature my-news-signature)) - (posting-from-work-p + ((posting-from-work-p) (signature-file "~/.work-signature") (address "user@@bar.foo") (body "You are fired.\n\nSincerely, your boss.") @@ -9906,6 +9905,7 @@ Reading mail with a newsreader---isn't that just plain WeIrD? But of course. @menu +* Mail in a Newsreader:: Important introductory notes. * Getting Started Reading Mail:: A simple cookbook example. * Splitting Mail:: How to create mail groups. * Mail Sources:: How to tell Gnus where to get mail from. @@ -9920,6 +9920,61 @@ course. @end menu +@node Mail in a Newsreader +@subsection Mail in a Newsreader + +If you are used to traditional mail readers, but have decided to switch +to reading mail with Gnus, you may find yourself experiencing something +of a culture shock. + +Gnus does not behave like traditional mail readers. If you want to make +it behave that way, you can, but it's an uphill battle. + +Gnus, by default, handles all its group using the same approach. This +approach is very newsreaderly---you enter a group, see the new/unread +messages, and when you read the messages, they get marked as read, and +you don't see them any more. (Unless you explicitly ask for them.) + +In particular, you do not do anything explicitly to delete messages. + +Does this mean that all the messages that have been marked as read are +deleted? How awful! + +But, no, it means that old messages are @dfn{expired} according to some +scheme or other. For news messages, the expire process is controlled by +the news administrator; for mail, the expire process is controlled by +you. The expire process for mail is covered in depth in @pxref{Expiring +Mail}. + +What many Gnus users find, after using it a while for both news and +mail, is that the transport becomes more and more irrelevant. What +becomes important is the size of the receiving audience. + +Many people subscribe to several mailing lists. These are transported +via SMTP, and are therefore mail. Some people have local news groups +which have only a handful of readers. These are transported via NNTP, +and are therefore news. + +The important distinction turns out to be not the transport mechanism, +but whether the messages are @dfn{personal} or @dfn{public}. Many users +then subtly alter the behavior of Gnus according to these two +categories. + +Some users never get comfortable using the Gnus (ahem) paradigm and wish +that Gnus should grow up and be a male, er, mail reader. It is possible +to whip Gnus into a more mailreaderly being, but, as said before, it's +not easy. People who prefer proper mail readers should try @sc{vm} +instead, which is an excellent, and proper, mail reader. + +I don't mean to scare anybody off, but I want to make it clear that you +may be required to learn a new way of thinking about messages. After +you've been subjected to The Gnus Way, you will come to love it. I can +guarantee it. (At least the guy who sold me the Emacs Subliminal +Brain-Washing Functions that I've put into Gnus did guarantee it. You +Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way. +You Do.) + + @node Getting Started Reading Mail @subsection Getting Started Reading Mail @@ -17985,8 +18040,6 @@ are in the cache. @item AUTHINFO GENERIC @item - support qmail maildir spools -@item `run-with-idle-timer' in gnus-demon. @item stop using invisible text properties and start using overlays instead @@ -19014,6 +19067,9 @@ Under the subject "foo1", you wrote on 01.01.1999: @end example @item +Allow "orphan" scores in the Agent scoring. + +@item Solve the halting problem. @c TODO diff --git a/texi/message.texi b/texi/message.texi index e4d577c..388f2df 100644 --- a/texi/message.texi +++ b/texi/message.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename message -@settitle Pterodactyl Message 0.89 Manual +@settitle Pterodactyl Message 0.91 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Pterodactyl Message 0.89 Manual +@title Pterodactyl Message 0.91 Manual @author by Lars Magne Ingebrigtsen @page @@ -83,7 +83,7 @@ Message mode buffers. * Key Index:: List of Message mode keys. @end menu -This manual corresponds to Pterodactyl Message 0.89. Message is +This manual corresponds to Pterodactyl Message 0.91. Message is distributed with the Gnus distribution bearing the same version number as this manual. -- 1.7.10.4