+Tue Nov 5 22:34:01 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * message.el (message-goto-signature): Place point better.
+
+ * gnus-art.el (gnus-summary-save-body-in-file): Restored.
+
+ * nntp.el (nntp-send-authinfo): Better password prompting.
+
+ * nnmail.el (nnmail-read-passwd): Allow format strings.
+
+Tue Nov 5 22:10:20 1996 David Moore <dmoore@ucsd.edu>
+
+ * gnus-sum.el (gnus-valid-move-group-p): New function.
+ (gnus-read-move-group-name): Faster implementation.
+
+Tue Nov 5 12:35:40 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-topic.el (gnus-topic-remove-topic): Would wipe out topic
+ parameters.
+
+ * gnus-sum.el (gnus-summary-stop-page-breaking): Remove all
+ buttons.
+
+ * nnweb.el (nnweb-set-hashtb): Typo.
+
+Tue Nov 5 10:43:24 1996 Randal Schwartz <merlyn@stonehenge.com>
+
+ * gnus-uu.el (gnus-uu-be-dangerous): New variable.
+ (gnus-uu-save-files): Use it.
+
+Tue Nov 5 10:19:39 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-summary-read-document): Doc fix.
+ (gnus-summary-catchup-and-exit): Don't exit when replying "n".
+
+ * gnus-art.el (gnus-summary-write-to-file): Doc fix.
+
+ * gnus-uu.el (gnus-uu-get-list-of-articles): Get numerical prefix
+ value.
+
+Tue Nov 5 10:14:02 1996 David Moore <dmoore@ucsd.edu>
+
+ * gnus-start.el (gnus-groups-to-gnus-format): Simplified and made
+ faster.
+
+Tue Nov 5 04:56:33 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnmail.el (nnmail-search-unix-mail-delim): Protect against
+ regexp overflows.
+
+ * nnheader.el (nnheader-header-value): New definition.
+
+ * nntp.el (nntp-open-connection): Erase buffer.
+ (nntp-possibly-change-group): Ditto.
+
+ * nnvirtual.el (nnvirtual-create-mapping): Would ignore groups
+ with just one article.
+
+Tue Nov 5 03:41:30 1996 David Moore <dmoore@ucsd.edu>
+
+ * gnus-nocem.el (gnus-nocem-enter-article): Would bug out on some
+ lines.
+
+Tue Nov 5 03:36:03 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-score.el (gnus-score-find-favourite-words): Put point at
+ bob.
+
+Tue Nov 5 03:33:04 1996 jeff sparkes <jsparkes@nortel.ca>
+
+ * gnus-kill.el (gnus-batch-score): Run in slave mode.
+
+Mon Nov 4 03:16:18 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnheader.el (nnheader-directory-regular-files): New function.
+
+ * nnmail.el (nnmail-get-spool-files): Allow nnmail-spool-file to
+ be a directory.
+
+ * gnus-sum.el (gnus-summary-next-group): Halt prefetch.
+
+ * gnus-async.el (gnus-async-halt-prefetch): New function.
+
+ * message.el (message-check-news-header-syntax): Anchor
+ multiple-searches.
+
+ * gnus-topic.el (gnus-topic-mode): Reset sorting function.
+
Tue Oct 29 20:42:07 1996 Lars Magne Ingebrigtsen <larsi@ylfing.ifi.uio.no>
* gnus-topic.el (gnus-topic-remove-topic): Fold properly.
visible (nth 2 elem)
face (nth 3 elem))
(while (re-search-forward regexp nil t)
- (article-hide-text
- (match-beginning invisible) (match-end invisible) props)
- (article-unhide-text-type
- (match-beginning visible) (match-end visible) 'emphasis)
- (put-text-property
- (match-beginning visible) (match-end visible)
- 'face face)))))))
+ (when (and (match-beginning visible) (match-beginning invisible))
+ (article-hide-text
+ (match-beginning invisible) (match-end invisible) props)
+ (article-unhide-text-type
+ (match-beginning visible) (match-end visible) 'emphasis)
+ (put-text-property
+ (match-beginning visible) (match-end visible) 'face face)
+ (goto-char (match-end invisible)))))))))
(provide 'article)
(setq gnus-newsgroup-last-file filename)))
(defun gnus-summary-write-to-file (&optional filename)
- "Append this article body to a file.
+ "Write this article to a file.
Optional argument FILENAME specifies file name.
The directory to save in defaults to `gnus-article-save-directory'."
(interactive)
(gnus-summary-save-in-file nil t))
+
+(defun gnus-summary-save-body-in-file (&optional filename)
+ "Append this article body to a file.
+Optional argument FILENAME specifies file name.
+The directory to save in defaults to `gnus-article-save-directory'."
+ (interactive)
+ (gnus-set-global-variables)
+ (let ((default-name
+ (funcall gnus-file-save-name gnus-newsgroup-name
+ gnus-current-headers gnus-newsgroup-last-file)))
+ (setq filename (gnus-read-save-file-name
+ "Save %s body in file:" default-name filename))
+ (gnus-make-directory (file-name-directory filename))
+ (gnus-eval-in-buffer-window gnus-original-article-buffer
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (when (search-forward "\n\n" nil t)
+ (narrow-to-region (point) (point-max)))
+ (gnus-output-to-file filename))))
+ ;; Remember the directory name to save articles.
+ (setq gnus-newsgroup-last-file filename)))
+
(defun gnus-summary-save-in-pipe (&optional command)
"Pipe this article to subprocess."
(interactive)
(defun gnus-async-set-buffer ()
(nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t))
+(defun gnus-async-halt-prefetch ()
+ "Stop prefetching."
+ (setq gnus-async-fetch-list nil))
+
(defun gnus-async-prefetch-next (group article summary)
"Possibly prefetch several articles starting with the article after ARTICLE."
(when (and (gnus-buffer-live-p summary)
(or (gnus-gethash gnus-tmp-group gnus-description-hashtb) "")
""))
(gnus-tmp-moderated
- (if (member gnus-tmp-group gnus-moderated-list) ?m ? ))
+ (if (gnus-gethash gnus-tmp-group gnus-moderated-hashtb) ?m ? ))
(gnus-tmp-moderated-string
(if (eq gnus-tmp-moderated ?m) "(m)" ""))
(gnus-tmp-method
(while (setq info (pop alist))
(when (gnus-group-native-p (gnus-info-group info))
(gnus-info-clear-data info)))
- (gnus-get-unread-articles))))
+ (gnus-get-unread-articles)
+ (gnus-dribble-enter ""))))
(defun gnus-info-clear-data (info)
"Clear all marks and read ranges from INFO."
(gnus-expert-user t)
(nnmail-spool-file nil)
(gnus-use-dribble-file nil)
+ (gnus-batch-mode t)
group newsrc entry
;; Disable verbose message.
gnus-novice-user gnus-large-newsgroup
gnus-options-not-subscribe)
;; Eat all arguments.
(setq command-line-args-left nil)
- (gnus)
+ (gnus-slave)
;; Apply kills to specified newsgroups in command line arguments.
(setq newsrc (cdr gnus-newsrc-alist))
(while (setq group (car (pop newsrc)))
(setq entry (gnus-gethash group gnus-newsrc-hashtb))
- (when (and (<= (nth 1 (car newsrc)) gnus-level-subscribed)
+ (when (and (<= (gnus-info-level (car newsrc)) gnus-level-subscribed)
(and (car entry)
(or (eq (car entry) t)
(not (zerop (car entry)))))
- (eq (gnus-matches-options-n group) 'subscribe))
+ ;;(eq (gnus-matches-options-n group) 'subscribe)
+ )
(gnus-summary-read-group group nil t nil t)
(when (eq (current-buffer) (get-buffer gnus-summary-buffer))
(gnus-summary-exit))))
(narrow-to-region b (1+ (match-beginning 0)))
(goto-char (point-min))
(while (search-forward "\t" nil t)
- (condition-case nil
- (setq group (let ((obarray gnus-active-hashtb)) (read buf)))
- (error nil))
- (if (not (boundp group))
- ;; Make sure all entries in the hashtb are bound.
- (set group nil)
- (when (gnus-gethash (symbol-name group) gnus-newsrc-hashtb)
- ;; Valid group.
- (beginning-of-line)
- (while (= (following-char) ?\t)
- (forward-line -1))
- (setq id (buffer-substring (point) (1- (search-forward "\t"))))
- (push id ncm)
- (gnus-sethash id t gnus-nocem-hashtb)
- (forward-line 1)
- (while (= (following-char) ?\t)
- (forward-line 1)))))
+ (if (condition-case nil
+ (setq group (let ((obarray gnus-active-hashtb)) (read buf)))
+ (error nil))
+ (if (not (boundp group))
+ ;; Make sure all entries in the hashtb are bound.
+ (set group nil)
+ (when (gnus-gethash (symbol-name group) gnus-newsrc-hashtb)
+ ;; Valid group.
+ (beginning-of-line)
+ (while (= (following-char) ?\t)
+ (forward-line -1))
+ (setq id (buffer-substring (point) (1- (search-forward "\t"))))
+ (push id ncm)
+ (gnus-sethash id t gnus-nocem-hashtb)
+ (forward-line 1)
+ (while (= (following-char) ?\t)
+ (forward-line 1))))))
(when ncm
(setq gnus-nocem-touched-alist t)
(push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
(insert (format "%-5d: %s\n" (caar rules) (cdar rules)))
(pop rules))
(gnus-add-current-to-buffer-list)
- (gnus-configure-windows 'score-words))))
+ (gnus-configure-windows 'score-words)
+ (goto-char (point-min)))))
(defun gnus-summary-rescore ()
"Redo the entire scoring process in the current summary."
gnus-zombie-list nil
gnus-killed-hashtb nil
gnus-active-hashtb nil
- gnus-moderated-list nil
+ gnus-moderated-hashtb nil
gnus-description-hashtb nil
gnus-current-headers nil
gnus-thread-indent-array nil
(gnus-message 5 "%sdone" mesg))))))
(setq methods (cdr methods))))))
+
+(defun gnus-ignored-newsgroups-has-to-p ()
+ "T only when gnus-ignored-newsgroups includes \"^to\\\\.\" as an element."
+ ;; note this regexp is the same as:
+ ;; (concat (regexp-quote "^to\\.") "\\($\\|" (regexp-quote "\\|") "\\)")
+ (string-match "\\^to\\\\\\.\\($\\|\\\\|\\)"
+ gnus-ignored-newsgroups))
+
;; Read an active file and place the results in `gnus-active-hashtb'.
(defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors)
(unless method
(gnus-make-hashtable
(count-lines (point-min) (point-max)))
(gnus-make-hashtable 4096)))))))
- ;; Delete unnecessary lines.
+ ;; Delete unnecessary lines, cleaned up dmoore@ucsd.edu 31.10.1996
(goto-char (point-min))
- (while (search-forward "\nto." nil t)
- (delete-region (1+ (match-beginning 0))
- (progn (forward-line 1) (point))))
- (unless (string= gnus-ignored-newsgroups "")
- (goto-char (point-min))
- (delete-matching-lines gnus-ignored-newsgroups))
+ (cond ((gnus-ignored-newsgroups-has-to-p)
+ (delete-matching-lines gnus-ignored-newsgroups))
+ ((string= gnus-ignored-newsgroups "")
+ (delete-matching-lines "^to\\."))
+ (t
+ (delete-matching-lines (concat "^to\\.\\|"
+ gnus-ignored-newsgroups))))
+
;; Make the group names readable as a lisp expression even if they
;; contain special characters.
;; Fix by Luc Van Eycken <Luc.VanEycken@esat.kuleuven.ac.be>.
(goto-char (point-max))
(while (re-search-backward "[][';?()#]" nil t)
(insert ?\\))
+
;; If these are groups from a foreign select method, we insert the
;; group prefix in front of the group names.
(and method (not (gnus-server-equal
(progn (insert prefix)
(zerop (forward-line 1)))))))
;; Store the active file in a hash table.
+ ;; dmoore@ucsd.edu 31.10.1996 - use same method for moderation or not
(goto-char (point-min))
- (if (and (boundp 'gnus-group-line-format)
- (string-match "%[oO]" gnus-group-line-format))
- ;; Suggested by Brian Edmonds <edmonds@cs.ubc.ca>.
- ;; If we want information on moderated groups, we use this
- ;; loop...
- (let* ((mod-hashtb (make-vector 7 0))
- (m (intern "m" mod-hashtb))
- group max min)
- (while (not (eobp))
- (condition-case nil
- (progn
- (narrow-to-region (point) (gnus-point-at-eol))
- (setq group (let ((obarray hashtb)) (read cur)))
- (if (and (numberp (setq max (read cur)))
- (numberp (setq min (read cur)))
- (progn
- (skip-chars-forward " \t")
- (not
- (or (= (following-char) ?=)
- (= (following-char) ?x)
- (= (following-char) ?j)))))
- (set group (cons min max))
- (set group nil))
- ;; Enter moderated groups into a list.
- (when (eq (let ((obarray mod-hashtb)) (read cur)) m)
- (push (symbol-name group) gnus-moderated-list)))
- (error
- (and group
- (symbolp group)
- (set group nil))))
- (widen)
- (forward-line 1)))
- ;; And if we do not care about moderation, we use this loop,
- ;; which is faster.
- (let (group max min)
- (while (not (eobp))
- (condition-case ()
- (progn
- (narrow-to-region (point) (gnus-point-at-eol))
- ;; group gets set to a symbol interned in the hash table
- ;; (what a hack!!) - jwz
- (setq group (let ((obarray hashtb)) (read cur)))
- (if (and (numberp (setq max (read cur)))
- (numberp (setq min (read cur)))
- (progn
- (skip-chars-forward " \t")
- (not
- (or (= (following-char) ?=)
- (= (following-char) ?x)
- (= (following-char) ?j)))))
+ (let (group max min)
+ (while (not (eobp))
+ (condition-case ()
+ (progn
+ (narrow-to-region (point) (gnus-point-at-eol))
+ ;; group gets set to a symbol interned in the hash table
+ ;; (what a hack!!) - jwz
+ (setq group (let ((obarray hashtb)) (read cur)))
+ (if (and (numberp (setq max (read cur)))
+ (numberp (setq min (read cur)))
+ (progn
+ (skip-chars-forward " \t")
+ (not
+ (or (= (following-char) ?=)
+ (= (following-char) ?x)
+ (= (following-char) ?j)))))
+ (progn
(set group (cons min max))
- (set group nil)))
- (error
- (progn
- (and group
- (symbolp group)
- (set group nil))
- (unless ignore-errors
- (gnus-message 3 "Warning - illegal active: %s"
- (buffer-substring
- (gnus-point-at-bol) (gnus-point-at-eol)))))))
- (widen)
- (forward-line 1))))))
+ ;; if group is moderated, stick in moderation table
+ (when (= (following-char) ?m)
+ (unless gnus-moderated-hashtb
+ (setq gnus-moderated-hashtb (make-vector 127 0)))
+ (gnus-sethash (symbol-name group) t
+ gnus-moderated-hashtb)))
+ (set group nil)))
+ (error
+ (progn
+ (and group
+ (symbolp group)
+ (set group nil))
+ (unless ignore-errors
+ (gnus-message 3 "Warning - illegal active: %s"
+ (buffer-substring
+ (gnus-point-at-bol) (gnus-point-at-eol)))))))
+ (widen)
+ (forward-line 1)))))
(defun gnus-groups-to-gnus-format (method &optional hashtb)
;; Parse a "groups" active file.
gnus-valid-select-methods)))
(equal (nth 1 m1) (nth 1 m2)))))))
-(defsubst gnus-header-value ()
- (buffer-substring (match-end 0) (gnus-point-at-eol)))
-
(defvar gnus-newsgroup-none-id 0)
(defun gnus-get-newsgroup-headers (&optional dependencies force-new)
(progn
(goto-char p)
(if (search-forward "\nsubject: " nil t)
- (gnus-header-value) "(none)"))
+ (nnheader-header-value) "(none)"))
;; From.
(progn
(goto-char p)
(if (search-forward "\nfrom: " nil t)
- (gnus-header-value) "(nobody)"))
+ (nnheader-header-value) "(nobody)"))
;; Date.
(progn
(goto-char p)
(if (search-forward "\ndate: " nil t)
- (gnus-header-value) ""))
+ (nnheader-header-value) ""))
;; Message-ID.
(progn
(goto-char p)
(if (search-forward "\nmessage-id: " nil t)
- (setq id (gnus-header-value))
+ (setq id (nnheader-header-value))
;; If there was no message-id, we just fake one to make
;; subsequent routines simpler.
(setq id (concat "none+"
(progn
(setq end (point))
(prog1
- (gnus-header-value)
+ (nnheader-header-value)
(setq ref
(buffer-substring
(progn
;; were no references and the in-reply-to header looks
;; promising.
(if (and (search-forward "\nin-reply-to: " nil t)
- (setq in-reply-to (gnus-header-value))
+ (setq in-reply-to (nnheader-header-value))
(string-match "<[^>]+>" in-reply-to))
(setq ref (substring in-reply-to (match-beginning 0)
(match-end 0)))
(progn
(goto-char p)
(and (search-forward "\nxref: " nil t)
- (gnus-header-value)))))
+ (nnheader-header-value)))))
(when (equal id ref)
(setq ref nil))
;; We do the threading while we read the headers. The
previous group instead."
(interactive "P")
(gnus-set-global-variables)
+ ;; Stop pre-fetching.
+ (gnus-async-halt-prefetch)
(let ((current-group gnus-newsgroup-name)
(current-buffer (current-buffer))
entered)
(defun gnus-summary-read-document (n)
"Open a new group based on the current article(s).
+This will allow you to read digests and other similar
+documents as newsgroups.
Obeys the standard process/prefix convention."
(interactive "P")
(let* ((articles (gnus-summary-work-articles n))
(gnus-set-global-variables)
(gnus-summary-select-article)
(gnus-eval-in-buffer-window gnus-article-buffer
- (widen)))
+ (widen)
+ (when (gnus-visual-p 'page-marker)
+ (let ((buffer-read-only nil))
+ (gnus-remove-text-with-property 'gnus-prev)
+ (gnus-remove-text-with-property 'gnus-next)))))
-(defun gnus-summary-move-article (&optional n to-newsgroup select-method action)
+(defun gnus-summary-move-article (&optional n to-newsgroup
+ select-method action)
"Move the current article to a different newsgroup.
If N is a positive number, move the N next articles.
If N is a negative number, move the N previous articles.
(setq to-method (or select-method
(gnus-group-name-to-method to-newsgroup)))
;; Check the method we are to move this article to...
- (unless (gnus-check-backend-function 'request-accept-article (car to-method))
+ (unless (gnus-check-backend-function
+ 'request-accept-article (car to-method))
(error "%s does not support article copying" (car to-method)))
(unless (gnus-check-server to-method)
(error "Can't open server %s" (car to-method)))
If prefix argument ALL is non-nil, all articles are marked as read."
(interactive "P")
(gnus-set-global-variables)
- (gnus-summary-catchup all quietly nil 'fast)
- ;; Select next newsgroup or exit.
- (if (eq gnus-auto-select-next 'quietly)
- (gnus-summary-next-group nil)
- (gnus-summary-exit)))
+ (when (gnus-summary-catchup all quietly nil 'fast)
+ ;; Select next newsgroup or exit.
+ (if (eq gnus-auto-select-next 'quietly)
+ (gnus-summary-next-group nil)
+ (gnus-summary-exit))))
(defun gnus-summary-catchup-all-and-exit (&optional quietly)
"Mark all articles in this newsgroup as read, and then exit."
(setq split-name (append result split-name)))))))))
split-name))
+(defun gnus-valid-move-group-p (group)
+ (and (boundp group)
+ (symbol-name group)
+ (memq 'respool
+ (assoc (symbol-name
+ (car (gnus-find-method-for-group
+ (symbol-name group))))
+ gnus-valid-select-methods))))
+
(defun gnus-read-move-group-name (prompt default articles prefix)
"Read a group name."
(let* ((split-name (gnus-get-split-value gnus-move-split-methods))
(minibuffer-confirm-incomplete nil) ; XEmacs
- group-map
- (dum (mapatoms
- (lambda (g)
- (and (boundp g)
- (symbol-name g)
- (memq 'respool
- (assoc (symbol-name
- (car (gnus-find-method-for-group
- (symbol-name g))))
- gnus-valid-select-methods))
- (push (list (symbol-name g)) group-map)))
- gnus-active-hashtb))
(prom
(format "%s %s to:"
prompt
(cond
((null split-name)
(gnus-completing-read default prom
- group-map nil nil prefix
+ gnus-active-hashtb
+ 'gnus-valid-move-group-p
+ nil prefix
'gnus-group-history))
((= 1 (length split-name))
- (gnus-completing-read (car split-name) prom group-map
- nil nil nil
+ (gnus-completing-read (car split-name) prom
+ gnus-active-hashtb
+ 'gnus-valid-move-group-p
+ nil nil
'gnus-group-history))
(t
(gnus-completing-read nil prom
nil nil nil
'gnus-group-history)))))
(when to-newsgroup
- (when (or (string= to-newsgroup "")
- (string= to-newsgroup prefix))
- (setq to-newsgroup (or default "")))
+ (if (or (string= to-newsgroup "")
+ (string= to-newsgroup prefix))
+ (setq to-newsgroup (or default "")))
(or (gnus-active to-newsgroup)
(gnus-activate-group to-newsgroup)
- (when (gnus-y-or-n-p (format "No such group: %s. Create it? "
- to-newsgroup))
- (or (and (gnus-request-create-group
- to-newsgroup (gnus-group-name-to-method to-newsgroup))
- (gnus-activate-group to-newsgroup nil nil
- (gnus-group-name-to-method
- to-newsgroup)))
- (error "Couldn't create group %s" to-newsgroup)))
+ (if (gnus-y-or-n-p (format "No such group: %s. Create it? "
+ to-newsgroup))
+ (or (and (gnus-request-create-group
+ to-newsgroup (gnus-group-name-to-method to-newsgroup))
+ (gnus-activate-group to-newsgroup nil nil
+ (gnus-group-name-to-method
+ to-newsgroup)))
+ (error "Couldn't create group %s" to-newsgroup)))
(error "No such group: %s" to-newsgroup)))
to-newsgroup))
(while (and (zerop (forward-line 1))
(> (or (gnus-group-topic-level) (1+ level)) level)))
(delete-region beg (point))
- (setcdr (cadr (gnus-topic-find-topology topic))
- (if insert (list 'visible) (list 'invisible)))
- (when hide
- (setcdr (cdadr (gnus-topic-find-topology topic))
- (list hide)))
+ ;; Do the change in this rather odd manner because it has been
+ ;; reported that some topics share parts of some lists, for some
+ ;; reason. I have been unable to determine why this is the
+ ;; case, but this hack seems to take care of things.
+ (let ((data (cadr (gnus-topic-find-topology topic))))
+ (setcdr data
+ (list (if insert 'visible 'invisible)
+ (if hide 'hide nil)
+ (cadddr data))))
(unless total-remove
(gnus-topic-insert-topic topic in-level)))))
(remove-hook 'gnus-group-change-level-function
'gnus-topic-change-level)
(remove-hook 'gnus-check-bogus-groups-hook 'gnus-topic-clean-alist)
- (setq gnus-group-prepare-function 'gnus-group-prepare-flat))
+ (setq gnus-group-prepare-function 'gnus-group-prepare-flat)
+ (setq gnus-group-sort-alist-function 'gnus-group-sort-flat))
(when redisplay
(gnus-group-list-groups))))
(defvar gnus-uu-save-separate-articles nil
"*Non-nil means that gnus-uu will save articles in separate files.")
+(defvar gnus-uu-be-dangerous 'ask
+ "*Specifies what to do if unusual situations arise during decoding.
+If nil, be as conservative as possible. If t, ignore things that
+didn't work, and overwrite existing files. Otherwise, ask each time.")
+
;; Internal variables
(defvar gnus-uu-saved-article-name nil)
(gnus-make-directory (concat dir fromdir))
(setq to-file (concat dir fromdir))
(when (or (not (file-exists-p to-file))
- (gnus-y-or-n-p (format "%s exists; overwrite? " to-file)))
+ (eq gnus-uu-be-dangerous t)
+ (and gnus-uu-be-dangerous
+ (gnus-y-or-n-p (format "%s exists; overwrite? "
+ to-file))))
(copy-file file to-file t t)))))
(gnus-message 5 "Saved %d file%s" len (if (= len 1) "" "s"))))
(let (articles)
(cond
(n
+ (setq n (prefix-numeric-value n))
(let ((backward (< n 0))
(n (abs n)))
(save-excursion
;; file was unsuccessfully decoded, so we delete it.
(when (and result-file
(file-exists-p result-file)
- (gnus-y-or-n-p
- (format "Delete unsuccessfully decoded file %s"
- result-file)))
+ (not gnus-uu-be-dangerous)
+ (or (eq gnus-uu-be-dangerous t)
+ (gnus-y-or-n-p
+ (format "Delete unsuccessfully decoded file %s"
+ result-file))))
(delete-file result-file)))
(when (memq 'begin process-state)
(setq result-file (car process-state)))
(not (memq 'end process-state))
result-file
(file-exists-p result-file)
- (gnus-y-or-n-p (format "Delete incomplete file %s? " result-file))
+ (not gnus-uu-be-dangerous)
+ (or (eq gnus-uu-be-dangerous t)
+ (gnus-y-or-n-p (format "Delete incomplete file %s? " result-file)))
(delete-file result-file))
;; If this was a file of the wrong sort, then
"Score and kill file handling."
:group 'gnus )
-(defconst gnus-version-number "0.53"
+(defconst gnus-version-number "0.54"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
(t
'ignore)))
-(defalias 'gnus-make-overlay 'make-overlay)
-(defalias 'gnus-overlay-put 'overlay-put)
-(defalias 'gnus-move-overlay 'move-overlay)
-(defalias 'gnus-overlay-end 'overlay-end)
-(defalias 'gnus-extent-detached-p 'ignore)
-(defalias 'gnus-extent-start-open 'ignore)
-(defalias 'gnus-set-text-properties 'set-text-properties)
-(defalias 'gnus-group-remove-excess-properties 'ignore)
-(defalias 'gnus-topic-remove-excess-properties 'ignore)
-(defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
-(defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
-(defalias 'gnus-make-local-hook 'make-local-hook)
-(defalias 'gnus-add-hook 'add-hook)
-(defalias 'gnus-character-to-event 'identity)
-(defalias 'gnus-add-text-properties 'add-text-properties)
-(defalias 'gnus-put-text-property 'put-text-property)
-(defalias 'gnus-mode-line-buffer-identification 'identity)
+(when (not (featurep 'gnus-xmas))
+ (progn (defalias 'gnus-make-overlay 'make-overlay)
+ (defalias 'gnus-overlay-put 'overlay-put)
+ (defalias 'gnus-move-overlay 'move-overlay)
+ (defalias 'gnus-overlay-end 'overlay-end)
+ (defalias 'gnus-extent-detached-p 'ignore)
+ (defalias 'gnus-extent-start-open 'ignore)
+ (defalias 'gnus-set-text-properties 'set-text-properties)
+ (defalias 'gnus-group-remove-excess-properties 'ignore)
+ (defalias 'gnus-topic-remove-excess-properties 'ignore)
+ (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
+ (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
+ (defalias 'gnus-make-local-hook 'make-local-hook)
+ (defalias 'gnus-add-hook 'add-hook)
+ (defalias 'gnus-character-to-event 'identity)
+ (defalias 'gnus-add-text-properties 'add-text-properties)
+ (defalias 'gnus-put-text-property 'put-text-property)
+ (defalias 'gnus-mode-line-buffer-identification 'identity)))
;; The XEmacs people think this is evil, so it must go.
(defun custom-face-lookup (&optional fg bg stipple bold italic underline)
(defvar gnus-slave nil
"Whether this Gnus is a slave or not.")
+(defvar gnus-batch-mode nil
+ "Whether this Gnus is running in batch mode or not.")
+
(defvar gnus-variable-list
'(gnus-newsrc-options gnus-newsrc-options-n
gnus-newsrc-last-checked-date
(defvar gnus-active-hashtb nil
"Hashtable of active articles.")
-(defvar gnus-moderated-list nil
- "List of moderated newsgroups.")
+(defvar gnus-moderated-hashtb nil
+ "Hashtable of moderated newsgroups.")
;; Save window configuration.
(defvar gnus-prev-winconf nil)
("gnus-logic" gnus-score-advanced)
("gnus-undo" gnus-undo-mode gnus-undo-register)
("gnus-async" gnus-async-request-fetched-article gnus-async-prefetch-next
- gnus-async-prefetch-article gnus-async-prefetch-remove-group)
+ gnus-async-prefetch-article gnus-async-prefetch-remove-group
+ gnus-async-halt-prefetch)
("article" article-decode-rfc1522)
("gnus-vm" :interactive t gnus-summary-save-in-vm
gnus-summary-save-article-vm))))
"Move point to the beginning of the message signature."
(interactive)
(goto-char (point-min))
- (or (re-search-forward message-signature-separator nil t)
- (goto-char (point-max))))
+ (if (re-search-forward message-signature-separator nil t)
+ (forward-line 1)
+ (goto-char (point-max))))
\f
(re-search-forward "^[^ \t:]+: " nil t))
(save-excursion
(or (re-search-forward
- (concat "^" (setq found
- (buffer-substring
- (match-beginning 0) (- (match-end 0) 2))))
+ (concat "^"
+ (regexp-quote
+ (setq found
+ (buffer-substring
+ (match-beginning 0) (- (match-end 0) 2))))
+ ":")
nil t)
(setq found nil))))
(if found
;; Parsing headers and NOV lines.
(defsubst nnheader-header-value ()
- (buffer-substring (match-end 0) (gnus-point-at-eol)))
+ (buffer-substring
+ (match-end 0)
+ (if (re-search-forward "^[^ \t]" nil 'move)
+ (- (point) 2)
+ (1- (point)))))
(defvar nnheader-newsgroup-none-id 1)
(after-insert-file-functions nil))
(insert-file-contents filename visit beg end replace)))
+(defun nnheader-directory-regular-files (dir)
+ "Return a list of all regular files in DIR."
+ (let ((files (directory-files dir t))
+ out)
+ (while files
+ (when (file-regular-p (car files))
+ (push (car files) out))
+ (pop files))
+ (nreverse out)))
+
(fset 'nnheader-run-at-time 'run-at-time)
(fset 'nnheader-cancel-timer 'cancel-timer)
(fset 'nnheader-cancel-function-timers 'cancel-function-timers)
This variable is \"/usr/spool/mail/$user\" by default.
If this variable is nil, no mail backends will read incoming mail.
If this variable is a list, all files mentioned in this list will be
-used as incoming mailboxes.")
+used as incoming mailboxes.
+If this variable is a directory (i. e., it's name ends with a \"/\"),
+treat all files in that directory as incoming spool files.")
(defvar nnmail-crash-box "~/.gnus-crash-box"
"*File where Gnus will store mail while processing it.")
"Put point at the beginning of the next message."
(let ((case-fold-search t)
(delim (concat "^" message-unix-mail-delimiter))
- found)
+ found search )
(while (not found)
- (if (re-search-forward delim nil t)
- (when (or (looking-at "[^\n :]+ *:")
- (looking-at delim)
- (looking-at (concat ">" message-unix-mail-delimiter)))
- (forward-line -1)
- (setq found 'yes))
- (setq found 'no)))
+ (setq search (condition-case ()
+ (re-search-forward delim nil t)
+ (error 'error)))
+ (cond
+ ((eq search 'error)
+ (setq found 'yes))
+ (search
+ (when (or (looking-at "[^\n :]+ *:")
+ (looking-at delim)
+ (looking-at (concat ">" message-unix-mail-delimiter)))
+ (forward-line -1)
+ (setq found 'yes)))
+ (t
+ (setq found 'no))))
(eq found 'yes)))
(defun nnmail-process-unix-mail-format (func artnum-func)
(eq nnmail-spool-file 'procmail))
nil)
((listp nnmail-spool-file)
- (append nnmail-spool-file procmails))
- ((stringp nnmail-spool-file)
+ (nconc
+ (apply
+ 'nconc
+ (mapcar
+ (lambda (file)
+ (if (file-directory-p file)
+ (nnheader-directory-regular-files file)
+ (list file)))
+ nnmail-spool-file))
+ procmails))
+ ((and (stringp nnmail-spool-file)
+ (not (file-directory-p nnmail-spool-file)))
(cons nnmail-spool-file procmails))
+ ((and (stringp nnmail-spool-file)
+ (file-directory-p nnmail-spool-file))
+ (nconc
+ (nnheader-directory-regular-files nnmail-spool-file)
+ procmails))
((eq nnmail-spool-file 'pop)
(cons (format "po:%s" (user-login-name)) procmails))
(t
(nnmail-time-less days (nnmail-time-since time)))))))
(defvar nnmail-read-passwd nil)
-(defun nnmail-read-passwd (prompt)
- (unless nnmail-read-passwd
- (if (load "passwd" t)
- (setq nnmail-read-passwd 'read-passwd)
- (autoload 'ange-ftp-read-passwd "ange-ftp")
- (setq nnmail-read-passwd 'ange-ftp-read-passwd)))
- (funcall nnmail-read-passwd prompt))
+(defun nnmail-read-passwd (prompt &rest args)
+ "Read a password using PROMPT.
+If ARGS, PROMPT is used as an argument to `format'."
+ (let ((prompt
+ (if args
+ (apply 'format prompt args)
+ prompt)))
+ (unless nnmail-read-passwd
+ (if (load "passwd" t)
+ (setq nnmail-read-passwd 'read-passwd)
+ (autoload 'ange-ftp-read-passwd "ange-ftp")
+ (setq nnmail-read-passwd 'ange-ftp-read-passwd)))
+ (funcall nnmail-read-passwd prompt)))
(defun nnmail-check-syntax ()
"Check (and modify) the syntax of the message in the current buffer."
"Send the AUTHINFO to the nntp server.
This function is supposed to be called from `nntp-server-opened-hook'.
It will prompt for a password."
- (nntp-send-command "^.*\r?\n" "AUTHINFO USER"
- (read-string "NNTP user name: "))
- (nntp-send-command "^.*\r?\n" "AUTHINFO PASS"
- (nnmail-read-passwd "NNTP password: ")))
+ (nntp-send-command
+ "^.*\r?\n" "AUTHINFO USER"
+ (read-string "NNTP (%s) user name: " nntp-address))
+ (nntp-send-command
+ "^.*\r?\n" "AUTHINFO PASS"
+ (nnmail-read-passwd "NNTP (%s) password: " nntp-address)))
(defun nntp-send-authinfo ()
"Send the AUTHINFO to the nntp server.
This function is supposed to be called from `nntp-server-opened-hook'.
It will prompt for a password."
(nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name))
- (nntp-send-command "^.*\r?\n" "AUTHINFO PASS"
- (read-string "NNTP password: ")))
+ (nntp-send-command
+ "^.*\r?\n" "AUTHINFO PASS"
+ (read-string "NNTP (%s) password: " nntp-address)))
(defun nntp-send-authinfo-from-file ()
"Send the AUTHINFO to the nntp server.
(save-excursion
(set-buffer nntp-server-buffer)
(nntp-read-server-type)
- (run-hooks 'nntp-server-opened-hook)))
+ (run-hooks 'nntp-server-opened-hook)
+ (set-buffer pbuffer)
+ (erase-buffer)))
(when (buffer-name (process-buffer process))
(kill-buffer (process-buffer process)))
nil))))
(when group
(let ((entry (nntp-find-connection-entry nntp-server-buffer)))
(when (not (equal group (caddr entry)))
- (nntp-request-group group)))))
+ (nntp-request-group group)
+ (erase-buffer)))))
(defun nntp-decode-text (&optional cr-only)
"Decode the text in the current buffer."
(mapcar
(lambda (g)
(when (and (setq active (gnus-activate-group g))
- (> (cdr active) (car active)))
+ (>= (cdr active) (car active)))
(setq unreads (gnus-list-of-unread-articles g)
marks (gnus-uncompress-marks
(gnus-info-marks (gnus-get-info g))))
(setq header (nnheader-parse-nov))
(forward-line 1)
(push (list (mail-header-number header)
- header (mail-header-xrefs header))
+ header (nnheader-header-xref header))
nnweb-articles)
(nnweb-set-hashtb header (car nnweb-articles)))))))
(nnheader-insert-nov (cadr (pop articles)))))))
(defun nnweb-set-hashtb (header data)
- (gnus-sethasb (nnweb-identifier (mail-header-xrefs header))
- data nnweb-hashtb))
+ (gnus-sethastb (nnweb-identifier (mail-header-xrefs header))
+ data nnweb-hashtb))
(defun nnweb-get-hashtb (url)
(gnus-gethash (nnweb-identifier url) nnweb-hashtb))
+Tue Nov 5 10:45:39 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Other Decode Variables): Addition.
+ (Mail-like Backends): New.
+
+Tue Nov 5 06:41:46 1996 Hrvoje Niksic <hniksic@srce.hr>
+
+ * gnus.texi (Score File Format): Added warning.
+
Mon Oct 28 15:50:08 1996 Lars Magne Ingebrigtsen <lars@eyesore.no>
* gnus.texi (Startup Variables): Addition.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Red Gnus 0.53 Manual
+@settitle Red Gnus 0.54 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Red Gnus 0.53 Manual
+@title Red Gnus 0.54 Manual
@author by Lars Magne Ingebrigtsen
@page
Move the file (if you're using a saving function.)
@end table
+@item gnus-uu-be-dangerous
+@vindex gnus-uu-be-dangerous
+Specifies what to do if unusual situations arise during decoding. If
+@code{nil}, be as conservative as possible. If @code{t}, ignore things
+that didn't work, and overwrite existing files. Otherwise, ask each
+time.
+
@item gnus-uu-ignore-files-by-name
@vindex gnus-uu-ignore-files-by-name
Files with name matching this regular expression won't be viewed.
@findex gnus-summary-refer-article
@kindex M-^ (Summary)
+@cindex Message-ID
+@cindex fetching by Message-ID
You can also ask the @sc{nntp} server for an arbitrary article, no
matter what group it belongs to. @kbd{M-^}
(@code{gnus-summary-refer-article}) will ask you for a
* Score Variables:: Customize your scoring. (My, what terminology).
* Score File Format:: What a score file may contain.
* Score File Editing:: You can edit score files by hand as well.
-* Adaptive Scoring:: Big Sister Gnus @emph{knows} what you read.
+* Adaptive Scoring:: Big Sister Gnus knows what you read.
* Home Score File:: How to say where new score entries are to go.
* Followups To Yourself:: Having Gnus notice when people answer you.
* Scoring Tips:: How to score effectively.
@item Lines, Chars
These two headers use different match types: @code{<}, @code{>},
-@code{=}, @code{>=} and @code{<=}.
+@code{=}, @code{>=} and @code{<=}. When matching on @code{Lines}, be
+careful because some backends (like @code{nndir}) do not generate
+@code{Lines} header, so every article ends up being marked as having 0
+lines. This can lead to strange results if you happen to lower score of
+the articles with few lines.
@item Date
For the Date header we have three kinda silly match types:
* Error Messaging:: How to get messages and report errors.
* Writing New Backends:: Extending old backends.
* Hooking New Backends Into Gnus:: What has to be done on the Gnus end.
+* Mail-like Backends:: Some tips on mail backends.
@end menu
@end table
+@node Mail-like Backends
+@subsubsection Mail-like Backends
+
+One of the things that separate the mail backends from the rest of the
+backends is the heavy dependence by the mail backends on common
+functions in @file{nnmail.el}. For instance, here's the definition of
+@code{nnml-request-scan}:
+
+@lisp
+(deffoo nnml-request-scan (&optional group server)
+ (setq nnml-article-file-alist nil)
+ (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
+@end lisp
+
+It simply just calls @code{nnmail-get-new-mail} will a few parameters,
+and @code{nnmail} takes care of all the moving and splitting of the
+mail.
+
+This function takes four parameters.
+
+@table @var
+@item method
+This should be a symbol to designate which backend is responsible for
+the call.
+
+@item exit-function
+This function should be called after the splitting has been performed.
+
+@item temp-directory
+Where the temporary files should be stored.
+
+@item group
+This optional argument should be a group name if the splitting is to be
+performed for one group only.
+@end table
+
+@code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to
+save each article. @var{backend}@code{-active-number} will be called to
+find the article number assigned to this article.
+
+The function also uses the following variables:
+@var{backend}@code{-get-new-mail} (to see whether to get new mail for
+this backend); and @var{backend}@code{-group-alist} and
+@var{backend}@code{-active-file} to generate the new active file.
+@var{backend}@code{-group-alist} should be a group-active alist, like
+this:
+
+@example
+(("a-group" (1 . 10))
+ ("some-group" (34 . 39)))
+@end example
+
@node Score File Syntax
@subsection Score File Syntax