** 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
+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
(make-local-variable 'gnus-article-current-summary)
(make-local-variable 'gnus-article-mime-handles)
(make-local-variable 'gnus-article-decoded-p)
+ (make-local-variable 'gnus-article-mime-handle-alist)
(gnus-set-default-directory)
(buffer-disable-undo)
(setq buffer-read-only t)
(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 b e :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)))
(message-remove-header gnus-agent-meta-information-header)))
;; Then we send it. If we have no meta-information, we just send
;; it and let Message figure out how.
- (when (if type
- (let ((message-this-is-news (eq type 'news))
- (message-this-is-mail (eq type 'mail))
- (gnus-post-method method)
- (message-post-method method))
- (message-send-and-exit))
- (message-send-and-exit))
+ (when (and (or (gnus-server-opened method)
+ (gnus-open-server method))
+ (if type
+ (let ((message-this-is-news (eq type 'news))
+ (message-this-is-mail (eq type 'mail))
+ (gnus-post-method method)
+ (message-post-method method))
+ (message-send-and-exit))
+ (message-send-and-exit)))
(let ((gnus-verbose-backends nil))
(gnus-request-expire-articles
(list article) (or group "nndraft:queue") t)))))
(interactive "P")
(gnus-setup-message 'forward
(gnus-summary-select-article)
- (set-buffer gnus-original-article-buffer)
- (let ((message-included-forward-headers
- (if full-headers "" message-included-forward-headers)))
- (message-forward post))))
+ (let (text)
+ (save-excursion
+ (set-buffer gnus-original-article-buffer)
+ (setq text (buffer-string)))
+ (set-buffer (gnus-get-buffer-create " *Gnus forward*"))
+ (insert text)
+ (run-hooks 'gnus-article-decode-hook)
+ (let ((message-included-forward-headers
+ (if full-headers "" message-included-forward-headers)))
+ (message-forward post)))))
(defun gnus-summary-resend-message (address n)
"Resend the current article to ADDRESS."
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)
(gnus-define-keys (gnus-summary-wash-mime-map "M" gnus-summary-wash-map)
"w" gnus-article-decode-mime-words
- "c" gnus-article-decode-charset)
+ "c" gnus-article-decode-charset
+ "v" gnus-mime-view-all-parts
+ "b" gnus-article-view-part)
(gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map)
"z" gnus-article-date-ut
("MIME"
["Words" gnus-article-decode-mime-words t]
["Charset" gnus-article-decode-charset t]
- ["QP" gnus-article-de-quoted-unreadable t])
+ ["QP" gnus-article-de-quoted-unreadable t]
+ ["View all" gnus-mime-view-all-parts])
("Date"
["Local" gnus-article-date-local t]
["ISO8601" gnus-article-date-iso8601 t]
(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)
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.33"
+(defconst gnus-version-number "0.34"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
gnus-article-show-all-headers
gnus-article-edit-mode gnus-article-edit-article
gnus-article-edit-done gnus-article-decode-encoded-words
- gnus-start-date-timer gnus-stop-date-timer)
+ gnus-start-date-timer gnus-stop-date-timer
+ gnus-mime-view-all-parts)
("gnus-int" gnus-request-type)
("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1
gnus-dribble-enter gnus-read-init-file gnus-dribble-touch)
(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))))
(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)))
(mm-enable-multibyte)
(buffer-disable-undo)))
(when (not nnmbox-group-alist)
start end number)
(set-buffer (setq nnmbox-mbox-buffer
(nnheader-find-file-noselect
- nnmbox-mbox-file nil 'raw)))
+ nnmbox-mbox-file nil t)))
(mm-enable-multibyte)
(buffer-disable-undo)
(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)
--- /dev/null
+;;; uudecode.el -- elisp native uudecode
+;; Copyright (c) 1998 by Shenghuo Zhu <zsh@cs.rochester.edu>
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; $Revision: 1.1 $
+;; Keywords: uudecode
+
+;; This file is part of GNU Emacs.
+;;
+;; 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)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; 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:
+;; Lots of codes are stolen from mm-decode.el, gnus-uu.el and
+;; base64.el
+
+;;; Code:
+
+(if (not (fboundp 'char-int))
+ (fset 'char-int 'identity))
+
+(defvar uu-decoder-program "uudecode"
+ "*Non-nil value should be a string that names a uu decoder.
+The program should expect to read uu data on its standard
+input and write the converted data to its standard output.")
+
+(defvar uu-decoder-switches nil
+ "*List of command line flags passed to the command named by uu-decoder-program.")
+
+(defvar uu-alphabet "\040-\140")
+
+(defvar uu-begin-string "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$")
+(defvar uu-end-string "^end[ \t]*$")
+
+(defvar uu-body-line
+ (let ((i 61) (str "^M"))
+ (while (> (setq i (1- i)) 0)
+ (setq str (concat str "[^a-z]")))
+ (concat str ".?$")))
+
+(defvar uu-temporary-file-directory "/tmp/")
+
+(defun uu-decode-region-external (start end &optional file-name)
+ "Decode uuencoded files using an external program."
+ (interactive "r\nP")
+ (let ((cbuf (current-buffer)) tempfile firstline work-buffer status)
+ (save-excursion
+ (goto-char start)
+ (when (re-search-forward uu-begin-string nil t)
+ (forward-line 1)
+ (setq firstline (point))
+ (cond ((null file-name))
+ ((stringp file-name))
+ (t
+ (setq file-name (read-file-name "File to Name:"
+ nil nil nil
+ (match-string 1)))))
+ (setq tempfile (expand-file-name
+ (or file-name (concat uu-temporary-file-directory
+ (make-temp-name "uu")))))
+ (let ((cdir default-directory) default-process-coding-system)
+ (unwind-protect
+ (progn
+ (set-buffer (setq work-buffer
+ (generate-new-buffer " *uudecode-work*")))
+ (buffer-disable-undo work-buffer)
+ (insert "begin 600 " (file-name-nondirectory tempfile) "\n")
+ (insert-buffer-substring cbuf firstline end)
+ (cd (file-name-directory tempfile))
+ (apply 'call-process-region
+ (point-min)
+ (point-max)
+ uu-decoder-program
+ nil
+ nil
+ nil
+ uu-decoder-switches))
+ (cd cdir) (set-buffer cbuf)))
+ (if (file-exists-p tempfile)
+ (unless file-name
+ (goto-char start)
+ (delete-region start end)
+ (let (format-alist)
+ (insert-file-contents-literally tempfile)))
+ (message "Can not uudecode")))
+ (and work-buffer (kill-buffer work-buffer))
+ (condition-case ()
+ (or file-name (delete-file tempfile))
+ (error)))))
+
+(defun uu-insert-char (char &optional count ignored buffer)
+ (condition-case nil
+ (progn
+ (insert-char char count ignored buffer)
+ (fset 'uu-insert-char 'insert-char))
+ (wrong-number-of-arguments
+ (fset 'uu-insert-char 'uu-xemacs-insert-char)
+ (uu-insert-char char count ignored buffer))))
+
+(defun uu-xemacs-insert-char (char &optional count ignored buffer)
+ (if (or (null buffer) (eq buffer (current-buffer)))
+ (insert-char char count)
+ (save-excursion
+ (set-buffer buffer)
+ (insert-char char count))))
+
+(defun uu-decode-region (start end &optional file-name)
+ (interactive "r\nP")
+ (let ((work-buffer nil)
+ (done nil)
+ (counter 0)
+ (remain 0)
+ (bits 0)
+ (lim 0) inputpos
+ (non-data-chars (concat "^" uu-alphabet)))
+ (unwind-protect
+ (save-excursion
+ (goto-char start)
+ (when (re-search-forward uu-begin-string nil t)
+ (cond ((null file-name))
+ ((stringp file-name))
+ (t
+ (setq file-name (expand-file-name
+ (read-file-name "File to Name:"
+ nil nil nil
+ (match-string 1))))))
+ (setq work-buffer (generate-new-buffer " *uudecode-work*"))
+ (buffer-disable-undo work-buffer)
+ (forward-line 1)
+ (skip-chars-forward non-data-chars end)
+ (while (not done)
+ (setq inputpos (point))
+ (setq remain 0 bits 0 counter 0)
+ (cond
+ ((> (skip-chars-forward uu-alphabet end) 0)
+ (setq lim (point))
+ (setq remain
+ (logand (- (char-int (char-after inputpos)) 32) 63))
+ (setq inputpos (1+ inputpos))
+ (if (= remain 0) (setq done t))
+ (while (and (< inputpos lim) (> remain 0))
+ (setq bits (+ bits
+ (logand
+ (-
+ (char-int (char-after inputpos)) 32) 63)))
+ (if (/= counter 0) (setq remain (1- remain)))
+ (setq counter (1+ counter)
+ inputpos (1+ inputpos))
+ (cond ((= counter 4)
+ (uu-insert-char (lsh bits -16) 1 nil work-buffer)
+ (uu-insert-char (logand (lsh bits -8) 255) 1 nil
+ work-buffer)
+ (uu-insert-char (logand bits 255) 1 nil
+ work-buffer)
+ (setq bits 0 counter 0))
+ (t (setq bits (lsh bits 6)))))))
+ (cond
+ (done)
+ ((> 0 remain)
+ (error "uucode line ends unexpectly")
+ (setq done t))
+ ((and (= (point) end) (not done))
+ (error "uucode ends unexpectly")
+ (setq done t))
+ ((= counter 3)
+ (uu-insert-char (logand (lsh bits -16) 255) 1 nil
+ work-buffer)
+ (uu-insert-char (logand (lsh bits -8) 255) 1 nil
+ work-buffer))
+ ((= counter 2)
+ (uu-insert-char (logand (lsh bits -10) 255) 1 nil
+ work-buffer)))
+ (skip-chars-forward non-data-chars end))
+ (if file-name
+ (save-excursion
+ (set-buffer work-buffer)
+ (write-file file-name))
+ (or (markerp end) (setq end (set-marker (make-marker) end)))
+ (goto-char start)
+ (insert-buffer-substring work-buffer)
+ (delete-region (point) end))))
+ (and work-buffer (kill-buffer work-buffer)))))
+
+(provide 'uudecode)
+
+;;; uudecode.el ends here
+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 Pterodactyl Gnus 0.33 Manual
+@settitle Pterodactyl Gnus 0.34 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Gnus 0.33 Manual
+@title Pterodactyl Gnus 0.34 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.33.
+This manual corresponds to Pterodactyl Gnus 0.34.
@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
fast, and too simplistic solution; and
@code{mail-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.
+cases. If this is unacceptable to you, use the 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
long thesis on cats' urinary tracts, and have to go home for dinner
before you've finished reading the thesis. You can then set a bookmark
in the article, and Gnus will jump to this bookmark the next time it
-encounters the article. @xref{Setting Marks}
+encounters the article. @xref{Setting Marks}.
@item
@vindex gnus-replied-mark
@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
@item
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.
\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.
--- /dev/null
+\def\verbatim@font{\fontencoding{OT1}\fontfamily{pcr}\fontsize{10pt}{10}\selectfont}
+
+\catcode `\÷ = \active
+\def ÷{\penalty10000\hskip0.001pt-\penalty\hyphenpenalty\hskip0.001pt\relax}
+
+\def \newpagestyle#1#2#3{\@namedef{ps@#1}{\def\@oddhead{#2}\def\@oddfoot{#3}%
+ \let\@evenhead\@oddhead \let\@evenfoot\@oddfoot}}
+\def \newdoublepagestyle#1#2#3#4#5{\@namedef{ps@#1}{\def\@evenhead{#2}%
+ \def\@oddhead{#3}%
+ \def\@evenfoot{#4}%
+ \def\@oddfoot{#5}}}
+
+\newlength{\headtextwidth}
+\setlength{\headtextwidth}{\textwidth}
+\addtolength{\headtextwidth}{2cm}
+\newlength{\headetextwidth}
+\setlength{\headetextwidth}{\headtextwidth}
+\addtolength{\headetextwidth}{-0.5cm}
+\newlength{\headotextwidth}
+\setlength{\headotextwidth}{\headtextwidth}
+\addtolength{\headotextwidth}{-0.35cm}
+
+\def\outputpage{%
+ \let \protect \noexpand
+ \shipout \vbox{%
+ \set@typeset@protect
+ \aftergroup\set@typeset@protect
+ \@shipoutsetup
+ \@begindvi
+ \vskip \topmargin
+ \moveright\@themargin \vbox {%
+ \setbox\@tempboxa \vbox to\headheight{%
+ \vfil
+ \color@hbox
+ \normalcolor
+ \hb@xt@ \headtextwidth {%
+ \let \label \@gobble
+ \let \index \@gobble
+ \let \glossary \@gobble %% 21 Jun 91
+ \@thehead
+ }%
+ \color@endbox
+ }% %% 22 Feb 87
+ \ifodd\c@page
+ \dp\@tempboxa \z@
+ \box\@tempboxa \mbox{} \\
+ \ifx \@oddhead\@empty\else
+ % \rule{\headotextwidth}{0.5pt}
+ \fi
+ \else
+ \hskip -2.2cm
+ \dp\@tempboxa \z@
+ \box\@tempboxa \mbox{}
+ \\\mbox{}
+ \vskip 2pt
+ \hskip -2.0cm
+ \ifx \@oddhead\@empty\else
+ % \rule{\headetextwidth}{0.5pt}
+ \fi
+ \fi
+ \vskip \headsep
+ \box\@outputbox
+ \baselineskip \footskip
+ \color@hbox
+ \normalcolor
+ \hb@xt@\textwidth{%
+ \let \label \@gobble
+ \let \index \@gobble %% 22 Feb 87
+ \let \glossary \@gobble %% 21 Jun 91
+ \@thefoot
+ }%
+ \color@endbox
+ }%
+ }%
+ \global \@colht \textheight
+ \stepcounter{page}%
+ \let\firstmark\botmark
+}
+
+\def\@makechapterhead#1{\gnuspagechapter{#1}}
+
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{3}
+
+\def\verbatim@font{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont}
--- /dev/null
+% SHOWIDX DOCUMENT-STYLE OPTION - released 16 June 1991
+% for LaTeX version 2.09
+% Copyright (C) 1985, 1988, 1989, 1991 by Leslie Lamport
+% Modified by Lars Ingebrigtsen 1993
+%
+% Prints \index entries in outer margin. For use with book or report
+% style. Note: makes \flushbottom the default.
+
+\typeout{Document style option `showidx' - released 16 June 1991}
+\typeout{Modified for use in eyesore.}
+
+\newbox\eye@boxa
+\newbox\eye@boxb
+\newbox\eye@boxc
+\newbox\eye@boxd
+\newbox\eye@boxe
+\newbox\eye@boxf
+\newbox\eye@boxg
+\newbox\eye@box
+\newbox\new@box
+
+ \global \setbox \eye@boxa \hbox{}
+ \global \setbox \eye@boxb \hbox{}
+ \global \setbox \eye@boxc \hbox{}
+ \global \setbox \eye@boxd \hbox{}
+ \global \setbox \eye@boxe \hbox{}
+ \global \setbox \eye@boxf \hbox{}
+ \global \setbox \eye@boxg \hbox{}
+
+\newdimen\eye@boxadim \global\eye@boxadim\z@
+\newdimen\eye@boxbdim \global\eye@boxbdim\z@
+\newdimen\eye@boxcdim \global\eye@boxcdim\z@
+\newdimen\eye@boxddim \global\eye@boxddim\z@
+\newdimen\eye@boxedim \global\eye@boxedim\z@
+\newdimen\eye@boxfdim \global\eye@boxfdim\z@
+\newdimen\eye@boxgdim \global\eye@boxgdim\z@
+
+\newdimen\gnus@horiz \global\gnus@horiz\z@
+\newdimen\gnus@vert \global\gnus@vert\z@
+
+
+\newdimen\eye@height
+\global\eye@height\textheight
+% \global\advance\eye@height 8cm
+
+\newdimen\eyeins@height
+\global\eyeins@height\z@
+
+\newdimen\eye@adjust
+\global\eye@adjust 0cm
+
+\newinsert\indexbox
+\dimen\indexbox=\maxdimen
+
+\newinsert\gnusbox
+\dimen\gnusbox=\maxdimen
+
+\newdimen\eye@dim
+\newdimen\new@dim
+\newdimen\doinsert
+
+\newdimen\eye@strutd
+\def\eye@strut#1{%
+ \eye@strutd#1
+ \advance\eye@strutd\eye@adjust
+ \advance\eye@strutd -1mm
+ \raisebox{-\eye@strutd}[0pt][0pt]{\rule{1mm}{\eye@strutd}}
+}
+
+\newdimen\eye@tmpd
+\newbox\eye@tmpba
+\newbox\eye@tmpbb
+\def\eye@insbox#1#2#3{%
+ \eye@dim#2
+ \advance\eye@dim\ht#3
+ \advance\eye@dim\eye@adjust
+ \ifdim \eye@dim < \eye@height
+ \global#2\eye@dim
+ \global\setbox#1
+ \hbox{\unhbox#1
+% \eye@strut{\ht#3}
+ \unhbox#3
+ \vrule \@height 1cm \@width\z@}
+ \setbox #3 \hbox{}
+ \fi}
+
+\def\@showidx#1{
+ \setbox\new@box\hbox{#1}
+ % \typeout{Vi er i showidx.}
+ \new@dim\z@
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxa\eye@boxadim\new@box
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxb\eye@boxbdim\new@box
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxc\eye@boxcdim\new@box
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxd\eye@boxddim\new@box
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxe\eye@boxedim\new@box
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxf\eye@boxfdim\new@box
+ \ifdim \ht\new@box > \z@
+ \eye@insbox\eye@boxg\eye@boxgdim\new@box
+ \ifdim \ht\new@box > \z@
+ \else
+ \typeout{Discarding index.}
+ \fi\fi\fi\fi\fi\fi\fi
+ \fi
+
+ \doinsert \z@
+ \ifdim \eyeins@height > \z@
+ \eye@dim\eyeins@height
+ \advance\eye@dim\eye@boxadim
+ \ifdim \eye@dim < \eye@height
+ \global\eyeins@height\eye@dim
+ \doinsert 1pt
+ \fi
+ \else
+ \doinsert 1pt
+ \global\eyeins@height\eye@boxadim
+ \fi
+
+ \ifdim \ht\eye@boxa > \z@
+
+ \ifdim \doinsert > \z@
+% \typeout{Vi inserter i indexbox.}
+ \insert\indexbox{
+ \small
+ \hsize\marginparwidth
+ \hangindent\marginparsep
+ \parindent\z@
+ \parfillskip\@flushglue
+ \everypar{}\let\par\@@par
+ \lineskip\normallineskip
+ \baselineskip .8\normalbaselineskip
+ \ifodd\c@page\raggedleft\else\raggedright\fi
+ \leavevmode
+ \relax
+ \unhbox\eye@boxa
+ \relax
+ }
+ \global \setbox \eye@boxa \copy\eye@boxb
+ \global \setbox \eye@boxb \copy\eye@boxc
+ \global \setbox \eye@boxc \copy\eye@boxd
+ \global \setbox \eye@boxd \copy\eye@boxe
+ \global \setbox \eye@boxe \copy\eye@boxf
+ \global \setbox \eye@boxf \copy\eye@boxg
+ \global \setbox \eye@boxg \hbox{}
+ \global \eye@boxadim\eye@boxbdim
+ \global \eye@boxbdim\eye@boxcdim
+ \global \eye@boxcdim\eye@boxddim
+ \global \eye@boxddim\eye@boxedim
+ \global \eye@boxedim\eye@boxfdim
+ \global \eye@boxfdim\eye@boxgdim
+ \global \eye@boxgdim\z@
+ \fi
+ \fi
+
+}
+
+\def\@rightidx{\hskip\columnwidth \hskip\marginparsep}
+\def\@leftidx{\hskip-\marginparsep \hskip-\marginparwidth}
+
+\def\@mkidx{
+
+% \typeout{Vi er i mkidx 1.}
+
+ \vbox to \z@{
+ \vskip \gnus@vert
+ \hbox{
+ \hskip \gnus@horiz
+ \box\gnusbox
+ }\vss
+ }
+ \vbox to \z@{
+ \ifdim \eyeins@height < \textheight
+ \eye@dim \textheight
+ \advance \eye@dim -\eyeins@height
+% \vskip \eye@dim
+ \else
+ \eye@dim \eye@height
+ \advance \eye@dim -3cm
+ \ifdim \eyeins@height > \eye@dim
+ % \vskip -3cm
+ \fi\fi
+ \hbox{
+ \ifodd\c@page \@rightidx \else \@leftidx \fi
+ \box\indexbox
+ }\vss
+ }
+
+ \global\eyeins@height\z@
+
+}
+
+\def\raggedbottom{\def\@textbottom{\vskip
+ \z@ plus.0001fil}\let\@texttop\@mkidx}
+\def\flushbottom{\let\@textbottom\relax \let\@texttop\@mkidx}
+
+\def\margindex#1{\@bsphack
+\begingroup\@sanitize\catcode32=10\relax\@showidx{#1}
+ \endgroup\@esphack}
+
+\def\@gnusfig#1{
+ \insert\gnusbox{
+ \small
+ \hsize\textwidth
+ \hangindent\marginparsep
+ \parindent\z@
+ \parfillskip\@flushglue
+ \everypar{}\let\par\@@par
+ \lineskip\normallineskip
+ \baselineskip .8\normalbaselineskip
+ \ifodd\c@page\raggedleft\else\raggedright\fi
+ \leavevmode
+ \relax
+ #1
+ \relax
+ }
+}
+
+\def\gnusfig#1#2#3{\@bsphack
+\begingroup\@sanitize\catcode32=10\relax\@gnusfig{#3}\global\gnus@horiz#1 \global\gnus@vert#2
+ \endgroup\@esphack}
+
+\flushbottom
+
+\endinput
--- /dev/null
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C
+%%Title: /home/menja/c/larsi/rgnus/texi/ps/eegnu.eps
+%%BoundingBox: 0 0 890.3 909.7
+%%CreationDate: Fri Oct 11 14:59:05 1996
+%%DocumentFonts:
+%%ColorUsage: B & W
+%%TileBox: 0 0 890.3 909.7
+%%EndComments
+%%BeginProcSet:Adobe_Illustrator_1.1 0 0
+% Copyright 1992 Corel Corporation.
+
+% All rights reserved.
+/wPSMDict 150 dict def
+wPSMDict begin
+/bd {bind def} bind def
+/ld {load def} bd
+/xd {exch def} bd
+/_ null def
+/$c 0 def
+/$m 0 def
+/$y 0 def
+/$k 0 def
+/$t 1 def
+/$n _ def
+/$o 0 def
+/$C 0 def
+/$M 0 def
+/$Y 0 def
+/$K 0 def
+/$T 1 def
+/$N _ def
+/$O 0 def
+/$h false def
+/$al 0 def
+/$tr 0 def
+/$le 0 def
+/$lx 0 def
+/$ly 0 def
+/$ctm matrix currentmatrix def
+/@cp /closepath ld
+/@gs /gsave ld
+/@gr /grestore ld
+/@MN {2 copy le{pop}{exch pop}ifelse}bd
+/setcmykcolor where {pop}{/setcmykcolor{4 1 roll
+3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat
+setrgbcolor
+pop}bd}ifelse
+/@tc{dup 1 ge{pop}{4 {dup
+6 -1 roll
+mul
+exch}repeat
+pop}ifelse}bd
+/@scc{$c $m $y $k $t @tc setcmykcolor true}bd
+/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd
+/@sm{/$ctm $ctm currentmatrix def}bd
+/x {/$t xd /$n xd
+/$k xd /$y xd /$m xd /$c xd}bd
+/X {/$T xd /$N xd
+/$K xd /$Y xd /$M xd /$C xd}bd
+/g {1 exch sub 0 0 0
+4 -1 roll
+_ 1 x}bd
+/G {1 exch sub 0 0 0
+4 -1 roll
+_ 1 X}bd
+/k {_ 1 x}bd
+/K {_ 1 X}bd
+/d /setdash ld
+/i {dup 0 ne {setflat} {pop} ifelse}bd
+/j /setlinejoin ld
+/J /setlinecap ld
+/M /setmiterlimit ld
+/w /setlinewidth ld
+/O {/$o xd}bd
+/R {/$O xd}bd
+/c /curveto ld
+/C /c ld
+/l /lineto ld
+/L /l ld
+/m /moveto ld
+/n /newpath ld
+/N /newpath ld
+/F {@scc{eofill}if n} bd
+/f {@cp F}bd
+/S {@SCC{stroke}if n} bd
+/s {@cp
+S}bd
+/B {@gs F @gr
+S}bd
+/b {@cp B }bd
+/u {}bd
+/U {}bd
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+1 i
+2 J
+0 j
+4 M
+[]0 d
+
+%%Note: traced as Normal_Outline
+0 g
+163.4 2.9 m
+197.1 51.5 223.7 94.3 251.6 130.7 C
+283.4 176.1 312.0 216.3 342.8 256.8 C
+373.2 303.2 401.1 342.1 420.0 396.9 C
+421.2 403.1 425.1 408.9 424.5 413.5 C
+395.6 371.6 368.4 326.2 337.2 285.0 C
+306.1 247.4 276.3 199.4 244.5 161.5 C
+212.1 116.7 182.9 79.1 168.6 20.4 C
+166.3 13.9 164.7 8.1 162.4 2.2 C
+162.4 2.2 163.4 2.9 163.4 2.9 C
+f
+0 g
+428.1 170.2 m
+428.1 170.2 429.7 170.2 430.0 170.5 C
+454.7 211.4 474.8 275.6 504.0 301.9 C
+512.1 300.6 515.0 280.8 527.3 283.1 C
+534.8 284.4 536.4 284.1 542.9 288.9 C
+571.4 331.1 600.3 374.5 623.6 423.2 C
+640.2 454.7 661.6 492.9 663.5 517.6 C
+660.3 515.6 L
+633.7 468.6 613.2 419.6 582.4 378.4 C
+572.1 367.1 566.5 352.8 550.7 348.3 C
+543.2 348.3 536.1 354.4 530.5 363.8 C
+528.9 367.1 528.9 368.1 525.4 369.7 C
+495.5 333.7 466.7 282.8 446.5 233.5 C
+436.2 206.2 433.2 190.0 427.4 170.5 C
+427.4 170.5 428.1 170.2 428.1 170.2 C
+f
+0 g
+754.7 271.7 m
+783.8 345.7 780.3 386.2 794.2 447.5 C
+806.2 497.1 819.2 543.8 843.5 614.9 C
+869.5 690.4 875.0 731.0 888.0 787.1 C
+892.5 826.7 892.8 865.9 869.5 898.7 C
+853.9 908.7 841.9 912.3 822.1 909.4 C
+785.5 890.2 764.1 846.4 749.8 799.7 C
+750.4 793.6 750.8 791.3 755.0 788.1 C
+755.6 788.1 756.9 788.1 757.9 788.1 C
+772.8 803.3 773.8 842.9 796.8 849.0 C
+817.6 849.0 826.3 847.7 840.3 834.8 C
+855.8 799.7 856.2 789.4 858.1 755.0 C
+855.2 687.5 836.7 643.7 819.8 576.9 C
+801.7 513.7 781.9 454.3 772.8 406.7 C
+766.3 361.6 755.0 332.4 754.0 271.7 C
+754.0 271.7 754.7 271.7 754.7 271.7 C
+f
+0 g
+383.0 484.8 m
+421.2 539.0 420.6 593.1 405.4 650.9 C
+395.0 674.5 382.7 683.6 367.7 695.0 C
+354.8 681.0 339.2 664.2 330.1 640.2 C
+330.1 640.2 330.1 638.5 330.4 638.2 C
+351.5 628.8 372.3 592.2 378.1 567.2 C
+381.0 544.5 378.8 505.2 382.3 484.8 C
+382.3 484.8 383.0 484.8 383.0 484.8 C
+f
+0 g
+120.6 509.8 m
+171.2 511.7 215.0 550.7 255.8 589.6 C
+283.4 609.7 302.2 627.8 315.8 663.5 C
+280.8 636.9 238.3 595.7 192.6 571.7 C
+179.6 566.2 162.4 565.6 147.8 570.4 C
+139.4 578.2 136.2 580.5 136.5 588.6 C
+144.6 635.3 192.3 684.3 217.6 724.8 C
+223.4 738.1 235.7 745.9 238.3 758.9 C
+204.3 726.8 174.1 677.1 147.5 634.3 C
+127.1 600.3 95.3 560.1 102.1 520.5 C
+107.0 510.8 111.8 513.7 120.6 509.8 C
+f
+0 g
+621.7 657.7 m
+669.0 661.2 703.4 716.1 724.8 769.6 C
+730.7 779.0 728.7 785.5 731.3 792.9 C
+711.8 758.5 695.0 728.4 656.7 720.9 C
+638.2 720.3 635.0 721.9 624.9 732.6 C
+621.7 736.5 620.4 739.4 618.1 744.3 C
+588.6 683.0 L
+593.1 671.6 598.3 665.5 608.1 661.9 C
+612.0 661.6 617.8 659.0 621.7 657.7 C
+f
+0 g
+502.0 681.0 m
+526.7 680.4 547.7 694.7 565.2 716.1 C
+576.0 734.9 583.1 755.0 592.2 775.4 C
+592.2 779.6 591.5 783.2 592.8 786.8 C
+582.4 775.7 571.4 752.7 549.7 746.5 C
+520.8 736.2 500.7 751.4 481.6 766.7 C
+440.4 802.3 416.7 847.7 366.8 868.5 C
+346.3 878.2 335.0 875.6 319.1 869.5 C
+300.3 862.7 292.8 850.7 279.2 833.8 C
+285.0 838.3 271.7 828.6 277.2 833.5 C
+268.5 845.8 244.2 875.3 220.8 881.1 C
+168.6 888.3 147.5 809.8 96.3 789.4 C
+83.3 784.8 72.0 776.7 61.2 781.6 C
+41.5 794.2 38.2 804.6 27.5 824.1 C
+2.2 764.7 L
+9.0 751.1 16.8 730.3 32.1 725.1 C
+45.0 720.3 55.1 721.6 68.1 727.1 C
+91.1 745.2 116.4 758.9 132.0 779.3 C
+140.1 789.4 146.5 797.5 157.6 808.5 C
+166.3 816.6 176.1 823.1 187.7 827.0 C
+219.2 813.0 240.6 789.7 259.1 759.5 C
+275.3 782.5 284.7 815.0 321.4 810.1 C
+373.9 801.4 405.0 751.7 443.6 715.1 C
+462.8 694.7 478.3 687.2 502.0 681.0 C
+f
+%%Trailer
+end
+showpage
--- /dev/null
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C
+%%Title: /home/menja/c/larsi/gnus-head.eps
+%%BoundingBox: 0 0 430.6 312.5
+%%CreationDate: Sat Feb 3 13:06:12 1996
+%%DocumentFonts:
+%%ColorUsage: B & W
+%%TileBox: 0 0 430.6 312.5
+%%EndComments
+%%BeginProcSet:Adobe_Illustrator_1.1 0 0
+% Copyright 1992 Corel Corporation.
+
+% All rights reserved.
+/wPSMDict 150 dict def
+wPSMDict begin
+/bd {bind def} bind def
+/ld {load def} bd
+/xd {exch def} bd
+/_ null def
+/$c 0 def
+/$m 0 def
+/$y 0 def
+/$k 0 def
+/$t 1 def
+/$n _ def
+/$o 0 def
+/$C 0 def
+/$M 0 def
+/$Y 0 def
+/$K 0 def
+/$T 1 def
+/$N _ def
+/$O 0 def
+/$h false def
+/$al 0 def
+/$tr 0 def
+/$le 0 def
+/$lx 0 def
+/$ly 0 def
+/$ctm matrix currentmatrix def
+/@cp /closepath ld
+/@gs /gsave ld
+/@gr /grestore ld
+/@MN {2 copy le{pop}{exch pop}ifelse}bd
+/setcmykcolor where {pop}{/setcmykcolor{4 1 roll
+3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat
+setrgbcolor
+pop}bd}ifelse
+/@tc{dup 1 ge{pop}{4 {dup
+6 -1 roll
+mul
+exch}repeat
+pop}ifelse}bd
+/@scc{$c $m $y $k $t @tc setcmykcolor true}bd
+/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd
+/@sm{/$ctm $ctm currentmatrix def}bd
+/x {/$t xd /$n xd
+/$k xd /$y xd /$m xd /$c xd}bd
+/X {/$T xd /$N xd
+/$K xd /$Y xd /$M xd /$C xd}bd
+/g {1 exch sub 0 0 0
+4 -1 roll
+_ 1 x}bd
+/G {1 exch sub 0 0 0
+4 -1 roll
+_ 1 X}bd
+/k {_ 1 x}bd
+/K {_ 1 X}bd
+/d /setdash ld
+/i {dup 0 ne {setflat} {pop} ifelse}bd
+/j /setlinejoin ld
+/J /setlinecap ld
+/M /setmiterlimit ld
+/w /setlinewidth ld
+/O {/$o xd}bd
+/R {/$O xd}bd
+/c /curveto ld
+/C /c ld
+/l /lineto ld
+/L /l ld
+/m /moveto ld
+/n /newpath ld
+/N /newpath ld
+/F {@scc{eofill}if n} bd
+/f {@cp F}bd
+/S {@SCC{stroke}if n} bd
+/s {@cp
+S}bd
+/B {@gs F @gr
+S}bd
+/b {@cp B }bd
+/u {}bd
+/U {}bd
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+1 i
+2 J
+0 j
+4 M
+[]0 d
+
+%%Note: traced as Normal_Outline
+0 g
+267.8 10.0 m
+291.8 50.8 294.2 95.0 278.8 136.8 C
+270.2 147.3 264.9 154.5 252.4 156.9 C
+227.0 119.5 L
+256.3 98.8 267.3 63.3 264.0 12.4 C
+264.4 10.5 265.9 9.1 265.9 9.1 C
+265.9 9.1 267.8 10.0 267.8 10.0 C
+f
+0 g
+79.2 40.3 m
+116.6 43.6 150.2 75.3 180.9 103.6 C
+197.2 121.4 204.0 133.4 217.9 150.7 C
+216.4 151.2 215.0 152.1 213.1 152.1 C
+178.0 128.6 147.3 81.1 102.2 86.8 C
+98.4 88.8 95.0 89.2 92.6 92.1 C
+87.3 120.4 126.2 159.8 141.1 182.8 C
+148.8 193.4 159.3 203.0 159.8 217.4 C
+131.0 190.0 98.8 140.6 71.5 90.7 C
+65.2 76.3 58.0 67.6 63.3 53.7 C
+68.6 45.1 70.5 43.2 79.2 40.3 C
+f
+0 g
+355.6 161.2 m
+376.3 159.3 388.3 171.8 404.6 184.3 C
+412.3 201.1 422.4 223.2 423.3 237.6 C
+416.6 234.2 410.8 229.4 405.1 217.4 C
+399.8 211.6 386.8 206.8 378.7 207.8 C
+334.0 206.4 308.1 288.4 252.4 297.1 C
+236.1 299.5 229.9 291.8 214.5 285.6 C
+203.0 270.2 L
+193.4 281.7 175.2 306.7 147.8 303.3 C
+115.2 279.8 101.2 238.5 57.6 230.8 C
+42.7 235.2 26.8 240.9 21.1 253.4 C
+19.6 257.7 19.6 260.1 16.8 262.5 C
+14.4 259.2 12.9 257.7 11.5 253.4 C
+20.1 231.8 12.4 207.8 31.6 190.5 C
+45.6 184.8 60.4 188.1 74.8 201.6 C
+103.6 220.3 113.2 256.3 142.5 259.2 C
+164.1 248.1 178.5 237.1 189.1 214.0 C
+208.8 241.9 L
+225.6 253.4 243.8 250.0 262.0 241.4 C
+294.2 215.0 325.9 167.5 355.6 161.2 C
+f
+%%Trailer
+end
+showpage
--- /dev/null
+#!/bin/sh
+match='M-x |(Group)|(Summary)|(Article)|(Server)|(Browse)|(Post)|(Mail)|(Score)|(Binary)|(Topic)|(Pick)'
+fun='{gnus-|{nn.*-|{grouplens-'
+egrep "$match" gnus.idx > gnus.kidx
+egrep "$fun" gnus.idx > gnus.gidx
+egrep -v "$match|$fun" gnus.idx > gnus.cidx
--- /dev/null
+;;; texi2latex.el --- convert a texi file into a LaTeX file.
+;; Copyright (C) 1996 Lars Magne Ingebrigtsen
+
+(require 'cl)
+
+(defun latexi-discard-until (string)
+ (let ((beg (match-beginning 0)))
+ (unless (re-search-forward (concat "^@end +" string "[ \t]*\n") nil t)
+ (error "No end: %s" string))
+ (delete-region beg (match-end 0))))
+
+(defun latexi-strip-line ()
+ (delete-region (progn (beginning-of-line) (point))
+ (progn (forward-line 1) (point))))
+
+(defun latexi-switch-line (command arg)
+ (latexi-strip-line)
+ (insert (format "\\%s{%s}\n" command arg)))
+
+(defun latexi-index-command (command arg)
+ (latexi-strip-line)
+ (insert (format "\\gnus%sindex{%s}\n"
+ (if (equal command "kindex") "k" "")
+ arg)))
+
+(defun latexi-begin-command (command)
+ (latexi-strip-line)
+ (insert (format "\\begin{%s}\n" command)))
+
+(defun latexi-exchange-command (command arg)
+ (delete-region (match-beginning 0) (match-end 0))
+ (insert (format "\\%s{%s}" command arg)))
+
+(defun latexi-translate ()
+ "Translate."
+ (interactive)
+ (latexi-translate-file "gnus")
+ (latexi-translate-file "gnus-faq"))
+
+(defun latexi-translate-file (file)
+ "Translate file a LaTeX file."
+ (let ((item-string "")
+ (item-stack nil)
+ (list-stack nil)
+ (latexi-buffer (get-buffer-create "*LaTeXi*"))
+ verbatim
+ (regexp
+ (concat
+ "@\\([^{} \t\n]+\\)"
+ "\\(\\( +\\(.*$\\)\\|[ \t]*$\\)\\|{\\([^}]*\\)}\\)"))
+ (cur (find-file-noselect (concat file ".texi")))
+ (times 3)
+ (chapter 0)
+ command arg)
+ (pop-to-buffer latexi-buffer)
+ (buffer-disable-undo)
+ (erase-buffer)
+ (insert-buffer-substring cur)
+ (goto-char (point-min))
+ (latexi-strip-line)
+ (latexi-translate-string "%@{" "\\gnuspercent{}\\gnusbraceleft{}")
+ (latexi-translate-string "%@}" "\\gnuspercent{}\\gnusbraceright{}")
+ (latexi-translate-string "%1@{" "\\gnuspercent{}1\\gnusbraceright{}")
+; (while (re-search-forward "{\"[^\"]*\\(\\\\\\)[^\"]*\"}\\\\" nil t)
+; (replace-match "\\verb+\\\\+ " t t))
+ (while (not (zerop (decf times)))
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (setq command (match-string 1))
+ (if (match-beginning 3)
+ (progn
+ (setq arg (or (match-string 4) ""))
+ (save-match-data
+ (when (string-match "[ \t]+$" arg)
+ (setq arg (substring arg 0 (match-beginning 0)))))
+ (cond
+ ((member command '("c" "comment"))
+ (if (string-match "@icon" (or arg ""))
+ (progn
+ (beginning-of-line)
+ (delete-region (point) (+ (point) 4))
+ (insert "\\gnus"))
+ (delete-region (match-beginning 0)
+ (progn (end-of-line) (point))))
+ (if (equal arg "@head")
+ (insert "\\gnusinteresting")))
+ ((member command '("setfilename"
+ "synindex" "setchapternewpage"
+ "summarycontents" "bye"
+ "top" "iftex" "cartouche"
+ "iflatex" "finalout" "vskip"))
+ (latexi-strip-line))
+ ((member command '("menu" "tex" "ifinfo" "ignore"))
+ (latexi-discard-until command))
+ ((member command '("subsection" "subsubsection"))
+ (latexi-switch-line command arg))
+ ((member command '("chapter"))
+ (latexi-switch-line
+ (format
+ "gnus%s{\\epsfig{figure=tmp/new-herd-%d.ps,scale=.5}}"
+ command (incf chapter))
+ arg))
+ ((member command '("section"))
+ (latexi-switch-line (format "gnus%s" command) arg))
+ ((member command '("cindex" "findex" "kindex" "vindex"))
+ (latexi-index-command command arg))
+ ((member command '("*"))
+ (delete-char -2)
+ (insert "\\\\"))
+ ((equal command "sp")
+ (replace-match "" t t))
+ ((equal command "node")
+ (latexi-strip-line)
+ (insert (format "\\label{%s}\n" arg)))
+ ((equal command "contents")
+ (latexi-strip-line)
+ ;;(insert (format "\\tableofcontents\n" arg))
+ )
+ ((member command '("titlepage"))
+ (latexi-begin-command command))
+ ((member command '("lisp" "example"))
+ (latexi-strip-line)
+ (insert (format "\\begin{verbatim}\n"))
+ (setq verbatim (point)))
+ ((member command '("center"))
+ (latexi-strip-line)
+ (insert (format "\\begin{%s}%s\\end{%s}\n"
+ command arg command)))
+ ((member command '("end"))
+ (cond
+ ((member arg '("titlepage"))
+ (latexi-strip-line)
+ (insert (format "\\end{%s}\n" arg)))
+ ((equal arg "quotation")
+ (latexi-strip-line)
+ (insert (format "\\end{verse}\n")))
+ ((member arg '("lisp" "example"))
+ (latexi-strip-line)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region verbatim (point))
+ (goto-char (point-min))
+ (while (search-forward "@{" nil t)
+ (replace-match "{" t t))
+ (goto-char (point-min))
+ (while (search-forward "@}" nil t)
+ (replace-match "}" t t))))
+ (setq verbatim nil)
+ (insert "\\end{verbatim}\n"))
+ ((member arg '("table"))
+ (setq item-string (pop item-stack))
+ (latexi-strip-line)
+ (insert (format "\\end{%slist}\n" (pop list-stack))))
+ ((member arg '("itemize" "enumerate"))
+ (setq item-string (pop item-stack))
+ (latexi-strip-line)
+ (insert (format "\\end{%s}\n" arg)))
+ ((member arg '("iflatex" "iftex" "cartouche"))
+ (latexi-strip-line))
+ (t
+ (error "Unknown end arg: %s" arg))))
+ ((member command '("table"))
+ (push item-string item-stack)
+ (push (substring arg 1) list-stack)
+ (setq item-string
+ (format "[@%s{%%s}]" (car list-stack)))
+ (latexi-strip-line)
+ (insert (format "\\begin{%slist}\n" (car list-stack))))
+ ((member command '("itemize" "enumerate"))
+ (push item-string item-stack)
+ (cond
+ ((member arg '("@bullet"))
+ (setq item-string "[\\gnusbullet]"))
+ (t
+ (setq item-string "")))
+ (latexi-strip-line)
+ (insert (format "\\begin{%s}\n" command)))
+ ((member command '("item"))
+ (latexi-strip-line)
+ (insert (format "\\%s%s\n" command (format item-string arg))))
+ ((equal command "itemx")
+ (latexi-strip-line)
+ (insert (format "\\gnusitemx{%s}\n" (format item-string arg))))
+ ((eq (aref command 0) ?@)
+ (goto-char (match-beginning 0))
+ (delete-char 2)
+ (insert "duppat{}"))
+ ((equal command "settitle")
+ (latexi-strip-line)
+ (insert (format "\\newcommand{\\gnustitlename}{%s}\n" arg)))
+ ((equal command "title")
+ (latexi-strip-line)
+ (insert (format "\\gnustitlename{%s}\n" arg)))
+ ((equal command "author")
+ (latexi-strip-line)
+ (insert (format "\\gnusauthor{%s}\n" arg)))
+ ((equal command "quotation")
+ (latexi-begin-command "verse"))
+ ((equal command "page")
+ (latexi-strip-line)
+ (insert (format "\\newpage\n" arg)))
+ ((equal command "'s")
+ (goto-char (match-beginning 0))
+ (delete-char 1))
+ ((equal command "include")
+ (latexi-strip-line)
+ (insert "\\input{gnus-faq.latexi}\n"))
+ ((equal command "printindex")
+ (latexi-strip-line)
+ ;;(insert
+ ;; (format
+ ;; "\\begin{theindex}\\input{gnus.%s}\\end{theindex}\n" arg))
+ )
+ (t
+ (error "Unknown command: %s" command))))
+ ;; These are commands with {}.
+ (setq arg (match-string 5))
+ (cond
+ ((member command '("xref" "pxref"))
+ (latexi-exchange-command (concat "gnus" command) arg))
+ ((member command '("sc" "file" "dfn" "emph" "kbd"
+ "code" "samp" "var" "strong" "i"))
+ (goto-char (match-beginning 0))
+ (delete-char 1)
+ (insert "\\gnus"))
+ ((member command '("copyright"))
+ (goto-char (match-beginning 0))
+ (delete-char 1)
+ (insert "\\"))
+ ((eq (aref command 0) ?@)
+ (goto-char (match-beginning 0))
+ (delete-char 2)
+ (insert "duppat{}"))
+ (t
+ (error "Unknown command: %s" command))))))
+ (latexi-translate-string "$" "\\gnusdollar{}")
+ (latexi-translate-string "&" "\\gnusampersand{}")
+ (latexi-translate-string "%" "\\gnuspercent{}")
+ (latexi-translate-string "#" "\\gnushash{}")
+ (latexi-translate-string "^" "\\gnushat{}")
+ (latexi-translate-string "~" "\\gnustilde{}")
+ (latexi-translate-string "_" "\\gnusunderline{}")
+ (latexi-translate-string "¬" "\\gnusnot{}")
+ (goto-char (point-min))
+ (while (search-forward "duppat{}" nil t)
+ (replace-match "@" t t))
+ (latexi-translate-string "@@" "@")
+ (latexi-translate-string "<" "\\gnusless{}")
+ (latexi-translate-string ">" "\\gnusgreater{}")
+ (goto-char (point-min))
+ (search-forward "label{Top}" nil t)
+ (while (re-search-forward "\\\\[ntr]\\b" nil t)
+ (when (save-match-data
+ (or (not (save-excursion
+ (search-backward "begin{verbatim}" nil t)))
+ (> (save-excursion
+ (search-backward "end{verbatim"))
+ (save-excursion
+ (search-backward "begin{verbatim}")))))
+ (goto-char (match-beginning 0))
+ (delete-char 1)
+ (insert "\\gnusbackslash{}")))
+ (latexi-translate-string "\\\\" "\\gnusbackslash{}")
+ (goto-char (point-min))
+ (while (re-search-forward "\\\\[][{}]" nil t)
+ (goto-char (match-beginning 0))
+ (delete-char 1))
+ (latexi-contributors)
+ (write-region (point-min) (point-max) (concat file ".latexi"))))
+
+(defun latexi-translate-string (in out)
+ (let (yes)
+ (goto-char (point-min))
+ (search-forward "label{Top}" nil t)
+ (while (search-forward in nil t)
+ (when (save-match-data
+ (or (not (save-excursion
+ (search-backward "begin{verbatim}" nil t)))
+ (> (save-excursion
+ (re-search-backward "end{verbatim}\\|end{verse}"))
+ (save-excursion
+ (re-search-backward
+ "begin{verbatim}\\|begin{verse}")))))
+ (replace-match out t t)))))
+
+(defun latexi-contributors ()
+ (goto-char (point-min))
+ (when (re-search-forward "^Also thanks to the following" nil t)
+ (forward-line 2)
+ (narrow-to-region
+ (point)
+ (1- (search-forward "\n\n")))
+ (when (re-search-backward "^and" nil t)
+ (latexi-strip-line))
+ (goto-char (point-min))
+ (while (re-search-forward "[.,] *$" nil t)
+ (replace-match "" t t))
+ (goto-char (point-min))
+ (let (names)
+ (while (not (eobp))
+ (push (buffer-substring (point) (progn (end-of-line) (point)))
+ names)
+ (forward-line 1))
+ (delete-region (point-min) (point-max))
+ (insert "\\begin{tabular}{lll}\n")
+ (setq names (nreverse (delete "" names)))
+ (while names
+ (insert (pop names) " & " (or (pop names) "\\mbox{}")
+ " & " (or (pop names) "\\mbox{}")
+ "\\\\\n"))
+ (insert "\\end{tabular}\n")
+ (widen))))
+
\ No newline at end of file