+1998-10-11 Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
+
+ * lisp/gnus.el (gnus-version-number): Update to 6.10.023.
+ Add version information for SEMI-1.9/FLIM-1.10.
+
+ * Sync up with Pterodactyl Gnus 0.34.
+
1998-10-10 Katsumi Yamaoka <yamaoka@jpl.org>
* lisp/gnus-msg.el (gnus-message-make-user-agent): Fix typo in doc
** Gnus changes.
+*** gnus-auto-select-first can now be a function to be
+called to position point.
+
make clean
rm -rf *~
for i in lisp texi; do (cd $$i; make distclean); done
- rm -f config.log config.status Makefile
+ rm -f config.log config.status config.cache Makefile
osome:
make EMACS=xemacs21 some
Enable to get Multiple Pop server in POP and APOP using pop3-fma.el
(pop3 For Multi Account).
+ And added many other features by "ELIPS"
+
* TODO
+ See TODO.ja
+
* T-gnus 6.8.17 is the last version Gnus 5.6 base.
- After this , T-gnus 6.9 - this is based on pgnus.
+ After this , T-gnus 6.10 - this is based on pgnus.
+
+ Latest T-gnus is T-gnus 6.10.023 (Based on pgnus-0.34).
- T-gnus 6.9.0 - Based on pgnus-0.6
+Sun Oct 11 02:28:40 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.34 is released.
+
+1998-10-11 02:15:41 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-inline-media-tests): delivery-status.
+
+ * mm-view.el (mm-inline-text): Provide default.
+
+1998-10-11 01:01:37 Lloyd Zusman <ljz@asfast.com>
+
+ * mailcap.el (mailcap-possible-viewers): Fix nils.
+
+1998-10-11 00:03:37 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-edit-exit): Don't do updates.
+ (article-update-date-lapsed): Record the buffer.
+ (article-update-date-lapsed): Do all windows that display article
+ buffers.
+
+ * nnml.el (nnml-generate-nov-databases-1): Ditto.
+
+ * gnus-score.el (gnus-score-score-files-1): Ignore dotted files.
+
+ * gnus-art.el (gnus-insert-mime-button): Mark buttons as
+ annoations.
+
+ * gnus-msg.el (gnus-summary-mail-forward): Decode properly.
+
+1998-10-10 22:07:03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-category-add): Change default category to
+ 'false.
+
+ * nnvirtual.el (nnvirtual-update-read-and-marked): Don't nix out
+ scores.
+
+ * gnus-draft.el (gnus-draft-send): Check server more.
+
+ * gnus-art.el (gnus-article-view-part): New command and keystroke.
+ (gnus-article-goto-part): New function.
+
+ * mm-view.el (mm-inline-text): Insert richtext properly.
+
+ * gnus-art.el (gnus-insert-mime-button): Store handle in alist.
+
+1998-10-03 15:04:27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * parse-time.el (parse-time-rules): Accept dates far into the past
+ and the future, and parse single-digit numbers as years.
+
+1998-10-02 04:46:46 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-display-external): Chop off directories.
+
+1998-10-01 07:33:35 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * uudecode.el (uu-decode-region-external): Use
+ insert-file-contents-literally.
+
+ * gnus-cache.el (gnus-cache-generate-active): Translate _ to :.
+
+1998-10-01 07:02:11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * uudecode.el: New file.
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Do
+ x-uuencode.
+
+1998-10-01 05:19:35 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-display-alternative): Set faces.
+
+ * message.el (message-fetch-field): Unfold properly.
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF
+ in text/plain.
+
+1998-09-30 05:47:49 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-first-unread-subject): New command.
+ (gnus-auto-select-first): Removed.
+ (gnus-auto-select-first): Extended.
+ (gnus-summary-read-group-1): Use new value.
+
+1998-09-29 13:21:06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-fix-before-sending): Space.
+
+ * nnmail.el (nnmail-find-file): Don't erase.
+
+Wed Sep 30 23:49:03 1998 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-fetch-headers): Do not decode headers.
+
+Wed Sep 30 23:46:29 1998 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-soup.el (gnus-soup-add-article): Do not decode headers.
+
+Wed Sep 30 23:44:08 1998 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-soup.el (gnus-soup-pack-packet): Pack only if necesary.
+
+Sat Sep 26 03:04:18 1998 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-with-unibyte-buffer): Make it work in XEmacs
+ 20.4.
+
+1998-09-29 11:35:09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-view-all-parts): New command and
+ keystroke.
+
+ * mm-decode.el (mm-display-external): Translate slashes.
+
+ * nnmail.el (nnmail-find-file): Restrict auto-mode-alist.
+
+ * nndraft.el (nndraft-retrieve-headers): Don't copy so much.
+
+ * mm-decode.el (mm-quote-arg): Quote spaces.
+ (mm-display-external): Quote args.
+
+1998-09-24 22:27:55 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-inlinable-part-p): New function.
+
Thu Sep 24 20:28:31 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Pterodactyl Gnus v0.33 is released.
SHELL = /bin/sh
VPATH = @srcdir@
-total:
- rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile
-
-all:
+all total:
rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile
warn:
rm -f *.elc ; $(EMACS) $(FLAGS) --eval '(dgnushack-compile t)' 2>&1 | egrep -v "variable G|inhibit-point-motion-hooks|coding-system|temp-results|variable gnus|variable nn|scroll-in-place|deactivate-mark|filladapt-mode|byte-code-function-p|print-quoted|ps-right-header|ps-left-header|article-inhibit|print-escape|ssl-program-arguments|message-log-max"
-clever:
- $(EMACS) $(FLAGS) -f dgnushack-compile
-
-some:
+clever some:
$(EMACS) $(FLAGS) -f dgnushack-compile
install: clever
+ rm -f dgnushack.elc
$(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir)
for p in *.elc; do \
echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \
(gnus-uncompress-range
(cons (1+ (caar (last gnus-agent-article-alist)))
(cdr (gnus-active group)))))
- (gnus-list-of-unread-articles group))))
+ (gnus-list-of-unread-articles group)))
+ (gnus-decode-encoded-word-function 'identity))
;; Fetch them.
(when articles
(gnus-message 7 "Fetching headers for %s..." group)
(gnus-agent-false nil))))))
;; No, we need to decide what we want.
(setq score-param
- (let ((score-method (or
- (gnus-group-get-parameter group 'agent-score t)
- (caddr category))))
+ (let ((score-method
+ (or
+ (gnus-group-get-parameter group 'agent-score t)
+ (caddr category))))
(when score-method
(require 'gnus-score)
(if (eq score-method 'file)
(interactive "SCategory name: ")
(when (assq category gnus-category-alist)
(error "Category %s already exists" category))
- (push (list category 'true nil nil)
+ (push (list category 'false nil nil)
gnus-category-alist)
(gnus-category-write)
(gnus-category-list))
;;; Internal variables
+(defvar gnus-article-mime-handle-alist nil)
(defvar article-lapsed-timer nil)
(defvar gnus-article-current-summary nil)
(let (deactivate-mark)
(save-excursion
(ignore-errors
- (when (and (gnus-buffer-live-p gnus-article-buffer)
- (get-buffer-window gnus-article-buffer))
- (set-buffer gnus-article-buffer)
- (goto-char (point-min))
- (when (re-search-forward "^X-Sent:" nil t)
- (article-date-lapsed t)))))))
+ (walk-windows
+ (lambda (w)
+ (set-buffer (window-buffer w))
+ (when (eq major-mode 'gnus-article-mode)
+ (goto-char (point-min))
+ (when (re-search-forward "^X-Sent:" nil t)
+ (article-date-lapsed t)))))))))
(defun gnus-start-date-timer (&optional n)
"Start a timer to update the X-Sent header in the article buffers.
"\C-c\C-i" gnus-info-find-node
"\C-c\C-b" gnus-bug
- gnus-mouse-2 'widget-button-click
-
"\C-d" gnus-article-read-summary-keys
"\M-*" gnus-article-read-summary-keys
"\M-#" gnus-article-read-summary-keys
(substring name (match-end 0))))))
(setq gnus-article-buffer name)
(setq gnus-original-article-buffer original)
+ (setq gnus-article-mime-handle-alist nil)
;; This might be a variable local to the summary buffer.
(unless gnus-single-article-buffer
(save-excursion
;;; Gnus MIME viewing functions
;;;
-(defvar gnus-mime-button-line-format "%{%([%t%d%n]%)%}\n"
+(defvar gnus-mime-button-line-format "%{%([%p. %t%d%n]%)%}\n"
"The following specs can be used:
%t The MIME type
%n The `name' parameter
%d The description, if any
-%l The length of the encoded part")
+%l The length of the encoded part
+%p The part identifier")
(defvar gnus-mime-button-line-format-alist
'((?t gnus-tmp-type ?s)
(?n gnus-tmp-name ?s)
(?d gnus-tmp-description ?s)
+ (?p gnus-tmp-id ?s)
(?l gnus-tmp-length ?d)))
(defvar gnus-mime-button-map nil)
(define-key gnus-mime-button-map "i" 'gnus-mime-inline-part)
(define-key gnus-mime-button-map "|" 'gnus-mime-pipe-part))
+(defun gnus-mime-view-all-parts ()
+ "View all the MIME parts."
+ (interactive)
+ (let ((handles gnus-article-mime-handles))
+ (while handles
+ (mm-display-part (pop handles)))))
+
(defun gnus-mime-save-part ()
"Save the MIME part under point."
(interactive)
(mm-insert-inline data contents)
(goto-char b))))
+(defun gnus-article-view-part (n)
+ "View MIME part N, which is the numerical prefix."
+ (interactive "p")
+ (save-current-buffer
+ (set-buffer gnus-article-buffer)
+ (when (> n (length gnus-article-mime-handle-alist))
+ (error "No such part"))
+ (let ((handle (cdr (assq n gnus-article-mime-handle-alist))))
+ (gnus-article-goto-part n)
+ (mm-display-part handle))))
+
+(defun gnus-article-goto-part (n)
+ "Go to MIME part N."
+ (goto-char (text-property-any (point-min) (point-max) 'gnus-part n)))
+
(defun gnus-insert-mime-button (handle)
(let ((gnus-tmp-name (mail-content-type-get (mm-handle-type handle) 'name))
(gnus-tmp-type (car (mm-handle-type handle)))
(gnus-tmp-length (save-excursion
(set-buffer (mm-handle-buffer handle))
(buffer-size)))
+ (gnus-tmp-id (1+ (length gnus-article-mime-handle-alist)))
b e)
+ (push (cons gnus-tmp-id handle) gnus-article-mime-handle-alist)
(setq gnus-tmp-name
(if gnus-tmp-name
(concat " (" gnus-tmp-name ")")
`(local-map ,gnus-mime-button-map
keymap ,gnus-mime-button-map
gnus-callback mm-display-part
+ gnus-part ,gnus-tmp-id
+ gnus-type annotation
gnus-data ,handle))
(setq e (point))
(widget-convert-button 'link from to :action 'gnus-widget-press-button
(let* ((handles (mm-dissect-buffer))
handle name type b e)
(mapcar 'mm-destroy-part gnus-article-mime-handles)
- (setq gnus-article-mime-handles handles)
+ (setq gnus-article-mime-handles handles
+ gnus-article-mime-handle-alist nil)
(when handles
(goto-char (point-min))
(search-forward "\n\n" nil t)
(insert "\n\n")
(when (and (mm-automatic-display-p
(car (mm-handle-type handle)))
+ (mm-inlinable-part-p (car (mm-handle-type handle)))
(or (not (mm-handle-disposition handle))
(equal (car (mm-handle-disposition handle))
"inline")))
(car (mm-handle-type handle))))
(point))
`(local-map ,gnus-mime-button-map
+ ,gnus-mouse-face-prop ,gnus-article-mouse-face
+ face ,gnus-article-button-face
keymap ,gnus-mime-button-map
gnus-callback
(lambda (handles)
(setq gnus-original-article nil)))
(set-window-configuration winconf)
;; Tippy-toe some to make sure that point remains where it was.
- (let ((buf (current-buffer)))
+ (save-current-buffer
(set-buffer curbuf)
(set-window-start (get-buffer-window (current-buffer)) window-start)
- (goto-char p)
- (set-buffer buf)))))
+ (goto-char p)))))
(defun gnus-article-edit-full-stops ()
"Interactively repair spacing at end of sentences."
(when arg
(gnus-async-set-buffer)
(gnus-async-with-semaphore
- (push (list ',(intern (format "%s-%d" group article)
- gnus-asynch-obarray)
- ,mark (set-marker (make-marker) (point-max))
- ,group ,article)
- gnus-async-article-alist)))
+ (setq
+ gnus-async-article-alist
+ (cons (list ',(intern (format "%s-%d" group article)
+ gnus-asynch-obarray)
+ ,mark (set-marker (make-marker) (point-max))
+ ,group ,article)
+ gnus-async-article-alist))))
(if (not (gnus-buffer-live-p ,summary))
(gnus-async-with-semaphore
(setq gnus-async-fetch-list nil))
(when top
(gnus-message 5 "Generating the cache active file...")
(setq gnus-cache-active-hashtb (gnus-make-hashtable 123)))
+ (when (string-match "^\\(nn[^_]+\\)_" group)
+ (setq group (replace-match "\\1:" t t group)))
;; Separate articles from all other files and directories.
(while files
(if (string-match "^[0-9]+$" (file-name-nondirectory (car files)))
(cond
((equal (car (car major)) minor)
(setq exact (cons (cdr (car major)) exact)))
- ((string-match (car (car major)) minor)
+ ((and minor (string-match (car (car major)) minor))
(setq wildcard (cons (cdr (car major)) wildcard))))
(setq major (cdr major)))
(nconc (nreverse exact) (nreverse wildcard))))
"*Hook to be run after the gnus-offline package has been loaded."
:group 'gnus-offline
:type 'hook)
+
(defcustom gnus-offline-before-online-hook nil
"*Hook to be run before all online jobs."
:group 'gnus-offline
seen out file)
(while (setq file (pop files))
(cond
- ;; Ignore "." and "..".
- ((member (file-name-nondirectory file) '("." ".."))
+ ;; Ignore files that start with a dot.
+ ((string-match "^\\." (file-name-nondirectory file))
nil)
;; Add subtrees of directory to also be searched.
((and (file-directory-p file)
(buffer-disable-undo tmp-buf)
(save-excursion
(while articles
- ;; Find the header of the article.
- (set-buffer gnus-summary-buffer)
- (when (setq headers (gnus-summary-article-header (car articles)))
;; Put the article in a buffer.
- (set-buffer tmp-buf)
- (when (gnus-request-article-this-buffer
- (car articles) gnus-newsgroup-name)
- (save-restriction
- (message-narrow-to-head)
- (message-remove-header gnus-soup-ignored-headers t))
- (gnus-soup-store gnus-soup-directory prefix headers
- gnus-soup-encoding-type
- gnus-soup-index-type)
- (gnus-soup-area-set-number
- area (1+ (or (gnus-soup-area-number area) 0)))))
+ (set-buffer tmp-buf)
+ (when (gnus-request-article-this-buffer
+ (car articles) gnus-newsgroup-name)
+ (setq headers (nnheader-parse-head t))
+ (save-restriction
+ (message-narrow-to-head)
+ (message-remove-header gnus-soup-ignored-headers t))
+ (gnus-soup-store gnus-soup-directory prefix headers
+ gnus-soup-encoding-type
+ gnus-soup-index-type)
+ (gnus-soup-area-set-number
+ area (1+ (or (gnus-soup-area-number area) 0))))
;; Mark article as read.
(set-buffer gnus-summary-buffer)
(gnus-summary-remove-process-mark (car articles))
"Make a SOUP packet from the SOUP areas."
(interactive)
(gnus-soup-read-areas)
- (unless (file-exists-p gnus-soup-directory)
- (message "No such directory: %s" gnus-soup-directory))
- (when (null (directory-files gnus-soup-directory nil "\\.MSG$"))
- (message "No files to pack."))
- (gnus-soup-pack gnus-soup-directory gnus-soup-packer))
+ (if (file-exists-p gnus-soup-directory)
+ (if (directory-files gnus-soup-directory nil "\\.MSG$")
+ (gnus-soup-pack gnus-soup-directory gnus-soup-packer)
+ (message "No files to pack."))
+ (message "No such directory: %s" gnus-soup-directory)))
(defun gnus-group-brew-soup (n)
"Make a soup packet from the current group.
(defcustom gnus-auto-select-first t
"*If nil, don't select the first unread article when entering a group.
If this variable is `best', select the highest-scored unread article
-in the group. If neither nil nor `best', select the first unread
-article.
+in the group. If t, select the first unread article.
+
+This variable can also be a function to place point on a likely
+subject line. Useful values include `gnus-summary-first-unread-subject',
+`gnus-summary-first-unread-article' and
+`gnus-summary-best-unread-article'.
If you want to prevent automatic selection of the first unread article
in some newsgroups, set the variable to nil in
:group 'gnus-group-select
:type '(choice (const :tag "none" nil)
(const best)
- (sexp :menu-tag "first" t)))
+ (sexp :menu-tag "first" t)
+ (function-item gnus-summary-first-unread-subject)
+ (function-item gnus-summary-first-unread-article)
+ (function-item gnus-summary-best-unread-article)))
(defcustom gnus-auto-select-next t
"*If non-nil, offer to go to the next group from the end of the previous.
"L" gnus-summary-lower-score
"\M-i" gnus-symbolic-argument
"h" gnus-summary-select-article-buffer
-
+ "b" gnus-article-view-part
+
"V" gnus-summary-score-map
"X" gnus-uu-extract-map
"S" gnus-summary-send-map)
(not no-display)
gnus-newsgroup-unreads
gnus-auto-select-first)
- (unless (if (eq gnus-auto-select-first 'best)
- (gnus-summary-best-unread-article)
- (gnus-summary-first-unread-article))
- (gnus-configure-windows 'summary))
+ (progn
+ (gnus-configure-windows 'summary)
+ (cond
+ ((eq gnus-auto-select-first 'best)
+ (gnus-summary-best-unread-article))
+ ((eq gnus-auto-select-first t)
+ (gnus-summary-first-unread-article))
+ ((gnus-functionp gnus-auto-select-first)
+ (funcall gnus-auto-select-first))))
;; Don't select any articles, just move point to the first
;; article in the group.
(goto-char (point-min))
(gnus-summary-display-article (gnus-summary-article-number)))
(gnus-summary-position-point)))
+(defun gnus-summary-first-unread-subject ()
+ "Place the point on the subject line of the first unread article.
+Return nil if there are no unread articles."
+ (interactive)
+ (prog1
+ (when (gnus-summary-first-subject t)
+ (gnus-summary-show-thread)
+ (gnus-summary-first-subject t))
+ (gnus-summary-position-point)))
+
(defun gnus-summary-first-article ()
"Select the first article.
Return nil if there are no articles."
(eq in-state 'first-and-last))
(progn
(setq state (list 'begin))
- (save-excursion (set-buffer (gnus-get-buffer-create "*gnus-uu-body*"))
- (erase-buffer))
+ (save-excursion
+ (set-buffer (gnus-get-buffer-create "*gnus-uu-body*"))
+ (erase-buffer))
(save-excursion
(set-buffer (gnus-get-buffer-create "*gnus-uu-pre*"))
(erase-buffer)
(delete-extent extent)
nil)))
-;; Fixed by Christopher Davis <ckd@loiosh.kei.com>.
-(defun gnus-xmas-article-add-button (from to fun &optional data)
- "Create a button between FROM and TO with callback FUN and data DATA."
- (when gnus-article-button-face
- (gnus-overlay-put (gnus-make-overlay from to)
- 'face gnus-article-button-face))
- (gnus-add-text-properties
- from to
- (nconc
- (and gnus-article-mouse-face
- (list 'mouse-face gnus-article-mouse-face))
- (list 'gnus-callback fun)
- (and data (list 'gnus-data data))
- (list 'highlight t))))
-
(defun gnus-xmas-window-top-edge (&optional window)
(nth 1 (window-pixel-edges window)))
(fset 'gnus-summary-recenter 'gnus-xmas-summary-recenter)
(fset 'gnus-extent-start-open 'gnus-xmas-extent-start-open)
(fset 'gnus-article-push-button 'gnus-xmas-article-push-button)
- (fset 'gnus-article-add-button 'gnus-xmas-article-add-button)
(fset 'gnus-window-top-edge 'gnus-xmas-window-top-edge)
(fset 'gnus-read-event-char 'gnus-xmas-read-event-char)
(fset 'gnus-group-startup-message 'gnus-xmas-group-startup-message)
(defconst gnus-product-name "T-gnus"
"Product name of this version of gnus.")
-(defconst gnus-version-number "6.10.022"
+(defconst gnus-version-number "6.10.023"
"Version number for this version of gnus.")
-(defconst gnus-original-version-number "0.33"
+(defconst gnus-original-version-number "0.34"
"Version number for this version of Gnus.")
(defconst gnus-original-product-name "Pterodactyl Gnus"
"Version number for this version of Gnus.")
(defconst gnus-version
- (format "%s %s (based on %s %s ; for SEMI 1.8, FLIM 1.8/1.9)"
+ (format "%s %s (based on %s %s ; for SEMI 1.8/1.9, FLIM 1.8/1.9/1.10)"
gnus-product-name gnus-version-number
gnus-original-product-name gnus-original-version-number)
"Version string for this version of gnus.")
(let* ((inhibit-point-motion-hooks t)
(value (mail-fetch-field header nil (not not-all))))
(when value
- (nnheader-replace-chars-in-string value ?\n ? ))))
+ (while (string-match "\n[\t ]+" value)
+ (setq value (replace-match " " t t value)))
+ value)))
(defun message-narrow-to-field ()
"Narrow the buffer to the header on the current line."
(message-check 'invisible-text
(when (text-property-any (point-min) (point-max) 'invisible t)
(put-text-property (point-min) (point-max) 'invisible nil)
- (unless (yes-or-no-p "Invisible text found and made visible; continue posting?")
+ (unless (yes-or-no-p "Invisible text found and made visible; continue posting? ")
(error "Invisible text found and made visible")))))
(defun message-add-action (action &rest types)
(require 'mm-util)
(require 'rfc2047)
(require 'qp)
+(require 'uudecode)
(defun mm-encode-body ()
"Encode a body.
;;; Functions for decoding
;;;
-(defun mm-decode-content-transfer-encoding (encoding)
+(defun mm-decode-content-transfer-encoding (encoding &optional type)
(cond
((eq encoding 'quoted-printable)
(quoted-printable-decode-region (point-min) (point-max)))
((eq encoding 'base64)
- (condition-case ()
- (base64-decode-region (point-min) (point-max))
- (error nil)))
+ (prog1
+ (condition-case ()
+ (base64-decode-region (point-min) (point-max))
+ (error nil))
+ (when (equal type "text/plain")
+ (goto-char (point-min))
+ (while (search-forward "\r\n" nil t)
+ (replace-match "\n" t t)))))
((memq encoding '(7bit 8bit binary))
)
((null encoding)
)
+ ((eq encoding 'x-uuencode)
+ (condition-case ()
+ (uu-decode-region (point-min) (point-max))
+ (error nil)))
(t
(error "Can't decode encoding %s" encoding))))
("text/enriched" mm-inline-text t)
("text/richtext" mm-inline-text t)
("text/html" mm-inline-text (featurep 'w3))
+ ("message/delivery-status" mm-inline-text t)
("audio/wav" mm-inline-audio
(and (or (featurep 'nas-sound) (featurep 'native-sound))
(device-sound-enabled-p)))
(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."
(save-excursion
"Display HANDLE using METHOD."
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle) (car (mm-handle-type handle)))
(if (functionp method)
(let ((cur (current-buffer)))
(switch-to-buffer (generate-new-buffer "*mm*"))
(make-directory dir)
(set-file-modes dir 448)
(if filename
- (setq file (expand-file-name (or filename "mm.") dir))
+ (setq file (expand-file-name (file-name-nondirectory filename)
+ dir))
(setq file (make-temp-name (expand-file-name "mm." dir))))
(write-region (point-min) (point-max)
file nil 'nomesg nil 'no-conversion)
(if needsterm
(start-process "*display*" nil
"xterm"
- "-e" (format method file))
+ "-e" shell-file-name "-c"
+ (format method
+ (mm-quote-arg file)))
(start-process "*display*" (generate-new-buffer "*mm*")
shell-file-name
- "-c" (format method file))))
+ "-c" (format method
+ (mm-quote-arg file)))))
(mm-handle-set-undisplayer handle (cons file process))
(message "Displaying %s..." (format method file))))))
"Return a version of ARG that is safe to evaluate in a shell."
(let ((pos 0) new-pos accum)
;; *** bug: we don't handle newline characters properly
- (while (setq new-pos (string-match "[!`\"$\\& \t{}]" arg pos))
+ (while (setq new-pos (string-match "[!`\"$\\& \t{} ]" arg pos))
(push (substring arg pos new-pos) accum)
(push "\\" accum)
(push (list (aref arg new-pos)) accum)
"Return the contents of HANDLE as a string."
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(buffer-string)))
(defvar mm-default-directory nil)
(setq mm-default-directory (file-name-directory file))
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(when (or (not (file-exists-p file))
(yes-or-no-p (format "File %s already exists; overwrite? "
file)))
(read-string "Shell command on MIME part: " mm-last-shell-command)))
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(shell-command-on-region (point-min) (point-max) command nil))))
(defun mm-interactively-view-part (handle)
(get-buffer-create (generate-new-buffer-name " *temp*")))
(unwind-protect
(with-current-buffer ,temp-buffer
- ,@forms)
+ (let (buffer-file-coding-system)
+ ,@forms))
(and (buffer-name ,temp-buffer)
(kill-buffer ,temp-buffer))
(setq-default enable-multibyte-characters ,multibyte))))))
buffer-read-only image)
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(setq image (make-image-specifier
(vector (intern type) :data (buffer-string)))))
(let ((annot (make-annotation image nil 'text)))
((equal type "plain")
(with-temp-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(setq text (buffer-string)))
(let ((b (point)))
(insert text)
(w3-do-setup)
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(require 'url)
(save-window-excursion
(w3-region (point-min) (point-max))
(save-excursion
(mm-with-unibyte-buffer
(insert-buffer-substring (mm-handle-buffer handle))
- (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
(save-window-excursion
(enriched-decode (point-min) (point-max))
- (setq text (buffer-string))))
- (mm-insert-inline handle text)))
- )))
+ (setq text (buffer-string)))))
+ (mm-insert-inline handle text))
+ (t
+ (save-excursion
+ (mm-with-unibyte-buffer
+ (insert-buffer-substring (mm-handle-buffer handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (car (mm-handle-type handle)))
+ (setq text (buffer-string))))
+ (mm-insert-inline handle text)))))
(defun mm-insert-inline (handle text)
"Insert TEXT inline from HANDLE."
start end number)
(set-buffer (setq nnbabyl-mbox-buffer
(nnheader-find-file-noselect
- nnbabyl-mbox-file nil 'raw)))
+ nnbabyl-mbox-file nil t)))
;; Save previous buffer mode.
(setq nnbabyl-previous-buffer-mode
(cons (cons (point-min) (point-max))
(save-excursion
(set-buffer nntp-server-buffer)
(erase-buffer)
- (let* ((buf (get-buffer-create " *draft headers*"))
- article)
- (set-buffer buf)
- (erase-buffer)
+ (let* (article)
;; We don't support fetching by Message-ID.
(if (stringp (car articles))
'headers
(while articles
- (set-buffer buf)
+ (narrow-to-region (point) (point))
(when (nndraft-request-article
(setq article (pop articles)) group server (current-buffer))
(goto-char (point-min))
(forward-line -1)
(goto-char (point-max)))
(delete-region (point) (point-max))
- (set-buffer nntp-server-buffer)
- (goto-char (point-max))
+ (goto-char (point-min))
(insert (format "221 %d Article retrieved.\n" article))
- (insert-buffer-substring buf)
+ (widen)
+ (goto-char (point-max))
(insert ".\n")))
(nnheader-fold-continuation-lines)
(defun nnmail-find-file (file)
"Insert FILE in server buffer safely."
(set-buffer nntp-server-buffer)
- (erase-buffer)
+ (delete-region (point-min) (point-max))
(let ((format-alist nil)
(after-insert-file-functions nil))
(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))
(insert-file-contents file)
t)
;; group twice.
(not (assoc (car method) group-art)))
(push (cons (if regrepp
- (replace-match
- (car method) nil nil (car method))
+ (nnmail-expand-newtext (car method))
(car method))
(funcall func (car method)))
group-art))
(save-excursion
(set-buffer (setq nnmbox-mbox-buffer
(nnheader-find-file-noselect
- nnmbox-mbox-file nil 'raw)))
+ nnmbox-mbox-file nil t)))
(buffer-disable-undo)))
(when (not nnmbox-group-alist)
(nnmail-activate 'nnmbox))
start end number)
(set-buffer (setq nnmbox-mbox-buffer
(nnheader-find-file-noselect
- nnmbox-mbox-file nil 'raw)))
+ nnmbox-mbox-file nil t)))
(buffer-disable-undo)
;; Go through the group alist and compare against
(let ((dirs (directory-files dir t nil t))
dir)
(while (setq dir (pop dirs))
- (when (and (not (member (file-name-nondirectory dir) '("." "..")))
+ (when (and (not (string-match "^\\." (file-name-nondirectory dir)))
(file-directory-p dir))
(nnml-generate-nov-databases-1 dir seen))))
;; Do this directory.
(nnvirtual-partition-sequence
(gnus-list-of-unread-articles
(nnvirtual-current-group)))))
- (type-marks (mapcar (lambda (ml)
- (cons (car ml)
- (nnvirtual-partition-sequence (cdr ml))))
- (gnus-info-marks (gnus-get-info
- (nnvirtual-current-group)))))
+ (type-marks
+ (delq nil
+ (mapcar (lambda (ml)
+ (if (eq (car ml) 'score)
+ nil
+ (cons (car ml)
+ (nnvirtual-partition-sequence (cdr ml)))))
+ (gnus-info-marks (gnus-get-info
+ (nnvirtual-current-group))))))
mark type groups carticles info entry)
;; Ok, atomically move all of the (un)read info, clear any old
;; marks, and move all of the current marks. This way if someone
;; hits C-g, you won't leave the component groups in a half-way state.
- (gnus-atomic-progn
+ (progn
;; move (un)read
(let ((gnus-newsgroup-active nil)) ;workaround guns-update-read-articles
(while (setq entry (pop unreads))
(while groups
(when (and (setq info (gnus-get-info (pop groups)))
(gnus-info-marks info))
- (gnus-info-set-marks info nil)))
+ (gnus-info-set-marks
+ info
+ (if (assq 'score (gnus-info-marks info))
+ (list (assq 'score (gnus-info-marks info)))
+ nil))))
;; Ok, currently type-marks is an assq list with keys of a mark type,
;; with data of an assq list with keys of component group names
`(((6) parse-time-weekdays)
((3) (1 31))
((4) parse-time-months)
- ((5) (1970 2038))
+ ((5) (100 4038))
((2 1 0)
,#'(lambda () (and (stringp elt)
(= (length elt) 8)
(= (length elt) 7)
(= (aref elt 1) ?:)))
[0 1] [2 4] [5 7])
- ((5) (70 99) ,#'(lambda () (+ 1900 elt))))
+ ((5) (50 99) ,#'(lambda () (+ 1900 elt)))
+ ((5) (0 49) ,#'(lambda () (+ 2000 elt))))
"(slots predicate extractor...)")
(defun parse-time-string (string)
+1998-10-01 07:55:35 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Splitting Mail): Fix.
+ (Washing Mail): Fix.
+
+1998-09-30 05:54:45 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Selecting a Group): Addition.
+
1998-09-13 08:58:56 Lars Magne Ingebrigtsen <larsi@gnus.org>
* dir (File): Updated.
make clean
rm -f *.orig *.rej *.elc *~ gnus gnus-[0-9] gnus-[0-9][0-9] Makefile
rm -f message message-[0-9]
+ rm -f emacs-mime
install:
$(SHELL) $(top_srcdir)/mkinstalldirs $(infodir)
\input texinfo @c -*-texinfo-*-
-@setfilename message
+@setfilename emacs-mime
@settitle Emacs MIME Manual
@synindex fn cp
@synindex vr cp
The main idea is to first analyze a @sc{mime} article, and then allow
other programs to do things based on the list of @dfn{handles} that are
-returned as a result of this analyzation.
+returned as a result of this analysis.
@menu
* Dissection:: Analyzing a @sc{mime} message.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Semi-gnus 6.10.022 Manual
+@settitle Semi-gnus 6.10.023 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Semi-gnus 6.10.022 Manual
+@title Semi-gnus 6.10.023 Manual
@author by Lars Magne Ingebrigtsen
@page
API. So Semi-gnus does not discriminate various language communities.
Oh, if you are a Klingon, please wait Unicode Next Generation.
-This manual corresponds to Semi-gnus 6.10.022.
+This manual corresponds to Semi-gnus 6.10.023.
@end ifinfo
@item best
Select the highest scored article in the group when entering the
group.
+
+@end table
+
+This variable can also be a function. In that case, that function will
+be called to place point on a subject line, and/or select some article.
+Useful functions include:
+
+@table @code
+@item gnus-summary-first-unread-subject
+Place point on the subject line of the first unread article, but
+don't select the article.
+
+@item gnus-summary-first-unread-article
+Select the first unread article.
+
+@item gnus-summary-best-unread-article
+Select the highest-scored unread article.
@end table
+
If you want to prevent automatic selection in some group (say, in a
binary group with Huge articles) you can set this variable to @code{nil}
in @code{gnus-select-group-hook}, which is called when a group is
slower; and @code{std11-extract-address-components}, which works very
nicely, but is slower. The default function will return the wrong
answer in 5% of the cases. If this is unacceptable to you, use the
-other function instead.
-
+other function instead:
+
+@lisp
+(setq gnus-extract-address-components
+ 'mail-extract-address-components)
+@end lisp
+
@vindex gnus-summary-same-subject
@code{gnus-summary-same-subject} is a string indicating that the current
article has the same subject as the previous. This string will be used
@item
@vindex gnus-cached-mark
Articles stored in the article cache will be marked with an @samp{*} in
-the second column (@code{gnus-cached-mark}). @xref{Article Caching}
+the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
@item
@vindex gnus-saved-mark
@kindex M t (Summary)
@findex gnus-summary-tick-article-forward
Tick the current article (@code{gnus-summary-tick-article-forward}).
-@xref{Article Caching}
+@xref{Article Caching}.
@item M ?
@itemx ?
@kindex M ? (Summary)
@findex gnus-summary-mark-as-dormant
Mark the current article as dormant
-(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}
+(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
@item M d
@itemx d
@kindex W b (Summary)
@findex gnus-article-add-buttons
Add clickable buttons to the article (@code{gnus-article-add-buttons}).
-@xref{Article Buttons}
+@xref{Article Buttons}.
@item W B
@kindex W B (Summary)
MIME headers), you can set the @code{charset} group/topic parameter to
the required charset (@pxref{Group Parameters}).
+@item W M v
+@kindex W M v (Summary)
+View all the @sc{mime} parts in the current article
+(@code{gnus-mime-view-all-parts}).
+
@end table
insert sub-expressions from the matched text. For instance:
@lisp
-("list.\\1" "From:.*\\(.*\\)-list@@majordomo.com")
+("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
@end lisp
The second element can also be a function. In that case, it will be
already exists, it will always be read (and incorporated) before any
other spool files.
-@vindex nnmail-prepare-incoming-hook
-@item nnmail-prepare-incoming-hook
-This is run in a buffer that holds all the new incoming mail, and can be
-used for, well, anything, really.
-
@vindex nnmail-split-hook
@item nnmail-split-hook
@findex article-decode-encoded-words
@item nnmail-prepare-incoming-hook
@vindex nnmail-prepare-incoming-hook
This hook is called before doing anything with the mail and is meant for
-grand, sweeping gestures. Functions to be used include:
+grand, sweeping gestures. It is called in a buffer that contains all
+the new, incoming mail. Functions to be used include:
@table @code
@item nnheader-ms-strip-cr
* Agent Variables:: Customizing is fun.
* Example Setup:: An example @file{.gnus.el} file for offline people.
* Batching Agents:: How to fetch news from a @code{cron} job.
+* Agent Caveats:: What you think it'll do and what it does.
@end menu
primary select method, which is listed on the bottom in the buffer.
@item
-Decide on download policy. @xref{Agent Categories}
+Decide on download policy. @xref{Agent Categories}.
@item
Uhm... that's it.
In both of these places the @code{download score rule} can take one of
three forms:
-@table @code
@enumerate
@item
Score rule
@end lisp
@end itemize
@end enumerate
-@end table
@node The Category Buffer
@subsubsection The Category Buffer
@kindex J S (Agent Group)
@findex gnus-group-send-drafts
Send all sendable messages in the draft group
-(@code{gnus-agent-fetch-session}). @xref{Drafts}
+(@code{gnus-agent-fetch-session}). @xref{Drafts}.
@item J a
@kindex J a (Agent Group)
@end example
+@node Agent Caveats
+@subsection Agent Caveats
+
+The Gnus Agent doesn't seem to work like most other offline
+newsreaders. Here are some common questions that some imaginary people
+may ask:
+
+@table @dfn
+@item If I read an article while plugged, do they get entered into the
+Agent?
+
+@strong{No.}
+
+@item If I read an article while plugged, and the article already exists
+in the Agent, will it get downloaded once more?
+
+@strong{Yes.}
+
+@end table
+
+In short, when Gnus is unplugged, it only looks into the locally stored
+articles; when it's plugged, it only talks to your ISP.
+
@node Scoring
@chapter Scoring
Bouncing articles should do MIME.
@item
+Crossposted articles should "inherit" the % or @ mark from the other
+groups it has been crossposted to, or something. (Agent.)
+
+@item
Solve the halting problem.
@c TODO
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Pterodactyl Message 0.33 Manual
+@settitle Pterodactyl Message 0.34 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Message 0.33 Manual
+@title Pterodactyl Message 0.34 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Pterodactyl Message 0.33. Message is
+This manual corresponds to Pterodactyl Message 0.34. Message is
distributed with the Gnus distribution bearing the same version number
as this manual.