** 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.
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.
+Sun Jul 4 06:31:01 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.91 is released.
+
+1999-07-04 04:35:28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * 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 <mklingbeil@knuut.de>
+
+ * smiley.el (smiley-buffer): Fix for NT.
+
+1999-07-03 11:26:47 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * 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 <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.90 is released.
+
+1999-07-03 09:31:10 Sven Fischer <herpes@kawo2.rwth-aachen.de>
+
+ * mailcap.el (mailcap-possible-viewers): Use string=.
+
+1999-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * 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 <zsh@cs.rochester.edu>
+
+ * lpath.el: Two free variables.
+
+1999-07-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * 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 <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-read-folder): Use nnheader-file-coding-system.
+
+1999-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * qp.el (quoted-printable-encoding-characters): Support lower case.
+
+1999-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * 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 <larsi@gnus.org>
+
+ * mm-util.el (mm-find-mime-charset-region): Fix.
+
+1999-06-30 KOSEKI Yoshinori <kose@yk.NetLaputa.ne.jp>
+
+ * 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 <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-summary-move-article): Fix something or
+ other.
+
+1999-06-29 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * 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 <zsh@cs.rochester.edu>
+
+ * base64.el (base64-run-command-on-region): Use unibyte buffer.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Fix bug when
+ gnus-newsgroup-name is nil.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode): Chop the tail newline.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-emphasize): Use correct
+ gnus-article-emphasis-alist.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): Fix text/html bug.
+
Mon Jun 28 17:54:01 1999 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Pterodactyl Gnus v0.89 is released.
(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"))
(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")
(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")
"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)))))
;;;
(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."
(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)))
(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
(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)))
(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))
(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)
(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 '<)))
(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
(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))
"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 "/"))
(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.")
\f
(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))))
(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)))
(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
(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))
"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
;; 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.
(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.
(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
(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.
(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)))
(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)))))
(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)
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))
(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)
(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
: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)
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
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
(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))))
(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))))
(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.
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)
("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,
(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;
(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)
(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)
(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)
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)
(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))
;;; 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)
(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)
(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 ()
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
;;; mm-uu.el -- Return uu stuffs as mm handles
-;; Copyright (c) 1998 by Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Copyright (c) 1998,99 by Shenghuo Zhu
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
-;; $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)
;; 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")
(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 <sabol@alderaan.gsfc.nasa.gov> and
+;;; Peter von der Ah\'e <pahe@daimi.au.dk>
+(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.
(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)
(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
(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))
((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
(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)
(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)
((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))
((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)
((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))
(require 'nnmail)
(require 'nnoo)
(require 'gnus-util)
+(require 'mm-util)
(eval-when-compile (require 'cl))
(nnoo-declare nndoc)
(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.
(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.")
\f
(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))
(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)
(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
(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)
(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)))
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)
(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))))
;; 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
;; 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)
(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))))
(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))
(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
(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)
(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))
(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,
(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))))))
(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))
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)))
(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)
(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
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)
(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
(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))))
(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)))
(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)
+
\f
;;; Interface functions
(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)
(lambda ()
(save-excursion
(set-buffer nnmbox-mbox-buffer)
- (save-buffer)))
+ (nnmbox-save-buffer)))
(file-name-directory nnmbox-mbox-file)
group
(lambda ()
(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)
(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))
(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))
(<= (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
(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)
(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)
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)
(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)
(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))
\f
(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)
(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)
(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)
(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)
\f
(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))))
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.
(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.
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)))
(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
(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)
(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")
(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.
(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)))
(require 'gnus-util)
(require 'gnus)
(require 'nnmail)
+(require 'mm-util)
(eval-when-compile
(ignore-errors
(require 'w3)
"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))
;;; 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."
(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))
(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."
(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)
;;;###autoload
(defun smiley-buffer (&optional buffer st nd)
(interactive)
- (when (featurep 'x)
+ (when (featurep '(or x mswindows))
(save-excursion
(when buffer
(set-buffer buffer))
+1999-07-04 04:33:50 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Posting Styles): Fix.
+ (Mail in a Newsreader): New.
+
1999-06-13 02:29:22 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (MIME Commands): Addition.
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
@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
@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
@tex
@titlepage
-@title Pterodactyl Gnus 0.89 Manual
+@title Pterodactyl Gnus 0.91 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Pterodactyl Gnus 0.89.
+This manual corresponds to Pterodactyl Gnus 0.91.
@end ifinfo
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:
(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.")
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.
@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
@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
@end example
@item
+Allow "orphan" scores in the Agent scoring.
+
+@item
Solve the halting problem.
@c TODO
\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
@tex
@titlepage
-@title Pterodactyl Message 0.89 Manual
+@title Pterodactyl Message 0.91 Manual
@author by Lars Magne Ingebrigtsen
@page
* 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.