*** pub/sgnus/lisp/custom.el Thu Sep 21 01:15:39 1995 --- sgnus/lisp/custom.el Fri Sep 15 10:55:05 1995 *************** *** 2143,2146 **** (- (custom-width custom) (- (point) from))) (custom-field-move field from (point)) (set-text-properties ! fro \ No newline at end of file --- 2143,2428 ---- (- (custom-width custom) (- (point) from))) (custom-field-move field from (point)) (set-text-properties ! from (point) ! (list 'custom-field field ! 'custom-tag field ! 'face (custom-field-face field) ! front-sticky t)))) ! ! (defun custom-field-read (field) ! ;; Read the screen content of FIELD. ! (custom-read (custom-field-custom field) ! (buffer-substring-no-properties (custom-field-start field) ! (custom-field-end field)))) ! ! ;; Fields are shown in a special `active' face when point is inside ! ;; it. You activate the field by moving point inside (entering) it ! ;; and deactivate the field by moving point outside (leaving) it. ! ! (defun custom-field-leave (field) ! ;; Deactivate FIELD. ! (let ((before-change-functions nil) ! (after-change-functions nil)) ! (put-text-property (custom-field-start field) (custom-field-end field) ! 'face (custom-field-face field)))) ! ! (defun custom-field-enter (field) ! ;; Activate FIELD. ! (let* ((start (custom-field-start field)) ! (end (custom-field-end field)) ! (custom (custom-field-custom field)) ! (padding (custom-padding custom)) ! (before-change-functions nil) ! (after-change-functions nil)) ! (or (eq this-command 'self-insert-command) ! (let ((pos end)) ! (while (and (< start pos) ! (eq (char-after (1- pos)) padding)) ! (setq pos (1- pos))) ! (if (< pos (point)) ! (goto-char pos)))) ! (put-text-property start end 'face custom-field-active-face))) ! ! (defun custom-field-resize (field) ! ;; Resize FIELD after change. ! (let* ((custom (custom-field-custom field)) ! (begin (custom-field-start field)) ! (end (custom-field-end field)) ! (pos (point)) ! (padding (custom-padding custom)) ! (width (custom-width custom)) ! (size (- end begin))) ! (cond ((< size width) ! (goto-char end) ! (if (fboundp 'insert-before-markers-and-inherit) ! ;; Emacs 19. ! (insert-before-markers-and-inherit ! (make-string (- width size) padding)) ! ;; XEmacs: BUG: Doesn't work! ! (insert-before-markers (make-string (- width size) padding))) ! (goto-char pos)) ! ((> size width) ! (let ((start (if (and (< (+ begin width) pos) (<= pos end)) ! pos ! (+ begin width)))) ! (goto-char end) ! (while (and (< start (point)) (= (preceding-char) padding)) ! (backward-delete-char 1)) ! (goto-char pos)))))) ! ! (defvar custom-field-changed nil) ! ;; List of fields changed on the screen but whose VALUE attribute has ! ;; not yet been updated to reflect the new screen content. ! (make-variable-buffer-local 'custom-field-changed) ! ! (defun custom-field-parse (field) ! ;; Parse FIELD content iff changed. ! (if (memq field custom-field-changed) ! (progn ! (setq custom-field-changed (delq field custom-field-changed)) ! (custom-field-value-set field (custom-field-read field)) ! (custom-field-update field)))) ! ! (defun custom-post-command () ! ;; Keep track of their active field. ! (custom-assert '(eq major-mode 'custom-mode)) ! (let ((field (custom-field-property (point)))) ! (if (eq field custom-field-last) ! (if (memq field custom-field-changed) ! (custom-field-resize field)) ! (custom-field-parse custom-field-last) ! (if custom-field-last ! (custom-field-leave custom-field-last)) ! (if field ! (custom-field-enter field)) ! (setq custom-field-last field)) ! (set-buffer-modified-p (or custom-modified-list ! custom-field-changed)))) ! ! (defvar custom-field-was nil) ! ;; The custom data before the change. ! (make-variable-buffer-local 'custom-field-was) ! ! (defun custom-before-change (begin end) ! ;; Check that we the modification is allowed. ! (if (not (eq major-mode 'custom-mode)) ! (message "Aargh! Why is custom-before-change called here?") ! (let ((from (custom-field-property begin)) ! (to (custom-field-property end))) ! (cond ((or (null from) (null to)) ! (error "You can only modify the fields")) ! ((not (eq from to)) ! (error "Changes must be limited to a single field.")) ! (t ! (setq custom-field-was from)))))) ! ! (defun custom-after-change (begin end length) ! ;; Keep track of field content. ! (if (not (eq major-mode 'custom-mode)) ! (message "Aargh! Why is custom-after-change called here?") ! (let ((field custom-field-was)) ! (custom-assert '(prog1 field (setq custom-field-was nil))) ! ;; Prevent mixing fields properties. ! (put-text-property begin end 'custom-field field) ! ;; Update the field after modification. ! (if (eq (custom-field-property begin) field) ! (let ((field-end (custom-field-end field))) ! (if (> end field-end) ! (set-marker field-end end)) ! (add-to-list 'custom-field-changed field)) ! ;; We deleted the entire field, reinsert it. ! (custom-assert '(eq begin end)) ! (save-excursion ! (goto-char begin) ! (custom-field-value-set field ! (custom-read (custom-field-custom field) "")) ! (custom-field-insert field)))))) ! ! (defun custom-field-property (pos) ! ;; The `custom-field' text property valid for POS. ! (or (get-text-property pos 'custom-field) ! (and (not (eq pos (point-min))) ! (get-text-property (1- pos) 'custom-field)))) ! ! ;;; Generic Utilities: ! ;; ! ;; Some utility functions that are not really specific to custom. ! ! (defun custom-assert (expr) ! "Assert that EXPR evaluates to non-nil at this point" ! (or (eval expr) ! (error "Assertion failed: %S" expr))) ! ! (defun custom-first-line (string) ! "Return the part of STRING before the first newline." ! (let ((pos 0) ! (len (length string))) ! (while (and (< pos len) (not (eq (aref string pos) ?\n))) ! (setq pos (1+ pos))) ! (if (eq pos len) ! string ! (substring string 0 pos)))) ! ! (defun custom-insert-before (list old new) ! "In LIST insert before OLD a NEW element." ! (cond ((null list) ! (list new)) ! ((null old) ! (nconc list (list new))) ! ((eq old (car list)) ! (cons new list)) ! (t ! (let ((list list)) ! (while (not (eq old (car (cdr list)))) ! (setq list (cdr list)) ! (custom-assert '(cdr list))) ! (setcdr list (cons new (cdr list)))) ! list))) ! ! (defun custom-strip-padding (string padding) ! "Remove padding from STRING." ! (let ((regexp (concat (regexp-quote (char-to-string padding)) "+"))) ! (while (string-match regexp string) ! (setq string (concat (substring string 0 (match-beginning 0)) ! (substring string (match-end 0)))))) ! string) ! ! (defun custom-plist-memq (prop plist) ! "Return non-nil if PROP is a property of PLIST. Comparison done with EQ." ! (let (result) ! (while plist ! (if (eq (car plist) prop) ! (setq result plist ! plist nil) ! (setq plist (cdr (cdr plist))))) ! result)) ! ! (defun custom-plist-delq (prop plist) ! "Delete property PROP from property list PLIST." ! (while (eq (car plist) prop) ! (setq plist (cdr (cdr plist)))) ! (let ((list plist) ! (next (cdr (cdr plist)))) ! (while next ! (if (eq (car next) prop) ! (progn ! (setq next (cdr (cdr next))) ! (setcdr (cdr list) next)) ! (setq list next ! next (cdr (cdr next)))))) ! plist) ! ! ;;; Meta Customization: ! ! (custom-declare '() ! '((tag . "Meta Customization") ! (doc . "Customization of the customization support.") ! (type . group) ! (data ((type . face-doc)) ! ((tag . "Button Face") ! (default . bold) ! (doc . "Face used for tags in customization buffers.") ! (name . custom-button-face) ! (synchronize . (lambda (f) ! (custom-category-put 'custom-button-properties ! 'face custom-button-face))) ! (type . face)) ! ((tag . "Mouse Face") ! (default . highlight) ! (doc . "\ ! Face used when mouse is above a button in customization buffers.") ! (name . custom-mouse-face) ! (synchronize . (lambda (f) ! (custom-category-put 'custom-button-properties ! mouse-face ! custom-mouse-face))) ! (type . face)) ! ((tag . "Field Face") ! (default . italic) ! (doc . "Face used for customization fields.") ! (name . custom-field-face) ! (type . face)) ! ((tag . "Uninitialized Face") ! (default . modeline) ! (doc . "Face used for uninitialized customization fields.") ! (name . custom-field-uninitialized-face) ! (type . face)) ! ((tag . "Invalid Face") ! (default . highlight) ! (doc . "\ ! Face used for customization fields containing invalid data.") ! (name . custom-field-invalid-face) ! (type . face)) ! ((tag . "Modified Face") ! (default . bold-italic) ! (doc . "Face used for modified customization fields.") ! (name . custom-field-modified-face) ! (type . face)) ! ((tag . "Active Face") ! (default . underline) ! (doc . "\ ! Face used for customization fields while they are being edited.") ! (name . custom-field-active-face) ! (type . face))))) ! ! ;; custom.el uses two categories. ! ! (custom-category-create 'custom-documentation-properties) ! (custom-category-put 'custom-documentation-properties rear-nonsticky t) ! ! (custom-category-create 'custom-button-properties) ! (custom-category-put 'custom-button-properties 'face custom-button-face) ! (custom-category-put 'custom-button-properties mouse-face custom-mouse-face) ! (custom-category-put 'custom-button-properties rear-nonsticky t) ! ! (custom-category-create 'custom-hidden-properties) ! (custom-category-put 'custom-hidden-properties 'invisible ! (not (string-match "XEmacs" emacs-version))) ! (custom-category-put 'custom-hidden-properties intangible t) ! ! (if (file-readable-p custom-file) ! (load-file custom-file)) ! ! (provide 'custom) ! ! ;;; custom.el ends here *** pub/sgnus/lisp/gnus-cite.el Sat Sep 16 09:56:04 1995 --- sgnus/lisp/gnus-cite.el Mon Sep 18 18:00:37 1995 *************** *** 43,62 **** "Regexp matching the longest possible citation prefix on a line.") (defvar gnus-cite-max-prefix 20 ! "Maximal possible length for a citation prefix.") (defvar gnus-supercite-regexp (concat "^\\(" gnus-cite-prefix-regexp "\\)? *" ">>>>> +\"\\([^\"\n]+\\)\" +==") "Regexp matching normal SuperCite attribution lines. ! The first regexp group should match a prefix added by another package.") (defvar gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +==" "Regexp matching mangled SuperCite attribution lines. The first regexp group should match the SuperCite attribution.") (defvar gnus-cite-minimum-match-count 2 ! "Minimal number of identical prefix'es before we believe it is a citation.") ;see gnus-cus.el ;(defvar gnus-cite-face-list --- 43,62 ---- "Regexp matching the longest possible citation prefix on a line.") (defvar gnus-cite-max-prefix 20 ! "Maximum possible length for a citation prefix.") (defvar gnus-supercite-regexp (concat "^\\(" gnus-cite-prefix-regexp "\\)? *" ">>>>> +\"\\([^\"\n]+\\)\" +==") "Regexp matching normal SuperCite attribution lines. ! The first grouping must match prefixes added by other packages.") (defvar gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +==" "Regexp matching mangled SuperCite attribution lines. The first regexp group should match the SuperCite attribution.") (defvar gnus-cite-minimum-match-count 2 ! "Minimum number of identical prefixes before we believe it's a citation.") ;see gnus-cus.el ;(defvar gnus-cite-face-list *************** *** 76,82 **** (defvar gnus-cite-attribution-prefix "in article\\|in <" "Regexp matching the beginning of an attribution line.") ! (defvar gnus-cite-attribution-postfix "\\(wrote\\|writes\\|said\\|says\\):[ \t]*$" "Regexp matching the end of an attribution line. The text matching the first grouping will be used as a button.") --- 76,82 ---- (defvar gnus-cite-attribution-prefix "in article\\|in <" "Regexp matching the beginning of an attribution line.") ! (defvar gnus-cite-attribution-suffix "\\(wrote\\|writes\\|said\\|says\\):[ \t]*$" "Regexp matching the end of an attribution line. The text matching the first grouping will be used as a button.") *************** *** 147,153 **** Text is considered cited if at least `gnus-cite-minimum-match-count' lines matches `gnus-cite-prefix-regexp' with the same prefix. ! Lines matching `gnus-cite-attribution-postfix' and perhaps `gnus-cite-attribution-prefix' are considered attribution lines." (interactive (list 'force)) ;; Create dark or light faces if necessary. --- 147,153 ---- Text is considered cited if at least `gnus-cite-minimum-match-count' lines matches `gnus-cite-prefix-regexp' with the same prefix. ! Lines matching `gnus-cite-attribution-suffix' and perhaps `gnus-cite-attribution-prefix' are considered attribution lines." (interactive (list 'force)) ;; Create dark or light faces if necessary. *************** *** 191,197 **** face (cdr (assoc prefix face-alist))) ;; Add attribution button. (goto-line number) ! (if (re-search-forward gnus-cite-attribution-postfix (save-excursion (end-of-line 1) (point)) t) (gnus-article-add-button (match-beginning 1) (match-end 1) --- 191,197 ---- face (cdr (assoc prefix face-alist))) ;; Add attribution button. (goto-line number) ! (if (re-search-forward gnus-cite-attribution-suffix (save-excursion (end-of-line 1) (point)) t) (gnus-article-add-button (match-beginning 1) (match-end 1) *************** *** 372,378 **** ;; Parse current buffer searching for attribution lines. (goto-char (point-min)) (search-forward "\n\n") ! (while (re-search-forward gnus-cite-attribution-postfix (point-max) t) (let* ((start (match-beginning 0)) (end (match-end 0)) (wrote (count-lines (point-min) end)) --- 372,378 ---- ;; Parse current buffer searching for attribution lines. (goto-char (point-min)) (search-forward "\n\n") ! (while (re-search-forward gnus-cite-attribution-suffix (point-max) t) (let* ((start (match-beginning 0)) (end (match-end 0)) (wrote (count-lines (point-min) end)) *************** *** 390,396 **** (beginning-of-line 0) (point)) t) ! (not (re-search-forward gnus-cite-attribution-postfix start t)) (count-lines (point-min) (1+ (point))))))) (if (eq wrote in) --- 390,396 ---- (beginning-of-line 0) (point)) t) ! (not (re-search-forward gnus-cite-attribution-suffix start t)) (count-lines (point-min) (1+ (point))))))) (if (eq wrote in) *** pub/sgnus/lisp/gnus-kill.el Sat Sep 16 09:56:05 1995 --- sgnus/lisp/gnus-kill.el Sun Sep 17 12:19:59 1995 *************** *** 333,339 **** "Remove lines marked with MARKS." (save-excursion (set-buffer gnus-summary-buffer) ! (gnus-summary-remove-lines-marked-with marks))) (defun gnus-apply-kill-file-internal () "Apply a kill file to the current newsgroup. --- 333,339 ---- "Remove lines marked with MARKS." (save-excursion (set-buffer gnus-summary-buffer) ! (gnus-summary-limit-to-marks marks 'reverse))) (defun gnus-apply-kill-file-internal () "Apply a kill file to the current newsgroup. *************** *** 344,351 **** (gnus-summary-inhibit-highlight t) beg) (setq gnus-newsgroup-kill-headers nil) - (or gnus-newsgroup-headers-hashtb-by-number - (gnus-make-headers-hashtable-by-number)) ;; If there are any previously scored articles, we remove these ;; from the `gnus-newsgroup-headers' list that the score functions ;; will see. This is probably pretty wasteful when it comes to --- 344,349 ---- *************** *** 620,631 **** (setq article (gnus-summary-article-number)) t) (setq article ! (gnus-summary-search-subject ! backward (not ignore-marked)))) (and (or (null gnus-newsgroup-kill-headers) (memq article gnus-newsgroup-kill-headers)) (gnus-execute-1 function regexp form ! (gnus-get-header-by-number article)) (setq killed-no (1+ killed-no)))) killed-no))) --- 618,629 ---- (setq article (gnus-summary-article-number)) t) (setq article ! (gnus-summary-search-forward ! (not ignore-marked) nil backward))) (and (or (null gnus-newsgroup-kill-headers) (memq article gnus-newsgroup-kill-headers)) (gnus-execute-1 function regexp form ! (gnus-summary-article-header article)) (setq killed-no (1+ killed-no)))) killed-no))) *** pub/sgnus/lisp/gnus-msg.el Sat Sep 16 09:56:05 1995 --- sgnus/lisp/gnus-msg.el Thu Sep 21 00:44:16 1995 *************** *** 111,116 **** --- 111,133 ---- article in. The default function is `rmail-output' which saves in Unix mailbox format.") + (defvar gnus-outgoing-message-group nil + "*All outgoing messages will be put in this group. + If you want to store all your outgoing mail and articles in the group + \"nnml:archive\", you set this variable to that value. This variable + can also be a list of group names. + + If you want to have greater control over what group to put each + message in, you can set this variable to a function that checks the + current newsgroup name and then returns a suitable group name (or list + of names).") + + (defvar gnus-draft-group-directory + (expand-file-name + (concat (file-name-as-directory gnus-article-save-directory) + "drafts")) + "*The directory where draft messages will be stored.") + (defvar gnus-user-login-name nil "*The login name of the user. Got from the function `user-login-name' if undefined.") *************** *** 155,160 **** --- 172,183 ---- Message-ID. Organization, Lines and X-Newsreader are optional. If you want Gnus not to insert some header, remove it from this list.") + (defvar gnus-required-mail-headers + '(From Date To Subject Message-ID Organization Lines) + "*Headers to be generated or prompted for when mailing a message. + RFC822 required that From, Date, To, Subject and Message-ID be + included. Organization, Lines and X-Mailer are optional.") + (defvar gnus-deletable-headers '(Message-ID Date) "*Headers to be deleted if they already exists and were generated by Gnus previously.") *************** *** 164,170 **** (defvar gnus-check-before-posting '(subject-cmsg multiple-headers sendsys message-id from long-lines control-chars size new-text ! signature) "In non-nil, Gnus will attempt to run some checks on outgoing posts. If this variable is t, Gnus will check everything it can. If it is a list, then those elements in that list will be checked.") --- 187,193 ---- (defvar gnus-check-before-posting '(subject-cmsg multiple-headers sendsys message-id from long-lines control-chars size new-text ! signature approved) "In non-nil, Gnus will attempt to run some checks on outgoing posts. If this variable is t, Gnus will check everything it can. If it is a list, then those elements in that list will be checked.") *************** *** 214,219 **** --- 237,245 ---- (defvar gnus-inews-article-function 'gnus-inews-article "*Function to post an article.") + (defvar gnus-bounced-headers-junk "^\\(Received\\):" + "*Regexp that matches headers to be removed in resent bounced mail.") + (defvar gnus-inews-article-hook (list 'gnus-inews-do-fcc) "*A hook called before finally posting an article. The default hook (`gnus-inews-do-fcc') does FCC processing (ie. saves *************** *** 227,232 **** --- 253,261 ---- (defvar gnus-mail-hook nil "*A hook called as the last thing after setting up a mail buffer.") + (defvar gnus-message-sent-hook nil + "*A hook run after an article has been sent (or attempted sent).") + ;;; Internal variables. (defvar gnus-post-news-buffer "*post-news*") *************** *** 255,260 **** --- 284,291 ---- (define-key gnus-summary-send-map "r" 'gnus-summary-reply) (define-key gnus-summary-send-map "R" 'gnus-summary-reply-with-original) (define-key gnus-summary-send-map "m" 'gnus-summary-mail-other-window) + (define-key gnus-summary-send-map "Db" 'gnus-summary-resend-bounced-mail) + (define-key gnus-summary-send-map "Dc" 'gnus-summary-send-draft) (define-key gnus-summary-send-map "u" 'gnus-uu-post-news) (define-key gnus-summary-send-map "om" 'gnus-summary-mail-forward) (define-key gnus-summary-send-map "op" 'gnus-summary-post-forward) *************** *** 297,303 **** (if yank-articles (gnus-summary-goto-subject (car yank-articles))) (save-window-excursion (gnus-summary-select-article)) ! (let ((headers (gnus-get-header-by-number (gnus-summary-article-number))) (gnus-newsgroup-name gnus-newsgroup-name)) ;; Check Followup-To: poster. (set-buffer gnus-article-buffer) --- 328,334 ---- (if yank-articles (gnus-summary-goto-subject (car yank-articles))) (save-window-excursion (gnus-summary-select-article)) ! (let ((headers (gnus-summary-article-header (gnus-summary-article-number))) (gnus-newsgroup-name gnus-newsgroup-name)) ;; Check Followup-To: poster. (set-buffer gnus-article-buffer) *************** *** 560,721 **** (reply gnus-article-reply) error post-result) (save-excursion - ;; Connect to default NNTP server if necessary. - ;; Suggested by yuki@flab.fujitsu.junet. (gnus-start-news-server) ;Use default server. - ;; NNTP server must be opened before current buffer is modified. (widen) (goto-char (point-min)) (run-hooks 'news-inews-hook) - (save-restriction - (narrow-to-region - (point-min) - (progn - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (match-beginning 0))) - - ;; Correct newsgroups field: change sequence of spaces to comma and - ;; eliminate spaces around commas. Eliminate imbedded line breaks. - (goto-char (point-min)) - (if (re-search-forward "^Newsgroups: +" nil t) - (save-restriction - (narrow-to-region - (point) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (forward-line 1) - (point))) - (goto-char (point-min)) - (while (re-search-forward "\n[ \t]+" nil t) - (replace-match " " t t)) ;No line breaks (too confusing) - (goto-char (point-min)) - (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t) - (replace-match "," t t)) - (goto-char (point-min)) - ;; Remove a trailing comma. - (if (re-search-forward ",$" nil t) - (replace-match "" t t)))) - - ;; Added by Per Abrahamsen . - ;; Help save the the world! - (or - gnus-expert-user - (let ((newsgroups (mail-fetch-field "newsgroups")) - (followup-to (mail-fetch-field "followup-to")) - groups to) - (if (and newsgroups - (string-match "," newsgroups) (not followup-to)) - (progn - (while (string-match "," newsgroups) - (setq groups - (cons (list (substring newsgroups - 0 (match-beginning 0))) - groups)) - (setq newsgroups (substring newsgroups (match-end 0)))) - (setq groups (nreverse (cons (list newsgroups) groups))) - - (setq to - (completing-read "Followups to: (default all groups) " - groups)) - (if (> (length to) 0) - (progn - (goto-char (point-min)) - (insert "Followup-To: " to "\n"))))))) - - ;; Cleanup Followup-To. - (goto-char (point-min)) - (if (search-forward-regexp "^Followup-To: +" nil t) - (save-restriction - (narrow-to-region - (point) - (if (re-search-forward "^[^ \t]" nil 'end) - (match-beginning 0) - (point-max))) - (goto-char (point-min)) - (replace-regexp "\n[ \t]+" " ") ;No line breaks (too confusing) - (goto-char (point-min)) - (replace-regexp "[ \t\n]*,[ \t\n]*\\|[ \t]+" ","))) - - ;; Mail the message too if To:, Bcc:. or Cc: exists. - (let* ((types '("to" "bcc" "cc")) - (ty types) - fcc-line) - (while ty - (or (mail-fetch-field (car ty) nil t) - (setq types (delete (car ty) types))) - (setq ty (cdr ty))) - - (if (not types) - ;; We do not want to send mail. - () - (if (not gnus-mail-send-method) - (progn - (ding) - (gnus-message - 1 "No mailer defined. To: and/or Cc: fields ignored.") - (sit-for 1)) - (save-excursion - ;; We want to remove Fcc, because we want to handle - ;; that one ourselves... - - (goto-char (point-min)) - (if (re-search-forward "^Fcc: " nil t) - (progn - (setq fcc-line - (buffer-substring - (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - (forward-line -1) - (gnus-delete-line))) - - ;; We generate a Message-ID so that the mail and the - ;; news copy of the message both get the same ID. - (or (mail-fetch-field "message-id") - (not (memq 'Message-ID gnus-required-headers)) - (progn - (goto-char (point-max)) - (insert "Message-ID: " (gnus-inews-message-id) "\n"))) - - (save-restriction - (widen) - (gnus-message 5 "Sending via mail...") - - (if (and gnus-mail-courtesy-message - (or (member "to" types) - (member "cc" types))) - ;; We only want to insert the courtesy mail - ;; message if we use to or cc; bcc should not - ;; have one. Well, if both bcc and to are - ;; present, it will get one anyway. - (progn - ;; Insert "courtesy" mail message. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote - mail-header-separator) "$")) - (forward-line 1) - (insert gnus-mail-courtesy-message) - (funcall gnus-mail-send-method) - (goto-char (point-min)) - (search-forward gnus-mail-courtesy-message) - (replace-match "" t t)) - (funcall gnus-mail-send-method)) - - (gnus-message 5 "Sending via mail...done") - - (goto-char (point-min)) - (narrow-to-region - (point) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$"))) - (goto-char (point-min)) - (delete-matching-lines "^BCC:")) - (if fcc-line - (progn - (goto-char (point-max)) - (insert fcc-line)))))))) ;; Send to server. (gnus-message 5 "Posting to USENET...") --- 591,600 ---- *************** *** 738,746 **** (ding) (gnus-message 1 "Article rejected: %s" (gnus-status-message gnus-select-method))))) ! ;; If NNTP server is opened by gnus-inews-news, close it by myself. ! (or server-running ! (gnus-close-server (gnus-find-method-for-group gnus-newsgroup-name))) (let ((conf gnus-prev-winconf)) (if (not error) (progn --- 617,623 ---- (ding) (gnus-message 1 "Article rejected: %s" (gnus-status-message gnus-select-method))))) ! (let ((conf gnus-prev-winconf)) (if (not error) (progn *************** *** 748,753 **** --- 625,696 ---- ;; Restore last window configuration. (and conf (set-window-configuration conf))))))) + (defun gnus-inews-narrow-to-headers () + (widen) + (narrow-to-region + (goto-char (point-min)) + (or (and (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$") nil t) + (match-beginning 0)) + (point-max)))) + + (defun gnus-inews-send-mail-copy () + ;; Mail the message if To, Bcc or Cc exists. + (let* ((types '("to" "bcc" "cc")) + (ty types) + (buffer (current-buffer)) + fcc) + (save-restriction + (widen) + (gnus-inews-narrow-to-headers) + + (while ty + (or (mail-fetch-field (car ty) nil t) + (setq types (delete (car ty) types))) + (setq ty (cdr ty))) + + (if (not types) + ;; We do not want to send mail. + () + (gnus-message 5 "Sending via mail...") + (widen) + (save-excursion + ;; We copy the article over to a temp buffer since we are + ;; going to modify it a little. + (nnheader-set-temp-buffer " *Gnus-mailing*") + (insert-buffer buffer) + ;; We remove Fcc, because we don't want the mailer to see + ;; that header. + (gnus-inews-narrow-to-headers) + (nnheader-remove-header "fcc") + + (widen) + + (if (and gnus-mail-courtesy-message + (or (member "to" types) + (member "cc" types))) + ;; We only want to insert the courtesy mail message if + ;; we use To or Cc; Bcc should not have one. Well, if + ;; both Bcc and To are present, it will get one + ;; anyway. + (progn + ;; Insert "courtesy" mail message. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$")) + (forward-line 1) + (insert gnus-mail-courtesy-message))) + + (gnus-mail-send) + (kill-buffer (current-buffer)) + (gnus-message 5 "Sending via mail...done")))))) + + (defun gnus-inews-remove-headers-after-mail () + (save-excursion + (save-restriction + (gnus-inews-narrow-to-headers) + (nnheader-remove-header "bcc")))) + (defun gnus-inews-check-post () "Check whether the post looks ok." (or *************** *** 791,797 **** (gnus-y-or-n-p (format "Multiple %s headers. Really post? " found)) t)))) ! ;; Check for version and sendsys. (or (gnus-check-before-posting 'sendsys) (save-excursion (if (re-search-forward "^Sendsys:\\|^Version:" nil t) --- 734,740 ---- (gnus-y-or-n-p (format "Multiple %s headers. Really post? " found)) t)))) ! ;; Check for Version and Sendsys. (or (gnus-check-before-posting 'sendsys) (save-excursion (if (re-search-forward "^Sendsys:\\|^Version:" nil t) *************** *** 800,806 **** (buffer-substring (match-beginning 0) (1- (match-end 0))))) t))) ! ;; Check the Message-Id header. (or (gnus-check-before-posting 'message-id) (save-excursion (let* ((case-fold-search t) --- 743,756 ---- (buffer-substring (match-beginning 0) (1- (match-end 0))))) t))) ! ;; Check for Approved. ! (or (gnus-check-before-posting 'approved) ! (save-excursion ! (if (re-search-forward "^Approved:" nil t) ! (gnus-y-or-n-p ! "The article contains an Approved header. Really post? ") ! t))) ! ;; Check the Message-ID header. (or (gnus-check-before-posting 'message-id) (save-excursion (let* ((case-fold-search t) *************** *** 935,940 **** --- 885,891 ---- (buffer-disable-undo (current-buffer)) (erase-buffer) (insert "Newsgroups: " newsgroups "\n" + "From: " (gnus-inews-real-user-address) "\n" "Subject: cancel " message-id "\n" "Control: cancel " message-id "\n" (if distribution *************** *** 957,1021 **** (kill-buffer (current-buffer)))))))) ! ;;; Lowlevel inews interface (defun gnus-inews-article (&optional use-group-method) "Post an article in current buffer using NNTP protocol." (let ((artbuf (current-buffer)) ! (tmpbuf (get-buffer-create " *Gnus-posting*"))) (widen) (goto-char (point-max)) ! ;; require a newline at the end for inews to append .signature to (or (= (preceding-char) ?\n) (insert ?\n)) ;; Prepare article headers. All message body such as signature ;; must be inserted before Lines: field is prepared. (save-restriction ! (goto-char (point-min)) ! (narrow-to-region ! (point-min) ! (save-excursion ! (re-search-forward ! (concat "^" (regexp-quote mail-header-separator) "$")) ! (match-beginning 0))) (gnus-inews-remove-headers) (gnus-inews-insert-headers) (run-hooks 'gnus-inews-article-header-hook) (widen)) ;; Check whether the article is a good Net Citizen. (if (and gnus-article-check-size (not (gnus-inews-check-post))) ;; Aber nein! 'illegal ;; Looks ok, so we do the nasty. (save-excursion - (set-buffer tmpbuf) - (buffer-disable-undo (current-buffer)) - (erase-buffer) - (insert-buffer-substring artbuf) - ;; Remove the header separator. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (replace-match "" t t) ;; This hook may insert a signature. (save-excursion (goto-char (point-min)) (let ((gnus-newsgroup-name (or (mail-fetch-field "newsgroups") gnus-newsgroup-name))) (run-hooks 'gnus-prepare-article-hook))) ;; Run final inews hooks. This hook may do FCC. ;; The article must be saved before being posted because ;; `gnus-request-post' modifies the buffer. (run-hooks 'gnus-inews-article-hook) ! ;; Post an article to NNTP server. ! ;; Return NIL if post failed. ! (prog1 ! (gnus-request-post ! (if use-group-method ! (gnus-find-method-for-group gnus-newsgroup-name) ! gnus-select-method) use-group-method) ! (kill-buffer (current-buffer))))))) (defun gnus-inews-remove-headers () (let ((case-fold-search t) --- 908,1068 ---- (kill-buffer (current-buffer)))))))) ! ;;; Lowlevel inews interface. ! ! ;; Dummy to avoid byte-compile warning. ! (defvar nnspool-rejected-article-hook) (defun gnus-inews-article (&optional use-group-method) "Post an article in current buffer using NNTP protocol." (let ((artbuf (current-buffer)) ! gcc result) (widen) (goto-char (point-max)) ! ;; Require a newline at the end of the buffer since inews may ! ;; append a .signature. (or (= (preceding-char) ?\n) (insert ?\n)) ;; Prepare article headers. All message body such as signature ;; must be inserted before Lines: field is prepared. (save-restriction ! (gnus-inews-narrow-to-headers) ! ;; Fix some headers. ! (gnus-inews-cleanup-headers) ! ;; Remove some headers. (gnus-inews-remove-headers) + ;; Insert some headers. (gnus-inews-insert-headers) + ;; Let the user do all of the above. (run-hooks 'gnus-inews-article-header-hook) + ;; Copy the Gcc header, if any. + (setq gcc (mail-fetch-field "gcc")) (widen)) ;; Check whether the article is a good Net Citizen. (if (and gnus-article-check-size (not (gnus-inews-check-post))) ;; Aber nein! 'illegal + ;; We fudge a hook for nnspool. + (setq nnspool-rejected-article-hook + (` + (list + (lambda () + (condition-case () + (save-excursion + (set-buffer (, (buffer-name))) + (gnus-put-in-draft-group nil 'silent)) + (error + (ding) + (gnus-message + 1 "Couldn't enter rejected article into draft group"))))))) + ;; Looks ok, so we do the nasty. (save-excursion ;; This hook may insert a signature. (save-excursion (goto-char (point-min)) (let ((gnus-newsgroup-name (or (mail-fetch-field "newsgroups") gnus-newsgroup-name))) (run-hooks 'gnus-prepare-article-hook))) + ;; Send off copies using mail, if that is wanted. + (gnus-inews-send-mail-copy) + ;; Remove more headers. + (gnus-inews-remove-headers-after-mail) + ;; Copy the article over to a temp buffer. + (nnheader-set-temp-buffer " *Gnus-posting*") + (insert-buffer-substring artbuf) + ;; Remove the header separator. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$")) + (replace-match "" t t) ;; Run final inews hooks. This hook may do FCC. ;; The article must be saved before being posted because ;; `gnus-request-post' modifies the buffer. (run-hooks 'gnus-inews-article-hook) ! ;; Copy the article over to some group, possibly. ! (and gcc (gnus-inews-do-gcc gcc)) ! ;; Post the article. ! (setq result ! (gnus-request-post ! (if use-group-method ! (gnus-find-method-for-group gnus-newsgroup-name) ! gnus-select-method) use-group-method)) ! (kill-buffer (current-buffer))) ! (run-hooks 'gnus-message-sent-hook) ! ;; We remove To and Cc headers to avoid re-mailing if the user ! ;; accidentally (or purposefully) leans on the `C-c C-c' keys ! ;; and the news server rejects the posting. ! (gnus-inews-narrow-to-headers) ! (nnheader-remove-header "^\\(to\\|[bcf]cc\\|cc\\):" t) ! (widen) ! ;; If the posting was unsuccessful (that it, it was rejected) we ! ;; put it into the draft group. ! (or result (gnus-put-in-draft-group)) ! result))) ! ! (defun gnus-inews-cleanup-headers () ! ;; Correct newsgroups field: change sequence of spaces to comma and ! ;; eliminate spaces around commas. Eliminate imbedded line breaks. ! (goto-char (point-min)) ! (if (re-search-forward "^Newsgroups: +" nil t) ! (save-restriction ! (narrow-to-region ! (point) ! (if (re-search-forward "^[^ \t]" nil t) ! (match-beginning 0) ! (forward-line 1) ! (point))) ! (goto-char (point-min)) ! (while (re-search-forward "\n[ \t]+" nil t) ! (replace-match " " t t)) ;No line breaks (too confusing) ! (goto-char (point-min)) ! (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t) ! (replace-match "," t t)) ! (goto-char (point-min)) ! ;; Remove a trailing comma. ! (if (re-search-forward ",$" nil t) ! (replace-match "" t t)))) ! ! ;; Added by Per Abrahamsen . ! ;; Help save the the world! ! (or ! gnus-expert-user ! (let ((newsgroups (mail-fetch-field "newsgroups")) ! (followup-to (mail-fetch-field "followup-to")) ! groups to) ! (if (and newsgroups ! (string-match "," newsgroups) (not followup-to)) ! (progn ! (while (string-match "," newsgroups) ! (setq groups ! (cons (list (substring newsgroups 0 (match-beginning 0))) ! groups)) ! (setq newsgroups (substring newsgroups (match-end 0)))) ! (setq groups (nreverse (cons (list newsgroups) groups))) ! ! (setq to (completing-read ! "Followups to: (default all groups) " groups)) ! (if (> (length to) 0) ! (progn ! (goto-char (point-min)) ! (insert "Followup-To: " to "\n"))))))) ! ! ;; Cleanup Followup-To. ! (goto-char (point-min)) ! (if (search-forward-regexp "^Followup-To: +" nil t) ! (save-restriction ! (narrow-to-region ! (point) ! (if (re-search-forward "^[^ \t]" nil 'end) ! (match-beginning 0) ! (point-max))) ! (goto-char (point-min)) ! (replace-regexp "\n[ \t]+" " ") ;No line breaks (too confusing) ! (goto-char (point-min)) ! (replace-regexp "[ \t\n]*,[ \t\n]*\\|[ \t]+" ",")))) ! (defun gnus-inews-remove-headers () (let ((case-fold-search t) *************** *** 1030,1036 **** (progn (forward-line 1) (point)))) (setq headers (cdr headers))))) ! (defun gnus-inews-insert-headers () "Prepare article headers. Headers already prepared in the buffer are not modified. Headers in `gnus-required-headers' will be generated." --- 1077,1083 ---- (progn (forward-line 1) (point)))) (setq headers (cdr headers))))) ! (defun gnus-inews-insert-headers (&optional headers) "Prepare article headers. Headers already prepared in the buffer are not modified. Headers in `gnus-required-headers' will be generated." *************** *** 1041,1050 **** (Path (gnus-inews-path)) (Subject nil) (Newsgroups nil) (Distribution nil) (Lines (gnus-inews-lines)) (X-Newsreader gnus-version) ! (headers gnus-required-headers) (case-fold-search t) header value elem) ;; First we remove any old generated headers. --- 1088,1099 ---- (Path (gnus-inews-path)) (Subject nil) (Newsgroups nil) + (To nil) (Distribution nil) (Lines (gnus-inews-lines)) (X-Newsreader gnus-version) ! (X-Mailer gnus-version) ! (headers (or headers gnus-required-headers)) (case-fold-search t) header value elem) ;; First we remove any old generated headers. *************** *** 1547,1554 **** subject message-of nil gnus-article-copy nil) (auto-save-mode auto-save-default) ! (use-local-map (copy-keymap mail-mode-map)) ! (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) (if (and follow-to (listp follow-to)) (progn --- 1596,1602 ---- subject message-of nil gnus-article-copy nil) (auto-save-mode auto-save-default) ! (gnus-inews-modify-mail-mode-map) (if (and follow-to (listp follow-to)) (progn *************** *** 1598,1608 **** (or mail-yank-hooks mail-citation-hook (run-hooks 'news-reply-header-hook))) ! (defun gnus-mail-send-and-exit () (interactive) (let ((reply gnus-article-reply) (winconf gnus-prev-winconf)) ! (mail-send-and-exit nil) (if (get-buffer gnus-group-buffer) (progn (if (gnus-buffer-exists-p (car-safe reply)) --- 1646,1696 ---- (or mail-yank-hooks mail-citation-hook (run-hooks 'news-reply-header-hook))) ! (defun gnus-mail-send-and-exit (&optional dont-send) ! "Send the current mail and return to Gnus." (interactive) (let ((reply gnus-article-reply) (winconf gnus-prev-winconf)) ! (or dont-send (gnus-mail-send)) ! (bury-buffer) ! (if (get-buffer gnus-group-buffer) ! (progn ! (if (gnus-buffer-exists-p (car-safe reply)) ! (progn ! (set-buffer (car reply)) ! (and (cdr reply) ! (gnus-summary-mark-article-as-replied ! (cdr reply))))) ! (and winconf (set-window-configuration winconf)))))) ! ! (defun gnus-put-message () ! "Put the current message in some group and return to Gnus." ! (interactive) ! (let ((reply gnus-article-reply) ! (winconf gnus-prev-winconf) ! (group gnus-newsgroup-name) ! buf) ! ! (or (and group (not (gnus-group-read-only-p group))) ! (setq group (read-string "Put in group: " nil ! (gnus-writable-groups)))) ! (and (gnus-gethash group gnus-newsrc-hashtb) ! (error "No such group: %s" group)) ! ! (save-excursion ! (save-restriction ! (widen) ! (gnus-inews-narrow-to-headers) ! (let (gnus-deletable-headers) ! (if (eq major-mode 'mail-mode) ! (gnus-inews-insert-headers gnus-required-mail-headers) ! (gnus-inews-insert-headers))) ! (goto-char (point-max)) ! (insert "Gcc: " group "\n") ! (widen))) ! ! (gnus-inews-do-gcc) ! (if (get-buffer gnus-group-buffer) (progn (if (gnus-buffer-exists-p (car-safe reply)) *************** *** 1613,1618 **** --- 1701,1707 ---- (cdr reply))))) (and winconf (set-window-configuration winconf)))))) + (defun gnus-forward-make-subject (buffer) (save-excursion (set-buffer buffer) *************** *** 1646,1653 **** (subject (gnus-forward-make-subject forward-buffer))) (set-buffer forward-buffer) (mail nil nil subject) ! (use-local-map (copy-keymap (current-local-map))) ! (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) (make-local-variable 'gnus-prev-winconf) (setq gnus-prev-winconf winconf) (gnus-forward-insert-buffer forward-buffer) --- 1735,1741 ---- (subject (gnus-forward-make-subject forward-buffer))) (set-buffer forward-buffer) (mail nil nil subject) ! (gnus-inews-modify-mail-mode-map) (make-local-variable 'gnus-prev-winconf) (setq gnus-prev-winconf winconf) (gnus-forward-insert-buffer forward-buffer) *************** *** 1673,1680 **** "Compose mail other window using mail." (let ((winconf (current-window-configuration))) (mail-other-window nil nil nil nil nil (get-buffer gnus-article-buffer)) ! (use-local-map (copy-keymap (current-local-map))) ! (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) (make-local-variable 'gnus-prev-winconf) (setq gnus-prev-winconf winconf) (run-hooks 'gnus-mail-hook) --- 1761,1767 ---- "Compose mail other window using mail." (let ((winconf (current-window-configuration))) (mail-other-window nil nil nil nil nil (get-buffer gnus-article-buffer)) ! (gnus-inews-modify-mail-mode-map) (make-local-variable 'gnus-prev-winconf) (setq gnus-prev-winconf winconf) (run-hooks 'gnus-mail-hook) *************** *** 1709,1715 **** (auto-save-mode auto-save-default) (make-local-variable 'gnus-prev-winconf) (setq gnus-prev-winconf winconf) ! (use-local-map (copy-keymap mail-mode-map)) (local-set-key "\C-c\C-c" 'gnus-bug-mail-send-and-exit) (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) --- 1796,1802 ---- (auto-save-mode auto-save-default) (make-local-variable 'gnus-prev-winconf) (setq gnus-prev-winconf winconf) ! (gnus-inews-modify-mail-mode-map) (local-set-key "\C-c\C-c" 'gnus-bug-mail-send-and-exit) (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) *************** *** 1785,1790 **** --- 1872,2104 ---- (goto-char (point-min)) (while (re-search-forward "[\000\200]" nil t) (replace-match "" t t)))) + + + ;;; Treatment of rejected articles. + + + ;;; Bounced mail. + + (defun gnus-summary-resend-bounced-mail (fetch) + "Re-mail the current message. + This only makes sense if the current message is a bounce message than + contains some mail you have written which has been bounced back to + you. + If FETCH, try to fetch the article that this is a reply to, if indeed + this is a reply." + (interactive) + (gnus-summary-select-article t) + ;; Create a mail buffer. + (funcall gnus-mail-other-window-method) + (erase-buffer) + (insert-buffer gnus-article-buffer) + (goto-char (point-min)) + (search-forward "\n\n") + ;; We remove everything before the bounced mail. + (delete-region + (point-min) + (if (re-search-forward "[^ \t]*:" nil t) + (match-beginning 0) + (point))) + (let (references) + (save-excursion + (save-restriction + (gnus-narrow-to-headers) + (nnheader-remove-header gnus-bounced-headers-junk t) + (setq references (mail-fetch-field "references")) + (goto-char (point-max)) + (insert mail-header-separator))) + ;; If there are references, we fetch the article we answered to. + (and fetch + references + (string-match "\\(<[^]+>\\)[ \t]*$" references) + (gnus-summary-refer-article + (substring references (match-beginning 1) (match-end 1))) + (progn + (gnus-summary-show-all-headers) + (gnus-configure-windows 'compose-bounce)))) + (goto-char (point-min))) + + ;;; Sending mail. + + (defun gnus-mail-send () + "Send the current buffer as mail. + Headers will be generated before sending." + (interactive) + (save-excursion + (save-restriction + (widen) + (gnus-inews-narrow-to-headers) + (let (gnus-deletable-headers) + (gnus-inews-insert-headers gnus-required-mail-headers)) + (widen))) + ;; Run final inews hooks. This hook may do FCC. + (run-hooks 'gnus-inews-article-hook) + (gnus-inews-do-gcc) + (gnus-inews-narrow-to-headers) + (nnheader-remove-header "^[gf]cc:" t) + (widen) + (mail-send) + (run-hooks 'gnus-message-sent-hook)) + + (defun gnus-inews-modify-mail-mode-map () + (use-local-map (copy-keymap (current-local-map))) + (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) + (local-set-key "\C-c\C-p" 'gnus-put-message) + (local-set-key "\C-c\C-d" 'gnus-enter-into-draft-group)) + + ;;; Gcc handling. + + ;; Do Gcc handling, which copied the message over to some group. + (defun gnus-inews-do-gcc (&optional gcc) + (save-excursion + (save-restriction + (gnus-narrow-to-headers) + (let ((gcc (or gcc (mail-fetch-field "gcc" nil t))) + end) + (if (not gcc) + () ; Nothing to be done. + (nnheader-remove-header "gcc") + ;; Copy the article over to some group(s). + (while (string-match + "^[ \t]*\\([^ \t]+\\)\\([ \t]+\\|$\\)" gcc) + (setq end (match-end 0)) + (condition-case () + (gnus-request-accept-article + (substring gcc (match-beginning 1) (match-end 1)) t) + (error nil)) + (setq gcc (substring gcc end)))))))) + + (defun gnus-inews-insert-gcc () + (let* ((group gnus-outgoing-message-group) + (gcc (cond + ((and (symbolp group) (fboundp group)) + (funcall group)) + ((or (stringp group) (list group)) + group)))) + (if (not gcc) + () ; Insert no Gcc. + (insert "Gcc: " + (if (stringp group) group + (mapconcat 'identity group " ")) + "\n")))) + + ;;; Handling rejected (and postponed) news. + + (defun gnus-draft-group () + "Return the name of the draft group." + (gnus-group-prefixed-name + (file-name-nondirectory gnus-draft-group-directory) + (list 'nndir gnus-draft-group-directory))) + + (defun gnus-make-draft-group () + "Make the draft group or die trying." + (let* ((method (` (nndir "private" + (nndir-directory (, gnus-draft-group-directory))))) + (group (gnus-group-prefixed-name + (file-name-nondirectory gnus-draft-group-directory) + method))) + (or (gnus-gethash group gnus-newsrc-hashtb) + (gnus-group-make-group (gnus-group-real-name group) method) + (error "Can't create the draft group")) + group)) + + (defun gnus-enter-into-draft-group () + "Enter the current buffer into the draft group." + (interactive) + (gnus-put-in-draft-group t)) + + (defun gnus-put-in-draft-group (&optional generate silent) + "Does the actual putting." + (let ((group (gnus-make-draft-group)) + (type (list major-mode (buffer-name) gnus-newsgroup-name + (point))) + (mode major-mode) + (buf (current-buffer))) + (widen) + (save-excursion + (nnheader-set-temp-buffer " *enter-draft*") + (insert-buffer buf) + (save-restriction + (widen) + (gnus-inews-narrow-to-headers) + (let (gnus-deletable-headers) + (if (eq mode 'mail-mode) + (gnus-inews-insert-headers gnus-required-mail-headers) + (gnus-inews-insert-headers))) + (widen)) + + (goto-char (point-min)) + ;; We have to store whether we are in a mail group or news group. + (insert (format "X-Gnus-Draft-Type: %S\n" type)) + (and (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$") nil t) + (replace-match "" t t)) + (if (prog1 + (gnus-request-accept-article group t) + (kill-buffer (current-buffer))) + (or silent + (gnus-mail-send-and-exit 'dont-send)))) + (set-buffer-modified-p nil))) + + (defun gnus-summary-send-draft () + "Enter a mail/post buffer to edit and send the draft." + (interactive) + (gnus-set-global-variables) + (gnus-summary-select-article t) + ;; First we find the draft type. + (let (type) + (save-excursion + (set-buffer gnus-article-buffer) + (widen) + (gnus-narrow-to-headers) + (setq type (condition-case () + (read (mail-fetch-field "x-gnus-draft-type")) + (error nil))) + (widen)) + (or type + (error "Unknown draft type")) + ;; Get to the proper buffer. + (set-buffer (get-buffer-create (nth 1 type))) + ;; It might be modified. + (and (buffer-modified-p) + (or (gnus-yes-or-no-p "Unsent message being composed; discard it? ") + (error "Break"))) + (setq buffer-read-only nil) + (buffer-enable-undo (current-buffer)) + (erase-buffer) + ;; Set proper mode. + (funcall (car type)) + (and (eq major-mode 'mail-mode) + (gnus-inews-modify-mail-mode-map)) + ;; Arrange for deletion of the draft after successful sending. + (make-local-variable 'gnus-message-sent-hook) + (setq gnus-message-sent-hook + (list + (` + (lambda () + (gnus-request-expire-articles + (, (list (cdr gnus-article-current))) + (, gnus-newsgroup-name) t))))) + ;; Insert the draft. + (insert-buffer gnus-article-buffer) + ;; Insert the separator. + (goto-char (point-min)) + (search-forward "\n\n") + (forward-char -1) + (insert mail-header-separator) + ;; Remove the draft header. + (gnus-inews-narrow-to-headers) + (nnheader-remove-header "x-gnus-draft-type") + (widen) + ;; Configure windows. + (let ((gnus-draft-buffer (current-buffer))) + (gnus-configure-windows 'draft)) + ;; Put point where you left it. + (goto-char (nth 3 type)))) + + + ;;; Allow redefinition of functions. (gnus-ems-redefine) *** pub/sgnus/lisp/gnus-score.el Sat Sep 16 09:56:05 1995 --- sgnus/lisp/gnus-score.el Tue Sep 19 17:05:32 1995 *************** *** 323,329 **** (let ((article (gnus-summary-article-number)) headers) (if article ! (if (and (setq headers (gnus-get-header-by-number article)) (vectorp headers)) (aref headers (nth 1 (assoc header gnus-header-index))) (if no-err --- 323,329 ---- (let ((article (gnus-summary-article-number)) headers) (if article ! (if (and (setq headers (gnus-summary-article-header article)) (vectorp headers)) (aref headers (nth 1 (assoc header gnus-header-index))) (if no-err *************** *** 970,977 **** match) (progn (and trace (setq gnus-score-trace ! (cons (cons (car (car articles)) kill) ! gnus-score-trace))) (setq found t) (setcdr (car articles) (+ score (cdr (car articles)))))) (setq articles (cdr articles))) --- 970,980 ---- match) (progn (and trace (setq gnus-score-trace ! (cons ! (cons ! (car-safe (rassq alist gnus-score-cache)) ! kill) ! gnus-score-trace))) (setq found t) (setcdr (car articles) (+ score (cdr (car articles)))))) (setq articles (cdr articles))) *************** *** 1021,1028 **** (funcall match-func match (timezone-make-date-sortable l)) (progn (and trace (setq gnus-score-trace ! (cons (cons (car (car articles)) kill) ! gnus-score-trace))) (setq found t) (setcdr (car articles) (+ score (cdr (car articles)))))) (setq articles (cdr articles))) --- 1024,1034 ---- (funcall match-func match (timezone-make-date-sortable l)) (progn (and trace (setq gnus-score-trace ! (cons ! (cons ! (car-safe (rassq alist gnus-score-cache)) ! kill) ! gnus-score-trace))) (setq found t) (setcdr (car articles) (+ score (cdr (car articles)))))) (setq articles (cdr articles))) *************** *** 1113,1120 **** (setcdr (car articles) (+ score (cdr (car articles)))) (setq found t) (and trace (setq gnus-score-trace ! (cons (cons (car (car articles)) kill) ! gnus-score-trace))))) ;; Update expire date (cond ((null date)) ;Permanent entry. (found ;Match, update date. --- 1119,1130 ---- (setcdr (car articles) (+ score (cdr (car articles)))) (setq found t) (and trace (setq gnus-score-trace ! (cons ! (cons ! (car-safe ! (rassq alist gnus-score-cache)) ! kill) ! gnus-score-trace))))) ;; Update expire date (cond ((null date)) ;Permanent entry. (found ;Match, update date. *************** *** 1327,1336 **** (setq art (car arts) arts (cdr arts)) (setcdr art (+ score (cdr art))) ! (setq gnus-score-trace ! (cons (cons (mail-header-number ! (car art)) kill) ! gnus-score-trace))) (while arts (setq art (car arts) arts (cdr arts)) --- 1337,1349 ---- (setq art (car arts) arts (cdr arts)) (setcdr art (+ score (cdr art))) ! (setq gnus-score-trace ! (cons ! (cons ! (car-safe ! (rassq alist gnus-score-cache)) ! kill) ! gnus-score-trace))) (while arts (setq art (car arts) arts (cdr arts)) *************** *** 1348,1356 **** (setq art (car arts) arts (cdr arts)) (setcdr art (+ score (cdr art))) ! (setq gnus-score-trace ! (cons (cons (mail-header-number (car art)) kill) ! gnus-score-trace))) (while arts (setq art (car arts) arts (cdr arts)) --- 1361,1373 ---- (setq art (car arts) arts (cdr arts)) (setcdr art (+ score (cdr art))) ! (setq gnus-score-trace ! (cons ! (cons ! (car-safe ! (rassq alist gnus-score-cache)) ! kill) ! gnus-score-trace))) (while arts (setq art (car arts) arts (cdr arts)) *************** *** 1409,1418 **** (setq art (car arts) arts (cdr arts)) (setcdr art (+ score (cdr art))) ! (setq gnus-score-trace ! (cons (cons (mail-header-number ! (car art)) kill) ! gnus-score-trace))) (while arts (setq art (car arts) arts (cdr arts)) --- 1426,1438 ---- (setq art (car arts) arts (cdr arts)) (setcdr art (+ score (cdr art))) ! (setq gnus-score-trace ! (cons ! (cons ! (car-safe ! (rassq alist gnus-score-cache)) ! kill) ! gnus-score-trace))) (while arts (setq art (car arts) arts (cdr arts)) *************** *** 1493,1500 **** (if (or (not elem) (get-text-property (point) 'gnus-pseudo)) () ! (setq headers (gnus-get-header-by-number ! (gnus-summary-article-number))) (while (and elem headers) (setq match (funcall (car (car elem)) headers)) (gnus-summary-score-entry --- 1513,1519 ---- (if (or (not elem) (get-text-property (point) 'gnus-pseudo)) () ! (setq headers (gnus-summary-article-header)) (while (and elem headers) (setq match (funcall (car (car elem)) headers)) (gnus-summary-score-entry *************** *** 1550,1557 **** (if (or (not elem) (get-text-property (gnus-point-at-bol) 'gnus-pseudo)) () ! (setq headers (gnus-get-header-by-number ! (gnus-summary-article-number))) (while elem (setq match (funcall (car (car elem)) headers)) (gnus-summary-score-entry --- 1569,1575 ---- (if (or (not elem) (get-text-property (gnus-point-at-bol) 'gnus-pseudo)) () ! (setq headers (gnus-summary-article-header)) (while elem (setq match (funcall (car (car elem)) headers)) (gnus-summary-score-entry *************** *** 1560,1567 **** (< (length match) gnus-score-exact-adapt-limit)) 'e 's) (nth 2 (car elem)) date nil t) ! (setq elem (cdr elem)))) ! (delete-region (point) (progn (forward-line 1) (point)))) ;; Switch back to the old score file. (gnus-score-load-file cur-score)))) --- 1578,1584 ---- (< (length match) gnus-score-exact-adapt-limit)) 'e 's) (nth 2 (car elem)) date nil t) ! (setq elem (cdr elem))))) ;; Switch back to the old score file. (gnus-score-load-file cur-score)))) *************** *** 1613,1619 **** "Find all score rules applied to this article." (interactive) (let ((gnus-newsgroup-headers ! (list (gnus-get-header-by-number (gnus-summary-article-number)))) (gnus-newsgroup-scored nil) (buf (current-buffer)) trace) --- 1630,1636 ---- "Find all score rules applied to this article." (interactive) (let ((gnus-newsgroup-headers ! (list (gnus-summary-article-header))) (gnus-newsgroup-scored nil) (buf (current-buffer)) trace) *************** *** 1625,1631 **** (gnus-add-current-to-buffer-list) (erase-buffer) (while trace ! (insert (format "%S\n" (cdr (car trace)))) (setq trace (cdr trace))) (goto-char (point-min)) (pop-to-buffer buf))) --- 1642,1649 ---- (gnus-add-current-to-buffer-list) (erase-buffer) (while trace ! (insert (format "%S -> %s\n" (cdr (car trace)) ! (file-name-nondirectory (car (car trace))))) (setq trace (cdr trace))) (goto-char (point-min)) (pop-to-buffer buf))) *** pub/sgnus/lisp/gnus-soup.el Thu Sep 21 01:16:20 1995 --- sgnus/lisp/gnus-soup.el Tue Sep 19 19:53:26 1995 *************** *** 0 **** --- 1,549 ---- + ;;; gnus-soup.el --- SOUP packet writing support for Gnus + ;; Copyright (C) 1995 Free Software Foundation, Inc. + + ;; Author: Per Abrahamsen + ;; Lars Magne Ingebrigtsen + ;; Keywords: news, mail + + ;; 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, 675 Mass Ave, Cambridge, MA 02139, USA. + + ;;; Commentary: + + ;;; Code: + + (require 'gnus-msg) + (require 'gnus) + + ;;; User Variables: + + (defvar gnus-soup-directory "~/SoupBrew/" + "*Directory containing an unpacked SOUP packet.") + + (defvar gnus-soup-replies-directory (concat gnus-soup-directory "SoupReplies/") + "*Directory where Gnus will do processing of replies.") + + (defvar gnus-soup-prefix-file "gnus-prefix" + "*Name of the file where Gnus stores the last used prefix.") + + (defvar gnus-soup-packer "tar cf - %s | gzip > $HOME/Soupout%d.tgz" + "Format string command for packing a SOUP packet. + The SOUP files will be inserted where the %s is in the string. + This string MUST contain both %s and %d. The file number will be + inserted where %d appears.") + + (defvar gnus-soup-unpacker "gunzip -c %s | tar xvf -" + "*Format string command for unpacking a SOUP packet. + The SOUP packet file name will be inserted at the %s.") + + (defvar gnus-soup-packet-directory "~/" + "*Where gnus-soup will look for REPLIES packets.") + + (defvar gnus-soup-packet-regexp "Soupin" + "*Regular expression matching SOUP REPLIES packets in `gnus-soup-packet-directory'.") + + ;;; Internal Variables: + + (defvar gnus-soup-encoding-type ?n + "*Soup encoding type. + `n' is news format, `m' is Unix mbox format, and `M' is MMDF mailbox + format.") + + (defvar gnus-soup-index-type ?c + "*Soup index type. + `n' means no index file and `c' means standard Cnews overview + format.") + + (defvar gnus-soup-group-type ?u + "*Soup message area type. + `u' is unknown, `m' is private mail, and `n' is news. + Gnus will determine by itself what type to use in what group, so + setting this variable won't do much.") + + (defvar gnus-soup-areas nil) + (defvar gnus-soup-last-prefix nil) + (defvar gnus-soup-prev-prefix nil) + (defvar gnus-soup-buffers nil) + + ;;; Access macros: + + (defmacro gnus-soup-area-prefix (area) + (` (aref (, area) 0))) + (defmacro gnus-soup-area-name (area) + (` (aref (, area) 1))) + (defmacro gnus-soup-area-encoding (area) + (` (aref (, area) 2))) + (defmacro gnus-soup-area-description (area) + (` (aref (, area) 3))) + (defmacro gnus-soup-area-number (area) + (` (aref (, area) 4))) + (defmacro gnus-soup-area-set-number (area value) + (` (aset (, area) 4 (, value)))) + + (defmacro gnus-soup-encoding-format (encoding) + (` (aref (, encoding) 0))) + (defmacro gnus-soup-encoding-index (encoding) + (` (aref (, encoding) 1))) + (defmacro gnus-soup-encoding-kind (encoding) + (` (aref (, encoding) 2))) + + (defmacro gnus-soup-reply-prefix (reply) + (` (aref (, reply) 0))) + (defmacro gnus-soup-reply-kind (reply) + (` (aref (, reply) 1))) + (defmacro gnus-soup-reply-encoding (reply) + (` (aref (, reply) 2))) + + ;;; Commands: + + (defun gnus-soup-send-replies () + "Unpack and send all replies in the reply packet." + (interactive) + (let ((packets (directory-files + gnus-soup-packet-directory t gnus-soup-packet-regexp))) + (while packets + (and (gnus-soup-send-packet (car packets)) + (delete-file (car packets))) + (setq packets (cdr packets))))) + + (defun gnus-soup-add-article (n) + "Add the current article to SOUP packet. + If N is a positive number, add the N next articles. + If N is a negative number, add the N previous articles. + If N is nil and any articles have been marked with the process mark, + move those articles instead." + (interactive "P") + (gnus-set-global-variables) + (let* ((articles (gnus-summary-work-articles n)) + (tmp-buf (get-buffer-create "*soup work*")) + (area (gnus-soup-area gnus-newsgroup-name)) + (prefix (gnus-soup-area-prefix area)) + headers) + (buffer-disable-undo tmp-buf) + (save-excursion + (while articles + ;; Find the header of the article. + (set-buffer gnus-summary-buffer) + (setq headers (gnus-summary-article-header (car articles))) + ;; Put the article in a buffer. + (set-buffer tmp-buf) + (gnus-request-article-this-buffer + (car articles) gnus-newsgroup-name) + (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)) + (gnus-summary-mark-as-read (car articles) "F") + (setq articles (cdr articles))) + (kill-buffer tmp-buf)) + (gnus-soup-save-areas))) + + (defun gnus-soup-pack-packet () + "Make a SOUP packet from the SOUP areas." + (interactive) + (gnus-soup-read-areas) + (gnus-soup-pack gnus-soup-directory gnus-soup-packer)) + + (defun gnus-group-brew-soup (n) + "Make a soup packet from the current group. + Uses the process/prefix convention." + (interactive "P") + (let ((groups (gnus-group-process-prefix n))) + (while groups + (gnus-group-remove-mark (car groups)) + (gnus-soup-group-brew (car groups)) + (setq groups (cdr groups))) + (gnus-soup-save-areas))) + + (defun gnus-brew-soup (&optional level) + "Go through all groups on LEVEL or less and make a soup packet." + (interactive "P") + (let ((level (or level gnus-level-subscribed)) + (newsrc (cdr gnus-newsrc-alist))) + (while newsrc + (and (<= (nth 1 (car newsrc)) level) + (gnus-soup-group-brew (car (car newsrc)))) + (setq newsrc (cdr newsrc))) + (gnus-soup-save-areas))) + + ;;;###autoload + (defun gnus-batch-brew-soup () + "Brew a SOUP packet from groups mention on the command line. + Will use the remaining command line arguments as regular expressions + for matching on group names. + + For instance, if you want to brew on all the nnml groups, as well as + groups with \"emacs\" in the name, you could say something like: + + $ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\"" + (interactive) + ) + + ;;; Internal Functions: + + ;; Store the current buffer. + (defun gnus-soup-store (directory prefix headers format index) + ;; Create the directory, if needed. + (or (file-directory-p directory) + (gnus-make-directory directory)) + (let* ((msg-buf (find-file-noselect + (concat directory prefix ".MSG"))) + (idx-buf (if (= index ?n) + nil + (find-file-noselect + (concat directory prefix ".IDX")))) + (article-buf (current-buffer)) + from head-line beg type) + (setq gnus-soup-buffers (cons msg-buf gnus-soup-buffers)) + (buffer-disable-undo msg-buf) + (and idx-buf + (progn + (setq gnus-soup-buffers (cons idx-buf gnus-soup-buffers)) + (buffer-disable-undo idx-buf))) + (save-excursion + ;; Make sure the last char in the buffer is a newline. + (goto-char (point-max)) + (or (= (current-column) 0) + (insert "\n")) + ;; Find the "from". + (goto-char (point-min)) + (setq from + (mail-strip-quoted-names + (or (mail-fetch-field "from") + (mail-fetch-field "really-from") + (mail-fetch-field "sender")))) + (goto-char (point-min)) + ;; Depending on what encoding is supposed to be used, we make + ;; a soup header. + (setq head-line + (cond + ((= gnus-soup-encoding-type ?n) + (format "#! rnews %d\n" (buffer-size))) + ((= gnus-soup-encoding-type ?m) + (while (search-forward "\nFrom " nil t) + (replace-match "\n>From " t t)) + (concat "From " (or from "unknown") + " " (current-time-string) "\n")) + ((= gnus-soup-encoding-type ?M) + "\^a\^a\^a\^a\n") + (t (error "Unsupported type: %c" gnus-soup-encoding-type)))) + ;; Insert the soup header and the article in the MSG buf. + (set-buffer msg-buf) + (goto-char (point-max)) + (insert head-line) + (setq beg (point)) + (insert-buffer-substring article-buf) + ;; Insert the index in the IDX buf. + (cond ((= index ?c) + (set-buffer idx-buf) + (gnus-soup-insert-idx beg headers)) + ((/= index ?n) + (error "Unknown index type: %c" type)))))) + + (defun gnus-soup-group-brew (group) + (let ((gnus-expert-user t) + (gnus-large-newsgroup nil)) + (and (gnus-summary-read-group group) + (let ((gnus-newsgroup-processable + (gnus-sorted-complement + gnus-newsgroup-unreads + (append gnus-newsgroup-dormant gnus-newsgroup-marked)))) + (gnus-soup-add-article nil))) + (gnus-summary-exit))) + + (defun gnus-soup-insert-idx (offset header) + ;; [number subject from date id references chars lines xref] + (goto-char (point-max)) + (insert + (format "%d\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t%s\t\n" + offset + (or (mail-header-subject header) "(none)") + (or (mail-header-from header) "(nobody)") + (or (mail-header-date header) "") + (or (mail-header-id header) + (concat "soup-dummy-id-" + (mapconcat + (lambda (time) (int-to-string time)) + (current-time) "-"))) + (or (mail-header-references header) "") + (or (mail-header-chars header) 0) + (or (mail-header-lines header) "0") + (or (mail-header-xref header) "")))) + + (defun gnus-soup-save-areas () + (gnus-soup-write-areas) + (save-excursion + (let (buf) + (while gnus-soup-buffers + (setq buf (car gnus-soup-buffers) + gnus-soup-buffers (cdr gnus-soup-buffers)) + (if (not (buffer-name buf)) + () + (set-buffer buf) + (and (buffer-modified-p) (save-buffer)) + (kill-buffer (current-buffer))))) + (let ((prefix gnus-soup-last-prefix)) + (while prefix + (gnus-set-work-buffer) + (insert (format "(setq gnus-soup-prev-prefix %d)\n" + (cdr (car prefix)))) + (write-region (point-min) (point-max) + (concat (car (car prefix)) + gnus-soup-prefix-file) + nil 'nomesg) + (setq prefix (cdr prefix)))))) + + (defun gnus-soup-pack (dir packer) + (let* ((files (mapconcat 'identity + '("AREAS" "*.MSG" "*.IDX" "INFO" + "LIST" "REPLIES" "COMMANDS" "ERRORS") + " ")) + (packer (if (< (string-match "%s" packer) + (string-match "%d" packer)) + (format packer files + (string-to-int (gnus-soup-unique-prefix dir))) + (format packer + (string-to-int (gnus-soup-unique-prefix dir)) + files))) + (dir (expand-file-name dir))) + (setq gnus-soup-areas nil) + (message "Packing %s..." packer) + (if (zerop (call-process "sh" nil nil nil "-c" + (concat "cd " dir " ; " packer))) + (progn + (call-process "sh" nil nil nil "-c" + (concat "cd " dir " ; rm " files)) + (message "Packing...done" packer)) + (error "Couldn't pack packet.")))) + + (defun gnus-soup-parse-areas (file) + "Parse soup area file FILE. + The result is a of vectors, each containing one entry from the AREA file. + The vector contain five strings, + [prefix name encoding description number] + though the two last may be nil if they are missing." + (let (areas) + (save-excursion + (set-buffer (find-file-noselect file 'force)) + (buffer-disable-undo (current-buffer)) + (goto-char (point-min)) + (while (not (eobp)) + (setq areas + (cons (vector (gnus-soup-field) + (gnus-soup-field) + (gnus-soup-field) + (and (eq (preceding-char) ?\t) + (gnus-soup-field)) + (and (eq (preceding-char) ?\t) + (string-to-int (gnus-soup-field)))) + areas)) + (if (eq (preceding-char) ?\t) + (beginning-of-line 2)))) + areas)) + + (defun gnus-soup-parse-replies (file) + "Parse soup REPLIES file FILE. + The result is a of vectors, each containing one entry from the REPLIES + file. The vector contain three strings, [prefix name encoding]." + (let (replies) + (save-excursion + (set-buffer (find-file-noselect file)) + (buffer-disable-undo (current-buffer)) + (goto-char (point-min)) + (while (not (eobp)) + (setq replies + (cons (vector (gnus-soup-field) (gnus-soup-field) + (gnus-soup-field)) + replies)) + (if (eq (preceding-char) ?\t) + (beginning-of-line 2)))) + replies)) + + (defun gnus-soup-field () + (prog1 + (buffer-substring (point) (progn (skip-chars-forward "^\t\n") (point))) + (forward-char 1))) + + (defun gnus-soup-read-areas () + (or gnus-soup-areas + (setq gnus-soup-areas + (gnus-soup-parse-areas (concat gnus-soup-directory "AREAS"))))) + + (defun gnus-soup-write-areas () + "Write all areas to disk." + (interactive) + (if (not gnus-soup-areas) + () + (save-excursion + (set-buffer (find-file-noselect + (concat gnus-soup-directory "AREAS"))) + (erase-buffer) + (let ((areas gnus-soup-areas) + area) + (while areas + (setq area (car areas) + areas (cdr areas)) + (insert (format "%s\t%s\t%s%s\n" + (gnus-soup-area-prefix area) + (gnus-soup-area-name area) + (gnus-soup-area-encoding area) + (if (or (gnus-soup-area-description area) + (gnus-soup-area-number area)) + (concat "\t" (or (gnus-soup-area-description + area) + "") + (if (gnus-soup-area-number area) + (concat "\t" + (int-to-string + (gnus-soup-area-number + area))) + "")) ""))))) + (write-region (point-min) (point-max) + (concat gnus-soup-directory "AREAS")) + (set-buffer-modified-p nil) + (kill-buffer (current-buffer))))) + + (defun gnus-soup-write-replies (dir areas) + (save-excursion + (set-buffer (find-file-noselect (concat dir "REPLIES"))) + (erase-buffer) + (let (area) + (while areas + (setq area (car areas) + areas (cdr areas)) + (insert (format "%s\t%s\t%s\n" + (gnus-soup-reply-prefix area) + (gnus-soup-reply-kind area) + (gnus-soup-reply-encoding area))))) + (write-region (point-min) (point-max) (concat dir "REPLIES")) + (set-buffer-modified-p nil) + (kill-buffer (current-buffer)))) + + (defun gnus-soup-area (group) + (gnus-soup-read-areas) + (let ((areas gnus-soup-areas) + (real-group (gnus-group-real-name group)) + area result) + (while areas + (setq area (car areas) + areas (cdr areas)) + (if (equal (gnus-soup-area-name area) real-group) + (setq result area))) + (or result + (setq result + (vector (gnus-soup-unique-prefix) + real-group + (format "%c%c%c" + gnus-soup-encoding-type + gnus-soup-index-type + (if (gnus-member-of-valid 'mail group) ?m ?n)) + nil nil) + gnus-soup-areas (cons result gnus-soup-areas))) + result)) + + (defun gnus-soup-unique-prefix (&optional dir) + (let* ((dir (file-name-as-directory (or dir gnus-soup-directory))) + (entry (assoc dir gnus-soup-last-prefix)) + gnus-soup-prev-prefix) + (if entry + () + (and (file-exists-p (concat dir gnus-soup-prefix-file)) + (condition-case nil + (load-file (concat dir gnus-soup-prefix-file)) + (error nil))) + (setq gnus-soup-last-prefix + (cons (setq entry (cons dir (or gnus-soup-prev-prefix 0))) + gnus-soup-last-prefix))) + (setcdr entry (1+ (cdr entry))) + (int-to-string (cdr entry)))) + + (defun gnus-soup-unpack-packet (dir unpacker packet) + (gnus-make-directory dir) + (message "Unpacking: %s" (format unpacker packet)) + (call-process + "sh" nil nil nil "-c" + (format "cd %s ; %s" (expand-file-name dir) (format unpacker packet))) + (message "Unpacking...done")) + + (defun gnus-soup-send-packet (packet) + (gnus-soup-unpack-packet + gnus-soup-replies-directory gnus-soup-unpacker packet) + (let ((replies (gnus-soup-parse-replies + (concat gnus-soup-replies-directory "REPLIES")))) + (save-excursion + (while replies + (let* ((msg-file (concat gnus-soup-replies-directory + (gnus-soup-reply-prefix (car replies)) + ".MSG")) + (msg-buf (and (file-exists-p msg-file) + (find-file-noselect msg-file))) + (tmp-buf (get-buffer-create " *soup send*")) + beg end) + (cond + ((/= (gnus-soup-encoding-format + (gnus-soup-reply-encoding (car replies))) ?n) + (error "Unsupported encoding")) + ((null msg-buf) + t) + (t + (buffer-disable-undo msg-buf) + (buffer-disable-undo tmp-buf) + (set-buffer msg-buf) + (goto-char (point-min)) + (while (not (eobp)) + (or (looking-at "#! *rnews +\\([0-9]+\\)") + (error "Bad header.")) + (forward-line 1) + (setq beg (point) + end (+ (point) (string-to-int + (buffer-substring + (match-beginning 1) (match-end 1))))) + (switch-to-buffer tmp-buf) + (erase-buffer) + (insert-buffer-substring msg-buf beg end) + (goto-char (point-min)) + (search-forward "\n\n") + (forward-char -1) + (insert mail-header-separator) + (cond + ((string= (gnus-soup-reply-kind (car replies)) "news") + (message "Sending news message to %s..." + (mail-fetch-field "newsgroups")) + (sit-for 1) + (gnus-inews-article)) + ((string= (gnus-soup-reply-kind (car replies)) "mail") + (message "Sending mail to %s..." + (mail-fetch-field "to")) + (sit-for 1) + (gnus-mail-send-and-exit)) + (t + (error "Unknown reply kind"))) + (set-buffer msg-buf) + (goto-char end)) + (delete-file (buffer-file-name)) + (kill-buffer msg-buf) + (kill-buffer tmp-buf) + (message "Sent packet")))) + (setq replies (cdr replies))) + t))) + + (provide 'gnus-soup) + + ;;; gnus-soup.el ends here *** pub/sgnus/lisp/gnus-uu.el Sat Sep 16 09:56:05 1995 --- sgnus/lisp/gnus-uu.el Wed Sep 20 17:34:53 1995 *************** *** 279,285 **** --- 279,287 ---- (define-key gnus-uu-mark-map "r" 'gnus-uu-mark-region) (define-key gnus-uu-mark-map "R" 'gnus-uu-mark-by-regexp) (define-key gnus-uu-mark-map "t" 'gnus-uu-mark-thread) + (define-key gnus-uu-mark-map "T" 'gnus-uu-unmark-thread) (define-key gnus-uu-mark-map "a" 'gnus-uu-mark-all) + (define-key gnus-uu-mark-map "b" 'gnus-uu-mark-buffer) (define-key gnus-uu-mark-map "S" 'gnus-uu-mark-sparse) (define-prefix-command 'gnus-uu-extract-map) *************** *** 473,479 **** (gnus-summary-set-process-mark (car articles)) (setq articles (cdr articles))) (message "")) ! (gnus-summary-position-cursor)) (defun gnus-uu-mark-series () "Mark the current series with the process mark." --- 475,481 ---- (gnus-summary-set-process-mark (car articles)) (setq articles (cdr articles))) (message "")) ! (gnus-summary-position-point)) (defun gnus-uu-mark-series () "Mark the current series with the process mark." *************** *** 484,493 **** (gnus-summary-set-process-mark (car articles)) (setq articles (cdr articles))) (message "")) ! (gnus-summary-position-cursor)) (defun gnus-uu-mark-region (beg end) ! "Marks all articles between point and mark." (interactive "r") (gnus-set-global-variables) (save-excursion --- 486,495 ---- (gnus-summary-set-process-mark (car articles)) (setq articles (cdr articles))) (message "")) ! (gnus-summary-position-point)) (defun gnus-uu-mark-region (beg end) ! "Set the process mark on all articles between point and mark." (interactive "r") (gnus-set-global-variables) (save-excursion *************** *** 495,501 **** (while (< (point) end) (gnus-summary-set-process-mark (gnus-summary-article-number)) (forward-line 1))) ! (gnus-summary-position-cursor)) (defun gnus-uu-mark-thread () "Marks all articles downwards in this thread." --- 497,508 ---- (while (< (point) end) (gnus-summary-set-process-mark (gnus-summary-article-number)) (forward-line 1))) ! (gnus-summary-position-point)) ! ! (defun gnus-uu-mark-buffer () ! "Set the process mark on all articles in the buffer." ! (interactive) ! (gnus-uu-mark-region (point-min) (point-max))) (defun gnus-uu-mark-thread () "Marks all articles downwards in this thread." *************** *** 505,511 **** (while (and (gnus-summary-set-process-mark (gnus-summary-article-number)) (zerop (gnus-summary-next-subject 1)) (> (gnus-summary-thread-level) level)))) ! (gnus-summary-position-cursor)) (defun gnus-uu-mark-sparse () "Mark all series that have some articles marked." --- 512,529 ---- (while (and (gnus-summary-set-process-mark (gnus-summary-article-number)) (zerop (gnus-summary-next-subject 1)) (> (gnus-summary-thread-level) level)))) ! (gnus-summary-position-point)) ! ! (defun gnus-uu-unmark-thread () ! "Unmarks all articles downwards in this thread." ! (interactive) ! (gnus-set-global-variables) ! (let ((level (gnus-summary-thread-level))) ! (while (and (gnus-summary-remove-process-mark ! (gnus-summary-article-number)) ! (zerop (gnus-summary-next-subject 1)) ! (> (gnus-summary-thread-level) level)))) ! (gnus-summary-position-point)) (defun gnus-uu-mark-sparse () "Mark all series that have some articles marked." *************** *** 517,523 **** (setq gnus-newsgroup-processable nil) (save-excursion (while marked ! (and (setq headers (gnus-get-header-by-number (car marked))) (setq subject (mail-header-subject headers) articles (gnus-uu-find-articles-matching (gnus-uu-reginize-string subject)) --- 535,541 ---- (setq gnus-newsgroup-processable nil) (save-excursion (while marked ! (and (setq headers (gnus-summary-article-header (car marked))) (setq subject (mail-header-subject headers) articles (gnus-uu-find-articles-matching (gnus-uu-reginize-string subject)) *************** *** 528,534 **** (setq articles (cdr articles))) (setq marked (cdr marked))) (setq gnus-newsgroup-processable (nreverse total))) ! (gnus-summary-position-cursor))) (defun gnus-uu-mark-all () "Mark all articles in \"series\" order." --- 546,552 ---- (setq articles (cdr articles))) (setq marked (cdr marked))) (setq gnus-newsgroup-processable (nreverse total))) ! (gnus-summary-position-point))) (defun gnus-uu-mark-all () "Mark all articles in \"series\" order." *************** *** 543,549 **** (if (not (memq number gnus-newsgroup-processable)) (save-excursion (gnus-uu-mark-series))) (forward-line 1)))) ! (gnus-summary-position-cursor)) ;; All PostScript functions written by Erik Selberg . --- 561,567 ---- (if (not (memq number gnus-newsgroup-processable)) (save-excursion (gnus-uu-mark-series))) (forward-line 1)))) ! (gnus-summary-position-point)) ;; All PostScript functions written by Erik Selberg . *************** *** 924,930 **** ;; non-nil, only unread articles are chosen. If DO-NOT-TRANSLATE is ;; non-nil, article names are not equalized before sorting. (let ((subject (or subject ! (gnus-uu-reginize-string (gnus-summary-subject-string)))) list-of-subjects) (save-excursion (if (not subject) --- 942,948 ---- ;; non-nil, only unread articles are chosen. If DO-NOT-TRANSLATE is ;; non-nil, article names are not equalized before sorting. (let ((subject (or subject ! (gnus-uu-reginize-string (gnus-summary-article-subject)))) list-of-subjects) (save-excursion (if (not subject) *************** *** 934,940 **** subj mark) (goto-char (point-min)) (while (not (eobp)) ! (and (setq subj (gnus-summary-subject-string)) (string-match subject subj) (or (not only-unread) (= (setq mark (gnus-summary-article-mark)) --- 952,958 ---- subj mark) (goto-char (point-min)) (while (not (eobp)) ! (and (setq subj (gnus-summary-article-subject)) (string-match subject subj) (or (not only-unread) (= (setq mark (gnus-summary-article-mark)) *************** *** 1158,1164 **** result-files)) (defun gnus-uu-part-number (article) ! (let ((subject (mail-header-subject (gnus-get-header-by-number article)))) (if (string-match "[0-9]+ */[0-9]+\\|[0-9]+ * of *[0-9]+" subject) (substring subject (match-beginning 0) (match-end 0)) --- 1176,1182 ---- result-files)) (defun gnus-uu-part-number (article) ! (let ((subject (mail-header-subject (gnus-summary-article-header article)))) (if (string-match "[0-9]+ */[0-9]+\\|[0-9]+ * of *[0-9]+" subject) (substring subject (match-beginning 0) (match-end 0)) *** pub/sgnus/lisp/gnus-vis.el Sat Sep 16 09:56:05 1995 --- sgnus/lisp/gnus-vis.el Tue Sep 19 15:58:59 1995 *************** *** 438,449 **** ["Set expirable mark" gnus-summary-mark-as-expirable t] ["Set bookmark" gnus-summary-set-bookmark t] ["Remove bookmark" gnus-summary-remove-bookmark t]) ! ("Display" ! ["Remove lines marked as read" gnus-summary-remove-lines-marked-as-read t] ! ["Remove lines marked with..." gnus-summary-remove-lines-marked-with t] ! ["Show dormant articles" gnus-summary-show-all-dormant t] ! ["Hide dormant articles" gnus-summary-hide-all-dormant t] ! ["Show expunged articles" gnus-summary-show-all-expunged t]) ("Process mark" ["Set mark" gnus-summary-mark-as-processable t] ["Remove mark" gnus-summary-unmark-as-processable t] --- 438,453 ---- ["Set expirable mark" gnus-summary-mark-as-expirable t] ["Set bookmark" gnus-summary-set-bookmark t] ["Remove bookmark" gnus-summary-remove-bookmark t]) ! ("Limit" ! ["Unread" gnus-summary-limit-to-unread t] ! ["Marks" gnus-summary-limit-to-marks t] ! ["Score" gnus-summary-limit-to-score t] ! ["Subject" gnus-summary-limit-to-subject t] ! ["Non-dormant" gnus-summary-limit-exclude-dormant t] ! ["Articles" gnus-summary-limit-to-articles t] ! ["Pop limit" gnus-summary-pop-limit t] ! ["Show dormant" gnus-summary-limit-include-dormant t] ! ["Show expunged" gnus-summary-show-all-expunged t]) ("Process mark" ["Set mark" gnus-summary-mark-as-processable t] ["Remove mark" gnus-summary-unmark-as-processable t] *************** *** 452,457 **** --- 456,462 ---- ["Mark region" gnus-uu-mark-region t] ["Mark by regexp" gnus-uu-mark-by-regexp t] ["Mark all" gnus-uu-mark-all t] + ["Mark buffer" gnus-uu-mark-buffer t] ["Mark sparse" gnus-uu-mark-sparse t] ["Mark thread" gnus-uu-mark-thread t])) ("Move" *************** *** 638,643 **** --- 643,649 ---- ("Date" ["Local" gnus-article-date-local t] ["UT" gnus-article-date-ut t] + ["Original" gnus-article-date-original t] ["Lapsed" gnus-article-date-lapsed t]) ("Filter" ["Overstrike" gnus-article-treat-overstrike t] *************** *** 678,683 **** --- 684,690 ---- ["Beginning of the article" gnus-summary-beginning-of-article t] ["End of the article" gnus-summary-end-of-article t] ["Fetch parent of article" gnus-summary-refer-parent-article t] + ["Fetch referenced articles" gnus-summary-refer-references t] ["Fetch article with id..." gnus-summary-refer-article t] ["Redisplay" gnus-summary-show-article t])) *************** *** 939,950 **** (end (progn (end-of-line) (point))) ;; now find out where the line starts and leave point there. (beg (progn (beginning-of-line) (point))) ! (score (or (cdr (assq (or (get-text-property beg 'gnus-number) gnus-current-article) gnus-newsgroup-scored)) gnus-summary-default-score 0)) (default gnus-summary-default-score) ! (mark (get-text-property beg 'gnus-mark)) (inhibit-read-only t)) (while (and list (not (eval (car (car list))))) (setq list (cdr list))) --- 946,957 ---- (end (progn (end-of-line) (point))) ;; now find out where the line starts and leave point there. (beg (progn (beginning-of-line) (point))) ! (score (or (cdr (assq (or (gnus-summary-article-number) gnus-current-article) gnus-newsgroup-scored)) gnus-summary-default-score 0)) (default gnus-summary-default-score) ! (mark (gnus-summary-article-mark)) (inhibit-read-only t)) (while (and list (not (eval (car (car list))))) (setq list (cdr list))) *** pub/sgnus/lisp/gnus.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/gnus.el Thu Sep 21 00:44:15 1995 *************** *** 93,101 **** (setq gnus-select-method '(nntp \"my.nntp.server\" (nntp-port-number 899)))") (defvar gnus-select-method (nconc ! (list 'nntp (or (getenv "NNTPSERVER") (if (and gnus-default-nntp-server (not (string= gnus-default-nntp-server ""))) gnus-default-nntp-server) --- 93,123 ---- (setq gnus-select-method '(nntp \"my.nntp.server\" (nntp-port-number 899)))") + (defvar gnus-nntpserver-file "/etc/nntpserver" + "*A file with only the name of the nntp server in it.") + + ;; This function is used to check both the environment variable + ;; NNTPSERVER and the /etc/nntpserver file to see whether one can find + ;; an nntp server name default. + (defun gnus-getenv-nntpserver () + (or (getenv "NNTPSERVER") + (and (file-readable-p gnus-nntpserver-file) + (save-excursion + (set-buffer (get-buffer-create " *gnus nntp*")) + (buffer-disable-undo (current-buffer)) + (insert-file-contents gnus-nntpserver-file) + (let ((name (buffer-string))) + (prog1 + (if (string-match "^[ \t\n]*$" name) + nil + name) + (kill-buffer (current-buffer)))))))) + (defvar gnus-select-method (nconc ! (list 'nntp (or (condition-case () ! (gnus-getenv-nntpserver) ! (error nil)) (if (and gnus-default-nntp-server (not (string= gnus-default-nntp-server ""))) gnus-default-nntp-server) *************** *** 222,230 **** (defvar gnus-asynchronous nil "*If non-nil, Gnus will supply backends with data needed for async article fetching.") - (defvar gnus-asynchronous-article-function nil - "*Function for picking articles to pre-fetch, possibly.") - (defvar gnus-score-file-single-match-alist nil "*Alist mapping regexps to lists of score files. Each element of this alist should be of the form --- 244,249 ---- *************** *** 368,375 **** will attempt to grab the headers to the old articles, and thereby build complete threads. If it has the value `some', only enough headers to connect otherwise loose threads will be displayed. ! The server has to support XOVER for any of this to work.") ;see gnus-cus.el ;(defvar gnus-visual t --- 387,396 ---- will attempt to grab the headers to the old articles, and thereby build complete threads. If it has the value `some', only enough headers to connect otherwise loose threads will be displayed. + This variable can also be a number. In that case, no more than that + number of old headers will be fetched. ! The server has to support NOV for any of this to work.") ;see gnus-cus.el ;(defvar gnus-visual t *************** *** 430,435 **** --- 451,462 ---- subject fields. (Or rather, they will be printed with a string given by the `gnus-summary-same-subject' variable.)") + (defvar gnus-summary-gather-exclude-subject "^ *$\\|^(none)$" + "*A regexp to match subjects to be excluded from loose thread gathering. + As loose thread gathering is done on subjects only, that means that + there can be many false gatherings performed. By rooting out certain + common subjects, gathering might become saner.") + (defvar gnus-summary-gather-subject-limit nil "*Maximum length of subject comparisons when gathering loose threads. Use nil to compare full subjects. Setting this variable to a low *************** *** 573,580 **** will not be marked.") (defvar gnus-simplify-subject-fuzzy-regexp nil ! "*Regular expression that will be removed from subject strings if ! fuzzy subject simplification is selected.") (defvar gnus-group-default-list-level gnus-level-subscribed "*Default listing level. --- 600,607 ---- will not be marked.") (defvar gnus-simplify-subject-fuzzy-regexp nil ! "*Regular expression or list of regular expressions that will be removed ! from subject strings if fuzzy subject simplification is selected.") (defvar gnus-group-default-list-level gnus-level-subscribed "*Default listing level. *************** *** 731,736 **** --- 758,766 ---- (mail-forward ([mail 1.0 point])) (post-forward ([post 1.0 point])) (reply-yank ([mail 1.0 point])) + (mail-bounce ([article 0.5] + [mail 1.0 point])) + (draft ([draft 1.0 point])) (followup ([article 0.5] [post 1.0 point])) (followup-yank ([post 1.0 point]))) *************** *** 764,770 **** (edit-score . gnus-score-edit-buffer) (mail . gnus-mail-buffer) (post . gnus-post-news-buffer) ! (faq . gnus-faq-buffer)) "Mapping from short symbols to buffer names or buffer variables.") (defvar gnus-carpal nil --- 794,801 ---- (edit-score . gnus-score-edit-buffer) (mail . gnus-mail-buffer) (post . gnus-post-news-buffer) ! (faq . gnus-faq-buffer) ! (draft . gnus-draft-buffer)) "Mapping from short symbols to buffer names or buffer variables.") (defvar gnus-carpal nil *************** *** 995,1001 **** ("nndoc" none prompt-address) ("nnbabyl" mail respool) ("nnkiboze" post virtual) ! ;;("nnsoup" post) ("nnfolder" mail respool)) "An alist of valid select methods. The first element of each list lists should be a string with the name --- 1026,1032 ---- ("nndoc" none prompt-address) ("nnbabyl" mail respool) ("nnkiboze" post virtual) ! ("nnsoup" post) ("nnfolder" mail respool)) "An alist of valid select methods. The first element of each list lists should be a string with the name *************** *** 1064,1069 **** --- 1095,1107 ---- If non-nil, this should be a regexp that should match all groups in which to perform auto-expiry. This only makes sense for mail groups.") + (defvar gnus-total-expirable-newsgroups nil + "*Groups in which to perform expiry of all read articles. + Use with extreme caution. All groups that match this regexp will be + expiring - which means that all read articles will be deleted after + (say) one week. (This only goes for mail groups and the like, of + course.)") + (defvar gnus-hidden-properties '(invisible t intangible t) "Property list to use for hiding text.") *************** *** 1253,1259 **** (defvar gnus-current-move-group nil) (defvar gnus-newsgroup-dependencies nil) - (defvar gnus-newsgroup-threads nil) (defvar gnus-newsgroup-async nil) (defconst gnus-group-edit-buffer "*Gnus edit newsgroup*") --- 1291,1296 ---- *************** *** 1329,1334 **** --- 1366,1372 ---- (defconst gnus-summary-mode-line-format-alist (list (list ?G 'group-name ?s) (list ?g '(gnus-short-group-name group-name) ?s) + (list ?p '(gnus-group-real-name group-name) ?s) (list ?A 'article-number ?d) (list ?Z 'unread-and-unselected ?s) (list ?V 'gnus-version ?s) *************** *** 1349,1355 **** "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "Gnus v5.0.4" "Version number for this version of Gnus.") (defvar gnus-info-nodes --- 1387,1393 ---- "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.01" "Version number for this version of Gnus.") (defvar gnus-info-nodes *************** *** 1374,1379 **** --- 1412,1420 ---- (defvar gnus-server-alist nil "List of available servers.") + (defvar gnus-slave nil + "Whether this Gnus is a slave or not.") + (defvar gnus-variable-list '(gnus-newsrc-options gnus-newsrc-options-n gnus-newsrc-last-checked-date *************** *** 1451,1456 **** --- 1492,1502 ---- (defvar gnus-newsgroup-auto-expire nil) (defvar gnus-newsgroup-active nil) + (defvar gnus-newsgroup-data nil) + (defvar gnus-newsgroup-data-reverse nil) + (defvar gnus-newsgroup-limit nil) + (defvar gnus-newsgroup-limits nil) + (defvar gnus-newsgroup-unreads nil "List of unread articles in the current newsgroup.") *************** *** 1488,1494 **** (defvar gnus-newsgroup-headers nil "List of article headers in the current newsgroup.") - (defvar gnus-newsgroup-headers-hashtb-by-number nil) (defvar gnus-newsgroup-ancient nil "List of `gnus-fetch-old-headers' articles in the current newsgroup.") --- 1534,1539 ---- *************** *** 1533,1549 **** gnus-newsgroup-replied gnus-newsgroup-expirable gnus-newsgroup-processable gnus-newsgroup-killed gnus-newsgroup-bookmarks gnus-newsgroup-dormant ! gnus-newsgroup-headers gnus-newsgroup-headers-hashtb-by-number gnus-current-article gnus-current-headers gnus-have-all-headers gnus-last-article gnus-article-internal-prepare-hook gnus-newsgroup-dependencies gnus-newsgroup-selected-overlay gnus-newsgroup-scored gnus-newsgroup-kill-headers ! gnus-newsgroup-threads gnus-newsgroup-async gnus-score-alist gnus-current-score-file gnus-summary-expunge-below gnus-summary-mark-below gnus-newsgroup-active gnus-scores-exclude-files gnus-newsgroup-history gnus-newsgroup-ancient (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring) ! gnus-cache-removeable-articles) "Variables that are buffer-local to the summary buffers.") (defconst gnus-bug-message --- 1578,1596 ---- gnus-newsgroup-replied gnus-newsgroup-expirable gnus-newsgroup-processable gnus-newsgroup-killed gnus-newsgroup-bookmarks gnus-newsgroup-dormant ! gnus-newsgroup-headers gnus-current-article gnus-current-headers gnus-have-all-headers gnus-last-article gnus-article-internal-prepare-hook gnus-newsgroup-dependencies gnus-newsgroup-selected-overlay gnus-newsgroup-scored gnus-newsgroup-kill-headers ! gnus-newsgroup-async gnus-score-alist gnus-current-score-file gnus-summary-expunge-below gnus-summary-mark-below gnus-newsgroup-active gnus-scores-exclude-files gnus-newsgroup-history gnus-newsgroup-ancient (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring) ! gnus-cache-removeable-articles ! gnus-newsgroup-data gnus-newsgroup-data-reverse ! gnus-newsgroup-limit gnus-newsgroup-limits) "Variables that are buffer-local to the summary buffers.") (defconst gnus-bug-message *************** *** 1581,1586 **** --- 1628,1634 ---- (autoload 'mail-extract-address-components "mail-extr") (autoload 'nnmail-split-fancy "nnmail") + (autoload 'nnmail-article-group "nnmail") (autoload 'nnvirtual-catchup-group "nnvirtual") ;; timezone *************** *** 1601,1613 **** (autoload 'rmail-show-message "rmail") ;; gnus-soup ! ;;(autoload 'gnus-group-brew-soup "gnus-soup" nil t) ! ;;(autoload 'gnus-brew-soup "gnus-soup" nil t) ! ;;(autoload 'gnus-soup-add-article "gnus-soup" nil t) ! ;;(autoload 'gnus-soup-send-replies "gnus-soup" nil t) ! ;;(autoload 'gnus-soup-save-areas "gnus-soup" nil t) ! ;;(autoload 'gnus-soup-pack-packet "gnus-soup" nil t) ! ;;(autoload 'nnsoup-pack-replies "nnsoup" nil t) ;; gnus-mh (autoload 'gnus-mail-reply-using-mhe "gnus-mh") --- 1649,1661 ---- (autoload 'rmail-show-message "rmail") ;; gnus-soup ! (autoload 'gnus-group-brew-soup "gnus-soup" nil t) ! (autoload 'gnus-brew-soup "gnus-soup" nil t) ! (autoload 'gnus-soup-add-article "gnus-soup" nil t) ! (autoload 'gnus-soup-send-replies "gnus-soup" nil t) ! (autoload 'gnus-soup-save-areas "gnus-soup" nil t) ! (autoload 'gnus-soup-pack-packet "gnus-soup" nil t) ! (autoload 'nnsoup-pack-replies "nnsoup" nil t) ;; gnus-mh (autoload 'gnus-mail-reply-using-mhe "gnus-mh") *************** *** 1727,1732 **** --- 1775,1781 ---- (autoload 'gnus-mail-other-window-using-mail "gnus-msg") (autoload 'gnus-article-mail "gnus-msg") (autoload 'gnus-bug "gnus-msg" nil t) + (autoload 'gnus-inews-message-id "gnus-msg") ;; gnus-vm (autoload 'gnus-summary-save-in-vm "gnus-vm" nil t) *************** *** 1743,1750 **** ;; Fix by Hallvard B Furuseth . ;; If you want the cursor to go somewhere else, set these two ;; functions in some startup hook to whatever you want. ! (defalias 'gnus-summary-position-cursor 'gnus-goto-colon) ! (defalias 'gnus-group-position-cursor 'gnus-goto-colon) ;;; Various macros and substs. --- 1792,1799 ---- ;; Fix by Hallvard B Furuseth . ;; If you want the cursor to go somewhere else, set these two ;; functions in some startup hook to whatever you want. ! (defalias 'gnus-summary-position-point 'gnus-goto-colon) ! (defalias 'gnus-group-position-point 'gnus-goto-colon) ;;; Various macros and substs. *************** *** 2332,2342 **** (buffer-string)))) (defun gnus-simplify-buffer-fuzzy () - (goto-char (point-min)) ;; Fix by Stainless Steel Rat . ! (while (re-search-forward "^[ \t]*\\(re\\|fwd\\)[[{(^0-9]*[])}]?[:;][ \t]*" ! nil t) ! (replace-match "" t t)) (goto-char (point-min)) (while (re-search-forward "[ \t\n]*([^()]*)[ \t\n]*$" nil t) (replace-match "" t t)) --- 2381,2402 ---- (buffer-string)))) (defun gnus-simplify-buffer-fuzzy () ;; Fix by Stainless Steel Rat . ! (goto-char (point-min)) ! (while (or ! (looking-at "^[ \t]*\\(re\\|fwd\\)[[{(^0-9]*[])}]?[:;][ \t]*") ! (looking-at "^[[].*:[ \t].*[]]$")) ! (goto-char (point-min)) ! (while (re-search-forward "^[ \t]*\\(re\\|fwd\\)[[{(^0-9]*[])}]?[:;][ \t]*" ! nil t) ! (replace-match "" t t)) ! (goto-char (point-min)) ! (while (re-search-forward "^[[].*:[ \t].*[]]$" nil t) ! (let ((beg (match-beginning 0)) ! (end (match-end 0))) ! (goto-char end) (delete-char -1) ! (goto-char beg) (delete-region beg (re-search-forward ":" nil t)) ! ))) (goto-char (point-min)) (while (re-search-forward "[ \t\n]*([^()]*)[ \t\n]*$" nil t) (replace-match "" t t)) *************** *** 2349,2357 **** (goto-char (point-min)) (while (re-search-forward "^[ \t]+" nil t) (replace-match "" t t)) (if gnus-simplify-subject-fuzzy-regexp ! (while (re-search-forward gnus-simplify-subject-fuzzy-regexp nil t) ! (replace-match "" t t)))) ;; Add the current buffer to the list of buffers to be killed on exit. (defun gnus-add-current-to-buffer-list () --- 2409,2426 ---- (goto-char (point-min)) (while (re-search-forward "^[ \t]+" nil t) (replace-match "" t t)) + (goto-char (point-min)) (if gnus-simplify-subject-fuzzy-regexp ! (if (listp gnus-simplify-subject-fuzzy-regexp) ! (let ((list gnus-simplify-subject-fuzzy-regexp)) ! (while list ! (goto-char (point-min)) ! (while (re-search-forward (car list) nil t) ! (replace-match "" t t)) ! (setq list (cdr list)))) ! (while (re-search-forward gnus-simplify-subject-fuzzy-regexp nil t) ! (replace-match "" t t)) ! ))) ;; Add the current buffer to the list of buffers to be killed on exit. (defun gnus-add-current-to-buffer-list () *************** *** 2416,2422 **** gnus-moderated-list nil gnus-description-hashtb nil gnus-newsgroup-headers nil - gnus-newsgroup-headers-hashtb-by-number nil gnus-newsgroup-name nil gnus-server-alist nil gnus-current-select-method nil) --- 2485,2490 ---- *************** *** 2760,2765 **** --- 2828,2874 ---- (let ((group (or group gnus-newsgroup-name))) (not (gnus-check-backend-function 'request-replace-article group)))) + (defun gnus-group-total-expirable-p (group) + "Check whether GROUP is total-expirable or not." + (let ((params (nth 5 (nth 2 (gnus-gethash group gnus-newsrc-hashtb))))) + (or (memq 'total-expire params) + (cdr (assq 'total-expire params)) ; (total-expire . t) + (and gnus-total-expirable-newsgroups ; Check var. + (string-match gnus-total-expirable-newsgroups group))))) + + (defun gnus-group-auto-expirable-p (group) + "Check whether GROUP is total-expirable or not." + (let ((params (nth 5 (nth 2 (gnus-gethash group gnus-newsrc-hashtb))))) + (or (memq 'auto-expire params) + (cdr (assq 'auto-expire params)) ; (auto-expire . t) + (and gnus-auto-expirable-newsgroups ; Check var. + (string-match gnus-auto-expirable-newsgroups group))))) + + (defun gnus-subject-equal (s1 s2) + "Check whether two subjects are equal." + (cond + ((null gnus-summary-gather-subject-limit) + (equal (gnus-simplify-subject-re s1) + (gnus-simplify-subject-re s2))) + ((eq gnus-summary-gather-subject-limit 'fuzzy) + (equal (gnus-simplify-subject-fuzzy s1) + (gnus-simplify-subject-fuzzy s2))) + ((numberp gnus-summary-gather-subject-limit) + (equal (gnus-limit-string s1 gnus-summary-gather-subject-limit) + (gnus-limit-string s2 gnus-summary-gather-subject-limit))) + (t + (equal s1 s2)))) + + ;; Returns a list of writable groups. + (defun gnus-writable-groups () + (let ((alist gnus-newsrc-alist) + groups) + (while alist + (or (gnus-group-read-only-p (car (car alist))) + (setq groups (cons (car (car alist)) groups))) + (setq alist (cdr alist))) + (nreverse groups))) + ;; Two silly functions to ensure that all `y-or-n-p' questions clear ;; the echo area. (defun gnus-y-or-n-p (prompt) *************** *** 3154,3164 **** (define-key gnus-group-group-map "V" 'gnus-group-make-empty-virtual) (define-key gnus-group-group-map "D" 'gnus-group-enter-directory) (define-key gnus-group-group-map "f" 'gnus-group-make-doc-group) ! ;;(define-key gnus-group-group-map "sb" 'gnus-group-brew-soup) ! ;;(define-key gnus-group-group-map "sw" 'gnus-soup-save-areas) ! ;;(define-key gnus-group-group-map "ss" 'gnus-soup-send-replies) ! ;;(define-key gnus-group-group-map "sp" 'gnus-soup-pack-packet) ! ;;(define-key gnus-group-group-map "sr" 'nnsoup-pack-replies) (define-prefix-command 'gnus-group-list-map) (define-key gnus-group-mode-map "A" 'gnus-group-list-map) --- 3263,3273 ---- (define-key gnus-group-group-map "V" 'gnus-group-make-empty-virtual) (define-key gnus-group-group-map "D" 'gnus-group-enter-directory) (define-key gnus-group-group-map "f" 'gnus-group-make-doc-group) ! (define-key gnus-group-group-map "sb" 'gnus-group-brew-soup) ! (define-key gnus-group-group-map "sw" 'gnus-soup-save-areas) ! (define-key gnus-group-group-map "ss" 'gnus-soup-send-replies) ! (define-key gnus-group-group-map "sp" 'gnus-soup-pack-packet) ! (define-key gnus-group-group-map "sr" 'nnsoup-pack-replies) (define-prefix-command 'gnus-group-list-map) (define-key gnus-group-mode-map "A" 'gnus-group-list-map) *************** *** 3249,3255 **** (gnus (or arg (1- gnus-level-default-subscribed)) t)) ;;;###autoload ! (defun gnus (&optional arg dont-connect) "Read network news. If ARG is non-nil and a positive number, Gnus will use that as the startup level. If ARG is non-nil and not a positive number, Gnus will --- 3358,3370 ---- (gnus (or arg (1- gnus-level-default-subscribed)) t)) ;;;###autoload ! (defun gnus-slave (&optional arg) ! "Read news as a slave." ! (interactive "P") ! (gnus arg nil 'slave)) ! ! ;;;###autoload ! (defun gnus (&optional arg dont-connect slave) "Read network news. If ARG is non-nil and a positive number, Gnus will use that as the startup level. If ARG is non-nil and not a positive number, Gnus will *************** *** 3265,3270 **** --- 3380,3387 ---- (nnheader-init-server-buffer) (gnus-read-init-file) + (setq gnus-slave slave) + (gnus-group-setup-buffer) (let ((buffer-read-only nil)) (erase-buffer) *************** *** 3291,3297 **** (gnus-make-newsrc-file gnus-startup-file)) ;; Read the dribble file. ! (and gnus-use-dribble-file (gnus-dribble-read-file)) (gnus-summary-make-display-table) (gnus-setup-news nil level) --- 3408,3414 ---- (gnus-make-newsrc-file gnus-startup-file)) ;; Read the dribble file. ! (and (or gnus-slave gnus-use-dribble-file) (gnus-dribble-read-file)) (gnus-summary-make-display-table) (gnus-setup-news nil level) *************** *** 3440,3446 **** (or newsrc (progn (goto-char (point-max)) (forward-line -1)))))) ;; Adjust cursor point. ! (gnus-group-position-cursor)))) (defun gnus-group-prepare-flat (level &optional all lowest regexp) "List all newsgroups with unread articles of level LEVEL or lower. --- 3557,3563 ---- (or newsrc (progn (goto-char (point-max)) (forward-line -1)))))) ;; Adjust cursor point. ! (gnus-group-position-point)))) (defun gnus-group-prepare-flat (level &optional all lowest regexp) "List all newsgroups with unread articles of level LEVEL or lower. *************** *** 3626,3632 **** (delete-region (point) (progn (forward-line 1) (point))) (gnus-group-insert-group-line-info group) (forward-line -1) ! (gnus-group-position-cursor))) (defun gnus-group-insert-group-line-info (group) (let ((entry (gnus-gethash group gnus-newsrc-hashtb)) --- 3743,3749 ---- (delete-region (point) (progn (forward-line 1) (point))) (gnus-group-insert-group-line-info group) (forward-line -1) ! (gnus-group-position-point))) (defun gnus-group-insert-group-line-info (group) (let ((entry (gnus-gethash group gnus-newsrc-hashtb)) *************** *** 3816,3822 **** nil)))))))) (zerop (forward-line way))))) (if found ! (progn (gnus-group-position-cursor) t) (goto-char (or pos beg)) (and pos t)))) --- 3933,3939 ---- nil)))))))) (zerop (forward-line way))))) (if found ! (progn (gnus-group-position-point) t) (goto-char (or pos beg)) (and pos t)))) *************** *** 3847,3853 **** t) (or no-advance (zerop (gnus-group-next-group 1)))) (setq n (1- n))) ! (gnus-summary-position-cursor) n)) (defun gnus-group-unmark-group (n) --- 3964,3970 ---- t) (or no-advance (zerop (gnus-group-next-group 1)))) (setq n (1- n))) ! (gnus-summary-position-point) n)) (defun gnus-group-unmark-group (n) *************** *** 3983,3989 **** (goto-char (text-property-any (point-min) (point-max) 'gnus-group (intern group))))) ;; Adjust cursor point. ! (gnus-group-position-cursor)) (defun gnus-group-goto-group (group) "Goto to newsgroup GROUP." --- 4100,4106 ---- (goto-char (text-property-any (point-min) (point-max) 'gnus-group (intern group))))) ;; Adjust cursor point. ! (gnus-group-position-point)) (defun gnus-group-goto-group (group) "Goto to newsgroup GROUP." *************** *** 4040,4046 **** done." (interactive "p") (gnus-group-next-unread-group n t (gnus-group-group-level)) ! (gnus-group-position-cursor)) (defun gnus-group-prev-unread-group-same-level (n) "Go to next N'th unread newsgroup on the same level. --- 4157,4163 ---- done." (interactive "p") (gnus-group-next-unread-group n t (gnus-group-group-level)) ! (gnus-group-position-point)) (defun gnus-group-prev-unread-group-same-level (n) "Go to next N'th unread newsgroup on the same level. *************** *** 4048,4054 **** done." (interactive "p") (gnus-group-next-unread-group (- n) t (gnus-group-group-level)) ! (gnus-group-position-cursor)) (defun gnus-group-best-unread-group (&optional exclude-group) "Go to the group with the highest level. --- 4165,4171 ---- done." (interactive "p") (gnus-group-next-unread-group (- n) t (gnus-group-group-level)) ! (gnus-group-position-point)) (defun gnus-group-best-unread-group (&optional exclude-group) "Go to the group with the highest level. *************** *** 4068,4074 **** (setq best-point (point)))))) (forward-line 1)) (if best-point (goto-char best-point)) ! (gnus-summary-position-cursor) (and best-point (gnus-group-group-name)))) (defun gnus-group-first-unread-group () --- 4185,4191 ---- (setq best-point (point)))))) (forward-line 1)) (if best-point (goto-char best-point)) ! (gnus-summary-position-point) (and best-point (gnus-group-group-name)))) (defun gnus-group-first-unread-group () *************** *** 4084,4090 **** (point) ; Success. (goto-char opoint) nil)) ; Not success. ! (gnus-group-position-cursor))) (defun gnus-group-enter-server-mode () "Jump to the server buffer." --- 4201,4207 ---- (point) ; Success. (goto-char opoint) nil)) ; Not success. ! (gnus-group-position-point))) (defun gnus-group-enter-server-mode () "Jump to the server buffer." *************** *** 4112,4138 **** "")) (list method nil))))) ! (let* ((meth (and method (if address (list (intern method) address) method))) ! (nname (if method (gnus-group-prefixed-name name meth) name)) ! info) ! (and (gnus-gethash nname gnus-newsrc-hashtb) ! (error "Group %s already exists" nname)) ! (gnus-group-change-level ! (setq info (list t nname gnus-level-default-subscribed nil nil meth)) ! gnus-level-default-subscribed gnus-level-killed ! (and (gnus-group-group-name) ! (gnus-gethash (gnus-group-group-name) ! gnus-newsrc-hashtb)) ! t) ! (gnus-sethash nname (cons 1 0) gnus-active-hashtb) ! (gnus-dribble-enter ! (concat "(gnus-group-set-info '" (prin1-to-string (cdr info)) ")")) ! (gnus-group-insert-group-line-info nname) ! ! (if (assoc method gnus-valid-select-methods) ! (require (intern method))) ! (and (gnus-check-backend-function 'request-create-group nname) ! (gnus-request-create-group nname)))) (defun gnus-group-edit-group (group &optional part) "Edit the group on the current line." --- 4229,4258 ---- "")) (list method nil))))) ! (save-excursion ! (set-buffer gnus-group-buffer) ! (let* ((meth (and method (if address (list (intern method) address) ! method))) ! (nname (if method (gnus-group-prefixed-name name meth) name)) ! info) ! (and (gnus-gethash nname gnus-newsrc-hashtb) ! (error "Group %s already exists" nname)) ! (gnus-group-change-level ! (setq info (list t nname gnus-level-default-subscribed nil nil meth)) ! gnus-level-default-subscribed gnus-level-killed ! (and (gnus-group-group-name) ! (gnus-gethash (gnus-group-group-name) ! gnus-newsrc-hashtb)) ! t) ! (gnus-sethash nname (cons 1 0) gnus-active-hashtb) ! (gnus-dribble-enter ! (concat "(gnus-group-set-info '" (prin1-to-string (cdr info)) ")")) ! (gnus-group-insert-group-line-info nname) ! ! (if (assoc method gnus-valid-select-methods) ! (require (intern method))) ! (and (gnus-check-backend-function 'request-create-group nname) ! (gnus-request-create-group nname))))) (defun gnus-group-edit-group (group &optional part) "Edit the group on the current line." *************** *** 4213,4219 **** (and winconf (set-window-configuration winconf)) (set-buffer gnus-group-buffer) (gnus-group-update-group (gnus-group-group-name)) ! (gnus-group-position-cursor))) (defun gnus-group-make-help-group () "Create the Gnus documentation group." --- 4333,4339 ---- (and winconf (set-window-configuration winconf)) (set-buffer gnus-group-buffer) (gnus-group-update-group (gnus-group-group-name)) ! (gnus-group-position-point))) (defun gnus-group-make-help-group () "Create the Gnus documentation group." *************** *** 4235,4241 **** (list 'nndoc-address (concat (file-name-as-directory (car path)) "doc.txt")) (list 'nndoc-article-type 'mbox)))) ! (gnus-group-position-cursor)) (defun gnus-group-make-doc-group (file type) "Create a group that uses a single file as the source." --- 4355,4361 ---- (list 'nndoc-address (concat (file-name-as-directory (car path)) "doc.txt")) (list 'nndoc-article-type 'mbox)))) ! (gnus-group-position-point)) (defun gnus-group-make-doc-group (file type) "Create a group that uses a single file as the source." *************** *** 4274,4280 **** "nndir" (if all gnus-group-archive-directory gnus-group-recent-archive-directory))) ! (gnus-group-position-cursor)) (defun gnus-group-make-directory-group (dir) "Create an nndir group. --- 4394,4400 ---- "nndir" (if all gnus-group-archive-directory gnus-group-recent-archive-directory))) ! (gnus-group-position-point)) (defun gnus-group-make-directory-group (dir) "Create an nndir group. *************** *** 4286,4292 **** (or (file-exists-p dir) (error "No such directory")) (or (file-directory-p dir) (error "Not a directory")) (gnus-group-make-group dir "nndir" dir) ! (gnus-group-position-cursor)) (defun gnus-group-make-kiboze-group (group address scores) "Create an nnkiboze group. --- 4406,4412 ---- (or (file-exists-p dir) (error "No such directory")) (or (file-directory-p dir) (error "Not a directory")) (gnus-group-make-group dir "nndir" dir) ! (gnus-group-position-point)) (defun gnus-group-make-kiboze-group (group address scores) "Create an nnkiboze group. *************** *** 4317,4323 **** (write-region (point-min) (point-max) (concat (or gnus-kill-files-directory "~/News") "nnkiboze:" group "." gnus-score-file-suffix))) ! (gnus-group-position-cursor)) (defun gnus-group-add-to-virtual (n vgroup) "Add the current group to a virtual group." --- 4437,4443 ---- (write-region (point-min) (point-max) (concat (or gnus-kill-files-directory "~/News") "nnkiboze:" group "." gnus-score-file-suffix))) ! (gnus-group-position-point)) (defun gnus-group-add-to-virtual (n vgroup) "Add the current group to a virtual group." *************** *** 4337,4343 **** (gnus-group-remove-mark s) (concat "\\(^" (regexp-quote s) "$\\)")) groups "\\|")))) ! (gnus-group-position-cursor)) (defun gnus-group-make-empty-virtual (group) "Create a new, fresh, empty virtual group." --- 4457,4463 ---- (gnus-group-remove-mark s) (concat "\\(^" (regexp-quote s) "$\\)")) groups "\\|")))) ! (gnus-group-position-point)) (defun gnus-group-make-empty-virtual (group) "Create a new, fresh, empty virtual group." *************** *** 4351,4357 **** (gnus-subscribe-group pgroup (gnus-group-group-name) method) (gnus-group-update-group pgroup) (forward-line -1) ! (gnus-group-position-cursor))) (defun gnus-group-enter-directory (dir) "Enter an ephemeral nneething group." --- 4471,4477 ---- (gnus-subscribe-group pgroup (gnus-group-group-name) method) (gnus-group-update-group pgroup) (forward-line -1) ! (gnus-group-position-point))) (defun gnus-group-enter-directory (dir) "Enter an ephemeral nneething group." *************** *** 4469,4475 **** (if (not (gnus-check-backend-function 'request-expire-articles group)) () (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) ! (expirable (if (memq 'total-expire (nth 5 info)) (cons nil (gnus-list-of-read-articles group)) (assq 'expire (nth 3 info))))) (and expirable --- 4589,4595 ---- (if (not (gnus-check-backend-function 'request-expire-articles group)) () (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) ! (expirable (if (gnus-group-total-expirable-p group) (cons nil (gnus-list-of-read-articles group)) (assq 'expire (nth 3 info))))) (and expirable *************** *** 4485,4491 **** (let ((gnus-group-marked (mapcar (lambda (info) (car info)) (cdr gnus-newsrc-alist)))) (gnus-group-expire-articles nil))) ! (gnus-group-position-cursor) (gnus-message 5 "Expiring...done")) (defun gnus-group-set-current-level (n level) --- 4605,4611 ---- (let ((gnus-group-marked (mapcar (lambda (info) (car info)) (cdr gnus-newsrc-alist)))) (gnus-group-expire-articles nil))) ! (gnus-group-position-point) (gnus-message 5 "Expiring...done")) (defun gnus-group-set-current-level (n level) *************** *** 4504,4510 **** (gnus-group-change-level group level (gnus-group-group-level)) (gnus-group-update-group-line))) ! (gnus-group-position-cursor)) (defun gnus-group-unsubscribe-current-group (&optional n) "Toggle subscription of the current group. --- 4624,4630 ---- (gnus-group-change-level group level (gnus-group-group-level)) (gnus-group-update-group-line))) ! (gnus-group-position-point)) (defun gnus-group-unsubscribe-current-group (&optional n) "Toggle subscription of the current group. *************** *** 4556,4562 **** (gnus-gethash (gnus-group-group-name) gnus-newsrc-hashtb))) (gnus-group-update-group group)) (t (error "No such newsgroup: %s" group))) ! (gnus-group-position-cursor))) (defun gnus-group-transpose-groups (n) "Move the current newsgroup up N places. --- 4676,4682 ---- (gnus-gethash (gnus-group-group-name) gnus-newsrc-hashtb))) (gnus-group-update-group group)) (t (error "No such newsgroup: %s" group))) ! (gnus-group-position-point))) (defun gnus-group-transpose-groups (n) "Move the current newsgroup up N places. *************** *** 4569,4575 **** (prog1 (forward-line (- n)) (gnus-group-yank-group) ! (gnus-group-position-cursor))) (defun gnus-group-kill-all-zombies () "Kill all zombie newsgroups." --- 4689,4695 ---- (prog1 (forward-line (- n)) (gnus-group-yank-group) ! (gnus-group-position-point))) (defun gnus-group-kill-all-zombies () "Kill all zombie newsgroups." *************** *** 4608,4626 **** (let ((buffer-read-only nil) (groups (gnus-group-process-prefix n)) group entry level) ! (while groups ! (setq group (car groups) ! groups (cdr groups)) ! (gnus-group-remove-mark group) ! (setq level (gnus-group-group-level)) ! (gnus-delete-line) ! (if (setq entry (gnus-gethash group gnus-newsrc-hashtb)) ! (setq gnus-list-of-killed-groups ! (cons (cons (car entry) (nth 2 entry)) ! gnus-list-of-killed-groups))) ! (gnus-group-change-level ! (if entry entry group) gnus-level-killed (if entry nil level))) ! (gnus-group-position-cursor) group)) (defun gnus-group-yank-group (&optional arg) --- 4728,4753 ---- (let ((buffer-read-only nil) (groups (gnus-group-process-prefix n)) group entry level) ! (if (or t (< (length groups) 10)) ! ;; This is faster when there are few groups. ! (while groups ! (setq group (car groups) ! groups (cdr groups)) ! (gnus-group-remove-mark group) ! (setq level (gnus-group-group-level)) ! (gnus-delete-line) ! (if (setq entry (gnus-gethash group gnus-newsrc-hashtb)) ! (setq gnus-list-of-killed-groups ! (cons (cons (car entry) (nth 2 entry)) ! gnus-list-of-killed-groups))) ! (gnus-group-change-level ! (if entry entry group) gnus-level-killed (if entry nil level))) ! ;; If there are lots and lots of groups to be killed, we use ! ;; this thing instead. ! ;; !!! Not written. ! ) ! ! (gnus-group-position-point) group)) (defun gnus-group-yank-group (&optional arg) *************** *** 4648,4654 **** (setq gnus-list-of-killed-groups (cdr gnus-list-of-killed-groups))) (forward-line -1) ! (gnus-group-position-cursor) group)) (defun gnus-group-list-all-groups (&optional arg) --- 4775,4781 ---- (setq gnus-list-of-killed-groups (cdr gnus-list-of-killed-groups))) (forward-line -1) ! (gnus-group-position-point) group)) (defun gnus-group-list-all-groups (&optional arg) *************** *** 4667,4673 **** (funcall gnus-group-prepare-function gnus-level-killed t gnus-level-killed)) (goto-char (point-min))) ! (gnus-group-position-cursor)) (defun gnus-group-list-zombies () "List all zombie newsgroups in the group buffer." --- 4794,4800 ---- (funcall gnus-group-prepare-function gnus-level-killed t gnus-level-killed)) (goto-char (point-min))) ! (gnus-group-position-point)) (defun gnus-group-list-zombies () "List all zombie newsgroups in the group buffer." *************** *** 4678,4684 **** (funcall gnus-group-prepare-function gnus-level-zombie t gnus-level-zombie)) (goto-char (point-min))) ! (gnus-group-position-cursor)) (defun gnus-group-get-new-news (&optional arg) "Get newly arrived articles. --- 4805,4811 ---- (funcall gnus-group-prepare-function gnus-level-zombie t gnus-level-zombie)) (goto-char (point-min))) ! (gnus-group-position-point)) (defun gnus-group-get-new-news (&optional arg) "Get newly arrived articles. *************** *** 4713,4724 **** (message "%s error: %s" group (gnus-status-message group)) (sit-for 2)))) (gnus-group-next-unread-group 1 t) ! (gnus-summary-position-cursor) ret)) (defun gnus-get-new-news-in-group (group) (and group ! (gnus-activate-group group) (progn (gnus-get-unread-articles-in-group (nth 2 (gnus-gethash group gnus-newsrc-hashtb)) --- 4840,4851 ---- (message "%s error: %s" group (gnus-status-message group)) (sit-for 2)))) (gnus-group-next-unread-group 1 t) ! (gnus-summary-position-point) ret)) (defun gnus-get-new-news-in-group (group) (and group ! (gnus-activate-group group 'scan) (progn (gnus-get-unread-articles-in-group (nth 2 (gnus-gethash group gnus-newsrc-hashtb)) *************** *** 4776,4782 **** 'gnus-level (1+ gnus-level-subscribed)))) gnus-description-hashtb) (goto-char (point-min)) ! (gnus-group-position-cursor))) ;; Suggested by by Daniel Quinlan . (defun gnus-group-apropos (regexp &optional search-description) --- 4903,4909 ---- 'gnus-level (1+ gnus-level-subscribed)))) gnus-description-hashtb) (goto-char (point-min)) ! (gnus-group-position-point))) ;; Suggested by by Daniel Quinlan . (defun gnus-group-apropos (regexp &optional search-description) *************** *** 4840,4846 **** (gnus-group-prepare-flat (or level gnus-level-subscribed) all (or lowest 1) regexp) (goto-char (point-min)) ! (gnus-group-position-cursor)) (defun gnus-group-list-all-matching (level regexp &optional lowest) "List all groups that match REGEXP. --- 4967,4973 ---- (gnus-group-prepare-flat (or level gnus-level-subscribed) all (or lowest 1) regexp) (goto-char (point-min)) ! (gnus-group-position-point)) (defun gnus-group-list-all-matching (level regexp &optional lowest) "List all groups that match REGEXP. *************** *** 5107,5113 **** (setq groups (cdr groups)))) (switch-to-buffer (current-buffer)) (goto-char (point-min)) ! (gnus-group-position-cursor))) (defun gnus-browse-mode () "Major mode for browsing a foreign server. --- 5234,5240 ---- (setq groups (cdr groups)))) (switch-to-buffer (current-buffer)) (goto-char (point-min)) ! (gnus-group-position-point))) (defun gnus-browse-mode () "Major mode for browsing a foreign server. *************** *** 5160,5166 **** (interactive "p") (prog1 (forward-line n) ! (gnus-group-position-cursor))) (defun gnus-browse-prev-group (n) "Go to the next group." --- 5287,5293 ---- (interactive "p") (prog1 (forward-line n) ! (gnus-group-position-point))) (defun gnus-browse-prev-group (n) "Go to the next group." *************** *** 5179,5185 **** (gnus-browse-unsubscribe-group) (zerop (gnus-browse-next-group ward))) (setq arg (1- arg))) ! (gnus-group-position-cursor) (if (/= 0 arg) (gnus-message 7 "No more newsgroups")) arg)) --- 5306,5312 ---- (gnus-browse-unsubscribe-group) (zerop (gnus-browse-next-group ward))) (setq arg (1- arg))) ! (gnus-group-position-point) (if (/= 0 arg) (gnus-message 7 "No more newsgroups")) arg)) *************** *** 5255,5260 **** --- 5382,5388 ---- (defvar gnus-summary-wash-highlight-map nil) (defvar gnus-summary-wash-time-map nil) (defvar gnus-summary-help-map nil) + (defvar gnus-summary-limit-map nil) (put 'gnus-summary-mode 'mode-class 'special) *************** *** 5351,5359 **** (define-key gnus-summary-mode-map gnus-mouse-2 'gnus-mouse-pick-article) (define-key gnus-summary-mode-map "m" 'gnus-summary-mail-other-window) (define-key gnus-summary-mode-map "a" 'gnus-summary-post-news) ! (define-key gnus-summary-mode-map ! "x" 'gnus-summary-remove-lines-marked-as-read) ! ; (define-key gnus-summary-mode-map "X" 'gnus-summary-remove-lines-marked-with) (define-key gnus-summary-mode-map "s" 'gnus-summary-isearch-article) (define-key gnus-summary-mode-map "t" 'gnus-summary-toggle-header) (define-key gnus-summary-mode-map "g" 'gnus-summary-show-article) --- 5479,5485 ---- (define-key gnus-summary-mode-map gnus-mouse-2 'gnus-mouse-pick-article) (define-key gnus-summary-mode-map "m" 'gnus-summary-mail-other-window) (define-key gnus-summary-mode-map "a" 'gnus-summary-post-news) ! (define-key gnus-summary-mode-map "x" 'gnus-summary-limit-to-unread) (define-key gnus-summary-mode-map "s" 'gnus-summary-isearch-article) (define-key gnus-summary-mode-map "t" 'gnus-summary-toggle-header) (define-key gnus-summary-mode-map "g" 'gnus-summary-show-article) *************** *** 5363,5368 **** --- 5489,5495 ---- (define-key gnus-summary-mode-map "\C-d" 'gnus-summary-enter-digest-group) (define-key gnus-summary-mode-map "v" 'gnus-summary-verbose-headers) (define-key gnus-summary-mode-map "\C-c\C-b" 'gnus-bug) + (define-key gnus-summary-mode-map "/" 'gnus-summary-limit-to-subject) ;; Sort of orthogonal keymap *************** *** 5381,5392 **** (define-key gnus-summary-mark-map "B" 'gnus-summary-remove-bookmark) (define-key gnus-summary-mark-map "#" 'gnus-summary-mark-as-processable) (define-key gnus-summary-mark-map "\M-#" 'gnus-summary-unmark-as-processable) - (define-key gnus-summary-mark-map - "\M-r" 'gnus-summary-remove-lines-marked-as-read) - (define-key gnus-summary-mark-map - "\M-\C-r" 'gnus-summary-remove-lines-marked-with) - (define-key gnus-summary-mark-map "D" 'gnus-summary-show-all-dormant) - (define-key gnus-summary-mark-map "\M-D" 'gnus-summary-hide-all-dormant) (define-key gnus-summary-mark-map "S" 'gnus-summary-show-all-expunged) (define-key gnus-summary-mark-map "C" 'gnus-summary-catchup) (define-key gnus-summary-mark-map "H" 'gnus-summary-catchup-to-here) --- 5508,5513 ---- *************** *** 5405,5411 **** (define-key gnus-summary-mark-map "P" 'gnus-uu-mark-map) (define-key gnus-summary-mode-map "S" 'gnus-summary-send-map) ! (define-prefix-command 'gnus-summary-goto-map) (define-key gnus-summary-mode-map "G" 'gnus-summary-goto-map) (define-key gnus-summary-goto-map "n" 'gnus-summary-next-unread-article) --- 5526,5545 ---- (define-key gnus-summary-mark-map "P" 'gnus-uu-mark-map) (define-key gnus-summary-mode-map "S" 'gnus-summary-send-map) ! ! (define-prefix-command 'gnus-summary-limit-map) ! (define-key gnus-summary-mark-map "N" 'gnus-summary-limit-map) ! (define-key gnus-summary-limit-map "n" 'gnus-summary-limit-to-articles) ! (define-key gnus-summary-limit-map "w" 'gnus-summary-pop-limit) ! (define-key gnus-summary-limit-map "s" 'gnus-summary-limit-to-subject) ! (define-key gnus-summary-limit-map "u" 'gnus-summary-limit-to-unread) ! (define-key gnus-summary-limit-map "m" 'gnus-summary-limit-to-marks) ! (define-key gnus-summary-limit-map "v" 'gnus-summary-limit-to-score) ! (define-key gnus-summary-limit-map "D" 'gnus-summary-limit-include-dormant) ! (define-key gnus-summary-limit-map "d" 'gnus-summary-limit-exclude-dormant) ! (define-key gnus-summary-limit-map "c" ! 'gnus-summary-limit-exclude-childless-dormant) ! (define-prefix-command 'gnus-summary-goto-map) (define-key gnus-summary-mode-map "G" 'gnus-summary-goto-map) (define-key gnus-summary-goto-map "n" 'gnus-summary-next-unread-article) *************** *** 5438,5443 **** --- 5572,5578 ---- (define-key gnus-summary-thread-map "u" 'gnus-summary-up-thread) (define-key gnus-summary-thread-map "d" 'gnus-summary-down-thread) (define-key gnus-summary-thread-map "#" 'gnus-uu-mark-thread) + (define-key gnus-summary-thread-map "\M-#" 'gnus-uu-unmark-thread) (define-prefix-command 'gnus-summary-exit-map) *************** *** 5468,5473 **** --- 5603,5609 ---- (define-key gnus-summary-article-map "e" 'gnus-summary-end-of-article) (define-key gnus-summary-article-map "^" 'gnus-summary-refer-parent-article) (define-key gnus-summary-article-map "r" 'gnus-summary-refer-parent-article) + (define-key gnus-summary-article-map "R" 'gnus-summary-refer-references) (define-key gnus-summary-article-map "g" 'gnus-summary-show-article) (define-key gnus-summary-article-map "s" 'gnus-summary-isearch-article) *************** *** 5501,5506 **** --- 5637,5643 ---- (define-key gnus-summary-wash-time-map "u" 'gnus-article-date-ut) (define-key gnus-summary-wash-time-map "l" 'gnus-article-date-local) (define-key gnus-summary-wash-time-map "e" 'gnus-article-date-lapsed) + (define-key gnus-summary-wash-time-map "o" 'gnus-article-date-original) (define-key gnus-summary-wash-map "b" 'gnus-article-add-buttons) (define-key gnus-summary-wash-map "o" 'gnus-article-treat-overstrike) *************** *** 5533,5539 **** (define-key gnus-summary-backend-map "r" 'gnus-summary-respool-article) (define-key gnus-summary-backend-map "w" 'gnus-summary-edit-article) (define-key gnus-summary-backend-map "c" 'gnus-summary-copy-article) ! (define-key gnus-summary-backend-map "q" 'gnus-summary-fancy-query) (define-key gnus-summary-backend-map "i" 'gnus-summary-import-article) --- 5670,5676 ---- (define-key gnus-summary-backend-map "r" 'gnus-summary-respool-article) (define-key gnus-summary-backend-map "w" 'gnus-summary-edit-article) (define-key gnus-summary-backend-map "c" 'gnus-summary-copy-article) ! (define-key gnus-summary-backend-map "q" 'gnus-summary-respool-query) (define-key gnus-summary-backend-map "i" 'gnus-summary-import-article) *************** *** 5546,5576 **** (define-key gnus-summary-save-map "h" 'gnus-summary-save-article-folder) (define-key gnus-summary-save-map "v" 'gnus-summary-save-article-vm) (define-key gnus-summary-save-map "p" 'gnus-summary-pipe-output) ! ; (define-key gnus-summary-save-map "s" 'gnus-soup-add-article) (define-key gnus-summary-mode-map "X" 'gnus-uu-extract-map) (define-key gnus-summary-mode-map "\M-&" 'gnus-summary-universal-argument) - ; (define-key gnus-summary-various-map "\C-s" 'gnus-summary-search-article-forward) - ; (define-key gnus-summary-various-map "\C-r" 'gnus-summary-search-article-backward) - ; (define-key gnus-summary-various-map "r" 'gnus-summary-refer-article) - ; (define-key gnus-summary-various-map "&" 'gnus-summary-execute-command) - ; (define-key gnus-summary-various-map "T" 'gnus-summary-toggle-truncation) - ; (define-key gnus-summary-various-map "e" 'gnus-summary-expand-window) (define-key gnus-summary-article-map "D" 'gnus-summary-enter-digest-group) - ; (define-key gnus-summary-various-map "k" 'gnus-summary-edit-local-kill) - ; (define-key gnus-summary-various-map "K" 'gnus-summary-edit-global-kill) (define-key gnus-summary-mode-map "V" 'gnus-summary-score-map) - ; (define-prefix-command 'gnus-summary-sort-map) - ; (define-key gnus-summary-various-map "s" 'gnus-summary-sort-map) - ; (define-key gnus-summary-sort-map "n" 'gnus-summary-sort-by-number) - ; (define-key gnus-summary-sort-map "a" 'gnus-summary-sort-by-author) - ; (define-key gnus-summary-sort-map "s" 'gnus-summary-sort-by-subject) - ; (define-key gnus-summary-sort-map "d" 'gnus-summary-sort-by-date) - ; (define-key gnus-summary-sort-map "i" 'gnus-summary-sort-by-score) - (define-key gnus-summary-mode-map "I" 'gnus-summary-increase-score) (define-key gnus-summary-mode-map "L" 'gnus-summary-lower-score) ) --- 5683,5697 ---- (define-key gnus-summary-save-map "h" 'gnus-summary-save-article-folder) (define-key gnus-summary-save-map "v" 'gnus-summary-save-article-vm) (define-key gnus-summary-save-map "p" 'gnus-summary-pipe-output) ! (define-key gnus-summary-save-map "s" 'gnus-soup-add-article) (define-key gnus-summary-mode-map "X" 'gnus-uu-extract-map) (define-key gnus-summary-mode-map "\M-&" 'gnus-summary-universal-argument) (define-key gnus-summary-article-map "D" 'gnus-summary-enter-digest-group) (define-key gnus-summary-mode-map "V" 'gnus-summary-score-map) (define-key gnus-summary-mode-map "I" 'gnus-summary-increase-score) (define-key gnus-summary-mode-map "L" 'gnus-summary-lower-score) ) *************** *** 5663,5725 **** (set (car locals) nil))) (setq locals (cdr locals))))) ! ;; Some summary mode macros. ! ;; Return a header specified by a NUMBER. ! (defun gnus-get-header-by-number (number) ! (save-excursion ! (set-buffer gnus-summary-buffer) ! (or gnus-newsgroup-headers-hashtb-by-number ! (gnus-make-headers-hashtable-by-number)) ! (gnus-gethash (int-to-string number) ! gnus-newsgroup-headers-hashtb-by-number))) ! ! ;; Fast version of the function above. ! (defmacro gnus-get-header-by-num (number) ! (` (gnus-gethash (int-to-string (, number)) ! gnus-newsgroup-headers-hashtb-by-number))) ! (defmacro gnus-summary-search-forward (&optional unread subject backward) ! "Search for article forward. ! If UNREAD is non-nil, only unread articles are selected. ! If SUBJECT is non-nil, the article which has the same subject will be ! searched for. ! If BACKWARD is non-nil, the search will be performed backwards instead." ! (` (gnus-summary-search-subject (, backward) (, unread) (, subject)))) ! ! (defmacro gnus-summary-search-backward (&optional unread subject) ! "Search for article backward. ! If 1st optional argument UNREAD is non-nil, only unread article is selected. ! If 2nd optional argument SUBJECT is non-nil, the article which has ! the same subject will be searched for." ! (` (gnus-summary-search-forward (, unread) (, subject) t))) (defmacro gnus-summary-article-number (&optional number-or-nil) "The article number of the article on the current line. If there isn's an article number here, then we return the current article number." (if number-or-nil ! '(get-text-property (gnus-point-at-bol) 'gnus-number) ! '(or (get-text-property (gnus-point-at-bol) 'gnus-number) gnus-current-article))) ! (defmacro gnus-summary-thread-level () ! "The thread level of the article on the current line." ! '(or (get-text-property (gnus-point-at-bol) 'gnus-level) ! 0)) ! ! (defmacro gnus-summary-article-mark () ! "The mark on the current line." ! '(get-text-property (gnus-point-at-bol) 'gnus-mark)) ! (defun gnus-summary-subject-string () "Return current subject string or nil if nothing." ! (let ((article (gnus-summary-article-number)) ! header) ! (and article ! (setq header (gnus-get-header-by-num article)) ! (vectorp header) ! (mail-header-subject header)))) ;; Various summary mode internalish functions. --- 5784,5938 ---- (set (car locals) nil))) (setq locals (cdr locals))))) ! ;; Summary data functions. ! (defmacro gnus-data-number (data) ! (` (car (, data)))) ! (defmacro gnus-data-mark (data) ! (` (nth 1 (, data)))) ! ! (defmacro gnus-data-set-mark (data mark) ! (` (setcar (nthcdr 1 (, data)) (, mark)))) ! ! (defmacro gnus-data-pos (data) ! (` (nth 2 (, data)))) ! ! (defmacro gnus-data-header (data) ! (` (nth 3 (, data)))) ! ! (defmacro gnus-data-level (data) ! (` (nth 4 (, data)))) ! ! (defmacro gnus-data-unread-p (data) ! (` (= (nth 1 (, data)) gnus-unread-mark))) ! ! (defmacro gnus-data-find (number) ! (` (assq (, number) gnus-newsgroup-data))) ! ! (defmacro gnus-data-find-list (number &optional data) ! (` (memq (assq (, number) (, (or data 'gnus-newsgroup-data))) ! (, (or data 'gnus-newsgroup-data))))) ! ! (defmacro gnus-data-make (number mark pos header level) ! (` (list (, number) (, mark) (set-marker (make-marker) (, pos)) (, header) ! (, level)))) ! ! (defun gnus-data-enter (after-article number mark pos header level) ! (let ((data (gnus-data-find-list after-article))) ! (or data (error "No such article: %d" after-article)) ! (setcdr data (cons (gnus-data-make number mark pos header level) ! (cdr data))))) ! ! (defun gnus-data-enter-list (after-article list) ! (if (not list) ! () ! (let ((data (gnus-data-find-list after-article)) ! (ilist list)) ! (or data (error "No such article: %d" after-article)) ! ;; Find the last element in the list to be spliced into the main ! ;; list. ! (while (cdr list) ! (setq list (cdr list))) ! (setcdr list (cdr data)) ! (setcdr data ilist)))) ! ! (defun gnus-data-remove (article) ! (let ((data gnus-newsgroup-data)) ! (if (= (gnus-data-number (car data)) article) ! (setq gnus-newsgroup-data (cdr gnus-newsgroup-data) ! gnus-newsgroup-data-reverse nil) ! (while (cdr data) ! (and (= (gnus-data-number (car (cdr data))) article) ! (progn ! (setcdr data (cdr (cdr data))) ! (setq data nil ! gnus-newsgroup-data-reverse nil))))))) ! ! (defmacro gnus-data-list (backward) ! (` (if (, backward) ! (or gnus-newsgroup-data-reverse ! (setq gnus-newsgroup-data-reverse ! (reverse gnus-newsgroup-data))) ! gnus-newsgroup-data))) ! ! (defun gnus-summary-article-pseudo-p (article) ! (not (vectorp (gnus-data-header (gnus-data-find article))))) ! ! (defun gnus-article-parent-p (number) ! (let* ((data (gnus-data-find-list number))) ! (and (cdr data) ; There has to be an article after... ! (< (gnus-data-level (car data)) ; And it has to have a higher level. ! (gnus-data-level (nth 1 data)))))) ! ! ;; Some summary mode macros. (defmacro gnus-summary-article-number (&optional number-or-nil) "The article number of the article on the current line. If there isn's an article number here, then we return the current article number." (if number-or-nil ! '(get-text-property (point) 'gnus-number) ! '(or (get-text-property (point) 'gnus-number) gnus-current-article))) ! (defmacro gnus-summary-article-header (&optional number) ! (` (gnus-data-header (gnus-data-find ! (, (or number '(gnus-summary-article-number))))))) ! ! (defmacro gnus-summary-thread-level (&optional number) ! (` (gnus-data-level (gnus-data-find ! (, (or number '(gnus-summary-article-number))))))) ! ! (defmacro gnus-summary-article-mark (&optional number) ! (` (gnus-data-mark (gnus-data-find ! (, (or number '(gnus-summary-article-number))))))) ! ! (defmacro gnus-summary-article-pos (&optional number) ! (` (gnus-data-pos (gnus-data-find ! (, (or number '(gnus-summary-article-number))))))) ! (defmacro gnus-summary-article-subject (&optional number) "Return current subject string or nil if nothing." ! (` (let ((headers ! (, (if number ! (` (gnus-data-header (assq (, number) gnus-newsgroup-data))) ! '(gnus-data-header (assq (gnus-summary-article-number) ! gnus-newsgroup-data)))))) ! (and headers ! (vectorp headers) ! (mail-header-subject headers))))) ! ! (defmacro gnus-summary-article-score (&optional number) ! "Return current article score." ! (` (or (cdr (assq (, (or number '(gnus-summary-article-number))) ! gnus-newsgroup-scored)) ! gnus-summary-default-score 0))) ! ! (defun gnus-summary-article-children (&optional number) ! (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)))) ! (level (gnus-data-level (car data))) ! l children) ! (while (and (setq data (cdr data)) ! (> (setq l (gnus-data-level (car data))) level)) ! (and (= (1+ level) l) ! (setq children (cons (gnus-data-number (car data)) ! children)))) ! (nreverse children))) ! ! (defun gnus-summary-article-parent (&optional number) ! (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)) ! (gnus-data-list t))) ! (level (gnus-data-level (car data))) ! l) ! (if (zerop level) ! () ; This is a root. ! ;; We search until we find an article with a level less than ! ;; this one. That function has to be the parent. ! (while (and (setq data (cdr data)) ! (not (< (gnus-data-level (car data)) level)))) ! (and data (gnus-data-number (car data)))))) ! ;; Various summary mode internalish functions. *************** *** 5766,5780 **** (defun gnus-summary-insert-dummy-line (sformat subject number) (if (not sformat) (setq sformat gnus-summary-dummy-line-format-spec)) ! (let (b) ! (beginning-of-line) ! (setq b (point)) ! (insert (eval sformat)) ! (add-text-properties ! b (1+ b) ! (list 'gnus-number number ! 'gnus-mark gnus-dummy-mark ! 'gnus-level 0)))) (defvar gnus-thread-indent-array nil) (defvar gnus-thread-indent-array-level gnus-thread-indent-level) --- 5979,5988 ---- (defun gnus-summary-insert-dummy-line (sformat subject number) (if (not sformat) (setq sformat gnus-summary-dummy-line-format-spec)) ! (beginning-of-line) ! (put-text-property ! (point) (progn (insert (eval sformat)) (point)) ! 'gnus-number number)) (defvar gnus-thread-indent-array nil) (defvar gnus-thread-indent-array-level gnus-thread-indent-level) *************** *** 5819,5832 **** (number (mail-header-number header)) (opening-bracket (if dummy ?\< ?\[)) (closing-bracket (if dummy ?\> ?\])) ! (buffer-read-only nil) ! (b (progn (beginning-of-line) (point)))) (or (numberp lines) (setq lines 0)) ! (insert (eval sformat)) ! (add-text-properties ! b (1+ b) (list 'gnus-number number ! 'gnus-mark (or unread gnus-unread-mark) ! 'gnus-level level)))) (defun gnus-summary-update-line (&optional dont-update) ;; Update summary line after change. --- 6027,6038 ---- (number (mail-header-number header)) (opening-bracket (if dummy ?\< ?\[)) (closing-bracket (if dummy ?\> ?\])) ! (buffer-read-only nil)) (or (numberp lines) (setq lines 0)) ! (put-text-property ! (point) ! (progn (insert (eval sformat)) (point)) ! 'gnus-number number))) (defun gnus-summary-update-line (&optional dont-update) ;; Update summary line after change. *************** *** 5864,5871 **** (while (and (not (eobp)) (< (point) end)) (if (and gnus-summary-mark-below (< (or (cdr (assq ! (setq article (get-text-property ! (point) 'gnus-number)) gnus-newsgroup-scored)) gnus-summary-default-score 0) gnus-summary-mark-below)) --- 6070,6076 ---- (while (and (not (eobp)) (< (point) end)) (if (and gnus-summary-mark-below (< (or (cdr (assq ! (setq article (gnus-summary-article-number)) gnus-newsgroup-scored)) gnus-summary-default-score 0) gnus-summary-mark-below)) *************** *** 5875,5881 **** (memq article gnus-newsgroup-unreads) (gnus-summary-mark-article-as-read gnus-low-score-mark)) ;; We want to possibly mark it as unread. ! (and (eq (get-text-property (point) 'gnus-mark) gnus-low-score-mark) (gnus-summary-mark-article-as-unread gnus-unread-mark))) ;; Do the visual highlights at the same time. --- 6080,6086 ---- (memq article gnus-newsgroup-unreads) (gnus-summary-mark-article-as-read gnus-low-score-mark)) ;; We want to possibly mark it as unread. ! (and (eq (gnus-summary-article-mark article) gnus-low-score-mark) (gnus-summary-mark-article-as-unread gnus-unread-mark))) ;; Do the visual highlights at the same time. *************** *** 5899,5904 **** --- 6104,6124 ---- gnus-empty-thread-mark) number))) + ;; This function goes through the local params of GROUP and sets all + ;; variable specs in that list. + (defun gnus-summary-set-local-parameters (group) + (let ((params (nth 5 (nth 2 (gnus-gethash group gnus-newsrc-hashtb)))) + elem) + (while params + (setq elem (car params) + params (cdr params)) + (and (consp elem) + (consp (cdr elem)) + (symbolp (car elem)) + (progn + (make-local-variable (car elem)) + (set (car elem) (eval (nth 1 elem)))))))) + (defun gnus-summary-read-group (group &optional show-all no-article kill-buffer) "Start reading news in newsgroup GROUP. *************** *** 5915,5921 **** (gnus-kill-buffer kill-buffer) (gnus-configure-windows 'summary 'force) (gnus-set-mode-line 'summary) ! (gnus-summary-position-cursor) (message "") t) ((null did-select) --- 6135,6141 ---- (gnus-kill-buffer kill-buffer) (gnus-configure-windows 'summary 'force) (gnus-set-mode-line 'summary) ! (gnus-summary-position-point) (message "") t) ((null did-select) *************** *** 5960,5967 **** (setq gnus-newsgroup-active (gnus-copy-sequence (gnus-gethash gnus-newsgroup-name gnus-active-hashtb))) ! ;; You can change the subjects in this hook. (run-hooks 'gnus-select-group-hook) ;; Do score processing. (and gnus-use-scoring (gnus-possibly-score-headers)) (gnus-update-format-specifications) --- 6180,6189 ---- (setq gnus-newsgroup-active (gnus-copy-sequence (gnus-gethash gnus-newsgroup-name gnus-active-hashtb))) ! ;; You can change the summary buffer in some way with this hook. (run-hooks 'gnus-select-group-hook) + ;; Set any local variables in the group parameters. + (gnus-summary-set-local-parameters gnus-newsgroup-name) ;; Do score processing. (and gnus-use-scoring (gnus-possibly-score-headers)) (gnus-update-format-specifications) *************** *** 5969,5975 **** (gnus-summary-prepare) (if (zerop (buffer-size)) (cond (gnus-newsgroup-dormant ! (gnus-summary-show-all-dormant)) ((and gnus-newsgroup-scored show-all) (gnus-summary-show-all-expunged)))) ;; Function `gnus-apply-kill-file' must be called in this hook. --- 6191,6197 ---- (gnus-summary-prepare) (if (zerop (buffer-size)) (cond (gnus-newsgroup-dormant ! (gnus-summary-limit-include-dormant)) ((and gnus-newsgroup-scored show-all) (gnus-summary-show-all-expunged)))) ;; Function `gnus-apply-kill-file' must be called in this hook. *************** *** 5999,6015 **** () (gnus-configure-windows 'summary 'force)) (gnus-set-mode-line 'summary) ! (gnus-summary-position-cursor) ;; If in async mode, we send some info to the backend. (and gnus-newsgroup-async - (setq gnus-newsgroup-threads (nreverse gnus-newsgroup-threads)) (gnus-request-asynchronous ! gnus-newsgroup-name ! (if (and gnus-asynchronous-article-function ! (fboundp gnus-asynchronous-article-function)) ! (funcall gnus-asynchronous-article-function ! gnus-newsgroup-threads) ! gnus-newsgroup-threads))) (gnus-kill-buffer kill-buffer) (if (not (get-buffer-window gnus-group-buffer)) () --- 6221,6231 ---- () (gnus-configure-windows 'summary 'force)) (gnus-set-mode-line 'summary) ! (gnus-summary-position-point) ;; If in async mode, we send some info to the backend. (and gnus-newsgroup-async (gnus-request-asynchronous ! gnus-newsgroup-name gnus-newsgroup-data)) (gnus-kill-buffer kill-buffer) (if (not (get-buffer-window gnus-group-buffer)) () *************** *** 6026,6044 **** ;; Generate the summary buffer. (let ((buffer-read-only nil)) (erase-buffer) (gnus-summary-prepare-threads (if gnus-show-threads (gnus-gather-threads (gnus-sort-threads ! (if (and gnus-summary-expunge-below ! (not gnus-fetch-old-headers)) ! (gnus-make-threads-and-expunge) ! (gnus-make-threads)))) gnus-newsgroup-headers) 'cull) (gnus-summary-update-lines) ! ;; Create the header hashtb. ! (gnus-make-headers-hashtable-by-number) ;; Call hooks for modifying summary buffer. ;; Suggested by sven@tde.LTH.Se (Sven Mattisson). (goto-char (point-min)) --- 6242,6258 ---- ;; Generate the summary buffer. (let ((buffer-read-only nil)) (erase-buffer) + (setq gnus-newsgroup-data nil + gnus-newsgroup-data-reverse nil) (gnus-summary-prepare-threads (if gnus-show-threads (gnus-gather-threads (gnus-sort-threads ! (gnus-make-threads))) gnus-newsgroup-headers) 'cull) (gnus-summary-update-lines) ! (setq gnus-newsgroup-data (nreverse gnus-newsgroup-data)) ;; Call hooks for modifying summary buffer. ;; Suggested by sven@tde.LTH.Se (Sven Mattisson). (goto-char (point-min)) *************** *** 6055,6079 **** (while threads (setq whole-subject (setq subject (mail-header-subject (car (car threads))))) ! (if gnus-summary-gather-subject-limit ! (or (and (numberp gnus-summary-gather-subject-limit) ! (> (length subject) gnus-summary-gather-subject-limit) ! (setq subject ! (substring subject 0 ! gnus-summary-gather-subject-limit))) ! (and (eq 'fuzzy gnus-summary-gather-subject-limit) ! (setq subject (gnus-simplify-subject-fuzzy subject)))) ! (setq subject (gnus-simplify-subject-re subject))) ! (if (setq hthread ! (gnus-gethash subject hashtb)) ! (progn ! (or (stringp (car (car hthread))) ! (setcar hthread (list whole-subject (car hthread)))) ! (setcdr (car hthread) (nconc (cdr (car hthread)) ! (list (car threads)))) ! (setcdr prev (cdr threads)) ! (setq threads prev)) ! (gnus-sethash subject threads hashtb)) (setq prev threads) (setq threads (cdr threads))) result))) --- 6269,6297 ---- (while threads (setq whole-subject (setq subject (mail-header-subject (car (car threads))))) ! (if (and gnus-summary-gather-exclude-subject ! (string-match gnus-summary-gather-exclude-subject ! subject)) ! () ; We don't want to do anything with this. ! (if gnus-summary-gather-subject-limit ! (or (and (numberp gnus-summary-gather-subject-limit) ! (> (length subject) gnus-summary-gather-subject-limit) ! (setq subject ! (substring subject 0 ! gnus-summary-gather-subject-limit))) ! (and (eq 'fuzzy gnus-summary-gather-subject-limit) ! (setq subject (gnus-simplify-subject-fuzzy subject)))) ! (setq subject (gnus-simplify-subject-re subject))) ! (if (setq hthread ! (gnus-gethash subject hashtb)) ! (progn ! (or (stringp (car (car hthread))) ! (setcar hthread (list whole-subject (car hthread)))) ! (setcdr (car hthread) (nconc (cdr (car hthread)) ! (list (car threads)))) ! (setcdr prev (cdr threads)) ! (setq threads prev)) ! (gnus-sethash subject threads hashtb))) (setq prev threads) (setq threads (cdr threads))) result))) *************** *** 6083,6257 **** ;; `gnus-get-newsgroup-headers' and builds the trees. First we go ;; through the dependecies in the hash table and finds all the ;; roots. Roots do not refer back to any valid articles. ! (gnus-message 6 "Threading...") ! (let (roots new-roots) (and gnus-fetch-old-headers (eq gnus-headers-retrieved-by 'nov) (gnus-build-old-threads)) (mapatoms (lambda (refs) ! (if (not (car (symbol-value refs))) ! (setq roots (append (cdr (symbol-value refs)) roots)) ! ;; Ok, these refer back to valid articles, but if ! ;; `gnus-thread-ignore-subject' is nil, we have to check that ! ;; the root has the same subject as its children. The children ! ;; that do not are made into roots and removed from the list ! ;; of children. ! (or gnus-thread-ignore-subject ! (let* ((prev (symbol-value refs)) ! (subject (gnus-simplify-subject-re ! (mail-header-subject (car prev)))) ! (headers (cdr prev))) ! (while headers ! (if (not (string= subject ! (gnus-simplify-subject-re ! (mail-header-subject (car headers))))) ! (progn ! (setq new-roots (cons (car headers) new-roots)) ! (setcdr prev (cdr headers))) ! (setq prev headers)) ! (setq headers (cdr headers))))))) gnus-newsgroup-dependencies) ! ! ;; We enter the new roots into the dependencies structure to ! ;; ensure that any possible later thread-regeneration will be ! ;; possible. ! (let ((r new-roots)) ! (while r ! (gnus-sethash (concat (mail-header-id (car r)) ".boo") ! (list nil (car r)) gnus-newsgroup-dependencies) ! (setq r (cdr r)))) ! ! (setq roots (nconc new-roots roots)) ! ! (prog1 ! (mapcar 'gnus-trim-thread ! (apply 'append ! (mapcar 'gnus-cut-thread ! (mapcar 'gnus-make-sub-thread roots)))) ! (gnus-message 6 "Threading...done")))) ! ! ! (defun gnus-make-threads-and-expunge () ! ;; This function takes the dependencies already made by ! ;; `gnus-get-newsgroup-headers' and builds the trees. First we go ! ;; through the dependecies in the hash table and finds all the ! ;; roots. Roots do not refer back to any valid articles. ! (gnus-message 6 "Threading...") ! (let ((default (or gnus-summary-default-score 0)) ! (below gnus-summary-expunge-below) ! roots article new-roots) ! (and gnus-fetch-old-headers ! (eq gnus-headers-retrieved-by 'nov) ! (gnus-build-old-threads)) ! (mapatoms ! (lambda (refs) ! (if (not (car (symbol-value refs))) ! ;; These articles do not refer back to any other articles - ! ;; they are roots. ! (let ((headers (cdr (symbol-value refs)))) ! ;; We weed out the low-scored articles. ! (while headers ! (if (not (< (or (cdr (assq (mail-header-number (car headers)) ! gnus-newsgroup-scored)) default) ! below)) ! ;; It is over. ! (setq roots (cons (car headers) roots)) ! ;; It is below, so we mark it as read. ! (setq gnus-newsgroup-unreads ! (delq (mail-header-number (car headers)) ! gnus-newsgroup-unreads)) ! (setq gnus-newsgroup-reads ! (cons (cons (mail-header-number (car headers)) ! gnus-low-score-mark) ! gnus-newsgroup-reads))) ! (setq headers (cdr headers)))) ! ;; Ok, these refer back to valid articles, but if ! ;; `gnus-thread-ignore-subject' is nil, we have to check that ! ;; the root has the same subject as its children. The children ! ;; that do not are made into roots and removed from the list ! ;; of children. ! (or gnus-thread-ignore-subject ! (let* ((prev (symbol-value refs)) ! (subject (gnus-simplify-subject-re ! (mail-header-subject (car prev)))) ! (headers (cdr prev))) ! (while headers ! (if (not (string= subject ! (gnus-simplify-subject-re ! (mail-header-subject (car headers))))) ! (progn ! (if (not (< (or (cdr (assq (mail-header-number ! (car headers)) ! gnus-newsgroup-scored)) ! default) below)) ! (setq new-roots (cons (car headers) new-roots)) ! (setq gnus-newsgroup-unreads ! (delq (mail-header-number (car headers)) ! gnus-newsgroup-unreads)) ! (setq gnus-newsgroup-reads ! (cons (cons (mail-header-number (car headers)) ! gnus-low-score-mark) ! gnus-newsgroup-reads))) ! (setcdr prev (cdr headers))) ! (setq prev headers)) ! (setq headers (cdr headers))))) ! ;; If this article is expunged, some of the children might be ! ;; roots. ! (if (< (or (cdr (assq (mail-header-number (car (symbol-value refs))) ! gnus-newsgroup-scored)) default) ! below) ! (let* ((prev (symbol-value refs)) ! (headers (cdr prev))) ! (while headers ! (setq article (mail-header-number (car headers))) ! (if (not (< (or (cdr (assq article gnus-newsgroup-scored)) ! default) below)) ! (progn (setq new-roots (cons (car headers) new-roots)) ! (setq prev headers)) ! (setq gnus-newsgroup-unreads ! (delq article gnus-newsgroup-unreads)) ! (setq gnus-newsgroup-reads ! (cons (cons article gnus-low-score-mark) ! gnus-newsgroup-reads)) ! (setcdr prev (cdr headers))) ! (setq headers (cdr headers)))) ! ;; It was not expunged, but we look at expunged children. ! (let* ((prev (symbol-value refs)) ! (headers (cdr prev)) ! article) ! (while headers ! (setq article (mail-header-number (car headers))) ! (if (not (< (or (cdr (assq article gnus-newsgroup-scored)) ! default) below)) ! (setq prev headers) ! (setq gnus-newsgroup-unreads ! (delq article gnus-newsgroup-unreads)) ! (setq gnus-newsgroup-reads ! (cons (cons article gnus-low-score-mark) ! gnus-newsgroup-reads)) ! (setcdr prev (cdr headers))) ! (setq headers (cdr headers))))))) ! gnus-newsgroup-dependencies) ! ! ;; We enter the new roots into the dependencies structure to ! ;; ensure that any possible later thread-regeneration will be ! ;; possible. ! (let ((r new-roots)) ! (while r ! (gnus-sethash (concat (mail-header-id (car r)) ".boo") ! (list nil (car r)) gnus-newsgroup-dependencies) ! (setq r (cdr r)))) ! ! (setq roots (nconc new-roots roots)) ! ! (prog1 ! (mapcar 'gnus-trim-thread ! (apply 'append ! (mapcar 'gnus-cut-thread ! (mapcar 'gnus-make-sub-thread roots)))) ! (gnus-message 6 "Threading...done")))) ! (defun gnus-cut-thread (thread) ;; Remove leaf dormant or ancient articles from THREAD. --- 6301,6316 ---- ;; `gnus-get-newsgroup-headers' and builds the trees. First we go ;; through the dependecies in the hash table and finds all the ;; roots. Roots do not refer back to any valid articles. ! (let (threads) (and gnus-fetch-old-headers (eq gnus-headers-retrieved-by 'nov) (gnus-build-old-threads)) (mapatoms (lambda (refs) ! (or (car (symbol-value refs)) ! (setq threads (append (cdr (symbol-value refs)) threads)))) gnus-newsgroup-dependencies) ! threads)) (defun gnus-cut-thread (thread) ;; Remove leaf dormant or ancient articles from THREAD. *************** *** 6262,6268 **** (or (memq number gnus-newsgroup-ancient) (memq number gnus-newsgroup-dormant) (and gnus-summary-expunge-below ! (eq gnus-fetch-old-headers 'some) (< (or (cdr (assq number gnus-newsgroup-scored)) gnus-summary-default-score 0) gnus-summary-expunge-below) --- 6321,6328 ---- (or (memq number gnus-newsgroup-ancient) (memq number gnus-newsgroup-dormant) (and gnus-summary-expunge-below ! (or (eq gnus-fetch-old-headers 'some) ! (numberp gnus-fetch-old-headers)) (< (or (cdr (assq number gnus-newsgroup-scored)) gnus-summary-default-score 0) gnus-summary-expunge-below) *************** *** 6278,6284 **** (defun gnus-trim-thread (thread) ;; Remove root ancient articles with only one child from THREAD. ! (if (and (eq gnus-fetch-old-headers 'some) (memq (mail-header-number (car thread)) gnus-newsgroup-ancient) (= (length thread) 2)) (gnus-trim-thread (nth 1 thread)) --- 6338,6345 ---- (defun gnus-trim-thread (thread) ;; Remove root ancient articles with only one child from THREAD. ! (if (and (or (eq gnus-fetch-old-headers 'some) ! (numberp gnus-fetch-old-headers)) (memq (mail-header-number (car thread)) gnus-newsgroup-ancient) (= (length thread) 2)) (gnus-trim-thread (nth 1 thread)) *************** *** 6347,6353 **** (defun gnus-rebuild-thread (id) (let ((dep gnus-newsgroup-dependencies) (buffer-read-only nil) ! parent headers refs thread art) (while (and id (setq headers (car (setq art (gnus-gethash (downcase id) dep))))) (setq parent art) --- 6408,6415 ---- (defun gnus-rebuild-thread (id) (let ((dep gnus-newsgroup-dependencies) (buffer-read-only nil) ! (current (gnus-summary-article-number)) ! parent headers refs thread art data) (while (and id (setq headers (car (setq art (gnus-gethash (downcase id) dep))))) (setq parent art) *************** *** 6357,6370 **** (setq thread (gnus-make-sub-thread (car parent))) (gnus-rebuild-remove-articles thread) (let ((beg (point))) ! (gnus-summary-prepare-threads (list thread)) (gnus-summary-update-lines beg (point))))) ;; Delete all lines in the summary buffer that correspond to articles ;; in this thread. (defun gnus-rebuild-remove-articles (thread) ! (and (gnus-summary-goto-subject (mail-header-number (car thread))) ! (gnus-delete-line)) (mapcar (lambda (th) (gnus-rebuild-remove-articles th)) (cdr thread))) (defun gnus-sort-threads (threads) --- 6419,6438 ---- (setq thread (gnus-make-sub-thread (car parent))) (gnus-rebuild-remove-articles thread) (let ((beg (point))) ! (let (gnus-newsgroup-data) ! (gnus-summary-prepare-threads (list thread)) ! (setq data (nreverse gnus-newsgroup-data))) ! (gnus-data-enter-list current data) (gnus-summary-update-lines beg (point))))) ;; Delete all lines in the summary buffer that correspond to articles ;; in this thread. (defun gnus-rebuild-remove-articles (thread) ! (let (number) ! (and (gnus-summary-goto-subject ! (setq number (mail-header-number (car thread)))) ! (gnus-delete-line)) ! (gnus-data-remove number)) (mapcar (lambda (th) (gnus-rebuild-remove-articles th)) (cdr thread))) (defun gnus-sort-threads (threads) *************** *** 6451,6457 **** gnus-newsgroup-dependencies))))) ;; Added by Per Abrahamsen . ! (defvar gnus-tmp-prev-subject "") (defun gnus-summary-prepare-threads (threads &optional cull) "Prepare summary buffer from THREADS and indentation LEVEL. --- 6519,6527 ---- gnus-newsgroup-dependencies))))) ;; Added by Per Abrahamsen . ! (defvar gnus-tmp-prev-subject nil) ! (defvar gnus-tmp-false-parent nil) ! (defvar gnus-tmp-root-expunged nil) (defun gnus-summary-prepare-threads (threads &optional cull) "Prepare summary buffer from THREADS and indentation LEVEL. *************** *** 6459,6465 **** or a straight list of headers." (message "Generating summary...") (let ((level 0) ! thread header number subject stack state gnus-tmp-gathered) (if (vectorp (car threads)) ;; If this is a straight (sic) list of headers, then a ;; threaded summary display isn't required, so we just create --- 6529,6539 ---- or a straight list of headers." (message "Generating summary...") (let ((level 0) ! thread header number subject stack state gnus-tmp-gathered mark ! new-roots new-adopts thread-end) ! ! (setq gnus-tmp-prev-subject nil) ! (if (vectorp (car threads)) ;; If this is a straight (sic) list of headers, then a ;; threaded summary display isn't required, so we just create *************** *** 6468,6487 **** ;; Do the threaded display. ! (while (or threads stack) ! ! (if threads ! ;; If there are some threads, we do them before the ! ;; threads on the stack. ! (setq thread threads ! header (car (car thread))) ! ;; There were no current threads, so we pop something off ! ;; the stack. ! (setq state (car stack) ! level (car state) ! thread (cdr state) ! stack (cdr stack) ! header (car (car thread)))) (if (stringp header) (progn --- 6542,6579 ---- ;; Do the threaded display. ! (while (or threads stack new-adopts new-roots) ! ! (if (and (= level 0) ! (not gnus-tmp-false-parent) ! (or new-adopts new-roots)) ! (progn ! (if new-adopts ! (setq level (if gnus-tmp-root-expunged 0 1) ! thread (list (car new-adopts)) ! header (car (car thread)) ! new-adopts (cdr new-adopts)) ! (if new-roots ! (setq thread (list (car new-roots)) ! header (car (car thread)) ! new-roots (cdr new-roots))))) ! ! (if threads ! ;; If there are some threads, we do them before the ! ;; threads on the stack. ! (setq thread threads ! header (car (car thread))) ! ;; There were no current threads, so we pop something off ! ;; the stack. ! (setq state (car stack) ! level (car state) ! thread (cdr state) ! stack (cdr stack) ! header (car (car thread))))) ! ! (setq gnus-tmp-false-parent nil) ! (setq gnus-tmp-root-expunged nil) ! (setq thread-end nil) (if (stringp header) (progn *************** *** 6492,6505 **** (let ((th (car (cdr (car thread))))) (while (cdr th) (setq th (cdr th))) ! (setcdr th (cdr (cdr (car thread)))) (setq gnus-tmp-gathered (nconc (mapcar (lambda (h) (mail-header-number (car h))) (cdr (cdr (car thread)))) gnus-tmp-gathered)) (setcdr (cdr (car thread)) nil)) ! (setq level -1)) ((eq gnus-summary-make-false-root 'empty) ;; We print adopted articles with empty subject fields. (setq gnus-tmp-gathered --- 6584,6600 ---- (let ((th (car (cdr (car thread))))) (while (cdr th) (setq th (cdr th))) ! ;(setcdr th (cdr (cdr (car thread)))) ! (setq new-adopts (nconc new-adopts ! (cdr (cdr (car thread))))) (setq gnus-tmp-gathered (nconc (mapcar (lambda (h) (mail-header-number (car h))) (cdr (cdr (car thread)))) gnus-tmp-gathered)) (setcdr (cdr (car thread)) nil)) ! (setq level -1 ! gnus-tmp-false-parent t)) ((eq gnus-summary-make-false-root 'empty) ;; We print adopted articles with empty subject fields. (setq gnus-tmp-gathered *************** *** 6521,6569 **** (setq number (mail-header-number header) subject (mail-header-subject header)) ! ;; Do the async thing. ! (and gnus-newsgroup-async ! (setq gnus-newsgroup-threads ! (cons (cons number (mail-header-lines header)) ! gnus-newsgroup-threads))) ! ! ;; We may have to root out some bad articles... ! (and cull ! (= level 0) ! (cond ((and (memq (setq number (mail-header-number header)) ! gnus-newsgroup-dormant) ! (null thread)) ! (setq header nil)) ! ((and gnus-summary-expunge-below ! (< (or (cdr (assq number gnus-newsgroup-scored)) ! gnus-summary-default-score 0) ! gnus-summary-expunge-below)) ! (setq header nil) ! (setq gnus-newsgroup-unreads ! (delq number gnus-newsgroup-unreads)) ! (setq gnus-newsgroup-reads ! (cons (cons number gnus-low-score-mark) ! gnus-newsgroup-reads))))) (and header (progn (inline (gnus-summary-insert-line ! nil header level nil ! (cond ! ((memq number gnus-newsgroup-marked) gnus-ticked-mark) ! ((memq number gnus-newsgroup-dormant) gnus-dormant-mark) ! ((memq number gnus-newsgroup-unreads) gnus-unread-mark) ! ((memq number gnus-newsgroup-expirable) gnus-expirable-mark) ! (t (or (cdr (assq number gnus-newsgroup-reads)) ! gnus-ancient-mark))) (memq number gnus-newsgroup-replied) (memq number gnus-newsgroup-expirable) (cond ((and gnus-thread-ignore-subject (not (string= ! (gnus-simplify-subject-re gnus-tmp-prev-subject) (gnus-simplify-subject-re subject)))) subject) ((zerop level) --- 6616,6686 ---- (setq number (mail-header-number header) subject (mail-header-subject header)) ! (cond ! ((and (null gnus-thread-ignore-subject) ! (not (zerop level)) ! gnus-tmp-prev-subject ! (not (string= gnus-tmp-prev-subject ! (gnus-simplify-subject-re subject)))) ! (setq new-roots (if (cdr (car thread)) ! (nconc new-roots (list (car thread))) ! new-roots) ! thread-end t ! header nil)) ! ((and gnus-newsgroup-limit ! (not (memq number gnus-newsgroup-limit))) ! (setq gnus-tmp-gathered ! (nconc (mapcar ! (lambda (h) (mail-header-number (car h))) ! (cdr (car thread))) ! gnus-tmp-gathered)) ! (setq new-adopts (if (cdr (car thread)) ! (append new-adopts ! (cdr (car thread))) ! new-adopts) ! thread-end t ! header nil) ! (if (zerop level) ! (setq gnus-tmp-root-expunged t))) ! ((and (memq number gnus-newsgroup-dormant) ! (null thread)) ! (setq header nil)) ! ((and gnus-summary-expunge-below ! (< (or (cdr (assq number gnus-newsgroup-scored)) ! gnus-summary-default-score 0) ! gnus-summary-expunge-below)) ! (setq header nil ! gnus-newsgroup-unreads ! (delq number gnus-newsgroup-unreads) ! gnus-newsgroup-reads ! (cons (cons number gnus-low-score-mark) ! gnus-newsgroup-reads)))) (and header (progn + (setq + mark + (cond + ((memq number gnus-newsgroup-marked) gnus-ticked-mark) + ((memq number gnus-newsgroup-dormant) gnus-dormant-mark) + ((memq number gnus-newsgroup-unreads) gnus-unread-mark) + ((memq number gnus-newsgroup-expirable) gnus-expirable-mark) + (t (or (cdr (assq number gnus-newsgroup-reads)) + gnus-ancient-mark)))) + (setq gnus-newsgroup-data + (cons (gnus-data-make number mark (point) header level) + gnus-newsgroup-data)) (inline (gnus-summary-insert-line ! nil header level nil mark (memq number gnus-newsgroup-replied) (memq number gnus-newsgroup-expirable) (cond ((and gnus-thread-ignore-subject + gnus-tmp-prev-subject (not (string= ! gnus-tmp-prev-subject (gnus-simplify-subject-re subject)))) subject) ((zerop level) *************** *** 6573,6600 **** subject)) (t gnus-summary-same-subject)) (and (eq gnus-summary-make-false-root 'adopt) (memq number gnus-tmp-gathered)) ! (cdr (assq number gnus-newsgroup-scored))) ! (setq gnus-tmp-prev-subject subject))))) (if (nth 1 thread) (setq stack (cons (cons (max 0 level) (nthcdr 1 thread)) stack))) (setq level (1+ level)) ! (setq threads (cdr (car thread)))))) (message "Generating summary...done")) - - (defun gnus-summary-prepare-unthreaded (headers &optional cull) ! (let (header number) ! ! ;; Do the async thing, if that is required. ! (if gnus-newsgroup-async ! (setq gnus-newsgroup-threads ! (mapcar (lambda (h) ! (cons (mail-header-number h) (mail-header-lines h))) ! headers))) (while headers (setq header (car headers) --- 6690,6711 ---- subject)) (t gnus-summary-same-subject)) (and (eq gnus-summary-make-false-root 'adopt) + (= level 1) (memq number gnus-tmp-gathered)) ! (cdr (assq number gnus-newsgroup-scored)))) ! (setq gnus-tmp-prev-subject ! (gnus-simplify-subject-re subject))))) (if (nth 1 thread) (setq stack (cons (cons (max 0 level) (nthcdr 1 thread)) stack))) (setq level (1+ level)) ! (setq threads (if thread-end nil (cdr (car thread)))) ! (or threads (setq level 0))))) (message "Generating summary...done")) (defun gnus-summary-prepare-unthreaded (headers &optional cull) ! (let (header number mark) (while headers (setq header (car headers) *************** *** 6603,6612 **** ;; We may have to root out some bad articles... (cond ! ((and cull ! (memq (setq number (mail-header-number header)) ! gnus-newsgroup-dormant))) ! ((and cull gnus-summary-expunge-below (< (or (cdr (assq number gnus-newsgroup-scored)) gnus-summary-default-score 0) gnus-summary-expunge-below)) --- 6714,6722 ---- ;; We may have to root out some bad articles... (cond ! ((memq (setq number (mail-header-number header)) ! gnus-newsgroup-dormant)) ! ((and gnus-summary-expunge-below (< (or (cdr (assq number gnus-newsgroup-scored)) gnus-summary-default-score 0) gnus-summary-expunge-below)) *************** *** 6615,6630 **** (setq gnus-newsgroup-reads (cons (cons number gnus-low-score-mark) gnus-newsgroup-reads))) (t ! (gnus-summary-insert-line ! nil header 0 nil ! (cond ((memq number gnus-newsgroup-marked) gnus-ticked-mark) ((memq number gnus-newsgroup-dormant) gnus-dormant-mark) ((memq number gnus-newsgroup-unreads) gnus-unread-mark) ((memq number gnus-newsgroup-expirable) gnus-expirable-mark) (t (or (cdr (assq number gnus-newsgroup-reads)) ! gnus-ancient-mark))) ! (memq number gnus-newsgroup-replied) (memq number gnus-newsgroup-expirable) (mail-header-subject header) nil (cdr (assq number gnus-newsgroup-scored)))))))) --- 6725,6748 ---- (setq gnus-newsgroup-reads (cons (cons number gnus-low-score-mark) gnus-newsgroup-reads))) + ((and gnus-newsgroup-limit + (not (memq number gnus-newsgroup-limit))) + ;; Don't print this article - it's not in the limit. + ) (t ! (setq mark ! (cond ! ((memq number gnus-newsgroup-marked) gnus-ticked-mark) ((memq number gnus-newsgroup-dormant) gnus-dormant-mark) ((memq number gnus-newsgroup-unreads) gnus-unread-mark) ((memq number gnus-newsgroup-expirable) gnus-expirable-mark) (t (or (cdr (assq number gnus-newsgroup-reads)) ! gnus-ancient-mark)))) ! (setq gnus-newsgroup-data ! (cons (gnus-data-make number mark (point) header 0) ! gnus-newsgroup-data)) ! (gnus-summary-insert-line ! nil header 0 nil mark (memq number gnus-newsgroup-replied) (memq number gnus-newsgroup-expirable) (mail-header-subject header) nil (cdr (assq number gnus-newsgroup-scored)))))))) *************** *** 6671,6707 **** ;; Retrieve the headers and read them in. (gnus-message 5 "Fetching headers...") (setq gnus-newsgroup-headers ! (if (eq 'nov (setq gnus-headers-retrieved-by ! ;; This is a naughty hack. To get the ! ;; retrieval of old headers to work, we ! ;; set `nntp-nov-gap' to nil (locally), ! ;; and then just retrieve the headers. ! ;; Mucho magic. ! (if gnus-fetch-old-headers ! (let (nntp-nov-gap) ! (gnus-retrieve-headers ! (if (not (eq 1 (car articles))) ! (cons 1 articles) ! articles) ! gnus-newsgroup-name)) ! (gnus-retrieve-headers ! articles gnus-newsgroup-name)))) ! (progn ! (gnus-get-newsgroup-headers-xover articles)) ! ;; If we were to fetch old headers, but the backend didn't ! ;; support XOVER, then it is possible we fetched one article ! ;; that we shouldn't have. If that's the case, we remove it. ! (if (or (not gnus-fetch-old-headers) ! (eq 1 (car articles))) ! () ! (save-excursion ! (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (and ! (looking-at "[0-9]+[ \t]+1[ \t]") ; This is not a NOV line. ! (delete-region ; So we delete this head. ! (point) ! (search-forward "\n.\n" nil t))))) (gnus-get-newsgroup-headers))) (gnus-message 5 "Fetching headers...done") ;; Remove canceled articles from the list of unread articles. --- 6789,6806 ---- ;; Retrieve the headers and read them in. (gnus-message 5 "Fetching headers...") (setq gnus-newsgroup-headers ! (if (eq 'nov ! (setq gnus-headers-retrieved-by ! (gnus-retrieve-headers ! articles gnus-newsgroup-name ! ;; We might want to fetch old headers, but ! ;; not if there is only 1 article. ! (and gnus-fetch-old-headers ! (or (and ! (not (eq gnus-fetch-old-headers 'some)) ! (not (numberp gnus-fetch-old-headers))) ! (> (length articles) 1)))))) ! (gnus-get-newsgroup-headers-xover articles) (gnus-get-newsgroup-headers))) (gnus-message 5 "Fetching headers...done") ;; Remove canceled articles from the list of unread articles. *************** *** 6732,6740 **** (setq gnus-newsgroup-processable nil))) ;; Check whether auto-expire is to be done in this group. (setq gnus-newsgroup-auto-expire ! (or (and (stringp gnus-auto-expirable-newsgroups) ! (string-match gnus-auto-expirable-newsgroups group)) ! (memq 'auto-expire (nth 5 info)))) ;; First and last article in this newsgroup. (and gnus-newsgroup-headers (setq gnus-newsgroup-begin --- 6831,6837 ---- (setq gnus-newsgroup-processable nil))) ;; Check whether auto-expire is to be done in this group. (setq gnus-newsgroup-auto-expire ! (gnus-group-auto-expirable-p group)) ;; First and last article in this newsgroup. (and gnus-newsgroup-headers (setq gnus-newsgroup-begin *************** *** 6995,7001 **** (not (memq (mail-header-number header) unreads))) (progn (setq start 0) ! (while (string-match "\\([^ ]+\\):\\([0-9]+\\)" xrefs start) (setq start (match-end 0)) (setq group (concat prefix (substring xrefs (match-beginning 1) (match-end 1)))) --- 7092,7098 ---- (not (memq (mail-header-number header) unreads))) (progn (setq start 0) ! (while (string-match "\\([^ ]+\\)[:/]\\([0-9]+\\)" xrefs start) (setq start (match-end 0)) (setq group (concat prefix (substring xrefs (match-beginning 1) (match-end 1)))) *************** *** 7142,7257 **** (setq gnus-article-internal-prepare-hook nil) (let ((cur nntp-server-buffer) (dependencies gnus-newsgroup-dependencies) ! headers id dep end ref) (save-excursion (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! ;; Search to the beginning of the next header. Error messages ! ;; do not begin with 2 or 3. ! (while (re-search-forward "^[23][0-9]+ " nil t) ! (let ((header (make-vector 9 nil)) ! (case-fold-search t) ! (p (point)) ! in-reply-to) (setq id nil ref nil) - (mail-header-set-number header (read cur)) ;; This implementation of this function, with nine ;; search-forwards instead of the one re-search-forward and ;; a case (which basically was the old function) is actually ;; about twice as fast, even though it looks messier. You ;; can't have everything, I guess. Speed and elegance ! ;; doesn't always come hand in hand. ! (save-restriction ! (narrow-to-region (point) (or (save-excursion ! (search-forward "\n.\n" nil t)) ! (point))) ! (if (search-forward "\nfrom: " nil t) ! (mail-header-set-from header (gnus-header-value)) ! (mail-header-set-from header "(nobody)")) ! (goto-char p) ! (if (search-forward "\nsubject: " nil t) ! (mail-header-set-subject header (gnus-header-value)) ! (mail-header-set-subject header "(none)")) ! (goto-char p) ! (and (search-forward "\nxref: " nil t) ! (mail-header-set-xref header (gnus-header-value))) ! (goto-char p) ! (or (numberp (and (search-forward "\nlines: " nil t) ! (mail-header-set-lines header (read cur)))) ! (mail-header-set-lines header 0)) ! (goto-char p) ! (and (search-forward "\ndate: " nil t) ! (mail-header-set-date header (gnus-header-value))) ! (goto-char p) ! (if (search-forward "\nmessage-id: " nil t) ! (mail-header-set-id header (setq id (gnus-header-value))) ! ;; If there was no message-id, we just fake one to make ! ;; subsequent routines simpler. ! (mail-header-set-id ! header ! (setq id (concat "none+" ! (int-to-string ! (setq gnus-newsgroup-none-id ! (1+ gnus-newsgroup-none-id))))))) ! (goto-char p) ! (if (search-forward "\nreferences: " nil t) ! (progn ! (mail-header-set-references header (gnus-header-value)) ! (setq end (match-end 0)) ! (save-excursion ! (setq ref ! (downcase ! (buffer-substring ! (progn ! (end-of-line) ! (search-backward ">" end t) ! (1+ (point))) ! (progn ! (search-backward "<" end t) ! (point))))))) ! ;; Get the references from the in-reply-to header if there ! ;; ware 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)) ! (string-match "<[^>]+>" in-reply-to)) ! (progn ! (mail-header-set-references ! header ! (setq ref (substring in-reply-to (match-beginning 0) ! (match-end 0)))) ! (setq ref (downcase ref))) (setq ref "none"))) ! ;; We do some threading while we read the headers. The ! ;; message-id and the last reference are both entered into ! ;; the same hash table. Some tippy-toeing around has to be ! ;; done in case an article has arrived before the article ! ;; which it refers to. ! (if (boundp (setq dep (intern (downcase id) dependencies))) ! (if (car (symbol-value dep)) ! ;; An article with this Message-ID has already ! ;; been seen, so we ignore this one, except we add ! ;; any additional Xrefs (in case the two articles ! ;; came from different servers. ! (progn ! (mail-header-set-xref ! (car (symbol-value dep)) ! (concat (or (mail-header-xref ! (car (symbol-value dep))) "") ! (or (mail-header-xref header) ""))) ! (setq header nil)) ! (setcar (symbol-value dep) header)) ! (set dep (list header))) ! (if header ! (progn ! (if (boundp (setq dep (intern ref dependencies))) ! (setcdr (symbol-value dep) ! (cons header (cdr (symbol-value dep)))) ! (set dep (list nil header))) ! (setq headers (cons header headers)))) ! (goto-char (point-max)))))) ! (nreverse headers))) ;; The following macros and functions were written by Felix Lee ;; . --- 7239,7372 ---- (setq gnus-article-internal-prepare-hook nil) (let ((cur nntp-server-buffer) (dependencies gnus-newsgroup-dependencies) ! headers id id-dep ref-dep end ref) (save-excursion (set-buffer nntp-server-buffer) ! (let ((case-fold-search t) ! in-reply-to header number p lines) ! (goto-char (point-min)) ! ;; Search to the beginning of the next header. Error messages ! ;; do not begin with 2 or 3. ! (while (re-search-forward "^[23][0-9]+ " nil t) (setq id nil ref nil) ;; This implementation of this function, with nine ;; search-forwards instead of the one re-search-forward and ;; a case (which basically was the old function) is actually ;; about twice as fast, even though it looks messier. You ;; can't have everything, I guess. Speed and elegance ! ;; doesn't always go hand in hand. ! (setq ! header ! (vector ! ;; Number. ! (prog1 ! (read cur) ! (forward-line 1) ! (setq p (point)) ! (narrow-to-region (point) ! (or (search-forward "\n.\n" nil t) ! (point)))) ! ;; Subject. ! (progn ! (goto-char p) ! (if (search-forward "\nsubject: " nil t) ! (gnus-header-value) "(none)")) ! ;; From. ! (progn ! (goto-char p) ! (if (search-forward "\nfrom: " nil t) ! (gnus-header-value) "(nobody)")) ! ;; Date. ! (progn ! (goto-char p) ! (if (search-forward "\ndate: " nil t) ! (gnus-header-value) "")) ! ;; Message-ID. ! (progn ! (goto-char p) ! (if (search-forward "\nmessage-id: " nil t) ! (setq id (gnus-header-value)) ! ;; If there was no message-id, we just fake one to make ! ;; subsequent routines simpler. ! (setq id (concat "none+" ! (int-to-string ! (setq gnus-newsgroup-none-id ! (1+ gnus-newsgroup-none-id))))))) ! ;; References. ! (progn ! (goto-char p) ! (if (search-forward "\nreferences: " nil t) ! (prog1 ! (gnus-header-value) ! (setq end (match-end 0)) ! (save-excursion ! (setq ref ! (downcase ! (buffer-substring ! (progn ! (end-of-line) ! (search-backward ">" end t) ! (1+ (point))) ! (progn ! (search-backward "<" end t) ! (point))))))) ! ;; Get the references from the in-reply-to header if there ! ;; 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)) ! (string-match "<[^>]+>" in-reply-to)) ! (prog1 ! (setq ref (substring in-reply-to (match-beginning 0) ! (match-end 0))) ! (setq ref (downcase ref)))) (setq ref "none"))) ! ;; Chars. ! 0 ! ;; Lines. ! (progn ! (goto-char p) ! (if (search-forward "\nlines: " nil t) ! (if (numberp (setq lines (read cur))) ! lines 0) ! 0)) ! ;; Xref. ! (progn ! (goto-char p) ! (and (search-forward "\nxref: " nil t) ! (gnus-header-value))))) ! ;; We do the threading while we read the headers. The ! ;; message-id and the last reference are both entered into ! ;; the same hash table. Some tippy-toeing around has to be ! ;; done in case an article has arrived before the article ! ;; which it refers to. ! (if (boundp (setq id-dep (intern (downcase id) dependencies))) ! (if (car (symbol-value id-dep)) ! ;; An article with this Message-ID has already ! ;; been seen, so we ignore this one, except we add ! ;; any additional Xrefs (in case the two articles ! ;; came from different servers). ! (progn ! (mail-header-set-xref ! (car (symbol-value id-dep)) ! (concat (or (mail-header-xref ! (car (symbol-value id-dep))) "") ! (or (mail-header-xref header) ""))) ! (setq header nil)) ! (setcar (symbol-value id-dep) header)) ! (set id-dep (list header))) ! (if header ! (progn ! (if (boundp (setq ref-dep (intern ref dependencies))) ! (setcdr (symbol-value ref-dep) ! (nconc (cdr (symbol-value ref-dep)) ! (list (symbol-value id-dep)))) ! (set ref-dep (list nil (symbol-value id-dep)))) ! (setq headers (cons header headers)))) ! (goto-char (point-max)) ! (widen)) ! (nreverse headers))))) ;; The following macros and functions were written by Felix Lee ;; . *************** *** 7304,7310 **** (let ((none 0) (eol (gnus-point-at-eol)) (buffer (current-buffer)) ! header ref id dep) ;; overview: [num subject from date id refs chars lines misc] (narrow-to-region (point) eol) --- 7419,7425 ---- (let ((none 0) (eol (gnus-point-at-eol)) (buffer (current-buffer)) ! header ref id id-dep ref-dep) ;; overview: [num subject from date id refs chars lines misc] (narrow-to-region (point) eol) *************** *** 7351,7377 **** ;; We build the thread tree. (and header ! (if (boundp (setq dep (intern (downcase id) dependencies))) ! (if (car (symbol-value dep)) ;; An article with this Message-ID has already been seen, ;; so we ignore this one, except we add any additional ;; Xrefs (in case the two articles came from different ;; servers. (progn (mail-header-set-xref ! (car (symbol-value dep)) ! (concat (or (mail-header-xref (car (symbol-value dep))) "") (or (mail-header-xref header) ""))) (setq header nil)) ! (setcar (symbol-value dep) header)) ! (set dep (list header)))) (if header (progn ! (if (boundp (setq dep (intern (or ref "none") ! dependencies))) ! (setcdr (symbol-value dep) ! (cons header (cdr (symbol-value dep)))) ! (set dep (list nil header))))) header)) (defun gnus-article-get-xrefs () --- 7466,7494 ---- ;; We build the thread tree. (and header ! (if (boundp (setq id-dep (intern (downcase id) dependencies))) ! (if (car (symbol-value id-dep)) ;; An article with this Message-ID has already been seen, ;; so we ignore this one, except we add any additional ;; Xrefs (in case the two articles came from different ;; servers. (progn (mail-header-set-xref ! (car (symbol-value id-dep)) ! (concat (or (mail-header-xref ! (car (symbol-value id-dep))) "") (or (mail-header-xref header) ""))) (setq header nil)) ! (setcar (symbol-value id-dep) header)) ! (set id-dep (list header)))) (if header (progn ! (if (boundp (setq ref-dep (intern (or ref "none") ! dependencies))) ! (setcdr (symbol-value ref-dep) ! (nconc (cdr (symbol-value ref-dep)) ! (list (symbol-value id-dep)))) ! (set ref-dep (list nil (symbol-value id-dep)))))) header)) (defun gnus-article-get-xrefs () *************** *** 7397,7419 **** (progn (end-of-line) (point)))) (mail-header-set-xref headers xref)))))))) - (defalias 'gnus-find-header-by-number 'gnus-get-header-by-number) - (make-obsolete 'gnus-find-header-by-number 'gnus-get-header-by-number) - - (defun gnus-make-headers-hashtable-by-number () - "Make hashtable for the variable gnus-newsgroup-headers by number." - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((headers gnus-newsgroup-headers) - header) - (setq gnus-newsgroup-headers-hashtb-by-number - (gnus-make-hashtable (length headers))) - (while headers - (setq header (car headers)) - (gnus-sethash (int-to-string (mail-header-number header)) - header gnus-newsgroup-headers-hashtb-by-number) - (setq headers (cdr headers)))))) - (defun gnus-more-header-backward () "Find new header backward." (let ((first (car (gnus-gethash gnus-newsgroup-name gnus-active-hashtb))) --- 7514,7519 ---- *************** *** 7457,7471 **** "Return a list of articles to be worked upon. The prefix argument, the list of process marked articles, and the current article will be taken into consideration." ! (let (articles) (if (and n (numberp n)) (let ((backward (< n 0)) (n (abs n))) (save-excursion ! (while (and (> n 0) ! (setq articles (cons (gnus-summary-article-number) ! articles)) ! (gnus-summary-search-forward nil nil backward)) (setq n (1- n)))) (sort articles (function <))) (or (reverse gnus-newsgroup-processable) --- 7557,7575 ---- "Return a list of articles to be worked upon. The prefix argument, the list of process marked articles, and the current article will be taken into consideration." ! (let (articles article) (if (and n (numberp n)) (let ((backward (< n 0)) (n (abs n))) (save-excursion ! (while ! (and (> n 0) ! (setq articles ! (cons (setq article (gnus-summary-article-number)) ! articles)) ! (if backward ! (gnus-summary-find-prev nil article) ! (gnus-summary-find-next nil article))) (setq n (1- n)))) (sort articles (function <))) (or (reverse gnus-newsgroup-processable) *************** *** 7488,7558 **** (save-excursion (gnus-group-best-unread-group exclude-group)))) ! (defun gnus-subject-equal (s1 s2) ! (cond ! ((null gnus-summary-gather-subject-limit) ! (equal (gnus-simplify-subject-re s1) ! (gnus-simplify-subject-re s2))) ! ((eq gnus-summary-gather-subject-limit 'fuzzy) ! (equal (gnus-simplify-subject-fuzzy s1) ! (gnus-simplify-subject-fuzzy s2))) ! ((numberp gnus-summary-gather-subject-limit) ! (equal (gnus-limit-string s1 gnus-summary-gather-subject-limit) ! (gnus-limit-string s2 gnus-summary-gather-subject-limit))) ! (t ! (equal s1 s2)))) ! ! (defun gnus-summary-search-subject (&optional backward unread subject) ! "Search for article forward. ! If BACKWARD is non-nil, search backward. ! If UNREAD is non-nil, only unread articles are selected. ! If SUBJECT is non-nil, the article which has the same subject will be ! searched for." ! (let ((func (if backward 'previous-single-property-change ! 'next-single-property-change)) ! (beg (point)) ! (did t) ! pos psubject) ! (beginning-of-line) ! (and gnus-summary-check-current unread ! (eq (get-text-property (point) 'gnus-mark) gnus-unread-mark) ! (setq did nil)) ! (if (not did) ! () ! (forward-char (if backward (if (bobp) 0 -1) (if (eobp) 0 1))) ! (while ! (and ! (setq pos (funcall func (point) 'gnus-number)) ! (goto-char (if backward (1- pos) pos)) ! (setq did ! (not (and ! (or (not unread) ! (eq (get-text-property (point) 'gnus-mark) ! gnus-unread-mark)) ! (or (not subject) ! (and (setq psubject ! (inline (gnus-summary-subject-string))) ! (inline ! (gnus-subject-equal subject psubject))))))) ! (if backward (if (bobp) nil (forward-char -1) t) ! (if (eobp) nil (forward-char 1) t))))) ! (if did ! (progn (goto-char beg) nil) ! (prog1 ! (get-text-property (point) 'gnus-number) ! (gnus-summary-show-thread) ! (gnus-summary-position-cursor))))) ! ! (defun gnus-summary-pseudo-article () ! "The thread level of the article on the current line." ! (get-text-property (gnus-point-at-bol) 'gnus-pseudo)) ! ! (defalias 'gnus-summary-score 'gnus-summary-article-score) ! (make-obsolete 'gnus-summary-score 'gnus-summary-article-score) ! (defun gnus-summary-article-score () ! "Return current article score." ! (or (cdr (assq (gnus-summary-article-number) gnus-newsgroup-scored)) ! gnus-summary-default-score 0)) (defun gnus-summary-recenter () "Center point in the summary window. --- 7592,7659 ---- (save-excursion (gnus-group-best-unread-group exclude-group)))) ! (defun gnus-summary-find-next (&optional unread article backward) ! (if backward (gnus-summary-find-prev) ! (let* ((article (or article (gnus-summary-article-number))) ! (arts (cdr (gnus-data-find-list article))) ! result) ! (if (setq result ! (if unread ! (progn ! (while arts ! (and (gnus-data-unread-p (car arts)) ! (setq result (car arts) ! arts nil)) ! (setq arts (cdr arts))) ! result) ! (car arts))) ! (progn ! (goto-char (gnus-data-pos result)) ! (gnus-data-number result)))))) ! ! (defun gnus-summary-find-prev (&optional unread article) ! (let* ((article (or article (gnus-summary-article-number))) ! result arts) ! (setq arts (cdr (gnus-data-find-list article (gnus-data-list 'rev)))) ! (if (setq result ! (if unread ! (progn ! (while arts ! (and (gnus-data-unread-p (car arts)) ! (setq result (car arts) ! arts nil)) ! (setq arts (cdr arts))) ! result) ! (car arts))) ! (progn ! (goto-char (gnus-data-pos result)) ! (gnus-data-number result))))) ! ! (defun gnus-summary-find-subject (subject &optional unread backward article) ! (let* ((article (or article (gnus-summary-article-number))) ! (articles (gnus-data-list backward)) ! (arts (cdr (gnus-data-find-list article articles))) ! result) ! (while arts ! (and (or (not unread) ! (gnus-data-unread-p (car arts))) ! (vectorp (gnus-data-header (car arts))) ! (gnus-subject-equal ! subject (mail-header-subject (gnus-data-header (car arts)))) ! (setq result (car arts) ! arts nil)) ! (setq arts (cdr arts))) ! (and result ! (goto-char (gnus-data-pos result)) ! (gnus-data-number result)))) ! ! (defun gnus-summary-search-forward (&optional unread subject backward) ! (cond (subject ! (gnus-summary-find-subject subject unread backward)) ! (backward ! (gnus-summary-find-prev unread)) ! (t ! (gnus-summary-find-next unread)))) (defun gnus-summary-recenter () "Center point in the summary window. *************** *** 7980,7999 **** (defun gnus-summary-first-subject (&optional unread) "Go to the first unread subject. If UNREAD is non-nil, go to the first unread article. ! Returns nil if there are no unread articles." (interactive "P") (prog1 ! (cond ((not unread) ! (goto-char (point-min))) ! ((gnus-goto-char ! (text-property-any ! (point-min) (point-max) 'gnus-mark gnus-unread-mark)) ! t) ! (t ! ;; There are no unread articles. ! (gnus-message 3 "No more unread articles") ! nil)) ! (gnus-summary-position-cursor))) (defun gnus-summary-next-subject (n &optional unread dont-display) "Go to next N'th summary line. --- 8081,8113 ---- (defun gnus-summary-first-subject (&optional unread) "Go to the first unread subject. If UNREAD is non-nil, go to the first unread article. ! Returns the article selected or nil if there are no unread articles." (interactive "P") (prog1 ! (cond ! ;; Empty summary. ! ((null gnus-newsgroup-data) ! (gnus-message 3 "No articles in the group") ! nil) ! ;; Pick the first article. ! ((not unread) ! (goto-char (gnus-data-pos (car gnus-newsgroup-data))) ! (gnus-data-number (car gnus-newsgroup-data))) ! ;; No unread articles. ! ((null gnus-newsgroup-unreads) ! (gnus-message 3 "No more unread articles") ! nil) ! ;; Find the first unread article. ! (t ! (let ((data gnus-newsgroup-data)) ! (while (and data ! (not (gnus-data-unread-p (car data)))) ! (setq data (cdr data))) ! (if data ! (progn ! (goto-char (gnus-data-pos (car data))) ! (gnus-data-number (car data))))))) ! (gnus-summary-position-point))) (defun gnus-summary-next-subject (n &optional unread dont-display) "Go to next N'th summary line. *************** *** 8005,8018 **** (let ((backward (< n 0)) (n (abs n))) (while (and (> n 0) ! (gnus-summary-search-forward unread nil backward)) (setq n (1- n))) (if (/= 0 n) (gnus-message 7 "No more%s articles" (if unread " unread" ""))) (or dont-display (progn (gnus-summary-recenter) ! (gnus-summary-position-cursor))) n)) (defun gnus-summary-next-unread-subject (n) --- 8119,8134 ---- (let ((backward (< n 0)) (n (abs n))) (while (and (> n 0) ! (if backward ! (gnus-summary-find-prev unread) ! (gnus-summary-find-next unread))) (setq n (1- n))) (if (/= 0 n) (gnus-message 7 "No more%s articles" (if unread " unread" ""))) (or dont-display (progn (gnus-summary-recenter) ! (gnus-summary-position-point))) n)) (defun gnus-summary-next-unread-subject (n) *************** *** 8044,8063 **** gnus-newsgroup-headers) nil 'require-match)))) (or article (error "No article number")) ! (let ((b (point))) ! (if (not (gnus-goto-char (text-property-any (point-min) (point-max) ! 'gnus-number article))) () (gnus-summary-show-thread) ;; Skip dummy articles. (if (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) (prog1 (if (not (eobp)) article (goto-char b) nil) ! (gnus-summary-position-cursor))))) ;; Walking around summary lines with displaying articles. --- 8160,8180 ---- gnus-newsgroup-headers) nil 'require-match)))) (or article (error "No article number")) ! (let ((b (point)) ! (data (gnus-data-find article))) ! (if (not data) () + (goto-char (gnus-data-pos data)) (gnus-summary-show-thread) ;; Skip dummy articles. (if (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) (prog1 (if (not (eobp)) article (goto-char b) nil) ! (gnus-summary-position-point))))) ;; Walking around summary lines with displaying articles. *************** *** 8079,8087 **** (gnus-article-prepare article all-header) (gnus-summary-show-thread) (if (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (progn ! (forward-line 1) ! (gnus-summary-position-cursor))) (run-hooks 'gnus-select-article-hook) (gnus-summary-recenter) (gnus-summary-goto-subject article) --- 8196,8202 ---- (gnus-article-prepare article all-header) (gnus-summary-show-thread) (if (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) (run-hooks 'gnus-select-article-hook) (gnus-summary-recenter) (gnus-summary-goto-subject article) *************** *** 8097,8107 **** non-nil, the article will be re-fetched even if it already present in the article buffer. If PSEUDO is non-nil, pseudo-articles will also be displayed." - (and (not pseudo) (gnus-summary-pseudo-article) - (error "This is a pseudo-article.")) (let ((article (or article (gnus-summary-article-number))) (all-headers (not (not all-headers))) ;Must be T or NIL. did) (prog1 (save-excursion (set-buffer gnus-summary-buffer) --- 8212,8223 ---- non-nil, the article will be re-fetched even if it already present in the article buffer. If PSEUDO is non-nil, pseudo-articles will also be displayed." (let ((article (or article (gnus-summary-article-number))) (all-headers (not (not all-headers))) ;Must be T or NIL. did) + (and (not pseudo) + (gnus-summary-article-pseudo-p article) + (error "This is a pseudo-article.")) (prog1 (save-excursion (set-buffer gnus-summary-buffer) *************** *** 8139,8151 **** ((and (gnus-summary-search-forward unread subject backward) (or (gnus-summary-display-article (gnus-summary-article-number)) (eq (gnus-summary-article-mark) gnus-canceled-mark))) ! (gnus-summary-position-cursor)) ;; If not, we try the first unread, if that is wanted. ((and subject gnus-auto-select-same (or (gnus-summary-first-unread-article) (eq (gnus-summary-article-mark) gnus-canceled-mark))) ! (gnus-summary-position-cursor) (gnus-message 6 "Wrapped")) ;; Try to get next/previous article not displayed in this group. ((and gnus-auto-extend-newsgroup --- 8255,8267 ---- ((and (gnus-summary-search-forward unread subject backward) (or (gnus-summary-display-article (gnus-summary-article-number)) (eq (gnus-summary-article-mark) gnus-canceled-mark))) ! (gnus-summary-position-point)) ;; If not, we try the first unread, if that is wanted. ((and subject gnus-auto-select-same (or (gnus-summary-first-unread-article) (eq (gnus-summary-article-mark) gnus-canceled-mark))) ! (gnus-summary-position-point) (gnus-message 6 "Wrapped")) ;; Try to get next/previous article not displayed in this group. ((and gnus-auto-extend-newsgroup *************** *** 8225,8231 **** "Select unread article after current one." (interactive) (gnus-summary-next-article t (and gnus-auto-select-same ! (gnus-summary-subject-string)))) (defun gnus-summary-prev-article (&optional unread subject) "Select the article after the current one. --- 8341,8347 ---- "Select unread article after current one." (interactive) (gnus-summary-next-article t (and gnus-auto-select-same ! (gnus-summary-article-subject)))) (defun gnus-summary-prev-article (&optional unread subject) "Select the article after the current one. *************** *** 8237,8243 **** "Select unred article before current one." (interactive) (gnus-summary-prev-article t (and gnus-auto-select-same ! (gnus-summary-subject-string)))) (defun gnus-summary-next-page (&optional lines circular) "Show next page of selected article. --- 8353,8359 ---- "Select unred article before current one." (interactive) (gnus-summary-prev-article t (and gnus-auto-select-same ! (gnus-summary-article-subject)))) (defun gnus-summary-next-page (&optional lines circular) "Show next page of selected article. *************** *** 8269,8275 **** ((null lines) (gnus-summary-next-unread-article))))) (gnus-summary-recenter) ! (gnus-summary-position-cursor))) (defun gnus-summary-prev-page (&optional lines) "Show previous page of selected article. --- 8385,8391 ---- ((null lines) (gnus-summary-next-unread-article))))) (gnus-summary-recenter) ! (gnus-summary-position-point))) (defun gnus-summary-prev-page (&optional lines) "Show previous page of selected article. *************** *** 8287,8293 **** (gnus-summary-recenter) (gnus-eval-in-buffer-window gnus-article-buffer (gnus-article-prev-page lines)))) ! (gnus-summary-position-cursor)) (defun gnus-summary-scroll-up (lines) "Scroll up (or down) one line current article. --- 8403,8409 ---- (gnus-summary-recenter) (gnus-eval-in-buffer-window gnus-article-buffer (gnus-article-prev-page lines)))) ! (gnus-summary-position-point)) (defun gnus-summary-scroll-up (lines) "Scroll up (or down) one line current article. *************** *** 8304,8334 **** ((< lines 0) (gnus-article-prev-page (- lines)))))) (gnus-summary-recenter) ! (gnus-summary-position-cursor)) (defun gnus-summary-next-same-subject () "Select next article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-next-article nil (gnus-summary-subject-string))) (defun gnus-summary-prev-same-subject () "Select previous article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-prev-article nil (gnus-summary-subject-string))) (defun gnus-summary-next-unread-same-subject () "Select next unread article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-next-article t (gnus-summary-subject-string))) (defun gnus-summary-prev-unread-same-subject () "Select previous unread article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-prev-article t (gnus-summary-subject-string))) (defun gnus-summary-first-unread-article () "Select the first unread article. --- 8420,8450 ---- ((< lines 0) (gnus-article-prev-page (- lines)))))) (gnus-summary-recenter) ! (gnus-summary-position-point)) (defun gnus-summary-next-same-subject () "Select next article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-next-article nil (gnus-summary-article-subject))) (defun gnus-summary-prev-same-subject () "Select previous article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-prev-article nil (gnus-summary-article-subject))) (defun gnus-summary-next-unread-same-subject () "Select next unread article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-next-article t (gnus-summary-article-subject))) (defun gnus-summary-prev-unread-same-subject () "Select previous unread article which has the same subject as current one." (interactive) (gnus-set-global-variables) ! (gnus-summary-prev-article t (gnus-summary-article-subject))) (defun gnus-summary-first-unread-article () "Select the first unread article. *************** *** 8341,8393 **** (gnus-summary-show-thread) (gnus-summary-first-subject t) (gnus-summary-display-article (gnus-summary-article-number)))) ! (gnus-summary-position-cursor))) (defun gnus-summary-best-unread-article () "Select the unread article with the highest score." (interactive) (gnus-set-global-variables) ! (let ((scored gnus-newsgroup-scored) ! (best -1000000) ! article art) ! (while scored ! (or (> best (cdr (car scored))) ! (and (memq (setq art (car (car scored))) gnus-newsgroup-unreads) ! (not (memq art gnus-newsgroup-marked)) ! (not (memq art gnus-newsgroup-dormant)) ! (if (= best (cdr (car scored))) ! (setq article (min art article)) ! (setq article art) ! (setq best (cdr (car scored)))))) ! (setq scored (cdr scored))) ! (cond ! ((or (not article) (null gnus-newsgroup-unreads)) ! ;; We didn't find any scored articles, so we just jump to the ! ;; first article. ! (gnus-summary-first-unread-article)) ! ((> best gnus-summary-default-score) ! ;; We found one, and it's bigger than the default score, so we ! ;; select it. ! (gnus-summary-goto-article article)) ! (t ! ;; We found an article, but it has a score lower than the ! ;; defaults, so we try to find an article with the default ! ;; score. ! (goto-char (point-min)) ! (while (and (or (not (= (gnus-summary-article-mark) gnus-unread-mark)) ! (and (assq (gnus-summary-article-number) ! gnus-newsgroup-scored) ! (< (cdr (assq (gnus-summary-article-number) ! gnus-newsgroup-scored)) ! gnus-summary-default-score))) ! (zerop (forward-line 1)) ! (not (eobp)))) ! (if (= (gnus-summary-article-mark) gnus-unread-mark) ! ;; We jump to the article we have finally found. ! (gnus-summary-goto-article (gnus-summary-article-number)) ! ;; Or there were no default-scored articles. ! (gnus-summary-goto-article article)))) ! (gnus-summary-position-cursor))) (defun gnus-summary-goto-article (article &optional all-headers) "Fetch ARTICLE and display it if it exists. --- 8457,8483 ---- (gnus-summary-show-thread) (gnus-summary-first-subject t) (gnus-summary-display-article (gnus-summary-article-number)))) ! (gnus-summary-position-point))) (defun gnus-summary-best-unread-article () "Select the unread article with the highest score." (interactive) (gnus-set-global-variables) ! (let ((best -1000000) ! (data gnus-newsgroup-data) ! article score) ! (while data ! (and (gnus-data-unread-p (car data)) ! (> (setq score ! (gnus-summary-article-score (gnus-data-number (car data)))) ! best) ! (setq best score ! article (gnus-data-number (car data)))) ! (setq data (cdr data))) ! (if article ! (gnus-summary-goto-article article) ! (error "No unread articles")) ! (gnus-summary-position-point))) (defun gnus-summary-goto-article (article &optional all-headers) "Fetch ARTICLE and display it if it exists. *************** *** 8404,8410 **** (prog1 (and (gnus-summary-goto-subject article) (gnus-summary-display-article article all-headers)) ! (gnus-summary-position-cursor))) (defun gnus-summary-goto-last-article () "Go to the previously read article." --- 8494,8500 ---- (prog1 (and (gnus-summary-goto-subject article) (gnus-summary-display-article article all-headers)) ! (gnus-summary-position-point))) (defun gnus-summary-goto-last-article () "Go to the previously read article." *************** *** 8412,8418 **** (prog1 (and gnus-last-article (gnus-summary-goto-article gnus-last-article)) ! (gnus-summary-position-cursor))) (defun gnus-summary-pop-article (number) "Pop one article off the history and go to the previous. --- 8502,8508 ---- (prog1 (and gnus-last-article (gnus-summary-goto-article gnus-last-article)) ! (gnus-summary-position-point))) (defun gnus-summary-pop-article (number) "Pop one article off the history and go to the previous. *************** *** 8424,8430 **** (if to (gnus-summary-goto-article (car to)) (error "Article history empty"))) ! (gnus-summary-position-cursor)) ;; Summary article oriented commands --- 8514,8689 ---- (if to (gnus-summary-goto-article (car to)) (error "Article history empty"))) ! (gnus-summary-position-point)) ! ! ;; Summary commands and functions for limiting the summary buffer. ! ! (defun gnus-summary-limit-to-articles (n) ! "Limit the summary buffer to the next N articles. ! If not given a prefix, use the process marked articles instead." ! (interactive "P") ! (gnus-set-global-variables) ! (prog1 ! (let ((articles (gnus-summary-work-articles n))) ! (gnus-summary-limit articles)) ! (gnus-summary-position-point))) ! ! (defun gnus-summary-pop-limit (&optional total) ! "Restore the previous limit. ! If given a prefix, remove all limits." ! (interactive "P") ! (gnus-set-global-variables) ! (prog2 ! (if total (setq gnus-newsgroup-limits nil)) ! (gnus-summary-limit nil 'pop)) ! (gnus-summary-position-point)) ! ! (defun gnus-summary-limit-to-subject (subject) ! "Limit the summary buffer to articles that have subjects that match a regexp." ! (interactive "sRegexp: ") ! (if (equal "" subject) ! () ! (prog1 ! (let ((articles (gnus-summary-find-matching "subject" subject))) ! (or articles (error "Found no matches for \"%s\"" subject)) ! (gnus-summary-limit articles)) ! (gnus-summary-position-point)))) ! ! (defalias 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread) ! (make-obsolete ! 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread) ! ! (defun gnus-summary-limit-to-unread (&optional all) ! "Limit the summary buffer to articles that are not marked as read. ! If ALL is non-nil, limit strictly to unread articles." ! (interactive "P") ! (if all ! (gnus-summary-limit-to-marks (char-to-string gnus-unread-mark) t) ! (gnus-summary-limit-to-marks ! ;; Concat all the marks that say that an article is read and have ! ;; those removed. ! (concat (mapconcat ! (lambda (char) (char-to-string (symbol-value char))) ! '(gnus-del-mark gnus-read-mark gnus-ancient-mark ! gnus-killed-mark gnus-kill-file-mark ! gnus-low-score-mark gnus-expirable-mark ! gnus-canceled-mark gnus-catchup-mark) ! ""))))) ! ! (defalias 'gnus-summary-delete-marked-with 'gnus-summary-limit-to-marks) ! (make-obsolete 'gnus-summary-delete-marked-with 'gnus-summary-limit-to-marks) ! ! (defun gnus-summary-limit-to-marks (marks &optional reverse) ! "Limit the summary buffer to articles that are not marked with MARKS (e.g. \"DK\"). ! If REVERSE, limit the summary buffer to articles that are marked ! with MARKS. ! Returns how many articles were removed." ! (interactive "sMarks: ") ! (gnus-set-global-variables) ! (prog1 ! (if gnus-newsgroup-adaptive ! (gnus-score-remove-lines-adaptive marks) ! (let ((data gnus-newsgroup-data) ! (marks (append marks nil)) ; Transform to list. ! articles) ! (while data ! (or (if reverse (not (memq (gnus-data-mark (car data)) marks)) ! (memq (gnus-data-mark (car data)) marks)) ! (setq articles (cons (gnus-data-number (car data)) articles))) ! (setq data (cdr data))) ! (gnus-summary-limit articles))) ! (gnus-summary-position-point))) ! ! (defun gnus-summary-limit-to-score (&optional score) ! "Limit to articles with score at or above SCORE." ! (interactive "P") ! (gnus-set-global-variables) ! (setq score (if score ! (prefix-numeric-value score) ! (or gnus-summary-default-score 0))) ! (let ((data gnus-newsgroup-data) ! articles) ! (while data ! (and (>= (gnus-summary-article-score (gnus-data-number (car data))) ! score) ! (setq articles (cons (gnus-data-number (car data)) articles))) ! (setq data (cdr data)) ! (prog1 ! (gnus-summary-limit articles) ! (gnus-summary-position-point))))) ! ! (defun gnus-summary-limit-include-dormant () ! "Display all the hidden articles that are marked as dormant." ! (interactive) ! (gnus-set-global-variables) ! (or gnus-newsgroup-dormant ! (error "There are no dormant articles in this group")) ! (prog1 ! (gnus-summary-limit (append gnus-newsgroup-dormant gnus-newsgroup-limit)) ! (gnus-summary-position-point))) ! ! (defun gnus-summary-limit-exclude-dormant () ! "Hide all dormant articles." ! (interactive) ! (gnus-set-global-variables) ! (prog1 ! (gnus-summary-limit-to-marks (char-to-string gnus-dormant-mark) 'reverse) ! (gnus-summary-position-point))) ! ! (defun gnus-summary-limit-exclude-childless-dormant () ! "Hide all dormant articles that have no children." ! (interactive) ! (gnus-set-global-variables) ! (let ((data gnus-newsgroup-data) ! articles) ! ;; Find all articles that are either not dormant or have ! ;; children. ! (while data ! (and (or (not (= (gnus-data-mark (car data)) gnus-dormant-mark)) ! (gnus-article-parent-p (gnus-data-number (car data)))) ! (setq articles (cons (gnus-data-number (car data)) ! articles))) ! (setq data (cdr data))) ! ;; Do the limiting. ! (prog1 ! (gnus-summary-limit articles) ! (gnus-summary-position-point)))) ! ! (defun gnus-summary-limit (articles &optional pop) ! (if pop ! ;; We pop the previous limit off the stack and use that. ! (setq articles (car gnus-newsgroup-limits) ! gnus-newsgroup-limits (cdr gnus-newsgroup-limits)) ! ;; We use the new limit, so we push the old limit on the stack. ! (setq gnus-newsgroup-limits ! (cons gnus-newsgroup-limit gnus-newsgroup-limits))) ! ;; Set the limit. ! (setq gnus-newsgroup-limit articles) ! (let ((total (length gnus-newsgroup-data)) ! (data (gnus-data-find-list (gnus-summary-article-number))) ! found) ! ;; This will do all the work of generating the new summary buffer ! ;; according to the new limit. ! (gnus-summary-prepare) ! ;; Try to return to the article you were at, or on in the ! ;; neighborhood. ! (if data ! ;; We try to find some article after the current one. ! (while data ! (and (gnus-summary-goto-subject (gnus-data-number (car data))) ! (setq data nil ! found t)) ! (setq data (cdr data)))) ! (or found ! ;; If there is no data, that means that we were after the last ! ;; article. The same goes when we can't find any articles ! ;; after the current one. ! (progn ! (goto-char (point-max)) ! (gnus-summary-find-prev))) ! ;; We return how many articles were removed from the summary ! ;; buffer as a result of the new limit. ! (- total (length gnus-newsgroup-data)))) ;; Summary article oriented commands *************** *** 8436,8443 **** (while (and (> n 0) ! (let ((ref (mail-header-references (gnus-get-header-by-num ! (gnus-summary-article-number))))) (if (and ref (not (equal ref "")) (string-match "<[^<>]*>[ \t]*$" ref)) (gnus-summary-refer-article --- 8695,8701 ---- (while (and (> n 0) ! (let ((ref (mail-header-references (gnus-summary-article-header)))) (if (and ref (not (equal ref "")) (string-match "<[^<>]*>[ \t]*$" ref)) (gnus-summary-refer-article *************** *** 8446,8457 **** (gnus-summary-article-number)) nil))) (setq n (1- n))) ! (gnus-summary-position-cursor) n) (defun gnus-summary-refer-article (message-id) ! "Refer article specified by MESSAGE-ID. ! NOTE: This command only works with newsgroups that use real or simulated NNTP." (interactive "sMessage-ID: ") (if (or (not (stringp message-id)) (zerop (length message-id))) --- 8704,8728 ---- (gnus-summary-article-number)) nil))) (setq n (1- n))) ! (gnus-summary-position-point) n) + + (defun gnus-summary-refer-references () + "Fetch all articles mentioned in the References header. + Return how many articles were fetched." + (interactive) + (gnus-set-global-variables) + (let ((ref (mail-header-references (gnus-summary-article-header))) + (n 0)) + (while (string-match "<[^]*>" ref) + (setq n (1+ n)) + (gnus-summary-refer-article + (substring ref (match-beginning 0) (match-end 0))) + (setq ref (substring ref (match-end 0)))) + n)) (defun gnus-summary-refer-article (message-id) ! "Fetch an article specified by MESSAGE-ID." (interactive "sMessage-ID: ") (if (or (not (stringp message-id)) (zerop (length message-id))) *************** *** 8509,8515 **** (let ((buffer-read-only nil)) (and tmp-point (set-window-start (get-buffer-window (current-buffer)) ! tmp-point))))))))))) (defun gnus-summary-enter-digest-group () "Enter a digest group based on the current article." --- 8780,8787 ---- (let ((buffer-read-only nil)) (and tmp-point (set-window-start (get-buffer-window (current-buffer)) ! tmp-point))) ! nil)))))))) (defun gnus-summary-enter-digest-group () "Enter a digest group based on the current article." *************** *** 8587,8593 **** (last nil)) ;; Hidden thread subtrees must be searched for ,too. (gnus-summary-show-all-threads) - (if (eobp) (forward-line -1)) ;; First of all, search current article. ;; We don't want to read article again from NNTP server nor reset ;; current point. --- 8859,8864 ---- *************** *** 8603,8609 **** ;; Then search next articles. (while (and (not found) (gnus-summary-display-article ! (gnus-summary-search-subject backward nil nil))) (gnus-message 9 "Searching article: %d..." gnus-current-article) (gnus-eval-in-buffer-window gnus-article-buffer --- 8874,8881 ---- ;; Then search next articles. (while (and (not found) (gnus-summary-display-article ! (if backward (gnus-summary-find-prev) ! (gnus-summary-find-next)))) (gnus-message 9 "Searching article: %d..." gnus-current-article) (gnus-eval-in-buffer-window gnus-article-buffer *************** *** 8618,8623 **** --- 8890,8918 ---- ;; Return T if found such article. found)) + (defun gnus-summary-find-matching (header regexp &optional backward unread + not-case-fold) + "Return a list of all articles that match REGEXP on HEADER. + The search stars on the current article and goes forwards unless + BACKWARD is non-nil. If UNREAD is non-nil, only unread articles will + be taken into consideration. If NOT-CASE-FOLD, case won't be folded + in the comparisons." + (let ((data (gnus-data-find-list (gnus-summary-article-number + (gnus-data-list backward)))) + (func (intern (concat "gnus-header-" header))) + (case-fold-search (not not-case-fold)) + articles d) + (or (fboundp func) (error "%s is not a valid header" header)) + (while data + (setq d (car data)) + (and (or (not unread) ; We want all articles... + (gnus-data-unread-p d)) ; Or just unreads. + (vectorp (gnus-data-header d)) ; It's not a pseudo. + (string-match regexp (funcall func (gnus-data-header d))) ; Match. + (setq articles (cons (gnus-data-number d) articles))) ; Success! + (setq data (cdr data))) + (nreverse articles))) + (defun gnus-summary-execute-command (header regexp command &optional backward) "Search forward for an article whose HEADER matches REGEXP and execute COMMAND. If HEADER is an empty string (or nil), the match is done on the entire *************** *** 8678,8684 **** (gnus-set-global-variables) (gnus-summary-select-article nil 'force) (gnus-configure-windows 'article) ! (gnus-summary-position-cursor)) (defun gnus-summary-verbose-headers (&optional arg) "Toggle permanent full header display. --- 8973,8979 ---- (gnus-set-global-variables) (gnus-summary-select-article nil 'force) (gnus-configure-windows 'article) ! (gnus-summary-position-point)) (defun gnus-summary-verbose-headers (&optional arg) "Toggle permanent full header display. *************** *** 8996,9002 **** "Import a random file into a mail newsgroup." (interactive "fImport file: ") (let ((group gnus-newsgroup-name) ! atts) (or (gnus-check-backend-function 'request-accept-article group) (error "%s does not support article importing" group)) (or (file-readable-p file) --- 9291,9297 ---- "Import a random file into a mail newsgroup." (interactive "fImport file: ") (let ((group gnus-newsgroup-name) ! atts lines) (or (gnus-check-backend-function 'request-accept-article group) (error "%s does not support article importing" group)) (or (file-readable-p file) *************** *** 9010,9019 **** (goto-char (point-min)) (if (nnheader-article-p) () ! (setq atts (file-attributes file)) (insert "From: " (read-string "From: ") "\n" "Subject: " (read-string "Subject: ") "\n" "Date: " (current-time-string (nth 5 atts)) "\n" "Chars: " (int-to-string (nth 7 atts)) "\n\n")) (gnus-request-accept-article group t) (kill-buffer (current-buffer))))) --- 9305,9317 ---- (goto-char (point-min)) (if (nnheader-article-p) () ! (setq atts (file-attributes file) ! lines (count-lines (point-min) (point-max))) (insert "From: " (read-string "From: ") "\n" "Subject: " (read-string "Subject: ") "\n" "Date: " (current-time-string (nth 5 atts)) "\n" + "Message-ID: " (gnus-inews-message-id) "\n" + "Lines: " (int-to-string lines) "\n" "Chars: " (int-to-string (nth 7 atts)) "\n\n")) (gnus-request-accept-article group t) (kill-buffer (current-buffer))))) *************** *** 9026,9032 **** () (let* ((info (nth 2 (gnus-gethash gnus-newsgroup-name gnus-newsrc-hashtb))) ! (total (memq 'total-expire (nth 5 info))) (expirable (if total (gnus-list-of-read-articles gnus-newsgroup-name) (setq gnus-newsgroup-expirable --- 9324,9330 ---- () (let* ((info (nth 2 (gnus-gethash gnus-newsgroup-name gnus-newsrc-hashtb))) ! (total (gnus-group-total-expirable-p gnus-newsgroup-name)) (expirable (if total (gnus-list-of-read-articles gnus-newsgroup-name) (setq gnus-newsgroup-expirable *************** *** 9094,9100 **** (or (memq (car articles) not-deleted) (gnus-summary-mark-article (car articles) gnus-canceled-mark)) (setq articles (cdr articles)))) ! (gnus-summary-position-cursor) not-deleted)) (defun gnus-summary-edit-article (&optional force) --- 9392,9398 ---- (or (memq (car articles) not-deleted) (gnus-summary-mark-article (car articles) gnus-canceled-mark)) (setq articles (cdr articles)))) ! (gnus-summary-position-point) not-deleted)) (defun gnus-summary-edit-article (&optional force) *************** *** 9151,9158 **** (gnus-configure-windows 'summary) (and gnus-visual (run-hooks 'gnus-visual-mark-article-hook))) ! (defun gnus-summary-fancy-query () ! "Query where the fancy respool algorithm would put this article." (interactive) (gnus-summary-select-article) (save-excursion --- 9449,9456 ---- (gnus-configure-windows 'summary) (and gnus-visual (run-hooks 'gnus-visual-mark-article-hook))) ! (defun gnus-summary-respool-query () ! "Query where the respool algorithm would put this article." (interactive) (gnus-summary-select-article) (save-excursion *************** *** 9161,9167 **** (goto-char (point-min)) (search-forward "\n\n") (narrow-to-region (point-min) (point)) ! (pp-eval-expression (list 'quote (nnmail-split-fancy)))))) ;; Summary score commands. --- 9459,9466 ---- (goto-char (point-min)) (search-forward "\n\n") (narrow-to-region (point-min) (point)) ! (pp-eval-expression ! (list 'quote (mapcar 'car (nnmail-article-group 'identity))))))) ;; Summary score commands. *************** *** 9179,9185 **** (save-excursion (gnus-summary-show-thread) (if (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) (let ((buffer-read-only nil)) ;; Set score. (gnus-summary-update-mark --- 9478,9484 ---- (save-excursion (gnus-summary-show-thread) (if (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) (let ((buffer-read-only nil)) ;; Set score. (gnus-summary-update-mark *************** *** 9203,9220 **** (defun gnus-summary-raise-same-subject-and-select (score) "Raise articles which has the same subject with SCORE and select the next." (interactive "p") ! (let ((subject (gnus-summary-subject-string))) (gnus-summary-raise-score score) ! (while (gnus-summary-search-subject nil nil subject) (gnus-summary-raise-score score)) (gnus-summary-next-article t))) (defun gnus-summary-raise-same-subject (score) "Raise articles which has the same subject with SCORE." (interactive "p") ! (let ((subject (gnus-summary-subject-string))) (gnus-summary-raise-score score) ! (while (gnus-summary-search-subject nil nil subject) (gnus-summary-raise-score score)) (gnus-summary-next-subject 1 t))) --- 9502,9519 ---- (defun gnus-summary-raise-same-subject-and-select (score) "Raise articles which has the same subject with SCORE and select the next." (interactive "p") ! (let ((subject (gnus-summary-article-subject))) (gnus-summary-raise-score score) ! (while (gnus-summary-find-subject subject) (gnus-summary-raise-score score)) (gnus-summary-next-article t))) (defun gnus-summary-raise-same-subject (score) "Raise articles which has the same subject with SCORE." (interactive "p") ! (let ((subject (gnus-summary-article-subject))) (gnus-summary-raise-score score) ! (while (gnus-summary-find-subject subject) (gnus-summary-raise-score score)) (gnus-summary-next-subject 1 t))) *************** *** 9238,9244 **** (or (zerop (gnus-summary-next-subject 1 t)) (goto-char e)))) (gnus-summary-recenter) ! (gnus-summary-position-cursor) (gnus-set-mode-line 'summary)) (defun gnus-summary-lower-same-subject-and-select (score) --- 9537,9543 ---- (or (zerop (gnus-summary-next-subject 1 t)) (goto-char e)))) (gnus-summary-recenter) ! (gnus-summary-position-point) (gnus-set-mode-line 'summary)) (defun gnus-summary-lower-same-subject-and-select (score) *************** *** 9265,9275 **** (setq unmark (prefix-numeric-value unmark))) (let ((count (gnus-summary-mark-same-subject ! (gnus-summary-subject-string) unmark))) ;; Select next unread article. If auto-select-same mode, should ;; select the first unread article. (gnus-summary-next-article t (and gnus-auto-select-same ! (gnus-summary-subject-string))) (gnus-message 7 "%d article%s marked as %s" count (if (= count 1) " is" "s are") (if unmark "unread" "read")))) --- 9564,9574 ---- (setq unmark (prefix-numeric-value unmark))) (let ((count (gnus-summary-mark-same-subject ! (gnus-summary-article-subject) unmark))) ;; Select next unread article. If auto-select-same mode, should ;; select the first unread article. (gnus-summary-next-article t (and gnus-auto-select-same ! (gnus-summary-article-subject))) (gnus-message 7 "%d article%s marked as %s" count (if (= count 1) " is" "s are") (if unmark "unread" "read")))) *************** *** 9283,9289 **** (setq unmark (prefix-numeric-value unmark))) (let ((count (gnus-summary-mark-same-subject ! (gnus-summary-subject-string) unmark))) ;; If marked as read, go to next unread subject. (if (null unmark) ;; Go to next unread subject. --- 9582,9588 ---- (setq unmark (prefix-numeric-value unmark))) (let ((count (gnus-summary-mark-same-subject ! (gnus-summary-article-subject) unmark))) ;; If marked as read, go to next unread subject. (if (null unmark) ;; Go to next unread subject. *************** *** 9303,9323 **** (progn (gnus-summary-mark-article-as-read gnus-killed-mark) (gnus-summary-show-thread) t) ! (gnus-summary-search-forward nil subject)) (setq count (1+ count)))) ((> unmark 0) ; Tick. (while (and (progn (gnus-summary-mark-article-as-unread gnus-ticked-mark) (gnus-summary-show-thread) t) ! (gnus-summary-search-forward nil subject)) (setq count (1+ count)))) (t ; Mark as unread. (while (and (progn (gnus-summary-mark-article-as-unread gnus-unread-mark) (gnus-summary-show-thread) t) ! (gnus-summary-search-forward nil subject)) (setq count (1+ count))))) (gnus-set-mode-line 'summary) ;; Return the number of marked articles. --- 9602,9622 ---- (progn (gnus-summary-mark-article-as-read gnus-killed-mark) (gnus-summary-show-thread) t) ! (gnus-summary-find-subject subject)) (setq count (1+ count)))) ((> unmark 0) ; Tick. (while (and (progn (gnus-summary-mark-article-as-unread gnus-ticked-mark) (gnus-summary-show-thread) t) ! (gnus-summary-find-subject subject)) (setq count (1+ count)))) (t ; Mark as unread. (while (and (progn (gnus-summary-mark-article-as-unread gnus-unread-mark) (gnus-summary-show-thread) t) ! (gnus-summary-find-subject subject)) (setq count (1+ count))))) (gnus-set-mode-line 'summary) ;; Return the number of marked articles. *************** *** 9341,9347 **** (setq n (1- n))) (if (/= 0 n) (gnus-message 7 "No more articles")) (gnus-summary-recenter) ! (gnus-summary-position-cursor) n)) (defun gnus-summary-unmark-as-processable (n) --- 9640,9646 ---- (setq n (1- n))) (if (/= 0 n) (gnus-message 7 "No more articles")) (gnus-summary-recenter) ! (gnus-summary-position-point) n)) (defun gnus-summary-unmark-as-processable (n) *************** *** 9357,9363 **** (save-excursion (while gnus-newsgroup-processable (gnus-summary-remove-process-mark (car gnus-newsgroup-processable)))) ! (gnus-summary-position-cursor)) (defun gnus-summary-mark-as-expirable (n) "Mark N articles forward as expirable. --- 9656,9662 ---- (save-excursion (while gnus-newsgroup-processable (gnus-summary-remove-process-mark (car gnus-newsgroup-processable)))) ! (gnus-summary-position-point)) (defun gnus-summary-mark-as-expirable (n) "Mark N articles forward as expirable. *************** *** 9432,9438 **** (progn (gnus-summary-show-thread) (and (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) (gnus-summary-update-mark gnus-process-mark 'replied) t)))) --- 9731,9737 ---- (progn (gnus-summary-show-thread) (and (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) (gnus-summary-update-mark gnus-process-mark 'replied) t)))) *************** *** 9444,9450 **** (progn (gnus-summary-show-thread) (and (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) (gnus-summary-update-mark ? 'replied) (if (memq article gnus-newsgroup-replied) (gnus-summary-update-mark gnus-replied-mark 'replied)) --- 9743,9749 ---- (progn (gnus-summary-show-thread) (and (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) (gnus-summary-update-mark ? 'replied) (if (memq article gnus-newsgroup-replied) (gnus-summary-update-mark gnus-replied-mark 'replied)) *************** *** 9473,9479 **** (setq n (1- n))) (if (/= 0 n) (gnus-message 7 "No more %sarticles" (if mark "" "unread "))) (gnus-summary-recenter) ! (gnus-summary-position-cursor) (gnus-set-mode-line 'summary) n)) --- 9772,9778 ---- (setq n (1- n))) (if (/= 0 n) (gnus-message 7 "No more %sarticles" (if mark "" "unread "))) (gnus-summary-recenter) ! (gnus-summary-position-point) (gnus-set-mode-line 'summary) n)) *************** *** 9496,9502 **** (setq gnus-newsgroup-expirable (cons article gnus-newsgroup-expirable)))) (while (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)) --- 9795,9801 ---- (setq gnus-newsgroup-expirable (cons article gnus-newsgroup-expirable)))) (while (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)) *************** *** 9519,9534 **** ;; See whether the article is to be put in the cache. (and gnus-use-cache ! (vectorp (gnus-get-header-by-num article)) (save-excursion (gnus-cache-possibly-enter-article gnus-newsgroup-name article ! (gnus-get-header-by-num article) (= mark gnus-ticked-mark) (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) (while (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)) --- 9818,9833 ---- ;; See whether the article is to be put in the cache. (and gnus-use-cache ! (vectorp (gnus-summary-article-header article)) (save-excursion (gnus-cache-possibly-enter-article gnus-newsgroup-name article ! (gnus-summary-article-header article) (= mark gnus-ticked-mark) (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) (while (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)) *************** *** 9563,9573 **** ;; See whether the article is to be put in the cache. (and gnus-use-cache (not (= mark gnus-canceled-mark)) ! (vectorp (gnus-get-header-by-num article)) (save-excursion (gnus-cache-possibly-enter-article gnus-newsgroup-name article ! (gnus-get-header-by-num article) (= mark gnus-ticked-mark) (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) --- 9862,9872 ---- ;; See whether the article is to be put in the cache. (and gnus-use-cache (not (= mark gnus-canceled-mark)) ! (vectorp (gnus-summary-article-header article)) (save-excursion (gnus-cache-possibly-enter-article gnus-newsgroup-name article ! (gnus-summary-article-header article) (= mark gnus-ticked-mark) (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) *************** *** 9575,9581 **** (let ((buffer-read-only nil)) (gnus-summary-show-thread) (and (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (forward-line 1)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)))) --- 9874,9880 ---- (let ((buffer-read-only nil)) (gnus-summary-show-thread) (and (eq (gnus-summary-article-mark) gnus-dummy-mark) ! (gnus-summary-find-next)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)))) *************** *** 9587,9600 **** plist) (if (not forward) () (forward-char forward) ! (setq plist (text-properties-at (point))) ! (delete-char 1) ! (insert mark) ! (and plist (add-text-properties (1- (point)) (point) plist)) (and (eq type 'unread) (progn ! (add-text-properties (1- (point)) (point) (list 'gnus-mark mark)) (gnus-summary-update-line (eq mark gnus-unread-mark))))))) (defun gnus-mark-article-as-read (article &optional mark) --- 9886,9900 ---- plist) (if (not forward) () + ;; Go to the right position on the line. (forward-char forward) ! ;; Replace the old mark with the new mark. ! (subst-char-in-region (point) (1+ (point)) (following-char) mark) ! ;; Optionally update the marks by some user rule. (and (eq type 'unread) (progn ! (gnus-data-set-mark (gnus-data-find (gnus-summary-article-number)) ! mark) (gnus-summary-update-line (eq mark gnus-unread-mark))))))) (defun gnus-mark-article-as-read (article &optional mark) *************** *** 9722,9807 **** (gnus-summary-mark-article (gnus-summary-article-number) gnus-del-mark)) t) ! (zerop (forward-line 1)))))) ! ! ;; Fix by Per Abrahamsen . ! (defalias 'gnus-summary-delete-marked-as-read ! 'gnus-summary-remove-lines-marked-as-read) ! (make-obsolete 'gnus-summary-delete-marked-as-read ! 'gnus-summary-remove-lines-marked-as-read) ! (defun gnus-summary-remove-lines-marked-as-read () ! "Remove lines that are marked as read." ! (interactive) ! (gnus-summary-remove-lines-marked-with ! (concat (mapconcat ! (lambda (char) (char-to-string (symbol-value char))) ! '(gnus-del-mark gnus-read-mark gnus-ancient-mark ! gnus-killed-mark gnus-kill-file-mark ! gnus-low-score-mark gnus-expirable-mark ! gnus-canceled-mark gnus-catchup-mark) ! "")))) ! ! (defalias 'gnus-summary-delete-marked-with ! 'gnus-summary-remove-lines-marked-with) ! (make-obsolete 'gnus-summary-delete-marked-with ! 'gnus-summary-remove-lines-marked-with) ! ;; Rewrite by Daniel Quinlan . ! (defun gnus-summary-remove-lines-marked-with (marks) ! "Remove lines that are marked with MARKS (e.g. \"DK\")." ! (interactive "sMarks: ") ! ;; Fix by Sudish Joseph . ! (gnus-set-global-variables) ! (let ((buffer-read-only nil) ! (marks (concat "^[" marks "]"))) ! (goto-char (point-min)) ! (if gnus-newsgroup-adaptive ! (gnus-score-remove-lines-adaptive marks) ! (while (re-search-forward marks nil t) ! (gnus-delete-line))) ! ;; If we use dummy roots, we have to do an additional sweep over ! ;; the buffer. ! (if (not (eq gnus-summary-make-false-root 'dummy)) ! () ! (goto-char (point-min)) ! (setq marks (concat "^[" (char-to-string gnus-dummy-mark) "]")) ! (while (re-search-forward marks nil t) ! (if (gnus-subject-equal ! (gnus-summary-subject-string) ! (progn ! (forward-line 1) ! (gnus-summary-subject-string))) ! () ! (forward-line -1) ! (gnus-delete-line))))) ! (or (zerop (buffer-size)) ! (if (eobp) ! (gnus-summary-prev-subject 1) ! (gnus-summary-position-cursor)))) ! ! (defun gnus-summary-expunge-below (&optional score) ! "Remove articles with score less than SCORE." ! (interactive "P") ! (gnus-set-global-variables) ! (setq score (if score ! (prefix-numeric-value score) ! (or gnus-summary-default-score 0))) ! (save-excursion ! (set-buffer gnus-summary-buffer) ! (goto-char (point-min)) ! (let ((buffer-read-only nil) ! beg) ! (while (not (eobp)) ! (if (< (gnus-summary-article-score) score) ! (progn ! (setq beg (point)) ! (forward-line 1) ! (delete-region beg (point))) ! (forward-line 1))) ! ;; Adjust point. ! (or (zerop (buffer-size)) ! (if (eobp) ! (gnus-summary-prev-subject 1) ! (gnus-summary-position-cursor)))))) (defun gnus-summary-mark-below (score mark) "Mark articles with score less than SCORE with MARK." --- 10022,10028 ---- (gnus-summary-mark-article (gnus-summary-article-number) gnus-del-mark)) t) ! (gnus-summary-find-next))))) (defun gnus-summary-mark-below (score mark) "Mark articles with score less than SCORE with MARK." *************** *** 9816,9822 **** (while (not (eobp)) (and (< (gnus-summary-article-score) score) (gnus-summary-mark-article nil mark)) ! (forward-line 1)))) (defun gnus-summary-kill-below (&optional score) "Mark articles with score below SCORE as read." --- 10037,10043 ---- (while (not (eobp)) (and (< (gnus-summary-article-score) score) (gnus-summary-mark-article nil mark)) ! (gnus-summary-find-next)))) (defun gnus-summary-kill-below (&optional score) "Mark articles with score below SCORE as read." *************** *** 9846,9857 **** (save-excursion (set-buffer gnus-summary-buffer) (goto-char (point-min)) ! (while (not (eobp)) ! (if (> (gnus-summary-article-score) score) ! (progn ! (gnus-summary-mark-article nil mark) ! (forward-line 1)) ! (forward-line 1))))) ;; Suggested by Daniel Quinlan . (defun gnus-summary-show-all-expunged () --- 10067,10077 ---- (save-excursion (set-buffer gnus-summary-buffer) (goto-char (point-min)) ! (while (and (progn ! (if (> (gnus-summary-article-score) score) ! (gnus-summary-mark-article nil mark)) ! t) ! (gnus-summary-find-next))))) ;; Suggested by Daniel Quinlan . (defun gnus-summary-show-all-expunged () *************** *** 9863,9869 **** headers h) (while scored (or (gnus-summary-goto-subject (car (car scored))) ! (and (setq h (gnus-get-header-by-num (car (car scored)))) (< (cdr (car scored)) gnus-summary-expunge-below) (setq headers (cons h headers)))) (setq scored (cdr scored))) --- 10083,10089 ---- headers h) (while scored (or (gnus-summary-goto-subject (car (car scored))) ! (and (setq h (gnus-summary-article-header (car (car scored)))) (< (cdr (car scored)) gnus-summary-expunge-below) (setq headers (cons h headers)))) (setq scored (cdr scored))) *************** *** 9876,9912 **** (gnus-summary-prepare-unthreaded (nreverse headers)) (point))))) (goto-char (point-min)) ! (gnus-summary-position-cursor))) ! ! (defun gnus-summary-show-all-dormant () ! "Display all the hidden articles that are marked as dormant." ! (interactive) ! (gnus-set-global-variables) ! (let ((buffer-read-only nil)) ! (let ((dormant gnus-newsgroup-dormant) ! headers h) ! (while dormant ! (or (gnus-summary-goto-subject (car dormant)) ! (and (setq h (gnus-get-header-by-num (car dormant))) ! (setq headers (cons h headers)))) ! (setq dormant (cdr dormant))) ! (or headers (error "No dormant articles hidden.")) ! (goto-char (point-min)) ! (save-excursion ! (gnus-summary-update-lines ! (point) ! (progn ! (gnus-summary-prepare-unthreaded (nreverse headers)) ! (point))))) ! (goto-char (point-min)) ! (gnus-summary-position-cursor))) ! ! (defun gnus-summary-hide-all-dormant () ! "Hide all dormant articles." ! (interactive) ! (gnus-set-global-variables) ! (gnus-summary-remove-lines-marked-with (char-to-string gnus-dormant-mark)) ! (gnus-summary-position-cursor)) (defun gnus-summary-catchup (&optional all quietly to-here not-mark) "Mark all articles not marked as unread in this newsgroup as read. --- 10096,10102 ---- (gnus-summary-prepare-unthreaded (nreverse headers)) (point))))) (goto-char (point-min)) ! (gnus-summary-position-point))) (defun gnus-summary-catchup (&optional all quietly to-here not-mark) "Mark all articles not marked as unread in this newsgroup as read. *************** *** 9940,9946 **** (while (and (if to-here (< (point) to-here) t) (gnus-summary-mark-article-as-read gnus-catchup-mark) ! (gnus-summary-search-subject nil (not all))))) (or to-here (setq gnus-newsgroup-unreads (append gnus-newsgroup-marked --- 10130,10136 ---- (while (and (if to-here (< (point) to-here) t) (gnus-summary-mark-article-as-read gnus-catchup-mark) ! (gnus-summary-find-next (not all))))) (or to-here (setq gnus-newsgroup-unreads (append gnus-newsgroup-marked *************** *** 9949,9955 **** (if (and (not to-here) (eq 'nnvirtual (car method))) (nnvirtual-catchup-group (gnus-group-real-name gnus-newsgroup-name) (nth 1 method) all))) ! (gnus-summary-position-cursor))) (defun gnus-summary-catchup-to-here (&optional all) "Mark all unticked articles before the current one as read. --- 10139,10145 ---- (if (and (not to-here) (eq 'nnvirtual (car method))) (nnvirtual-catchup-group (gnus-group-real-name gnus-newsgroup-name) (nth 1 method) all))) ! (gnus-summary-position-point))) (defun gnus-summary-catchup-to-here (&optional all) "Mark all unticked articles before the current one as read. *************** *** 9957,9968 **** (interactive "P") (gnus-set-global-variables) (save-excursion ! (and (zerop (forward-line -1)) (progn - (end-of-line) (gnus-summary-catchup all t (point)) (gnus-set-mode-line 'summary)))) ! (gnus-summary-position-cursor)) (defun gnus-summary-catchup-all (&optional quietly) "Mark all articles in this newsgroup as read." --- 10147,10157 ---- (interactive "P") (gnus-set-global-variables) (save-excursion ! (and (gnus-summary-find-prev) (progn (gnus-summary-catchup all t (point)) (gnus-set-mode-line 'summary)))) ! (gnus-summary-position-point)) (defun gnus-summary-catchup-all (&optional quietly) "Mark all articles in this newsgroup as read." *************** *** 10010,10016 **** (> (prefix-numeric-value arg) 0))) (gnus-summary-prepare) (gnus-summary-goto-subject current) ! (gnus-summary-position-cursor))) (defun gnus-summary-show-all-threads () "Show all threads." --- 10199,10205 ---- (> (prefix-numeric-value arg) 0))) (gnus-summary-prepare) (gnus-summary-goto-subject current) ! (gnus-summary-position-point))) (defun gnus-summary-show-all-threads () "Show all threads." *************** *** 10019,10025 **** (save-excursion (let ((buffer-read-only nil)) (subst-char-in-region (point-min) (point-max) ?\^M ?\n t))) ! (gnus-summary-position-cursor)) (defun gnus-summary-show-thread () "Show thread subtrees. --- 10208,10214 ---- (save-excursion (let ((buffer-read-only nil)) (subst-char-in-region (point-min) (point-max) ?\^M ?\n t))) ! (gnus-summary-position-point)) (defun gnus-summary-show-thread () "Show thread subtrees. *************** *** 10027,10033 **** (interactive) (gnus-set-global-variables) (let ((buffer-read-only nil) ! (orig (prog1 (point) (gnus-summary-hide-thread))) ;; first goto end then to beg, to have point at beg after let (end (progn (end-of-line) (point))) (beg (progn (beginning-of-line) (point)))) --- 10216,10222 ---- (interactive) (gnus-set-global-variables) (let ((buffer-read-only nil) ! (orig (point)) ;; first goto end then to beg, to have point at beg after let (end (progn (end-of-line) (point))) (beg (progn (beginning-of-line) (point)))) *************** *** 10036,10042 **** (search-forward "\r" end t) (subst-char-in-region beg end ?\^M ?\n t) (goto-char orig) ! (gnus-summary-position-cursor)))) (defun gnus-summary-hide-all-threads () "Hide all thread subtrees." --- 10225,10231 ---- (search-forward "\r" end t) (subst-char-in-region beg end ?\^M ?\n t) (goto-char orig) ! (gnus-summary-position-point)))) (defun gnus-summary-hide-all-threads () "Hide all thread subtrees." *************** *** 10045,10053 **** (save-excursion (goto-char (point-min)) (gnus-summary-hide-thread) ! (while (and (not (eobp)) (zerop (forward-line 1))) (gnus-summary-hide-thread))) ! (gnus-summary-position-cursor)) (defun gnus-summary-hide-thread () "Hide thread subtrees. --- 10234,10242 ---- (save-excursion (goto-char (point-min)) (gnus-summary-hide-thread) ! (while (zerop (gnus-summary-next-thread 1)) (gnus-summary-hide-thread))) ! (gnus-summary-position-point)) (defun gnus-summary-hide-thread () "Hide thread subtrees. *************** *** 10057,10077 **** (let ((buffer-read-only nil) (start (point)) (level (gnus-summary-thread-level)) (end (point))) ;; Go forward until either the buffer ends or the subthread ;; ends. (if (eobp) () ! (while (and (zerop (forward-line 1)) (> (gnus-summary-thread-level) level)) (setq end (point))) (prog1 (save-excursion (goto-char end) (search-backward "\n" start t)) ! (subst-char-in-region start end ?\n ?\^M t) ! (forward-line -1) ! (gnus-summary-position-cursor))))) (defun gnus-summary-go-to-next-thread (&optional previous) "Go to the same level (or less) next thread. --- 10246,10267 ---- (let ((buffer-read-only nil) (start (point)) (level (gnus-summary-thread-level)) + (article (gnus-summary-article-number)) (end (point))) ;; Go forward until either the buffer ends or the subthread ;; ends. (if (eobp) () ! (while (and (gnus-summary-find-next) (> (gnus-summary-thread-level) level)) (setq end (point))) (prog1 (save-excursion (goto-char end) (search-backward "\n" start t)) ! (subst-char-in-region start end ?\n ?\^M) ! (gnus-summary-goto-subject article) ! (gnus-summary-position-point))))) (defun gnus-summary-go-to-next-thread (&optional previous) "Go to the same level (or less) next thread. *************** *** 10080,10094 **** (let ((level (gnus-summary-thread-level)) (article (gnus-summary-article-number))) (if previous ! (while (and (zerop (forward-line -1)) (> (gnus-summary-thread-level) level))) ! (while (and (save-excursion ! (forward-line 1) ! (not (eobp))) ! (zerop (forward-line 1)) (> (gnus-summary-thread-level) level)))) (gnus-summary-recenter) ! (gnus-summary-position-cursor) (let ((oart (gnus-summary-article-number))) (and (/= oart article) oart)))) --- 10270,10281 ---- (let ((level (gnus-summary-thread-level)) (article (gnus-summary-article-number))) (if previous ! (while (and (gnus-summary-find-prev) (> (gnus-summary-thread-level) level))) ! (while (and (gnus-summary-find-next) (> (gnus-summary-thread-level) level)))) (gnus-summary-recenter) ! (gnus-summary-position-point) (let ((oart (gnus-summary-article-number))) (and (/= oart article) oart)))) *************** *** 10104,10110 **** (while (and (> n 0) (gnus-summary-go-to-next-thread backward)) (setq n (1- n))) ! (gnus-summary-position-cursor) (if (/= 0 n) (gnus-message 7 "No more threads")) n)) --- 10291,10297 ---- (while (and (> n 0) (gnus-summary-go-to-next-thread backward)) (setq n (1- n))) ! (gnus-summary-position-point) (if (/= 0 n) (gnus-message 7 "No more threads")) n)) *************** *** 10116,10143 **** (gnus-set-global-variables) (gnus-summary-next-thread (- n))) ! (defun gnus-summary-go-down-thread (&optional same) ! "Go down one level in the current thread. ! If SAME is non-nil, also move to articles of the same level." ! (let ((level (gnus-summary-thread-level)) ! (start (point))) ! (if (and (zerop (forward-line 1)) ! (> (gnus-summary-thread-level) level)) ! t ! (goto-char start) ! nil))) (defun gnus-summary-go-up-thread () "Go up one level in the current thread." ! (let ((level (gnus-summary-thread-level)) ! (start (point))) ! (while (and (zerop (forward-line -1)) ! (>= (gnus-summary-thread-level) level))) ! (if (>= (gnus-summary-thread-level) level) ! (progn ! (goto-char start) ! nil) ! t))) (defun gnus-summary-down-thread (n) "Go down thread N steps. --- 10303,10319 ---- (gnus-set-global-variables) (gnus-summary-next-thread (- n))) ! (defun gnus-summary-go-down-thread () ! "Go down one level in the current thread." ! (let ((children (gnus-summary-article-children))) ! (and children ! (gnus-summary-goto-subject (car children))))) (defun gnus-summary-go-up-thread () "Go up one level in the current thread." ! (let ((parent (gnus-summary-article-parent))) ! (and parent ! (gnus-summary-goto-subject parent)))) (defun gnus-summary-down-thread (n) "Go down thread N steps. *************** *** 10152,10158 **** (if up (gnus-summary-go-up-thread) (gnus-summary-go-down-thread))) (setq n (1- n))) ! (gnus-summary-position-cursor) (if (/= 0 n) (gnus-message 7 "Can't go further")) n)) --- 10328,10334 ---- (if up (gnus-summary-go-up-thread) (gnus-summary-go-down-thread))) (setq n (1- n))) ! (gnus-summary-position-point) (if (/= 0 n) (gnus-message 7 "Can't go further")) n)) *************** *** 10187,10193 **** (t (gnus-summary-mark-article-as-unread gnus-ticked-mark))) ;; ...and go forward until either the buffer ends or the subtree ;; ends. ! (if (not (and (zerop (forward-line 1)) (> (gnus-summary-thread-level) level))) (setq killing nil)))) ;; Hide killed subtrees. --- 10363,10369 ---- (t (gnus-summary-mark-article-as-unread gnus-ticked-mark))) ;; ...and go forward until either the buffer ends or the subtree ;; ends. ! (if (not (and (gnus-summary-find-next) (> (gnus-summary-thread-level) level))) (setq killing nil)))) ;; Hide killed subtrees. *************** *** 10222,10228 **** (gnus-summary-sort (cons (lambda () ! (let* ((header (gnus-get-header-by-num (gnus-summary-article-number))) (extract (funcall gnus-extract-address-components (mail-header-from header)))) --- 10398,10404 ---- (gnus-summary-sort (cons (lambda () ! (let* ((header (gnus-summary-article-header)) (extract (funcall gnus-extract-address-components (mail-header-from header)))) *************** *** 10240,10251 **** (gnus-summary-sort (cons (lambda () ! (let* ((header (gnus-get-header-by-num (gnus-summary-article-number))) (extract (funcall gnus-extract-address-components (mail-header-from header)))) (concat ! (downcase (gnus-simplify-subject (gnus-summary-subject-string) t)) "\r" (or (car extract) (cdr extract))))) 'gnus-thread-sort-by-subject) reverse)) --- 10416,10427 ---- (gnus-summary-sort (cons (lambda () ! (let* ((header (gnus-summary-article-header)) (extract (funcall gnus-extract-address-components (mail-header-from header)))) (concat ! (downcase (gnus-simplify-subject (gnus-summary-article-subject) t)) "\r" (or (car extract) (cdr extract))))) 'gnus-thread-sort-by-subject) reverse)) *************** *** 10260,10266 **** (lambda () (gnus-sortable-date (mail-header-date ! (gnus-get-header-by-num (gnus-summary-article-number))))) 'gnus-thread-sort-by-date) reverse)) --- 10436,10442 ---- (lambda () (gnus-sortable-date (mail-header-date ! (gnus-summary-article-header)))) 'gnus-thread-sort-by-date) reverse)) *************** *** 10296,10309 **** (gnus-summary-hide-all-threads)) ;; If in async mode, we send some info to the backend. (and gnus-newsgroup-async - (setq gnus-newsgroup-threads (nreverse gnus-newsgroup-threads)) (gnus-request-asynchronous ! gnus-newsgroup-name ! (if (and gnus-asynchronous-article-function ! (fboundp gnus-asynchronous-article-function)) ! (funcall gnus-asynchronous-article-function ! gnus-newsgroup-threads))))))))) ! (defun gnus-sortable-date (date) "Make sortable string by string-lessp from DATE. --- 10472,10479 ---- (gnus-summary-hide-all-threads)) ;; If in async mode, we send some info to the backend. (and gnus-newsgroup-async (gnus-request-asynchronous ! gnus-newsgroup-name gnus-newsgroup-data))))))) (defun gnus-sortable-date (date) "Make sortable string by string-lessp from DATE. *************** *** 10331,10337 **** (gnus-set-global-variables) (let ((articles (gnus-summary-work-articles n))) (while articles ! (let ((header (gnus-get-header-by-num (car articles)))) (if (vectorp header) (progn (save-window-excursion --- 10501,10507 ---- (gnus-set-global-variables) (let ((articles (gnus-summary-work-articles n))) (while articles ! (let ((header (gnus-summary-article-header (car articles)))) (if (vectorp header) (progn (save-window-excursion *************** *** 10360,10366 **** (gnus-message 1 "Article %d is unsaveable" (car articles))))) (gnus-summary-remove-process-mark (car articles)) (setq articles (cdr articles))) ! (gnus-summary-position-cursor) n)) (defun gnus-summary-pipe-output (&optional arg) --- 10530,10536 ---- (gnus-message 1 "Article %d is unsaveable" (car articles))))) (gnus-summary-remove-process-mark (car articles)) (setq articles (cdr articles))) ! (gnus-summary-position-point) n)) (defun gnus-summary-pipe-output (&optional arg) *************** *** 10543,10549 **** b) (or (gnus-summary-goto-subject article) (error (format "No such article: %d" article))) ! (gnus-summary-position-cursor) ;; If all commands are to be bunched up on one line, we collect ;; them here. (if gnus-view-pseudos-separately --- 10713,10719 ---- b) (or (gnus-summary-goto-subject article) (error (format "No such article: %d" article))) ! (gnus-summary-position-point) ;; If all commands are to be bunched up on one line, we collect ;; them here. (if gnus-view-pseudos-separately *************** *** 10580,10598 **** (while pslist (gnus-summary-goto-subject (or (cdr (assq 'article (car pslist))) (gnus-summary-article-number))) ! (forward-line 1) (setq b (point)) ! (insert " " (file-name-nondirectory ! (cdr (assq 'name (car pslist)))) ! ": " (or (cdr (assq 'execute (car pslist))) "") "\n") ! (add-text-properties ! b (1+ b) (list 'gnus-number gnus-reffed-article-number ! 'gnus-mark gnus-unread-mark ! 'gnus-level 0 ! 'gnus-pseudo (car pslist))) (forward-line -1) - (gnus-sethash (int-to-string gnus-reffed-article-number) - (car pslist) gnus-newsgroup-headers-hashtb-by-number) (setq gnus-newsgroup-unreads (cons gnus-reffed-article-number gnus-newsgroup-unreads)) (setq gnus-reffed-article-number (1- gnus-reffed-article-number)) --- 10750,10770 ---- (while pslist (gnus-summary-goto-subject (or (cdr (assq 'article (car pslist))) (gnus-summary-article-number))) ! (gnus-data-enter ! (gnus-summary-article-number) ! gnus-reffed-article-number gnus-unread-mark ! (progn (forward-line 1) (point)) ! (car pslist) 0) (setq b (point)) ! (put-text-property ! (point) ! (progn ! (insert " " (file-name-nondirectory ! (cdr (assq 'name (car pslist)))) ! ": " (or (cdr (assq 'execute (car pslist))) "") "\n") ! (point)) ! 'gnus-number gnus-reffed-article-number) (forward-line -1) (setq gnus-newsgroup-unreads (cons gnus-reffed-article-number gnus-newsgroup-unreads)) (setq gnus-reffed-article-number (1- gnus-reffed-article-number)) *************** *** 10645,10654 **** "Edit a local kill file applied to the current newsgroup." (interactive) (gnus-set-global-variables) ! (setq gnus-current-headers ! (gnus-gethash ! (int-to-string (gnus-summary-article-number)) ! gnus-newsgroup-headers-hashtb-by-number)) (gnus-set-global-variables) (gnus-group-edit-local-kill (gnus-summary-article-number) gnus-newsgroup-name)) --- 10817,10823 ---- "Edit a local kill file applied to the current newsgroup." (interactive) (gnus-set-global-variables) ! (setq gnus-current-headers (gnus-summary-article-header)) (gnus-set-global-variables) (gnus-group-edit-local-kill (gnus-summary-article-number) gnus-newsgroup-name)) *************** *** 10812,10818 **** () (save-excursion (set-buffer gnus-summary-buffer) ! (let ((header (gnus-get-header-by-num article))) (if (< article 0) (if (vectorp header) ;; It's a real article. --- 10981,10987 ---- () (save-excursion (set-buffer gnus-summary-buffer) ! (let ((header (gnus-summary-article-header article))) (if (< article 0) (if (vectorp header) ;; It's a real article. *************** *** 10848,10869 **** (defun gnus-read-header (id) "Read the headers of article ID and enter them into the Gnus system." ! (let (header) ! (if (not (setq header ! (car (if (let ((gnus-nov-is-evil t)) ! (gnus-retrieve-headers ! (list id) gnus-newsgroup-name)) ! (gnus-get-newsgroup-headers))))) ! nil ! (if (stringp id) ! (mail-header-set-number header gnus-reffed-article-number)) ! (setq gnus-newsgroup-headers (cons header gnus-newsgroup-headers)) ! (gnus-sethash (int-to-string (mail-header-number header)) header ! gnus-newsgroup-headers-hashtb-by-number) ! (if (stringp id) ! (setq gnus-reffed-article-number (1- gnus-reffed-article-number))) ! (setq gnus-current-headers header) ! header))) (defun gnus-article-prepare (article &optional all-headers header) "Prepare ARTICLE in article mode buffer. --- 11017,11051 ---- (defun gnus-read-header (id) "Read the headers of article ID and enter them into the Gnus system." ! (let ((group gnus-newsgroup-name) ! header where) ! (if (setq where ! (if (gnus-check-backend-function 'request-head group) ! (gnus-request-head id group) ! (gnus-request-article id group))) ! (save-excursion ! (set-buffer nntp-server-buffer) ! (and (search-forward "\n\n" nil t) ! (delete-region (1- (point)) (point-max))) ! (goto-char (point-max)) ! (insert ".\n") ! (goto-char (point-min)) ! (insert "211 " (int-to-string (cdr where)) " Article retrieved.\n") ! (if (not (setq header (car (gnus-get-newsgroup-headers)))) ! () ; Malformed head. ! (if (and (stringp id) ! (not (string= (gnus-group-real-name group) ! (car where)))) ! ;; If we fetched by Message-ID and the article came ! ;; from a different group, we fudge some bogus article ! ;; numbers for this article. ! (progn ! (mail-header-set-number header gnus-reffed-article-number) ! (setq gnus-reffed-article-number ! (1- gnus-reffed-article-number)))) ! (setq gnus-newsgroup-headers (cons header gnus-newsgroup-headers)) ! (setq gnus-current-headers header) ! header))))) (defun gnus-article-prepare (article &optional all-headers header) "Prepare ARTICLE in article mode buffer. *************** *** 10933,10939 **** gnus-newsgroup-history) gnus-current-article article gnus-current-headers ! (gnus-get-header-by-num gnus-current-article) gnus-article-current (cons gnus-newsgroup-name gnus-current-article)) (gnus-summary-show-thread) --- 11115,11121 ---- gnus-newsgroup-history) gnus-current-article article gnus-current-headers ! (gnus-summary-article-header gnus-current-article) gnus-article-current (cons gnus-newsgroup-name gnus-current-article)) (gnus-summary-show-thread) *************** *** 10948,10957 **** (setq gnus-have-all-headers (or all-headers gnus-show-all-headers)) (and gnus-use-cache ! (vectorp (gnus-get-header-by-number article)) (gnus-cache-possibly-enter-article group article ! (gnus-get-header-by-number article) (memq article gnus-newsgroup-marked) (memq article gnus-newsgroup-dormant) (memq article gnus-newsgroup-unreads))))) --- 11130,11139 ---- (setq gnus-have-all-headers (or all-headers gnus-show-all-headers)) (and gnus-use-cache ! (vectorp (gnus-summary-article-header article)) (gnus-cache-possibly-enter-article group article ! (gnus-summary-article-header article) (memq article gnus-newsgroup-marked) (memq article gnus-newsgroup-dormant) (memq article gnus-newsgroup-unreads))))) *************** *** 11196,11203 **** how much time has lapsed since DATE." (interactive (list 'ut)) (let ((date (mail-header-date (or gnus-current-headers ! (gnus-get-header-by-number ! (gnus-summary-article-number))""))) (date-regexp "^Date: \\|^X-Sent: ")) (if (or (not date) (string= date "")) --- 11378,11384 ---- how much time has lapsed since DATE." (interactive (list 'ut)) (let ((date (mail-header-date (or gnus-current-headers ! (gnus-summary-article-header) ""))) (date-regexp "^Date: \\|^X-Sent: ")) (if (or (not date) (string= date "")) *************** *** 11227,11232 **** --- 11408,11415 ---- (timezone-make-date-arpa-standard date nil "UT") (error date)) "\n")) + ((eq type 'original) + (concat "Date: " date "\n")) ((eq type 'lapsed) ;; If the date is seriously mangled, the timezone ;; functions are liable to bug out, so we condition-case *************** *** 11269,11274 **** --- 11452,11464 ---- (interactive) (gnus-article-date-ut 'local)) + (defun gnus-article-date-original () + "Convert the current article date to what it was originally. + This is only useful if you have used some other date conversion + function and want to see what the date was before converting." + (interactive) + (gnus-article-date-ut 'original)) + (defun gnus-article-date-lapsed () "Convert the current article date to time lapsed since it was sent." (interactive) *************** *** 11603,11609 **** (defun gnus-dribble-enter (string) (if (and (not gnus-dribble-ignore) ! gnus-dribble-buffer (buffer-name gnus-dribble-buffer)) (let ((obuf (current-buffer))) (set-buffer gnus-dribble-buffer) --- 11793,11800 ---- (defun gnus-dribble-enter (string) (if (and (not gnus-dribble-ignore) ! (or gnus-dribble-buffer ! gnus-slave) (buffer-name gnus-dribble-buffer)) (let ((obuf (current-buffer))) (set-buffer gnus-dribble-buffer) *************** *** 11832,11843 **** (funcall (gnus-get-function method 'close-group) (gnus-group-real-name group) (nth 1 method)))) ! (defun gnus-retrieve-headers (articles group) (let ((method (gnus-find-method-for-group group))) (if (and gnus-use-cache (numberp (car articles))) (gnus-cache-retrieve-headers articles group) (funcall (gnus-get-function method 'retrieve-headers) ! articles (gnus-group-real-name group) (nth 1 method))))) (defun gnus-retrieve-groups (groups method) (funcall (gnus-get-function method 'retrieve-groups) groups (nth 1 method))) --- 12023,12035 ---- (funcall (gnus-get-function method 'close-group) (gnus-group-real-name group) (nth 1 method)))) ! (defun gnus-retrieve-headers (articles group &optional fetch-old) (let ((method (gnus-find-method-for-group group))) (if (and gnus-use-cache (numberp (car articles))) (gnus-cache-retrieve-headers articles group) (funcall (gnus-get-function method 'retrieve-headers) ! articles (gnus-group-real-name group) (nth 1 method) ! fetch-old)))) (defun gnus-retrieve-groups (groups method) (funcall (gnus-get-function method 'retrieve-groups) groups (nth 1 method))) *************** *** 11889,11894 **** --- 12081,12091 ---- (funcall (gnus-get-function method 'request-post) (nth 1 method))) + (defun gnus-request-scan (group method) + (let ((method (if group (gnus-find-method-for-group group) method))) + (funcall (gnus-get-function method 'request-scan) + (and group (gnus-group-real-name group)) (nth 1 method)))) + (defun gnus-request-expire-articles (articles group &optional force) (let ((method (gnus-find-method-for-group group))) (funcall (gnus-get-function method 'request-expire-articles) *************** *** 11920,11925 **** --- 12117,12123 ---- (gnus-group-real-name group) (nth 1 method)))) (defun gnus-member-of-valid (symbol group) + "Find out if GROUP has SYMBOL as part of its \"valid\" spec." (memq symbol (assoc (format "%s" (car (gnus-find-method-for-group group))) gnus-valid-select-methods))) *************** *** 12030,12036 **** (setq gnus-active-hashtb (make-vector 4095 0))) ;; Possibly eval the dribble file. ! (and init gnus-use-dribble-file (gnus-dribble-eval-file)) (gnus-update-format-specifications) --- 12228,12234 ---- (setq gnus-active-hashtb (make-vector 4095 0))) ;; Possibly eval the dribble file. ! (and init (or gnus-use-dribble-file gnus-slave) (gnus-dribble-eval-file)) (gnus-update-format-specifications) *************** *** 12441,12447 **** ;; the others, so we just pop them on a list for ;; now. (setq virtuals (cons info virtuals)) ! (and (setq active (gnus-activate-group (car info))) ;; Close the groups as we look at them! (gnus-close-group group)))) --- 12639,12645 ---- ;; the others, so we just pop them on a list for ;; now. (setq virtuals (cons info virtuals)) ! (and (setq active (gnus-activate-group (car info) 'scan)) ;; Close the groups as we look at them! (gnus-close-group group)))) *************** *** 12450,12456 **** (<= (nth 1 info) level)) (progn (or gnus-read-active-file (gnus-check-server method)) ! (setq active (gnus-activate-group (car info)))))) (if active (gnus-get-unread-articles-in-group info active) --- 12648,12654 ---- (<= (nth 1 info) level)) (progn (or gnus-read-active-file (gnus-check-server method)) ! (setq active (gnus-activate-group (car info) 'scan))))) (if active (gnus-get-unread-articles-in-group info active) *************** *** 12466,12472 **** ;; !!! If one virtual group contains another virtual group, even ;; doing it this way might cause problems. (while virtuals ! (and (setq active (gnus-activate-group (car (car virtuals)))) (gnus-get-unread-articles-in-group (car virtuals) active)) (setq virtuals (cdr virtuals))) --- 12664,12670 ---- ;; !!! If one virtual group contains another virtual group, even ;; doing it this way might cause problems. (while virtuals ! (and (setq active (gnus-activate-group (car (car virtuals)) 'scan)) (gnus-get-unread-articles-in-group (car virtuals) active)) (setq virtuals (cdr virtuals))) *************** *** 12602,12609 **** (setq marked m)) (setq m (cdr m))))) ! (defun gnus-activate-group (group) ;; Check whether a group has been activated or not. (let ((method (gnus-find-method-for-group group)) active) (and (gnus-check-server method) --- 12800,12808 ---- (setq marked m)) (setq m (cdr m))))) ! (defun gnus-activate-group (group &optional scan) ;; Check whether a group has been activated or not. + ;; If SCAN, request a scan of that group as well. (let ((method (gnus-find-method-for-group group)) active) (and (gnus-check-server method) *************** *** 12624,12632 **** (gnus-sethash group (setq active (cons (read (current-buffer)) (read (current-buffer)))) ! gnus-active-hashtb)) ! ;; Return the new active info. ! active))))) (defun gnus-update-read-articles (group unread unselected ticked &optional domarks replied expirable killed --- 12823,12834 ---- (gnus-sethash group (setq active (cons (read (current-buffer)) (read (current-buffer)))) ! gnus-active-hashtb) ! (and scan ! (gnus-check-backend-function 'request-scan (car method)) ! (gnus-request-scan group method)) ! ;; Return the new active info. ! active)))))) (defun gnus-update-read-articles (group unread unselected ticked &optional domarks replied expirable killed *************** *** 12740,12745 **** --- 12942,12950 ---- (gnus-message 5 mesg) (if (not (gnus-check-server method)) () + ;; Request that the backend scan its incoming messages. + (and (gnus-check-backend-function 'request-scan (car method)) + (gnus-request-scan nil method)) (cond ((and (eq gnus-read-active-file 'some) (gnus-check-backend-function 'retrieve-groups (car method))) *************** *** 12965,12971 **** (buffer-disable-undo (current-buffer)) (gnus-newsrc-to-gnus-format) (kill-buffer (current-buffer)) ! (gnus-message 5 "Reading %s...done" newsrc-file)))))) (defun gnus-read-newsrc-el-file (file) (let ((ding-file (concat file "d"))) --- 13170,13180 ---- (buffer-disable-undo (current-buffer)) (gnus-newsrc-to-gnus-format) (kill-buffer (current-buffer)) ! (gnus-message 5 "Reading %s...done" newsrc-file))) ! ! ;; Read any slave files. ! (or gnus-slave ! (gnus-master-read-slave-newsrc))))) (defun gnus-read-newsrc-el-file (file) (let ((ding-file (concat file "d"))) *************** *** 13342,13372 **** (progn (run-hooks 'gnus-save-newsrc-hook) (save-excursion ! (if (and gnus-use-dribble-file (or (not gnus-dribble-buffer) (not (buffer-name gnus-dribble-buffer)) (zerop (save-excursion (set-buffer gnus-dribble-buffer) (buffer-size))))) (gnus-message 4 "(No changes need to be saved)") ! (if gnus-save-newsrc-file ! (progn ! (gnus-message 5 "Saving %s..." gnus-current-startup-file) ! ;; Make backup file of master newsrc. ! (gnus-gnus-to-newsrc-format) ! (gnus-message 5 "Saving %s...done" ! gnus-current-startup-file))) ! ;; Quickly loadable .newsrc. ! (set-buffer (get-buffer-create " *Gnus-newsrc*")) ! (setq buffer-file-name (concat gnus-current-startup-file ".eld")) ! (gnus-add-current-to-buffer-list) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (gnus-message 5 "Saving %s.eld..." gnus-current-startup-file) ! (gnus-gnus-to-quick-newsrc-format) ! (save-buffer) ! (kill-buffer (current-buffer)) ! (gnus-message 5 "Saving %s.eld...done" gnus-current-startup-file) (gnus-dribble-delete-file)))))) (defun gnus-gnus-to-quick-newsrc-format () --- 13551,13585 ---- (progn (run-hooks 'gnus-save-newsrc-hook) (save-excursion ! (if (and (or gnus-use-dribble-file gnus-slave) (or (not gnus-dribble-buffer) (not (buffer-name gnus-dribble-buffer)) (zerop (save-excursion (set-buffer gnus-dribble-buffer) (buffer-size))))) (gnus-message 4 "(No changes need to be saved)") ! (if gnus-slave ! (gnus-slave-save-newsrc) ! (if gnus-save-newsrc-file ! (progn ! (gnus-message 5 "Saving %s..." gnus-current-startup-file) ! ;; Make backup file of master newsrc. ! (gnus-gnus-to-newsrc-format) ! (gnus-message 5 "Saving %s...done" ! gnus-current-startup-file))) ! ;; Quickly loadable .newsrc. ! (set-buffer (get-buffer-create " *Gnus-newsrc*")) ! (setq buffer-file-name ! (concat gnus-current-startup-file ".eld")) ! (gnus-add-current-to-buffer-list) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (gnus-message 5 "Saving %s.eld..." gnus-current-startup-file) ! (gnus-gnus-to-quick-newsrc-format) ! (save-buffer) ! (kill-buffer (current-buffer)) ! (gnus-message ! 5 "Saving %s.eld...done" gnus-current-startup-file)) (gnus-dribble-delete-file)))))) (defun gnus-gnus-to-quick-newsrc-format () *************** *** 13393,13399 **** (setq variables (cdr variables))) (gnus-uncompress-newsrc-alist))) - (defun gnus-gnus-to-newsrc-format () ;; Generate and save the .newsrc file. (let ((newsrc (cdr gnus-newsrc-alist)) --- 13606,13611 ---- *************** *** 13445,13450 **** --- 13657,13719 ---- (save-buffer) (kill-buffer (current-buffer))))) + + ;;; Slave functions. + + (defun gnus-slave-save-newsrc () + (save-excursion + (set-buffer gnus-dribble-buffer) + (let ((slave-name + (make-temp-name (concat gnus-current-startup-file "-slave-")))) + (write-region (point-min) (point-max) slave-name nil 'nomesg)))) + + (defun gnus-master-read-slave-newsrc () + (let ((slave-files + (directory-files + (file-name-directory gnus-current-startup-file) + t (concat + "^" (regexp-quote + (concat + (file-name-nondirectory gnus-current-startup-file) + "-slave-"))) + t)) + file) + (if (not slave-files) + () ; There are no slave files to read. + (gnus-message 7 "Reading slave newsrcs...") + (save-excursion + (set-buffer (get-buffer-create " *gnus slave*")) + (buffer-disable-undo (current-buffer)) + (setq slave-files + (sort (mapcar (lambda (file) + (list (nth 5 (file-attributes file)) file)) + slave-files) + (lambda (f1 f2) + (or (< (car (car f1)) (car (car f2))) + (< (nth 1 (car f1)) (nth 1 (car f2))))))) + (while slave-files + (erase-buffer) + (setq file (nth 1 (car slave-files))) + (insert-file-contents file) + (if (condition-case () + (progn + (eval-buffer (current-buffer)) + t) + (error + (message "Possible error in %s" file) + (ding) + (sit-for 2) + nil)) + (or gnus-slave ; Slaves shouldn't delete these files. + (condition-case () + (delete-file file) + (error nil)))) + (setq slave-files (cdr slave-files)))) + (gnus-message 7 "Reading slave newsrcs...done")))) + + + ;;; Group description. + (defun gnus-read-all-descriptions-files () (let ((methods (cons gnus-select-method gnus-secondary-select-methods))) (while methods *************** *** 13621,13633 **** (gnus-server-insert-server-line nil (car (car alist)) (cdr (car alist))) (setq alist (cdr alist)))) (goto-char (point-min)) ! (gnus-server-position-cursor)) (defun gnus-server-server-name () (let ((server (get-text-property (gnus-point-at-bol) 'gnus-server))) (and server (symbol-name server)))) ! (defalias 'gnus-server-position-cursor 'gnus-goto-colon) (defconst gnus-server-edit-buffer "*Gnus edit server*") --- 13890,13902 ---- (gnus-server-insert-server-line nil (car (car alist)) (cdr (car alist))) (setq alist (cdr alist)))) (goto-char (point-min)) ! (gnus-server-position-point)) (defun gnus-server-server-name () (let ((server (get-text-property (gnus-point-at-bol) 'gnus-server))) (and server (symbol-name server)))) ! (defalias 'gnus-server-position-point 'gnus-goto-colon) (defconst gnus-server-edit-buffer "*Gnus edit server*") *************** *** 13647,13653 **** (progn (forward-line 1) (point)))) (let ((entry (assoc server gnus-server-alist))) (gnus-server-insert-server-line nil (car entry) (cdr entry)) ! (gnus-server-position-cursor)))))) (defun gnus-server-set-info (server info) ;; Enter a select method into the virtual server alist. --- 13916,13922 ---- (progn (forward-line 1) (point)))) (let ((entry (assoc server gnus-server-alist))) (gnus-server-insert-server-line nil (car entry) (cdr entry)) ! (gnus-server-position-point)))))) (defun gnus-server-set-info (server info) ;; Enter a select method into the virtual server alist. *************** *** 13719,13725 **** (cons (assoc server gnus-server-alist) gnus-server-killed-servers)) (setq gnus-server-alist (delq (car gnus-server-killed-servers) gnus-server-alist)) ! (gnus-server-position-cursor)) (defun gnus-server-yank-server () "Yank the previously killed server." --- 13988,13994 ---- (cons (assoc server gnus-server-alist) gnus-server-killed-servers)) (setq gnus-server-alist (delq (car gnus-server-killed-servers) gnus-server-alist)) ! (gnus-server-position-point)) (defun gnus-server-yank-server () "Yank the previously killed server." *************** *** 13739,13745 **** (setcdr alist (cons killed (cdr alist))))) (gnus-server-update-server (car killed)) (setq gnus-server-killed-servers (cdr gnus-server-killed-servers)) ! (gnus-server-position-cursor))) (defun gnus-server-exit () "Return to the group buffer." --- 14008,14014 ---- (setcdr alist (cons killed (cdr alist))))) (gnus-server-update-server (car killed)) (setq gnus-server-killed-servers (cdr gnus-server-killed-servers)) ! (gnus-server-position-point))) (defun gnus-server-exit () "Return to the group buffer." *************** *** 13755,13761 **** (if cur (gnus-server-goto-server cur) (goto-char (point-max)) (forward-line -1)) ! (gnus-server-position-cursor))) (defun gnus-server-copy-server (from to) (interactive --- 14024,14030 ---- (if cur (gnus-server-goto-server cur) (goto-char (point-max)) (forward-line -1)) ! (gnus-server-position-point))) (defun gnus-server-copy-server (from to) (interactive *************** *** 13793,13799 **** (and to (progn (goto-char to) ! (gnus-server-position-cursor))))) (defun gnus-server-edit-server (server) "Edit the server on the current line." --- 14062,14068 ---- (and to (progn (goto-char to) ! (gnus-server-position-point))))) (defun gnus-server-edit-server (server) "Edit the server on the current line." *************** *** 13830,13836 **** (set-buffer gnus-server-buffer) (gnus-server-update-server (gnus-server-server-name)) (gnus-server-list-servers) ! (gnus-server-position-cursor))) (defun gnus-server-read-server (server) "Browse a server." --- 14099,14105 ---- (set-buffer gnus-server-buffer) (gnus-server-update-server (gnus-server-server-name)) (gnus-server-list-servers) ! (gnus-server-position-point))) (defun gnus-server-read-server (server) "Browse a server." *** pub/sgnus/lisp/nnbabyl.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnbabyl.el Tue Sep 19 11:28:31 1995 *************** *** 82,127 **** (count 0) article art-string start stop) (nnbabyl-possibly-change-newsgroup newsgroup) ! (if (stringp (car sequence)) ! 'headers ! (while sequence ! (setq article (car sequence)) ! (setq art-string (nnbabyl-article-string article)) ! (set-buffer nnbabyl-mbox-buffer) ! (if (or (search-forward art-string nil t) ! (search-backward art-string nil t)) ! (progn ! (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) ! (while (and (not (looking-at ".+:")) ! (zerop (forward-line 1)))) ! (setq start (point)) ! (search-forward "\n\n" nil t) ! (setq stop (1- (point))) ! (set-buffer nntp-server-buffer) ! (insert "221 " (int-to-string article) " Article retrieved.\n") ! (insert-buffer-substring nnbabyl-mbox-buffer start stop) ! (goto-char (point-max)) ! (insert ".\n"))) ! (setq sequence (cdr sequence)) ! (setq count (1+ count)) ! (and (numberp nnmail-large-newsgroup) ! (> number nnmail-large-newsgroup) ! (zerop (% count 20)) ! gnus-verbose-backends ! (message "nnbabyl: Receiving headers... %d%%" ! (/ (* count 100) number)))) ! (and (numberp nnmail-large-newsgroup) (> number nnmail-large-newsgroup) gnus-verbose-backends ! (message "nnbabyl: Receiving headers...done")) ! ;; Fold continuation lines. ! (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ! 'headers)))) (defun nnbabyl-open-server (server &optional defs) (nnheader-init-server-buffer) --- 82,125 ---- (count 0) article art-string start stop) (nnbabyl-possibly-change-newsgroup newsgroup) ! (while sequence ! (setq article (car sequence)) ! (setq art-string (nnbabyl-article-string article)) ! (set-buffer nnbabyl-mbox-buffer) ! (if (or (search-forward art-string nil t) ! (search-backward art-string nil t)) ! (progn ! (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) ! (while (and (not (looking-at ".+:")) ! (zerop (forward-line 1)))) ! (setq start (point)) ! (search-forward "\n\n" nil t) ! (setq stop (1- (point))) ! (set-buffer nntp-server-buffer) ! (insert "221 " (int-to-string article) " Article retrieved.\n") ! (insert-buffer-substring nnbabyl-mbox-buffer start stop) ! (goto-char (point-max)) ! (insert ".\n"))) ! (setq sequence (cdr sequence)) ! (setq count (1+ count)) (and (numberp nnmail-large-newsgroup) (> number nnmail-large-newsgroup) + (zerop (% count 20)) gnus-verbose-backends ! (message "nnbabyl: Receiving headers... %d%%" ! (/ (* count 100) number)))) ! (and (numberp nnmail-large-newsgroup) ! (> number nnmail-large-newsgroup) ! gnus-verbose-backends ! (message "nnbabyl: Receiving headers...done")) ! ! ;; Fold continuation lines. ! (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ! 'headers))) (defun nnbabyl-open-server (server &optional defs) (nnheader-init-server-buffer) *************** *** 155,194 **** (defun nnbabyl-request-article (article &optional newsgroup server buffer) (nnbabyl-possibly-change-newsgroup newsgroup) ! (if (stringp article) ! nil ! (save-excursion ! (set-buffer nnbabyl-mbox-buffer) ! (goto-char (point-min)) ! (if (search-forward (nnbabyl-article-string article) nil t) ! (let (start stop) ! (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) ! (while (and (not (looking-at ".+:")) ! (zerop (forward-line 1)))) ! (setq start (point)) ! (or (and (re-search-forward ! (concat "^" nnbabyl-mail-delimiter) nil t) ! (forward-line -1)) ! (goto-char (point-max))) ! (setq stop (point)) ! (let ((nntp-server-buffer (or buffer nntp-server-buffer))) ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (insert-buffer-substring nnbabyl-mbox-buffer start stop) ! (goto-char (point-min)) ! (if (search-forward "\n*** EOOH ***" nil t) ! (progn ! (delete-region (progn (beginning-of-line) (point)) ! (or (search-forward "\n\n" nil t) ! (point))))) ! t)))))) (defun nnbabyl-request-group (group &optional server dont-check) (save-excursion (if (nnbabyl-possibly-change-newsgroup group) (if dont-check t - (nnbabyl-get-new-mail group) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) --- 153,191 ---- (defun nnbabyl-request-article (article &optional newsgroup server buffer) (nnbabyl-possibly-change-newsgroup newsgroup) ! (save-excursion ! (set-buffer nnbabyl-mbox-buffer) ! (goto-char (point-min)) ! (if (search-forward (nnbabyl-article-string article) nil t) ! (let (start stop) ! (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) ! (while (and (not (looking-at ".+:")) ! (zerop (forward-line 1)))) ! (setq start (point)) ! (or (and (re-search-forward ! (concat "^" nnbabyl-mail-delimiter) nil t) ! (forward-line -1)) ! (goto-char (point-max))) ! (setq stop (point)) ! (let ((nntp-server-buffer (or buffer nntp-server-buffer))) ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (insert-buffer-substring nnbabyl-mbox-buffer start stop) ! (goto-char (point-min)) ! (if (search-forward "\n*** EOOH ***" nil t) ! (progn ! (delete-region (progn (beginning-of-line) (point)) ! (or (search-forward "\n\n" nil t) ! (point))))) ! (if (numberp article) ! (cons nnbabyl-current-group article) ! (nnbabyl-article-group-number))))))) (defun nnbabyl-request-group (group &optional server dont-check) (save-excursion (if (nnbabyl-possibly-change-newsgroup group) (if dont-check t (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) *************** *** 201,206 **** --- 198,224 ---- (car active)))) t))))) + (defun nnbabyl-request-scan (&optional group server) + (nnbabyl-read-mbox) + (nnmail-get-new-mail + 'nnbabyl + (lambda () + (save-excursion + (set-buffer nnbabyl-mbox-buffer) + (save-buffer))) + nnbabyl-mbox-file group + (lambda () + (save-excursion + (let ((in-buf (current-buffer))) + (goto-char (point-min)) + (while (search-forward "\n\^_\n" nil t) + (delete-char -1)) + (set-buffer nnbabyl-mbox-buffer) + (goto-char (point-max)) + (search-backward "\n\^_" nil t) + (goto-char (match-end 0)) + (insert-buffer-substring in-buf)))))) + (defun nnbabyl-close-group (group &optional server) t) *************** *** 214,220 **** t) (defun nnbabyl-request-list (&optional server) - (if server (nnbabyl-get-new-mail)) (save-excursion (or (nnmail-find-file nnbabyl-active-file) (progn --- 232,237 ---- *************** *** 259,265 **** days))) (progn (and gnus-verbose-backends ! (message "Deleting article %s..." (car articles))) (nnbabyl-delete-mail)) (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) --- 276,283 ---- days))) (progn (and gnus-verbose-backends ! (message "Deleting article %d in %s..." ! (car articles) newsgroup)) (nnbabyl-delete-mail)) (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) *************** *** 388,395 **** nil))) (defun nnbabyl-article-string (article) ! (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":" ! (int-to-string article) " ")) (defun nnbabyl-insert-lines () "Insert how many lines and chars there are in the body of the mail." --- 406,424 ---- nil))) (defun nnbabyl-article-string (article) ! (if (numberp article) ! (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":" ! (int-to-string article) " ") ! (concat "\nMessage-ID: " article))) ! ! (defun nnbabyl-article-group-number () ! (save-excursion ! (goto-char (point-min)) ! (and (re-search-forward "^X-Gnus-Newsgroup: +\\([^:]+\\):\\([0-9]+\\) " ! nil t) ! (cons (buffer-substring (match-beginning 1) (match-end 1)) ! (string-to-int ! (buffer-substring (match-beginning 2) (match-end 2))))))) (defun nnbabyl-insert-lines () "Insert how many lines and chars there are in the body of the mail." *************** *** 507,569 **** (goto-char (point-min)) (while (search-forward "\^_" nil t) (replace-match "?" t t))) - - (defun nnbabyl-get-new-mail (&optional group) - "Read new incoming mail." - (let* ((spools (nnmail-get-spool-files group)) - (group-in group) - incoming incomings) - (nnbabyl-read-mbox) - (if (or (not nnbabyl-get-new-mail) (not nnmail-spool-file)) - () - ;; We go through all the existing spool files and split the - ;; mail from each. - (while spools - (and - (file-exists-p (car spools)) - (> (nth 7 (file-attributes (car spools))) 0) - (progn - (and gnus-verbose-backends - (message "nnbabyl: Reading incoming mail...")) - (if (not (setq incoming - (nnmail-move-inbox - (car spools) - (concat nnbabyl-mbox-file "-Incoming")))) - () - (setq incomings (cons incoming incomings)) - (save-excursion - (setq group (nnmail-get-split-group (car spools) group-in)) - (let* ((nnmail-prepare-incoming-hook - (cons 'nnbabyl-remove-incoming-delims - nnmail-prepare-incoming-hook)) - in-buf) - (setq in-buf (nnmail-split-incoming - incoming 'nnbabyl-save-mail t group)) - (set-buffer in-buf) - (goto-char (point-min)) - (while (search-forward "\n\^_\n" nil t) - (delete-char -1)) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-max)) - (search-backward "\n\^_" nil t) - (goto-char (match-end 0)) - (insert-buffer-substring in-buf) - (kill-buffer in-buf)))))) - (setq spools (cdr spools))) - ;; If we did indeed read any incoming spools, we save all info. - (and (buffer-modified-p nnbabyl-mbox-buffer) - (save-excursion - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - (set-buffer nnbabyl-mbox-buffer) - (save-buffer))) - (if incomings (run-hooks 'nnmail-read-incoming-hook)) - (while incomings - (setq incoming (car incomings)) - (and nnmail-delete-incoming - (file-exists-p incoming) - (file-writable-p incoming) - (delete-file incoming)) - (setq incomings (cdr incomings)))))) (provide 'nnbabyl) --- 536,541 ---- *** pub/sgnus/lisp/nndir.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nndir.el Thu Sep 21 00:25:51 1995 *************** *** 32,44 **** (eval-and-compile (autoload 'mail-send-and-exit "sendmail")) (defconst nndir-version "nndir 1.0") - (defvar nndir-current-directory nil - "Current news group directory.") - (defvar nndir-status-string "") (defvar nndir-nov-is-evil nil --- 32,43 ---- (eval-and-compile (autoload 'mail-send-and-exit "sendmail")) + (defvar nndir-directory nil) + (defconst nndir-version "nndir 1.0") (defvar nndir-status-string "") (defvar nndir-nov-is-evil nil *************** *** 46,122 **** ;;; Interface functions. ! (defun nndir-retrieve-headers (sequence &optional newsgroup server) (nndir-execute-nnml-command ! '(nnml-retrieve-headers sequence group server) server)) ! (defun nndir-open-server (host &optional service) ! "Open nndir backend." ! (setq nndir-status-string "") ! (nnheader-init-server-buffer)) (defun nndir-close-server (&optional server) - "Close news server." t) (defun nndir-server-opened (&optional server) - "Return server process status, T or NIL. - If the stream is opened, return T, otherwise return NIL." (and nntp-server-buffer ! (get-buffer nntp-server-buffer))) (defun nndir-status-message (&optional server) - "Return server status response as string." nndir-status-string) ! (defun nndir-request-article (id &optional newsgroup server buffer) (nndir-execute-nnmh-command ! '(nnmh-request-article id group server buffer) server)) (defun nndir-request-group (group &optional server dont-check) - "Select news GROUP." (nndir-execute-nnmh-command ! '(nnmh-request-group group "" dont-check) server)) (defun nndir-request-list (&optional server dir) - "Get list of active articles in all newsgroups." (nndir-execute-nnmh-command ! '(nnmh-request-list nil dir) server)) (defun nndir-request-newgroups (date &optional server) (nndir-execute-nnmh-command ! '(nnmh-request-newgroups date server) server)) (defun nndir-request-post (&optional server) - "Post a new news in current buffer." (mail-send-and-exit nil)) (defalias 'nndir-request-post-buffer 'nnmail-request-post-buffer) ! (defun nndir-request-expire-articles (articles newsgroup &optional server force) ! "Expire all articles in the ARTICLES list in group GROUP." ! (setq nndir-status-string "nndir: expire not possible") ! nil) (defun nndir-close-group (group &optional server) t) ! (defun nndir-request-move-article (article group server accept-form) ! (setq nndir-status-string "nndir: move not possible") ! nil) ! ! (defun nndir-request-accept-article (group) ! (setq nndir-status-string "nndir: accept not possible") ! nil) ;;; Low-Level Interface ! (defun nndir-execute-nnmh-command (command server) ! (let ((dir (expand-file-name server))) (and (string-match "/$" dir) (setq dir (substring dir 0 (match-beginning 0)))) (string-match "/[^/]+$" dir) --- 45,149 ---- + (defvar nndir-current-server nil) + (defvar nndir-server-alist nil) + (defvar nndir-server-variables + (list + '(nndir-directory nil) + '(nndir-status-string "") + '(nndir-group-alist))) + + + ;;; Interface functions. ! (defun nndir-retrieve-headers (sequence &optional group server fetch-old) (nndir-execute-nnml-command ! (` (nnml-retrieve-headers ! (quote (, sequence)) (, group) (, server) (, fetch-old))))) ! (defun nndir-open-server (server &optional defs) ! (nnheader-init-server-buffer) ! (if (equal server nndir-current-server) ! t ! (if nndir-current-server ! (setq nndir-server-alist ! (cons (list nndir-current-server ! (nnheader-save-variables nndir-server-variables)) ! nndir-server-alist))) ! (let ((state (assoc server nndir-server-alist))) ! (if state ! (progn ! (nnheader-restore-variables (nth 1 state)) ! (setq nndir-server-alist (delq state nndir-server-alist))) ! (nnheader-set-init-variables nndir-server-variables defs)) ! (or (assq 'nndir-directory defs) ! (setq nndir-directory server))) ! (setq nndir-current-server server))) (defun nndir-close-server (&optional server) t) (defun nndir-server-opened (&optional server) (and nntp-server-buffer ! (get-buffer nntp-server-buffer) ! nndir-current-server ! (equal nndir-current-server server))) (defun nndir-status-message (&optional server) nndir-status-string) ! (defun nndir-request-article (id &optional group server buffer) (nndir-execute-nnmh-command ! (` (nnmh-request-article (, id) (, group) (, server) (, buffer))))) (defun nndir-request-group (group &optional server dont-check) (nndir-execute-nnmh-command ! (` (nnmh-request-group (, group) "" (, dont-check))))) (defun nndir-request-list (&optional server dir) (nndir-execute-nnmh-command ! (` (nnmh-request-list nil (, dir))))) (defun nndir-request-newgroups (date &optional server) (nndir-execute-nnmh-command ! (` (nnmh-request-newgroups (, date) (, server))))) (defun nndir-request-post (&optional server) (mail-send-and-exit nil)) (defalias 'nndir-request-post-buffer 'nnmail-request-post-buffer) ! (defun nndir-request-expire-articles ! (articles group &optional server force) ! (nndir-execute-nnmh-command ! (` (nnmh-request-expire-articles (, articles) (, group) ! (, server) (, force))))) ! ! (defun nndir-request-accept-article (group &optional last) ! (nndir-execute-nnmh-command ! (` (nnmh-request-accept-article (, group) (, last))))) (defun nndir-close-group (group &optional server) t) ! (defun nndir-request-create-group (group &optional server) ! (if (file-exists-p nndir-directory) ! (if (file-directory-p nndir-directory) ! t ! nil) ! (condition-case () ! (progn ! (make-directory nndir-directory t) ! t) ! (file-error nil)))) ;;; Low-Level Interface ! (defun nndir-execute-nnmh-command (command) ! (let ((dir (expand-file-name nndir-directory))) (and (string-match "/$" dir) (setq dir (substring dir 0 (match-beginning 0)))) (string-match "/[^/]+$" dir) *************** *** 125,132 **** (nnmh-get-new-mail nil)) (eval command)))) ! (defun nndir-execute-nnml-command (command server) ! (let ((dir (expand-file-name server))) (and (string-match "/$" dir) (setq dir (substring dir 0 (match-beginning 0)))) (string-match "/[^/]+$" dir) --- 152,159 ---- (nnmh-get-new-mail nil)) (eval command)))) ! (defun nndir-execute-nnml-command (command) ! (let ((dir (expand-file-name nndir-directory))) (and (string-match "/$" dir) (setq dir (substring dir 0 (match-beginning 0)))) (string-match "/[^/]+$" dir) *** pub/sgnus/lisp/nneething.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nneething.el Wed Sep 20 18:49:45 1995 *************** *** 70,76 **** ;;; Interface functions. ! (defun nneething-retrieve-headers (sequence &optional newsgroup server) (nneething-possibly-change-directory newsgroup) (save-excursion --- 70,76 ---- ;;; Interface functions. ! (defun nneething-retrieve-headers (sequence &optional newsgroup server fetch-old) (nneething-possibly-change-directory newsgroup) (save-excursion *** pub/sgnus/lisp/nnfolder.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnfolder.el Tue Sep 19 11:28:34 1995 *************** *** 86,94 **** (defvar nnfolder-buffer-alist nil) (defvar nnfolder-active-timestamp nil) - (defmacro nnfolder-article-string (article) - (` (concat "\n" nnfolder-article-marker (int-to-string (, article)) " "))) - (defvar nnfolder-current-server nil) --- 86,91 ---- *************** *** 188,218 **** (defun nnfolder-request-article (article &optional newsgroup server buffer) (nnfolder-possibly-change-group newsgroup) ! (if (stringp article) ! nil ! (save-excursion ! (set-buffer nnfolder-current-buffer) ! (goto-char (point-min)) ! (if (search-forward (nnfolder-article-string article) nil t) ! (let (start stop) ! (re-search-backward (concat "^" rmail-unix-mail-delimiter) nil t) ! (setq start (point)) ! (forward-line 1) ! (or (and (re-search-forward ! (concat "^" rmail-unix-mail-delimiter) nil t) ! (forward-line -1)) ! (goto-char (point-max))) ! (setq stop (point)) ! (let ((nntp-server-buffer (or buffer nntp-server-buffer))) ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (insert-buffer-substring nnfolder-current-buffer start stop) (goto-char (point-min)) ! (while (looking-at "From ") ! (delete-char 5) ! (insert "X-From-Line: ") ! (forward-line 1)) ! t)))))) (defun nnfolder-request-group (group &optional server dont-check) (save-excursion --- 185,220 ---- (defun nnfolder-request-article (article &optional newsgroup server buffer) (nnfolder-possibly-change-group newsgroup) ! (save-excursion ! (set-buffer nnfolder-current-buffer) ! (goto-char (point-min)) ! (if (search-forward (nnfolder-article-string article) nil t) ! (let (start stop) ! (re-search-backward (concat "^" rmail-unix-mail-delimiter) nil t) ! (setq start (point)) ! (forward-line 1) ! (or (and (re-search-forward ! (concat "^" rmail-unix-mail-delimiter) nil t) ! (forward-line -1)) ! (goto-char (point-max))) ! (setq stop (point)) ! (let ((nntp-server-buffer (or buffer nntp-server-buffer))) ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (insert-buffer-substring nnfolder-current-buffer start stop) ! (goto-char (point-min)) ! (while (looking-at "From ") ! (delete-char 5) ! (insert "X-From-Line: ") ! (forward-line 1)) ! (if (numberp article) ! (cons nnfolder-current-group article) (goto-char (point-min)) ! (search-forward (concat "\n" nnfolder-article-marker)) ! (cons nnfolder-current-group ! (string-to-int ! (buffer-substring ! (point) (progn (end-of-line) (point))))))))))) (defun nnfolder-request-group (group &optional server dont-check) (save-excursion *************** *** 222,228 **** (progn (if dont-check t - (nnfolder-get-new-mail group) (let* ((active (assoc group nnfolder-group-alist)) (group (car active)) (range (car (cdr active))) --- 224,229 ---- *************** *** 239,244 **** --- 240,261 ---- minactive maxactive group)) t))))))) + (defun nnfolder-request-scan (&optional group server) + (nnmail-get-new-mail + 'nnfolder + (lambda () + (let ((bufs nnfolder-buffer-alist)) + (save-excursion + (while bufs + (if (not (buffer-name (nth 1 (car bufs)))) + (setq nnfolder-buffer-alist + (delq (car bufs) nnfolder-buffer-alist)) + (set-buffer (nth 1 (car bufs))) + (and (buffer-modified-p) (save-buffer))) + (setq bufs (cdr bufs)))))) + nnfolder-directory + group)) + ;; Don't close the buffer if we're not shutting down the server. This way, ;; we can keep the buffer in the group buffer cache, and not have to grovel ;; over the buffer again unless we add new mail to it or modify it in some *************** *** 280,286 **** t) (defun nnfolder-request-list (&optional server) - (if server (nnfolder-get-new-mail)) (save-excursion (nnmail-find-file nnfolder-active-file) (setq nnfolder-group-alist (nnmail-get-active)))) --- 297,302 ---- *************** *** 321,327 **** days))) (progn (and gnus-verbose-backends ! (message "Deleting article %s..." (car articles))) (nnfolder-delete-mail)) (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) --- 337,344 ---- days))) (progn (and gnus-verbose-backends ! (message "Deleting article %d..." ! (car articles) newsgroup)) (nnfolder-delete-mail)) (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) *************** *** 414,419 **** --- 431,441 ---- ;;; Internal functions. + (defun nnfolder-article-string (article) + (if (numberp article) + (concat "\n" nnfolder-article-marker (int-to-string article) " ") + (concat "\nMessage-ID: " article))) + (defun nnfolder-delete-mail (&optional force leave-delim) ;; Beginning of the article. (save-excursion *************** *** 646,704 **** ;; Make absolutely sure that the active list reflects reality! (nnmail-save-active nnfolder-group-alist nnfolder-active-file) (current-buffer)))) - - (defun nnfolder-get-new-mail (&optional group) - "Read new incoming mail." - (let* ((spools (nnmail-get-spool-files group)) - (group-in group) - incomings incoming) - (if (or (not nnfolder-get-new-mail) (not nnmail-spool-file)) - () - ;; We first activate all the groups. - (nnfolder-possibly-activate-groups nil) - ;; The we go through all the existing spool files and split the - ;; mail from each. - (while spools - (and - (file-exists-p (car spools)) - (> (nth 7 (file-attributes (car spools))) 0) - (progn - (and gnus-verbose-backends - (message "nnfolder: Reading incoming mail...")) - (if (not (setq incoming - (nnmail-move-inbox - (car spools) - (concat (file-name-as-directory nnfolder-directory) - "Incoming")))) - () - (setq incomings (cons incoming incomings)) - (setq group (nnmail-get-split-group (car spools) group-in)) - (nnmail-split-incoming incoming 'nnfolder-save-mail nil group)))) - (setq spools (cdr spools))) - ;; If we did indeed read any incoming spools, we save all info. - (if incoming - (progn - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) - (run-hooks 'nnmail-read-incoming-hook) - (and gnus-verbose-backends - (message "nnfolder: Reading incoming mail...done")))) - (let ((bufs nnfolder-buffer-alist)) - (save-excursion - (while bufs - (if (not (buffer-name (nth 1 (car bufs)))) - (setq nnfolder-buffer-alist - (delq (car bufs) nnfolder-buffer-alist)) - (set-buffer (nth 1 (car bufs))) - (and (buffer-modified-p) (save-buffer))) - (setq bufs (cdr bufs))))) - (while incomings - (setq incoming (car incomings)) - (and - nnmail-delete-incoming - (file-writable-p incoming) - (file-exists-p incoming) - (delete-file incoming)) - (setq incomings (cdr incomings)))))) (provide 'nnfolder) --- 668,673 ---- *** pub/sgnus/lisp/nnheader.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnheader.el Tue Sep 19 23:02:48 1995 *************** *** 36,41 **** --- 36,46 ---- ;;; Code: + (require 'mail-utils) + + (defvar nnheader-max-head-length 4096 + "*Max length of the head of articles.") + (defalias 'nntp-header-number 'mail-header-number) (defmacro mail-header-number (header) "Return article number in HEADER." *************** *** 188,199 **** ;; Read the head of an article. (defun nnheader-insert-head (file) ! (let ((beg 0) ! (chop 1024)) ! (while (and (eq chop (nth 1 (nnheader-insert-file-contents-literally ! file nil beg (setq beg (+ chop beg))))) ! (prog1 (not (search-backward "\n\n" nil t)) ! (goto-char (point-max))))))) (defun nnheader-article-p () (goto-char (point-min)) --- 193,210 ---- ;; Read the head of an article. (defun nnheader-insert-head (file) ! (if (eq nnheader-max-head-length t) ! ;; Just read the entire file. ! (nnheader-insert-file-contents-literally file) ! (let ((beg 0) ! (chop 1024)) ! ;; Read 1K blocks until we find a separator. ! (while (and (eq chop (nth 1 (nnheader-insert-file-contents-literally ! file nil beg (setq beg (+ chop beg))))) ! (prog1 (not (search-backward "\n\n" nil t)) ! (goto-char (point-max))) ! (or (null nnheader-max-head-length) ! (< beg nnheader-max-head-length))))))) (defun nnheader-article-p () (goto-char (point-min)) *************** *** 341,347 **** (defun nnheader-insert-references (references message-id) ;; Fold long references line to follow RFC1036. (mail-position-on-field "References") ! (let ((begin (gnus-point-at-bol)) (fill-column 78) (fill-prefix "\t")) (if references (insert references)) --- 352,358 ---- (defun nnheader-insert-references (references message-id) ;; Fold long references line to follow RFC1036. (mail-position-on-field "References") ! (let ((begin (save-excursion (beginning-of-line) (point))) (fill-column 78) (fill-prefix "\t")) (if references (insert references)) *************** *** 350,355 **** --- 361,384 ---- ;; The region must end with a newline to fill the region ;; without inserting extra newline. (fill-region-as-paragraph begin (1+ (point))))) + + (defun nnheader-remove-header (header &optional is-regexp) + (goto-char (point-min)) + (let ((regexp (if is-regexp header (concat "^" header ":"))) + (case-fold-search t)) + (while (re-search-forward regexp nil t) + (delete-region + (match-beginning 0) + ;; There might be a continuation header, so we have to search + ;; until we find a new non-continuation line. + (if (re-search-forward "^[^ \t]" nil t) + (match-beginning 0) + (point-max)))))) + + (defun nnheader-set-temp-buffer (name) + (set-buffer (get-buffer-create name)) + (buffer-disable-undo (current-buffer)) + (erase-buffer)) (provide 'nnheader) *** pub/sgnus/lisp/nnkiboze.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnkiboze.el Wed Sep 20 18:49:47 1995 *************** *** 50,56 **** ;;; Interface functions. ! (defun nnkiboze-retrieve-headers (articles &optional group server) (nnkiboze-possibly-change-newsgroups group) (if gnus-nov-is-evil nil --- 50,56 ---- ;;; Interface functions. ! (defun nnkiboze-retrieve-headers (articles &optional group server fetch-old) (nnkiboze-possibly-change-newsgroups group) (if gnus-nov-is-evil nil *************** *** 105,111 **** ;; does no harm I think. The only alternative is to offer no ;; article fetching by message-id at all. (nntp-request-article article newsgroup gnus-nntp-server buffer) ! (let* ((header (gnus-get-header-by-number article)) (xref (mail-header-xref header)) igroup iarticle) (or xref (error "nnkiboze: No xref")) --- 105,111 ---- ;; does no harm I think. The only alternative is to offer no ;; article fetching by message-id at all. (nntp-request-article article newsgroup gnus-nntp-server buffer) ! (let* ((header (gnus-summary-article-header article)) (xref (mail-header-xref header)) igroup iarticle) (or xref (error "nnkiboze: No xref")) *************** *** 271,277 **** (if (> (car (car gnus-newsgroup-scored)) lowest) (nnkiboze-enter-nov nov-buffer ! (gnus-get-header-by-number (car (car gnus-newsgroup-scored))) (if method (gnus-group-prefixed-name gnus-newsgroup-name method) gnus-newsgroup-name))) --- 271,278 ---- (if (> (car (car gnus-newsgroup-scored)) lowest) (nnkiboze-enter-nov nov-buffer ! (gnus-summary-article-header ! (car (car gnus-newsgroup-scored))) (if method (gnus-group-prefixed-name gnus-newsgroup-name method) gnus-newsgroup-name))) *** pub/sgnus/lisp/nnmail.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnmail.el Wed Sep 20 23:20:56 1995 *************** *** 196,202 **** (mail . "mailer-daemon\\|postmaster")) "*Alist of abbreviations allowed in `nnmail-split-fancy'.") ! (defvar nnmail-delete-incoming t "*If non-nil, the mail backends will delete incoming files after splitting.") (defvar nnmail-message-id-cache-length 1000 --- 196,202 ---- (mail . "mailer-daemon\\|postmaster")) "*Alist of abbreviations allowed in `nnmail-split-fancy'.") ! (defvar nnmail-delete-incoming nil "*If non-nil, the mail backends will delete incoming files after splitting.") (defvar nnmail-message-id-cache-length 1000 *************** *** 231,238 **** nil method-address)) (save-excursion (set-buffer (get-buffer-create "*mail*")) - (mail-mode) - (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) (if (and (buffer-modified-p) (> (buffer-size) 0) (not (y-or-n-p "Unsent mail being composed; erase it? "))) --- 231,236 ---- *************** *** 288,293 **** --- 286,292 ---- subject message-of (if (zerop (length new-cc)) nil new-cc) article-buffer nil) + (mail-mode) (auto-save-mode auto-save-default) ;; Note that "To" elements should already be in the message. (if (and follow-to (listp follow-to)) *************** *** 301,306 **** --- 300,308 ---- (car (car follow-to)) ": " (cdr (car follow-to)) "\n") (setq follow-to (cdr follow-to))))) (nnheader-insert-references references message-id))) + (use-local-map (copy-keymap (current-local-map))) + (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) + (local-set-key "\C-c\C-p" 'gnus-put-message) (current-buffer)))) (defun nnmail-find-file (file) *************** *** 484,490 **** group)) group)) ! (defun nnmail-split-incoming (incoming func &optional dont-kill group) "Go through the entire INCOMING file and pick out each individual mail. FUNC will be called with the buffer narrowed to each mail." (let ((delim (concat "^" rmail-unix-mail-delimiter)) --- 486,492 ---- group)) group)) ! (defun nnmail-split-incoming (incoming func &optional exit-func group) "Go through the entire INCOMING file and pick out each individual mail. FUNC will be called with the buffer narrowed to each mail." (let ((delim (concat "^" rmail-unix-mail-delimiter)) *************** *** 566,574 **** (goto-char end))) ;; Close the message-id cache. (nnmail-cache-close) ! (if dont-kill ! (current-buffer) ! (kill-buffer (current-buffer)))))) ;; Mail crossposts syggested by Brian Edmonds . (defun nnmail-article-group (func) --- 568,575 ---- (goto-char end))) ;; Close the message-id cache. (nnmail-cache-close) ! (if exit-func (funcall exit-func)) ! (kill-buffer (current-buffer))))) ;; Mail crossposts syggested by Brian Edmonds . (defun nnmail-article-group (func) *************** *** 871,876 **** --- 872,931 ---- (goto-char (point-max)) (search-backward id nil t)))) + (defun nnmail-get-value (&rest args) + (let ((sym (intern (apply 'format args)))) + (and (boundp sym) + (symbol-value sym)))) + + (defun nnmail-get-new-mail (method exit-func temp + &optional group spool-func) + "Read new incoming mail." + (let* ((spools (nnmail-get-spool-files group)) + (group-in group) + incoming incomings) + (if (or (not (nnmail-get-value "%s-get-new-mail" method)) + (not nnmail-spool-file)) + () ; We don't want to look for new mail. + ;; We first activate all the groups. + (nnmail-activate method) + ;; The we go through all the existing spool files and split the + ;; mail from each. + (while spools + (and + (file-exists-p (car spools)) + (> (nth 7 (file-attributes (car spools))) 0) + (progn + (and gnus-verbose-backends + (message "%s: Reading incoming mail..." method)) + (if (not (setq incoming + (nnmail-move-inbox + (car spools) + (concat temp "Incoming")))) + () ; There is no new mail. + (setq group (nnmail-get-split-group (car spools) group-in)) + (nnmail-split-incoming + incoming (intern (format "%s-save-mail" method)) + spool-func group) + (setq incomings (cons incoming incomings))))) + (setq spools (cdr spools))) + ;; If we did indeed read any incoming spools, we save all info. + (if incoming + (progn + (nnmail-save-active + (nnmail-get-value "%s-group-alist" method) + (nnmail-get-value "%s-active-file" method)) + (and exit-func + (funcall exit-func)) + (run-hooks 'nnmail-read-incoming-hook) + (and gnus-verbose-backends + (message "%s: Reading incoming mail...done" method)))) + (while incomings + (setq incoming (car incomings)) + (and nnmail-delete-incoming + (file-exists-p incoming) + (file-writable-p incoming) + (delete-file incoming)) + (setq incomings (cdr incomings)))))) (provide 'nnmail) *** pub/sgnus/lisp/nnmbox.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnmbox.el Tue Sep 19 12:53:18 1995 *************** *** 84,131 **** (count 0) article art-string start stop) (nnmbox-possibly-change-newsgroup newsgroup) ! (if (stringp (car sequence)) ! 'headers ! (while sequence ! (setq article (car sequence)) ! (setq art-string (nnmbox-article-string article)) ! (set-buffer nnmbox-mbox-buffer) ! (if (or (search-forward art-string nil t) ! (progn (goto-char (point-min)) ! (search-forward art-string nil t))) ! (progn ! (setq start ! (save-excursion ! (re-search-backward ! (concat "^" rmail-unix-mail-delimiter) nil t) ! (point))) ! (search-forward "\n\n" nil t) ! (setq stop (1- (point))) ! (set-buffer nntp-server-buffer) ! (insert (format "221 %d Article retrieved.\n" article)) ! (insert-buffer-substring nnmbox-mbox-buffer start stop) ! (goto-char (point-max)) ! (insert ".\n"))) ! (setq sequence (cdr sequence)) ! (setq count (1+ count)) ! (and (numberp nnmail-large-newsgroup) ! (> number nnmail-large-newsgroup) ! (zerop (% count 20)) ! gnus-verbose-backends ! (message "nnmbox: Receiving headers... %d%%" ! (/ (* count 100) number)))) ! (and (numberp nnmail-large-newsgroup) (> number nnmail-large-newsgroup) gnus-verbose-backends ! (message "nnmbox: Receiving headers...done")) ! ;; Fold continuation lines. ! (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ! 'headers)))) (defun nnmbox-open-server (server &optional defs) (nnheader-init-server-buffer) --- 84,129 ---- (count 0) article art-string start stop) (nnmbox-possibly-change-newsgroup newsgroup) ! (while sequence ! (setq article (car sequence)) ! (setq art-string (nnmbox-article-string article)) ! (set-buffer nnmbox-mbox-buffer) ! (if (or (search-forward art-string nil t) ! (progn (goto-char (point-min)) ! (search-forward art-string nil t))) ! (progn ! (setq start ! (save-excursion ! (re-search-backward ! (concat "^" rmail-unix-mail-delimiter) nil t) ! (point))) ! (search-forward "\n\n" nil t) ! (setq stop (1- (point))) ! (set-buffer nntp-server-buffer) ! (insert (format "221 %d Article retrieved.\n" article)) ! (insert-buffer-substring nnmbox-mbox-buffer start stop) ! (goto-char (point-max)) ! (insert ".\n"))) ! (setq sequence (cdr sequence)) ! (setq count (1+ count)) (and (numberp nnmail-large-newsgroup) (> number nnmail-large-newsgroup) + (zerop (% count 20)) gnus-verbose-backends ! (message "nnmbox: Receiving headers... %d%%" ! (/ (* count 100) number)))) ! (and (numberp nnmail-large-newsgroup) ! (> number nnmail-large-newsgroup) ! gnus-verbose-backends ! (message "nnmbox: Receiving headers...done")) ! ! ;; Fold continuation lines. ! (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ! 'headers))) (defun nnmbox-open-server (server &optional defs) (nnheader-init-server-buffer) *************** *** 159,196 **** (defun nnmbox-request-article (article &optional newsgroup server buffer) (nnmbox-possibly-change-newsgroup newsgroup) ! (if (stringp article) ! nil ! (save-excursion ! (set-buffer nnmbox-mbox-buffer) ! (goto-char (point-min)) ! (if (search-forward (nnmbox-article-string article) nil t) ! (let (start stop) ! (re-search-backward (concat "^" rmail-unix-mail-delimiter) nil t) ! (setq start (point)) ! (forward-line 1) ! (or (and (re-search-forward ! (concat "^" rmail-unix-mail-delimiter) nil t) ! (forward-line -1)) ! (goto-char (point-max))) ! (setq stop (point)) ! (let ((nntp-server-buffer (or buffer nntp-server-buffer))) ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (insert-buffer-substring nnmbox-mbox-buffer start stop) ! (goto-char (point-min)) ! (while (looking-at "From ") ! (delete-char 5) ! (insert "X-From-Line: ") ! (forward-line 1)) ! t)))))) (defun nnmbox-request-group (group &optional server dont-check) (save-excursion (if (nnmbox-possibly-change-newsgroup group) (if dont-check t - (nnmbox-get-new-mail group) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) --- 157,193 ---- (defun nnmbox-request-article (article &optional newsgroup server buffer) (nnmbox-possibly-change-newsgroup newsgroup) ! (save-excursion ! (set-buffer nnmbox-mbox-buffer) ! (goto-char (point-min)) ! (if (search-forward (nnmbox-article-string article) nil t) ! (let (start stop) ! (re-search-backward (concat "^" rmail-unix-mail-delimiter) nil t) ! (setq start (point)) ! (forward-line 1) ! (or (and (re-search-forward ! (concat "^" rmail-unix-mail-delimiter) nil t) ! (forward-line -1)) ! (goto-char (point-max))) ! (setq stop (point)) ! (let ((nntp-server-buffer (or buffer nntp-server-buffer))) ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (insert-buffer-substring nnmbox-mbox-buffer start stop) ! (goto-char (point-min)) ! (while (looking-at "From ") ! (delete-char 5) ! (insert "X-From-Line: ") ! (forward-line 1)) ! (if (numberp article) ! (cons nnmbox-current-group article) ! (nnmbox-article-group-number))))))) (defun nnmbox-request-group (group &optional server dont-check) (save-excursion (if (nnmbox-possibly-change-newsgroup group) (if dont-check t (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) *************** *** 203,213 **** (car active)))) t))))) (defun nnmbox-close-group (group &optional server) t) (defun nnmbox-request-list (&optional server) - (if server (nnmbox-get-new-mail)) (save-excursion (or (nnmail-find-file nnmbox-active-file) (progn --- 200,225 ---- (car active)))) t))))) + (defun nnmbox-request-scan (&optional group server) + (nnmbox-read-mbox) + (nnmail-get-new-mail + 'nnmbox + (lambda () + (save-excursion + (set-buffer nnmbox-mbox-buffer) + (save-buffer))) + nnmbox-mbox-file group + (lambda () + (save-excursion + (let ((in-buf (current-buffer))) + (set-buffer nnmbox-mbox-buffer) + (goto-char (point-max)) + (insert-buffer-substring in-buf)))))) + (defun nnmbox-close-group (group &optional server) t) (defun nnmbox-request-list (&optional server) (save-excursion (or (nnmail-find-file nnmbox-active-file) (progn *************** *** 251,257 **** days))) (progn (and gnus-verbose-backends ! (message "Deleting article %s..." (car articles))) (nnmbox-delete-mail)) (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) --- 263,270 ---- days))) (progn (and gnus-verbose-backends ! (message "Deleting article %d in %s..." ! (car articles) newsgroup)) (nnmbox-delete-mail)) (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) *************** *** 381,388 **** (setq nnmbox-current-group newsgroup)))) (defun nnmbox-article-string (article) ! (concat "\nX-Gnus-Newsgroup: " nnmbox-current-group ":" ! (int-to-string article) " ")) (defun nnmbox-save-mail (&optional group) "Called narrowed to an article." --- 394,412 ---- (setq nnmbox-current-group newsgroup)))) (defun nnmbox-article-string (article) ! (if (numberp article) ! (concat "\nX-Gnus-Newsgroup: " nnmbox-current-group ":" ! (int-to-string article) " ") ! (concat "\nMessage-ID: " article))) ! ! (defun nnmbox-article-group-number () ! (save-excursion ! (goto-char (point-min)) ! (and (re-search-forward "^X-Gnus-Newsgroup: +\\([^:]+\\):\\([0-9]+\\) " ! nil t) ! (cons (buffer-substring (match-beginning 1) (match-end 1)) ! (string-to-int ! (buffer-substring (match-beginning 2) (match-end 2))))))) (defun nnmbox-save-mail (&optional group) "Called narrowed to an article." *************** *** 454,507 **** (narrow-to-region start end) (nnmbox-save-mail)))) (goto-char end)))))) - - (defun nnmbox-get-new-mail (&optional group) - "Read new incoming mail." - (let* ((spools (nnmail-get-spool-files group)) - (group-in group) - incoming incomings) - (nnmbox-read-mbox) - (if (or (not nnmbox-get-new-mail) (not nnmail-spool-file)) - () - ;; We go through all the existing spool files and split the - ;; mail from each. - (while spools - (and - (file-exists-p (car spools)) - (> (nth 7 (file-attributes (car spools))) 0) - (progn - (and gnus-verbose-backends - (message "nnmbox: Reading incoming mail...")) - (if (not (setq incoming - (nnmail-move-inbox - (car spools) - (concat nnmbox-mbox-file "-Incoming")))) - () - (setq incomings (cons incoming incomings)) - (save-excursion - (setq group (nnmail-get-split-group (car spools) group-in)) - (let ((in-buf (nnmail-split-incoming - incoming 'nnmbox-save-mail t group))) - (set-buffer nnmbox-mbox-buffer) - (goto-char (point-max)) - (insert-buffer-substring in-buf) - (kill-buffer in-buf)))))) - (setq spools (cdr spools))) - ;; If we did indeed read any incoming spools, we save all info. - (and (buffer-modified-p nnmbox-mbox-buffer) - (save-excursion - (nnmail-save-active nnmbox-group-alist nnmbox-active-file) - (set-buffer nnmbox-mbox-buffer) - (save-buffer))) - (if incomings (run-hooks 'nnmail-read-incoming-hook)) - (while incomings - (setq incoming (car incomings)) - (and nnmail-delete-incoming - (file-exists-p incoming) - (file-writable-p incoming) - (delete-file incoming)) - (setq incomings (cdr incomings)))))) - (provide 'nnmbox) --- 478,483 ---- *** pub/sgnus/lisp/nnmh.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnmh.el Wed Sep 20 17:36:11 1995 *************** *** 156,165 **** (and (stringp file) (file-exists-p file) (not (file-directory-p file)) ! (save-excursion (nnmail-find-file file))))) (defun nnmh-request-group (group &optional server dont-check) - (and nnmh-get-new-mail (or dont-check (nnmh-get-new-mail group))) (let ((pathname (nnmh-article-pathname group nnmh-directory)) dir) (if (file-directory-p pathname) --- 156,165 ---- (and (stringp file) (file-exists-p file) (not (file-directory-p file)) ! (save-excursion (nnmail-find-file file)) ! (string-to-int (file-name-nondirectory file))))) (defun nnmh-request-group (group &optional server dont-check) (let ((pathname (nnmh-article-pathname group nnmh-directory)) dir) (if (file-directory-p pathname) *************** *** 193,198 **** --- 193,201 ---- (setq nnmh-status-string "No such group") nil))) + (defun nnmh-request-scan (&optional group server) + (nnmail-get-new-mail 'nnmh nil nnmh-directory group)) + (defun nnmh-request-list (&optional server dir) (or dir (save-excursion *************** *** 231,237 **** (apply (function max) files) (apply (function min) files))))))) (setq nnmh-group-alist (nnmail-get-active)) - (and server nnmh-get-new-mail (nnmh-get-new-mail)) t) (defun nnmh-request-newgroups (date &optional server) --- 234,239 ---- *************** *** 274,280 **** days)))) (progn (and gnus-verbose-backends ! (message "Deleting article %s..." article)) (condition-case () (delete-file article) (file-error --- 276,283 ---- days)))) (progn (and gnus-verbose-backends ! (message "Deleting article %d..." ! article newsgroup)) (condition-case () (delete-file article) (file-error *************** *** 330,335 **** --- 333,357 ---- t) (error nil)))) + (defun nnmh-request-create-group (group &optional server) + (nnmail-activate 'nnmh) + (or (assoc group nnmh-group-alist) + (let (active) + (setq nnmh-group-alist (cons (list group (setq active (cons 1 0))) + nnmh-group-alist)) + (nnmh-possibly-create-directory group) + (nnmh-possibly-change-directory group) + (let ((articles (mapcar + (lambda (file) + (string-to-int file)) + (directory-files + nnmh-current-directory nil "^[0-9]+$")))) + (and articles + (progn + (setcar active (apply 'min articles)) + (setcdr active (apply 'max articles))))))) + t) + ;;; Internal functions. *************** *** 402,448 **** (if (file-directory-p (concat mail-dir group)) (concat mail-dir group "/") (concat mail-dir (nnmail-replace-chars-in-string group ?. ?/) "/")))) - - (defun nnmh-get-new-mail (&optional group) - "Read new incoming mail." - (let* ((spools (nnmail-get-spool-files group)) - (group-in group) - incoming incomings) - (if (or (not nnmh-get-new-mail) (not nnmail-spool-file)) - () - ;; We first activate all the groups. - (or nnmh-group-alist - (nnmh-request-list)) - ;; The we go through all the existing spool files and split the - ;; mail from each. - (while spools - (and - (file-exists-p (car spools)) - (> (nth 7 (file-attributes (car spools))) 0) - (progn - (and gnus-verbose-backends - (message "nnmh: Reading incoming mail...")) - (if (not (setq incoming - (nnmail-move-inbox - (car spools) - (concat (file-name-as-directory nnmh-directory) - "Incoming")))) - () - (setq incomings (cons incoming incomings)) - (setq group (nnmail-get-split-group (car spools) group-in)) - (nnmail-split-incoming incoming 'nnmh-save-mail nil group)))) - (setq spools (cdr spools))) - ;; If we did indeed read any incoming spools, we save all info. - (if incoming - (message "nnmh: Reading incoming mail...done")) - (while incomings - (setq incoming (car incomings)) - (and nnmail-delete-incoming - (file-exists-p incoming) - (file-writable-p incoming) - (delete-file incoming)) - (setq incomings (cdr incomings)))))) - (defun nnmh-update-gnus-unreads (group) ;; Go through the .nnmh-articles file and compare with the actual --- 424,429 ---- *** pub/sgnus/lisp/nnml.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnml.el Wed Sep 20 21:33:51 1995 *************** *** 64,69 **** --- 64,70 ---- (defvar nnml-nov-file-name ".overview") (defvar nnml-current-directory nil) + (defvar nnml-current-group nil) (defvar nnml-status-string "") (defvar nnml-nov-buffer-alist nil) (defvar nnml-group-alist nil) *************** *** 84,89 **** --- 85,91 ---- (list 'nnml-nov-is-evil nnml-nov-is-evil) (list 'nnml-nov-file-name nnml-nov-file-name) '(nnml-current-directory nil) + '(nnml-current-group nil) '(nnml-status-string "") '(nnml-nov-buffer-alist nil) '(nnml-group-alist nil) *************** *** 93,99 **** ;;; Interface functions. ! (defun nnml-retrieve-headers (sequence &optional newsgroup server) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) --- 95,101 ---- ;;; Interface functions. ! (defun nnml-retrieve-headers (sequence &optional newsgroup server fetch-old) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) *************** *** 104,110 **** (if (stringp (car sequence)) 'headers (nnml-possibly-change-directory newsgroup) ! (if (nnml-retrieve-headers-with-nov sequence) 'nov (while sequence (setq article (car sequence)) --- 106,112 ---- (if (stringp (car sequence)) 'headers (nnml-possibly-change-directory newsgroup) ! (if (nnml-retrieve-headers-with-nov sequence fetch-old) 'nov (while sequence (setq article (car sequence)) *************** *** 173,187 **** (defun nnml-request-article (id &optional newsgroup server buffer) (nnml-possibly-change-directory newsgroup) ! (let ((file (if (stringp id) ! nil ! (concat nnml-current-directory (int-to-string id)))) ! (nntp-server-buffer (or buffer nntp-server-buffer))) ! (if (and (stringp file) ! (file-exists-p file) ! (not (file-directory-p file))) ! (save-excursion ! (nnmail-find-file file))))) (defun nnml-request-group (group &optional server dont-check) (if (not (nnml-possibly-change-directory group)) --- 175,196 ---- (defun nnml-request-article (id &optional newsgroup server buffer) (nnml-possibly-change-directory newsgroup) ! (let* ((group-num (and (stringp id) (nnml-find-group-number id))) ! (number (if (numberp id) id (cdr group-num))) ! (file ! (and number ! (concat ! nnml-current-directory ! (if (numberp id) ! (int-to-string number) ! (car group-num))))) ! (nntp-server-buffer (or buffer nntp-server-buffer))) ! (and file ! (file-exists-p file) ! (not (file-directory-p file)) ! (save-excursion (nnmail-find-file file)) ! ;; We return the article number. ! (cons newsgroup (string-to-int (file-name-nondirectory file)))))) (defun nnml-request-group (group &optional server dont-check) (if (not (nnml-possibly-change-directory group)) *************** *** 190,196 **** nil) (if dont-check t - (nnml-get-new-mail group) (nnmail-activate 'nnml) (let ((active (nth 1 (assoc group nnml-group-alist)))) (save-excursion --- 199,204 ---- *************** *** 203,208 **** --- 211,219 ---- (car active) (cdr active) group)) t)))))) + (defun nnml-request-scan (&optional group server) + (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group)) + (defun nnml-close-group (group &optional server) t) *************** *** 232,238 **** t) (defun nnml-request-list (&optional server) - (if server (nnml-get-new-mail)) (save-excursion (nnmail-find-file nnml-active-file) (setq nnml-group-alist (nnmail-get-active)))) --- 243,248 ---- *************** *** 281,287 **** days))))) (progn (and gnus-verbose-backends ! (message "Deleting article %s..." article)) (condition-case () (delete-file article) (file-error --- 291,298 ---- days))))) (progn (and gnus-verbose-backends ! (message "Deleting article %d in %s..." ! article newsgroup)) (condition-case () (delete-file article) (file-error *************** *** 386,392 **** ;;; Internal functions ! (defun nnml-retrieve-headers-with-nov (articles) (if (or gnus-nov-is-evil nnml-nov-is-evil) nil (let ((first (car articles)) --- 397,445 ---- ;;; Internal functions ! ;; Find an article number in the current group given the Message-ID. ! (defun nnml-find-group-number (id) ! (save-excursion ! (set-buffer (get-buffer-create " *nnml id*")) ! (buffer-disable-undo (current-buffer)) ! (let ((alist nnml-group-alist) ! number) ! ;; We want to look through all .overview files, but we want to ! ;; start with the one in the current directory. It seems most ! ;; likely that the article we are looking for is in that group. ! (if (setq number (nnml-find-id nnml-current-group id)) ! (cons nnml-current-group id) ! ;; It wasn't there, so we look through the other groups as well. ! (while (and (not number) ! alist) ! (or (string= (car (car alist)) nnml-current-group) ! (setq number (nnml-find-id (car (car alist)) id))) ! (or number ! (setq alist (cdr alist)))) ! (and number ! (cons (car (car alist)) number)))))) ! ! (defun nnml-find-id (group id) ! (erase-buffer) ! (insert-file-contents (nnmail-article-pathname group nnml-directory)) ! (let (number found) ! (while (and (not found) ! (search-forward id nil t)) ; We find the ID. ! ;; And the id is in the fourth field. ! (if (search-backward ! "\t" (save-excursion (beginning-of-line) (point)) t 4) ! (progn ! (beginning-of-line) ! (setq found t) ! ;; We return the article number. ! (setq number ! (condition-case () ! (read (current-buffer)) ! (error nil)))))) ! number)) ! ! ! (defun nnml-retrieve-headers-with-nov (articles &optional fetch-old) (if (or gnus-nov-is-evil nnml-nov-is-evil) nil (let ((first (car articles)) *************** *** 398,419 **** (set-buffer nntp-server-buffer) (erase-buffer) (insert-file-contents nov) ! (goto-char (point-min)) ! (while (and (not (eobp)) (< first (read (current-buffer)))) ! (forward-line 1)) ! (beginning-of-line) ! (if (not (eobp)) (delete-region 1 (point))) ! (while (and (not (eobp)) (>= last (read (current-buffer)))) ! (forward-line 1)) ! (beginning-of-line) ! (if (not (eobp)) (delete-region (point) (point-max))) ! t))))) (defun nnml-possibly-change-directory (newsgroup &optional force) (if newsgroup (let ((pathname (nnmail-article-pathname newsgroup nnml-directory))) (and (or force (file-directory-p pathname)) ! (setq nnml-current-directory pathname))) t)) (defun nnml-possibly-create-directory (group) --- 451,478 ---- (set-buffer nntp-server-buffer) (erase-buffer) (insert-file-contents nov) ! (if (and fetch-old ! (not (numberp fetch-old))) ! t ; Don't remove anything. ! (if fetch-old ! (setq first (max 1 (- first fetch-old)))) ! (goto-char (point-min)) ! (while (and (not (eobp)) (< first (read (current-buffer)))) ! (forward-line 1)) ! (beginning-of-line) ! (if (not (eobp)) (delete-region 1 (point))) ! (while (and (not (eobp)) (>= last (read (current-buffer)))) ! (forward-line 1)) ! (beginning-of-line) ! (if (not (eobp)) (delete-region (point) (point-max))) ! t)))))) (defun nnml-possibly-change-directory (newsgroup &optional force) (if newsgroup (let ((pathname (nnmail-article-pathname newsgroup nnml-directory))) (and (or force (file-directory-p pathname)) ! (setq nnml-current-directory pathname ! nnml-current-group newsgroup))) t)) (defun nnml-possibly-create-directory (group) *************** *** 481,529 **** (int-to-string (cdr active)))) (setcdr active (1+ (cdr active)))) (cdr active))) - - (defun nnml-get-new-mail (&optional group) - "Read new incoming mail." - (let* ((spools (nnmail-get-spool-files group)) - (group-in group) - incoming incomings) - (if (or (not nnml-get-new-mail) (not nnmail-spool-file)) - () - ;; We first activate all the groups. - (nnmail-activate 'nnml) - ;; The we go through all the existing spool files and split the - ;; mail from each. - (while spools - (and - (file-exists-p (car spools)) - (> (nth 7 (file-attributes (car spools))) 0) - (progn - (and gnus-verbose-backends - (message "nnml: Reading incoming mail...")) - (if (not (setq incoming - (nnmail-move-inbox - (car spools) (concat nnml-directory "Incoming")))) - () - (setq group (nnmail-get-split-group (car spools) group-in)) - (nnmail-split-incoming incoming 'nnml-save-mail nil group) - (setq incomings (cons incoming incomings))))) - (setq spools (cdr spools))) - ;; If we did indeed read any incoming spools, we save all info. - (if incoming - (progn - (nnmail-save-active nnml-group-alist nnml-active-file) - (nnml-save-nov) - (run-hooks 'nnmail-read-incoming-hook) - (and gnus-verbose-backends - (message "nnml: Reading incoming mail...done")))) - (while incomings - (setq incoming (car incomings)) - (and nnmail-delete-incoming - (file-exists-p incoming) - (file-writable-p incoming) - (delete-file incoming)) - (setq incomings (cdr incomings)))))) - (defun nnml-add-nov (group article line) "Add a nov line for the GROUP base." --- 540,545 ---- *** pub/sgnus/lisp/nnsoup.el Thu Sep 21 01:16:29 1995 --- sgnus/lisp/nnsoup.el Wed Sep 20 18:49:44 1995 *************** *** 0 **** --- 1,564 ---- + ;;; nnsoup.el --- SOUP access for Gnus + ;; Copyright (C) 1995 Free Software Foundation, Inc. + + ;; Author: Lars Magne Ingebrigtsen + ;; Masanobu UMEDA + ;; Keywords: news, mail + + ;; 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, 675 Mass Ave, Cambridge, MA 02139, USA. + + ;;; Commentary: + + ;;; Code: + + (require 'nnheader) + (require 'nnmail) + (require 'gnus-soup) + (require 'gnus-msg) + + (defvar nnsoup-directory "~/SOUP/" + "*SOUP packet directory directory.") + + (defvar nnsoup-replies-directory (concat nnsoup-directory "replies/") + "*Directory where outgoing packets will be composed.") + + (defvar nnsoup-replies-format-type ?n + "*Format of the replies packages.") + + (defvar nnsoup-replies-index-type ?n + "*Index type of the replies packages.") + + (defvar nnsoup-active-file (concat nnsoup-directory "active") + "Active file.") + + (defvar nnsoup-packer "tar cf - %s | gzip > $HOME/Soupin%d.tgz" + "Format string command for packing a SOUP packet. + The SOUP files will be inserted where the %s is in the string. + This string MUST contain both %s and %d. The file number will be + inserted where %d appears.") + + (defvar nnsoup-unpacker "gunzip -c %s | tar xvf -" + "*Format string command for unpacking a SOUP packet. + The SOUP packet file name will be inserted at the %s.") + + (defvar nnsoup-packet-directory "~/" + "*Where nnsoup will look for incoming packets.") + + (defvar nnsoup-packet-regexp "Soupout" + "*Regular expression matching SOUP packets in `nnsoup-packet-directory'.") + + + + (defconst nnsoup-version "nnsoup 0.0" + "nnsoup version.") + + (defvar nnsoup-status-string "") + (defvar nnsoup-group-alist nil) + (defvar nnsoup-replies-list nil) + (defvar nnsoup-buffers nil) + (defvar nnsoup-current-group nil) + + + + ;; Server variables. + + (defvar nnsoup-current-server nil) + (defvar nnsoup-server-alist nil) + (defvar nnsoup-server-variables + (list + (list 'nnsoup-directory nnsoup-directory) + (list 'nnsoup-active-file nnsoup-active-file) + '(nnsoup-status-string "") + '(nnsoup-group-alist nil))) + + + + ;;; Interface functions. + + (defun nnsoup-retrieve-headers (sequence &optional group server fetch-old) + (nnsoup-possibly-change-group group) + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer) + (let ((areas (cdr (assoc nnsoup-current-group nnsoup-group-alist))) + (articles sequence) + (use-nov t) + useful-areas this-area-seq) + (if (stringp (car sequence)) + 'headers + ;; We go through all the areas and find which files the + ;; articles in SEQUENCE come from. + (while (and areas sequence) + ;; Peel off areas that are below sequence. + (while (and areas (< (cdr (car (car areas))) (car sequence))) + (setq areas (cdr areas))) + (if (not areas) + () + ;; This is a useful area. + (setq useful-areas (cons (car areas) useful-areas) + this-area-seq nil) + ;; We take note whether this MSG has a corresponding IDX + ;; for later use. + (if (or (= (gnus-soup-encoding-index + (gnus-soup-area-encoding (nth 1 (car areas)))) ?n) + (not (file-exists-p + (nnsoup-file + (gnus-soup-area-prefix (nth 1 (car areas))))))) + (setq use-nov nil)) + ;; We assing the portion of `sequence' that is relevant to + ;; this MSG packet to this packet. + (while (and sequence (<= (car sequence) (cdr (car (car areas))))) + (setq this-area-seq (cons (car sequence) this-area-seq) + sequence (cdr sequence))) + (setcar useful-areas (cons (nreverse this-area-seq) + (car useful-areas))))) + + ;; We now have a list of article numbers and corresponding + ;; areas. + (setq useful-areas (nreverse useful-areas)) + + ;; Two different approaches depending on whether all the MSG + ;; files have corresponding IDX files. If they all do, we + ;; simply return the relevant IDX files and let Gnus sort out + ;; what lines are relevant. If some of the IDX files are + ;; missing, we must return HEADs for all the articles. + (if use-nov + (while useful-areas + (goto-char (point-max)) + (let ((b (point)) + (number (car (nth 1 (car useful-areas))))) + (insert-buffer-substring + (nnsoup-index-buffer + (gnus-soup-area-prefix + (nth 2 (car useful-areas))))) + (goto-char b) + ;; We have to remove the index number entires and + ;; insert article numbers instead. + (while (looking-at "[0-9]+") + (replace-match (int-to-string number) t t) + (setq number (1+ number)) + (forward-line 1))) + (setq useful-areas (cdr useful-areas))) + ;; We insert HEADs. + (while useful-areas + (setq articles (car (car useful-areas)) + useful-areas (cdr useful-areas)) + (while articles + (goto-char (point-max)) + (insert (format "221 %d Article retrieved.\n" (car articles))) + (insert-buffer-substring + (nnsoup-narrow-to-article + (car articles) (cdr (car useful-areas)) 'head)) + (goto-char (point-max)) + (insert ".\n") + (setq articles (cdr articles)))) + + ;; Fold continuation lines. + (goto-char (point-min)) + (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) + (replace-match " " t t))) + (if use-nov 'nov 'headers))))) + + (defun nnsoup-open-server (server &optional defs) + (nnsoup-set-variables) + (nnheader-init-server-buffer) + (if (equal server nnsoup-current-server) + t + (if nnsoup-current-server + (setq nnsoup-server-alist + (cons (list nnsoup-current-server + (nnheader-save-variables nnsoup-server-variables)) + nnsoup-server-alist))) + (let ((state (assoc server nnsoup-server-alist))) + (if state + (progn + (nnheader-restore-variables (nth 1 state)) + (setq nnsoup-server-alist (delq state nnsoup-server-alist))) + (nnheader-set-init-variables nnsoup-server-variables defs))) + (setq nnsoup-current-server server)) + (nnsoup-read-active-file)) + + (defun nnsoup-request-close () + (nnsoup-write-active-file) + (nnsoup-write-replies) + (while nnsoup-buffers + (and (car nnsoup-buffers) + (buffer-name (car nnsoup-buffers)) + (kill-buffer (car nnsoup-buffers))) + (setq nnsoup-buffers (cdr nnsoup-buffers))) + (setq nnsoup-group-alist nil + nnsoup-current-group nil + nnsoup-current-server nil + nnsoup-server-alist nil + nnsoup-replies-list nil) + t) + + (defun nnsoup-close-server (&optional server) + t) + + (defun nnsoup-server-opened (&optional server) + (and (equal server nnsoup-current-server) + nntp-server-buffer + (buffer-name nntp-server-buffer))) + + (defun nnsoup-status-message (&optional server) + nnsoup-status-string) + + (defun nnsoup-request-article (id &optional newsgroup server buffer) + (nnsoup-possibly-change-group newsgroup) + (let ((buffer (or buffer nntp-server-buffer))) + (save-excursion + (set-buffer buffer) + (erase-buffer) + (if (stringp id) + () + (insert-buffer-substring + (nnsoup-narrow-to-article id)) + t)))) + + (defun nnsoup-request-group (group &optional server dont-check) + (nnsoup-possibly-change-group group) + (if dont-check + () + (let ((area (cdr (assoc group nnsoup-group-alist))) + min max) + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer) + (setq min (car (car (car area)))) + (while (cdr area) + (setq area (cdr area))) + (setq max (cdr (car (car area)))) + (insert (format "211 %d %d %d %s\n" + (max (1+ (- max min)) 0) min max group))))) + t) + + (defun nnsoup-close-group (group &optional server) + t) + + (defun nnsoup-request-list (&optional server) + (or nnsoup-group-alist (nnsoup-read-areas)) + (nnsoup-unpack-packets) + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer) + (let ((alist nnsoup-group-alist) + min) + (while alist + (setq min (car (car (nth 1 (car alist))))) + (insert (format "%s %d %d y\n" (car (car alist)) + (let ((areas (car alist))) + (while (cdr areas) + (setq areas (cdr areas))) + (cdr (car (car areas)))) min)) + (setq alist (cdr alist))) + t))) + + (defun nnsoup-request-newgroups (date &optional server) + (nnsoup-request-list)) + + (defun nnsoup-request-list-newsgroups (&optional server) + nil) + + (defun nnsoup-request-post (&optional server) + (nnsoup-store-reply "news") + t) + + (defun nnsoup-request-mail () + (nnsoup-store-reply "mail") + t) + + (defun nnsoup-request-post-buffer (post group &rest args) + (nnsoup-possibly-change-group group) + (apply + ;; Find out whether the source for this group is a mail or a news + ;; group and call the right function for getting a buffer. + (let ((enc (nth 1 (car (cdr (assoc nnsoup-current-group + nnsoup-group-alist)))))) + (if (and enc + (= (gnus-soup-encoding-kind (gnus-soup-area-encoding enc)) ?m)) + 'nnmail-request-post-buffer + 'nntp-request-post-buffer)) + post group args)) + + + ;;; Internal functions + + (defun nnsoup-possibly-change-group (group &optional force) + (if group + (setq nnsoup-current-group group) + t)) + + (defun nnsoup-read-active-file () + (if (file-exists-p nnsoup-active-file) + (condition-case () + (load nnsoup-active-file) + (error nil)))) + + (defun nnsoup-write-active-file () + (save-excursion + (set-buffer (get-buffer-create " *nnsoup work*")) + (buffer-disable-undo (current-buffer)) + (erase-buffer) + (insert (format "(setq nnsoup-group-alist '%S)\n" nnsoup-group-alist)) + (write-region (point-min) (point-max) nnsoup-active-file + nil 'silent) + (kill-buffer (current-buffer)))) + + (defun nnsoup-read-areas () + (save-excursion + (set-buffer nntp-server-buffer) + (let ((areas (gnus-soup-parse-areas (concat nnsoup-directory "AREAS"))) + entry number area lnum) + ;; Go through all areas in the new AREAS file. + (while areas + (setq area (car areas) + areas (cdr areas)) + ;; Find the number of new articles in this area. + (setq number (nnsoup-number-of-articles area)) + (if (not (setq entry (assoc (gnus-soup-area-name area) + nnsoup-group-alist))) + ;; If this is a new area (group), we just add this info to + ;; the group alist. + (setq nnsoup-group-alist + (cons (list (gnus-soup-area-name area) + (list (cons 1 number) area)) + nnsoup-group-alist)) + ;; There are already articles in this group, so we add this + ;; info to the end of the entry. + (let ((e (cdr entry))) + (while (cdr e) + (setq e (cdr e))) + (setcdr e (list (list (cons (setq lnum (1+ (cdr (car (car e))))) + (+ lnum number)) + area))))))) + (nnsoup-write-active-file))) + + (defun nnsoup-number-of-articles (area) + (save-excursion + (cond + ;; If the number is in the area info, we just return it. + ((gnus-soup-area-number area) + (gnus-soup-area-number area)) + ;; If there is an index file, we just count the lines. + ((/= (gnus-soup-encoding-index (gnus-soup-area-encoding area)) ?n) + (set-buffer (nnsoup-index-buffer (gnus-soup-area-prefix area))) + (count-lines (point-min) (point-max))) + ;; We do it the hard way - re-searching through the message + ;; buffer. + (t + (set-buffer (nnsoup-message-buffer (gnus-soup-area-prefix area))) + (goto-char (point-min)) + (let ((regexp (nnsoup-header (gnus-soup-encoding-format + (gnus-soup-area-encoding area)))) + (num 0)) + (while (re-search-forward regexp nil t) + (setq num (1+ num))) + num))))) + + (defun nnsoup-index-buffer (prefix &optional message) + (let* ((file (concat prefix (if message ".MSG" ".IDX"))) + (buffer-name (concat " *nnsoup " file "*"))) + (or (get-buffer buffer-name) ; File aready loaded. + (save-excursion ; Load the file. + (set-buffer (get-buffer-create buffer-name)) + (setq nnsoup-buffers (cons (current-buffer) nnsoup-buffers)) + (insert-file-contents (concat nnsoup-directory file)) + (current-buffer))))) + + (defun nnsoup-file (prefix &optional message) + (concat nnsoup-directory prefix (if message ".MSG" ".IDX"))) + + (defun nnsoup-message-buffer (prefix) + (nnsoup-index-buffer prefix 'msg)) + + (defun nnsoup-unpack-packets () + (let ((packets (directory-files + nnsoup-packet-directory t nnsoup-packet-regexp)) + msg) + (while packets + (message (setq msg (format "nnsoup: unpacking %s..." (car packets)))) + (gnus-soup-unpack-packet nnsoup-directory nnsoup-unpacker (car packets)) + (delete-file (car packets)) + (nnsoup-read-areas) + (message "%sdone" msg) + (setq packets (cdr packets))))) + + (defun nnsoup-narrow-to-article (article &optional area head) + (let* ((area (or area (nnsoup-article-to-area article nnsoup-current-group))) + (prefix (gnus-soup-area-prefix (nth 1 area))) + beg end msg-buf) + (setq msg-buf (nnsoup-index-buffer prefix 'msg)) + (save-excursion + (cond + ;; We use the index file to find out where the article begins and ends. + ((and (= (gnus-soup-encoding-index + (gnus-soup-area-encoding (nth 1 area))) + ?c) + (file-exists-p (nnsoup-file prefix))) + (set-buffer (nnsoup-index-buffer prefix)) + (widen) + (goto-char (point-min)) + (forward-line (- article (car (car area)))) + (setq beg (read (current-buffer))) + (forward-line 1) + (if (looking-at "[0-9]+") + (progn + (setq end (read (current-buffer))) + (set-buffer msg-buf) + (widen) + (let ((format (gnus-soup-encoding-format + (gnus-soup-area-encoding (nth 1 area))))) + (goto-char end) + (if (or (= format ?n) (= format ?m)) + (setq end (progn (forward-line -1) (point)))))) + (set-buffer msg-buf)) + (widen) + (narrow-to-region beg (or end (point-max)))) + (t + (set-buffer msg-buf) + (widen) + (goto-char (point-min)) + (let ((header (nnsoup-header + (gnus-soup-encoding-format + (gnus-soup-area-encoding (nth 1 area)))))) + (re-search-forward header nil t (- article (car (car area)))) + (narrow-to-region + (match-beginning 0) + (if (re-search-forward header nil t) + (match-beginning 0) + (point-max)))))) + (goto-char (point-min)) + (if (not head) + () + (narrow-to-region + (point-min) + (if (search-forward "\n\n" nil t) + (1- (point)) + (point-max)))) + msg-buf))) + + (defun nnsoup-header (format) + (cond + ((= format ?n) + "^#! *rnews +[0-9]+ *$") + ((= format ?m) + (concat "^" rmail-unix-mail-delimiter)) + ((= format ?M) + "^\^A\^A\^A\^A\n") + (t + (error "Unknown format: %c" format)))) + + (defun nnsoup-pack-replies () + "Make an outbound package of SOUP replies." + (interactive) + (nnsoup-write-active-file) + (nnsoup-write-replies) + (gnus-soup-pack nnsoup-replies-directory nnsoup-packer)) + + (defun nnsoup-write-replies () + (gnus-soup-write-replies nnsoup-replies-directory nnsoup-replies-list)) + + (defun nnsoup-article-to-area (article group) + (let ((areas (cdr (assoc group nnsoup-group-alist)))) + (while (and areas (< (cdr (car (car areas))) article)) + (setq areas (cdr areas))) + (and areas (car areas)))) + + (defun nnsoup-set-variables () + (setq gnus-inews-article-function 'nnsoup-request-post) + (setq gnus-mail-send-method 'nnsoup-request-mail) + (setq send-mail-function 'nnsoup-request-mail)) + + (defun nnsoup-store-reply (kind) + ;; Mostly stolen from `sendmail.el'. + (let ((tembuf (generate-new-buffer " sendmail temp")) + (case-fold-search nil) + (mailbuf (current-buffer)) + delimline) + (save-excursion + (set-buffer tembuf) + (erase-buffer) + (insert-buffer-substring mailbuf) + (goto-char (point-max)) + ;; require one newline at the end. + (or (= (preceding-char) ?\n) + (insert ?\n)) + ;; Change header-delimiter to be what sendmail expects. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "\n")) + (replace-match "\n") + (backward-char 1) + (setq delimline (point-marker)) + (if mail-aliases (expand-mail-aliases (point-min) delimline)) + (goto-char (point-min)) + ;; ignore any blank lines in the header + (while (and (re-search-forward "\n\n\n*" delimline t) + (< (point) delimline)) + (replace-match "\n")) + (let ((case-fold-search t)) + (goto-char (point-min)) + ;; Find and handle any FCC fields. + (goto-char (point-min)) + (if (re-search-forward "^FCC:" delimline t) + (mail-do-fcc delimline)) + (goto-char (point-min)) + ;; "S:" is an abbreviation for "Subject:". + (goto-char (point-min)) + (if (re-search-forward "^S:" delimline t) + (replace-match "Subject:")) + ;; Don't send out a blank subject line + (goto-char (point-min)) + (if (re-search-forward "^Subject:[ \t]*\n" delimline t) + (replace-match "")) + ;; Insert an extra newline if we need it to work around + ;; Sun's bug that swallows newlines. + (goto-char (1+ delimline)) + (if (eval mail-mailer-swallows-blank-line) + (newline))) + (gnus-soup-store + nnsoup-replies-directory + (nnsoup-kind-to-prefix kind) nil nnsoup-replies-format-type + nnsoup-replies-index-type) + (kill-buffer tembuf)))) + + (defun nnsoup-kind-to-prefix (kind) + (or nnsoup-replies-list + (setq nnsoup-replies-list + (gnus-soup-parse-replies + (concat nnsoup-replies-directory "REPLIES")))) + (let ((replies nnsoup-replies-list)) + (while (and replies + (not (string= kind (gnus-soup-reply-kind (car replies))))) + (setq replies (cdr replies))) + (if replies + (gnus-soup-reply-prefix (car replies)) + (setq nnsoup-replies-list + (cons (vector (gnus-soup-unique-prefix nnsoup-replies-directory) + kind + (format "%c%c%c" + nnsoup-replies-format-type + nnsoup-replies-index-type + (if (string= kind "news") + ?n ?m))) + nnsoup-replies-list)) + (gnus-soup-reply-prefix (car nnsoup-replies-list))))) + + (provide 'nnsoup) + + ;;; nnsoup.el ends here *** pub/sgnus/lisp/nnspool.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnspool.el Wed Sep 20 23:20:59 1995 *************** *** 74,79 **** --- 74,82 ---- If nil, nnspool will load the entire file into a buffer and process it there.") + (defvar nnspool-rejected-article-hook nil + "*A hook that will be run when an article has been rejected by the server.") + (defconst nnspool-version "nnspool 2.0" *************** *** 111,117 **** ;;; Interface functions. ! (defun nnspool-retrieve-headers (sequence &optional newsgroup server) "Retrieve the headers for the articles in SEQUENCE. Newsgroup must be selected before calling this function." (save-excursion --- 114,120 ---- ;;; Interface functions. ! (defun nnspool-retrieve-headers (sequence &optional newsgroup server fetch-old) "Retrieve the headers for the articles in SEQUENCE. Newsgroup must be selected before calling this function." (save-excursion *************** *** 125,131 **** (if (not (nnspool-possibly-change-directory newsgroup)) () (if (and (numberp (car sequence)) ! (nnspool-retrieve-headers-with-nov sequence)) 'nov (while sequence (setq article (car sequence)) --- 128,134 ---- (if (not (nnspool-possibly-change-directory newsgroup)) () (if (and (numberp (car sequence)) ! (nnspool-retrieve-headers-with-nov sequence fetch-old)) 'nov (while sequence (setq article (car sequence)) *************** *** 192,207 **** (defun nnspool-request-article (id &optional newsgroup server buffer) "Select article by message ID (or number)." (nnspool-possibly-change-directory newsgroup) ! (let ((file (if (stringp id) ! (nnspool-find-article-by-message-id id) ! (concat nnspool-current-directory (prin1-to-string id)))) ! (nntp-server-buffer (or buffer nntp-server-buffer))) ! (if (and (stringp file) ! (file-exists-p file) ! (not (file-directory-p file))) ! (save-excursion ! (nnspool-find-file file))))) ! (defun nnspool-request-body (id &optional newsgroup server) "Select article body by message ID (or number)." (nnspool-possibly-change-directory newsgroup) --- 195,214 ---- (defun nnspool-request-article (id &optional newsgroup server buffer) "Select article by message ID (or number)." (nnspool-possibly-change-directory newsgroup) ! (let* ((group (if (stringp id) ! (nnspool-find-article-by-message-id id) ! nnspool-current-group)) ! (file (and group (nnspool-article-pathname group id))) ! (nntp-server-buffer (or buffer nntp-server-buffer))) ! (and file ! (file-exists-p file) ! (not (file-directory-p file)) ! (save-excursion (nnspool-find-file file)) ! ;; We return the article number. ! (if (numberp id) ! (cons newsgroup id) ! (cons group id))))) ! (defun nnspool-request-body (id &optional newsgroup server) "Select article body by message ID (or number)." (nnspool-possibly-change-directory newsgroup) *************** *** 226,233 **** (defun nnspool-request-group (group &optional server dont-check) "Select news GROUP." ! (let ((pathname (nnspool-article-pathname ! (nnspool-replace-chars-in-string group ?. ?/))) dir) (if (not (file-directory-p pathname)) (progn --- 233,239 ---- (defun nnspool-request-group (group &optional server dont-check) "Select news GROUP." ! (let ((pathname (nnspool-article-pathname group)) dir) (if (not (file-directory-p pathname)) (progn *************** *** 320,335 **** (save-excursion (let* ((process-connection-type nil) ; t bugs out on Solaris (inews-buffer (generate-new-buffer " *nnspool post*")) ! (proc (apply 'start-process "*nnspool inews*" inews-buffer ! nnspool-inews-program nnspool-inews-switches))) ! (set-process-sentinel proc 'nnspool-inews-sentinel) ! (process-send-region proc (point-min) (point-max)) ! ;; We slap a condition-case around this, because the process may ! ;; have exited already... ! (condition-case nil ! (process-send-eof proc) ! (error nil)) ! t))) (defun nnspool-inews-sentinel (proc status) (save-excursion --- 326,350 ---- (save-excursion (let* ((process-connection-type nil) ; t bugs out on Solaris (inews-buffer (generate-new-buffer " *nnspool post*")) ! (proc ! (condition-case err ! (apply 'start-process "*nnspool inews*" inews-buffer ! nnspool-inews-program nnspool-inews-switches) ! (error ! (setq nnspool-status-string (format "inews error: %S" err)) ! nil)))) ! (if (not proc) ! ;; The inews program failed. ! () ! (setq nnspool-status-string "") ! (set-process-sentinel proc 'nnspool-inews-sentinel) ! (process-send-region proc (point-min) (point-max)) ! ;; We slap a condition-case around this, because the process may ! ;; have exited already... ! (condition-case nil ! (process-send-eof proc) ! (error nil)) ! t)))) (defun nnspool-inews-sentinel (proc status) (save-excursion *************** *** 338,405 **** (if (or (zerop (buffer-size)) (search-forward "spooled" nil t)) (kill-buffer (current-buffer)) ! ;; Make status message by unfolding lines. ! (subst-char-in-region (point-min) (point-max) ?\n ?\\ 'noundo) (setq nnspool-status-string (buffer-string)) (message "nnspool: %s" nnspool-status-string) ! ;(kill-buffer (current-buffer)) ! ))) (defalias 'nnspool-request-post-buffer 'nntp-request-post-buffer) ;;; Internal functions. ! (defun nnspool-retrieve-headers-with-nov (articles) (if (or gnus-nov-is-evil nnspool-nov-is-evil) nil (let ((nov (concat (file-name-as-directory nnspool-nov-directory) (nnspool-replace-chars-in-string nnspool-current-group ?. ?/) ! "/.overview")) ! article) ! (if (file-exists-p nov) ! (save-excursion ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (if nnspool-sift-nov-with-sed ! (nnspool-sift-nov-with-sed articles nov) ! (insert-file-contents nov) ! ;; First we find the first wanted line. We issue a number ! ;; of search-forwards - the first article we are lookign ! ;; for may be expired, so we have to go on searching until ! ;; we find one of the articles we want. ! (while (and articles ! (setq article (concat (int-to-string ! (car articles)) "\t")) ! (not (or (looking-at article) ! (search-forward (concat "\n" article) ! nil t)))) ! (setq articles (cdr articles))) ! (if (not articles) ! () ! (beginning-of-line) ! (delete-region (point-min) (point)) ! ;; Then we find the last wanted line. We go to the end ! ;; of the buffer and search backward much the same way ! ;; we did to find the first article. ! ;; !!! Perhaps it would be better just to do a (last articles), ! ;; and go forward successively over each line and ! ;; compare to avoid this (reverse), like this: ! ;; (while (and (>= last (read nntp-server-buffer))) ! ;; (zerop (forward-line 1)))) ! (setq articles (reverse articles)) ! (goto-char (point-max)) ! (while (and articles ! (not (search-backward ! (concat "\n" (int-to-string (car articles)) ! "\t") nil t))) ! (setq articles (cdr articles))) ! (if articles ! (progn ! (forward-line 2) ! (delete-region (point) (point-max))))) ! (or articles (progn (erase-buffer) nil)))))))) (defun nnspool-sift-nov-with-sed (articles file) (let ((first (car articles)) --- 353,428 ---- (if (or (zerop (buffer-size)) (search-forward "spooled" nil t)) (kill-buffer (current-buffer)) ! ;; Make status message by folding lines. ! (while (re-search-forward "[ \t\n]+" nil t) ! (replace-match " " t t)) (setq nnspool-status-string (buffer-string)) (message "nnspool: %s" nnspool-status-string) ! (ding) ! (run-hooks 'nnspool-rejected-article-hook)))) (defalias 'nnspool-request-post-buffer 'nntp-request-post-buffer) ;;; Internal functions. ! (defun nnspool-retrieve-headers-with-nov (articles &optional fetch-old) (if (or gnus-nov-is-evil nnspool-nov-is-evil) nil (let ((nov (concat (file-name-as-directory nnspool-nov-directory) (nnspool-replace-chars-in-string nnspool-current-group ?. ?/) ! "/.overview"))) ! (if (not (file-exists-p nov)) ! () ! (save-excursion ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (if nnspool-sift-nov-with-sed ! (nnspool-sift-nov-with-sed articles nov) ! (insert-file-contents nov) ! (if (and fetch-old ! (not (numberp fetch-old))) ! t ; We want all the headers. ! ;; First we find the first wanted line. ! (nnspool-find-nov-line ! (if fetch-old (max 1 (- (car articles) fetch-old)) ! (car articles))) ! (delete-region (point-min) (point)) ! ;; Then we find the last wanted line. ! (if (nnspool-find-nov-line ! (progn (while (cdr articles) (setq articles (cdr articles))) ! (car articles))) ! (forward-line 1)) ! (delete-region (point) (point-max)) ! ;; If the buffer is empty, this wasn't very successful. ! (not (zerop (buffer-size)))))))))) ! ! (defun nnspool-find-nov-line (article) ! (let ((max (point-max)) ! (min (goto-char (point-min))) ! (cur (current-buffer)) ! (prev (point-min)) ! num found) ! (if (or (eobp) ! (>= (read cur) article)) ! (beginning-of-line) ! (while (not found) ! (goto-char (/ (+ max min) 2)) ! (forward-line 1) ! (if (or (= (point) prev) ! (eobp)) ! (setq found t) ! (setq prev (point)) ! (cond ((> (setq num (read cur)) article) ! (setq max (point))) ! ((< num article) ! (setq min (point))) ! (t ! (setq found t)))) ! (beginning-of-line)) ! (or (not num) (= num article))))) ! (defun nnspool-sift-nov-with-sed (articles file) (let ((first (car articles)) *************** *** 411,429 **** file))) ;; Fixed by fdc@cliwe.ping.de (Frank D. Cringle). (defun nnspool-find-article-by-message-id (id) - "Return full pathname of an article identified by message-ID." (save-excursion ! (let ((buf (get-buffer-create " *nnspool work*"))) ! (set-buffer buf) ! (erase-buffer) ! (call-process "grep" nil t nil id nnspool-history-file) ! (goto-char (point-min)) ! (if (looking-at "<[^>]+>[ \t]+[-0-9~]+[ \t]+\\([^ \t\n]*\\)") ! (concat nnspool-spool-directory ! (nnspool-replace-chars-in-string ! (buffer-substring (match-beginning 1) (match-end 1)) ! ?. ?/)))))) (defun nnspool-find-file (file) "Insert FILE in server buffer safely." --- 434,451 ---- file))) ;; Fixed by fdc@cliwe.ping.de (Frank D. Cringle). + ;; Find out what group an article identified by a Message-ID is in. (defun nnspool-find-article-by-message-id (id) (save-excursion ! (set-buffer (get-buffer-create " *nnspool work*")) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (call-process "grep" nil t nil id nnspool-history-file) ! (goto-char (point-min)) ! (prog1 ! (if (looking-at "<[^>]+>[ \t]+[-0-9~]+[ \t]+\\([^ \t\n]*\\)") ! (buffer-substring (match-beginning 1) (match-end 1))) ! (kill-buffer (current-buffer))))) (defun nnspool-find-file (file) "Insert FILE in server buffer safely." *************** *** 435,442 **** (defun nnspool-possibly-change-directory (newsgroup) (if newsgroup ! (let ((pathname (nnspool-article-pathname ! (nnspool-replace-chars-in-string newsgroup ?. ?/)))) (if (file-directory-p pathname) (progn (setq nnspool-current-directory pathname) --- 457,463 ---- (defun nnspool-possibly-change-directory (newsgroup) (if newsgroup ! (let ((pathname (nnspool-article-pathname newsgroup))) (if (file-directory-p pathname) (progn (setq nnspool-current-directory pathname) *************** *** 446,454 **** nil)) t)) ! (defun nnspool-article-pathname (group) ! "Make pathname for GROUP." ! (concat (file-name-as-directory nnspool-spool-directory) group "/")) (defun nnspool-replace-chars-in-string (string from to) "Replace characters in STRING from FROM to TO." --- 467,479 ---- nil)) t)) ! (defun nnspool-article-pathname (group &optional article) ! "Find the path for GROUP." ! (concat ! (file-name-as-directory nnspool-spool-directory) ! (nnspool-replace-chars-in-string group ?. ?/) ! "/" ! (if article (int-to-string article) ""))) (defun nnspool-replace-chars-in-string (string from to) "Replace characters in STRING from FROM to TO." *** pub/sgnus/lisp/nntp.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nntp.el Wed Sep 20 01:28:56 1995 *************** *** 140,145 **** --- 140,147 ---- (defvar nntp-async-number 5 "*How many articles should be prefetched when in asynchronous mode.") + (defvar nntp-warn-about-losing-connection t + "*If non-nil, beep when a server closes connection.") *************** *** 204,210 **** ;;; Interface functions. ! (defun nntp-retrieve-headers (sequence &optional newsgroup server) "Retrieve the headers to the articles in SEQUENCE." (nntp-possibly-change-server newsgroup server) (save-excursion --- 206,212 ---- ;;; Interface functions. ! (defun nntp-retrieve-headers (sequence &optional newsgroup server fetch-old) "Retrieve the headers to the articles in SEQUENCE." (nntp-possibly-change-server newsgroup server) (save-excursion *************** *** 212,218 **** (erase-buffer) (if (and (not gnus-nov-is-evil) (not nntp-nov-is-evil) ! (nntp-retrieve-headers-with-xover sequence)) 'nov (let ((number (length sequence)) (count 0) --- 214,220 ---- (erase-buffer) (if (and (not gnus-nov-is-evil) (not nntp-nov-is-evil) ! (nntp-retrieve-headers-with-xover sequence fetch-old)) 'nov (let ((number (length sequence)) (count 0) *************** *** 458,473 **** (nntp-async-fetch-articles id))))))) (if found ! t ;; The article was not in the async buffer, so we fetch it now. (unwind-protect (progn (if buffer (set-process-buffer nntp-server-process buffer)) (let ((nntp-server-buffer (or buffer nntp-server-buffer)) (art (or (and (numberp id) (int-to-string id)) id))) - ;; If NEmacs, end of message may look like: "\256\215" (".^M") (prog1 ! (nntp-send-command "^\\.\r?\n" "ARTICLE" art) (nntp-decode-text) (and nntp-async-articles (nntp-async-fetch-articles id))))) (if buffer (set-process-buffer --- 460,478 ---- (nntp-async-fetch-articles id))))))) (if found ! id ;; The article was not in the async buffer, so we fetch it now. (unwind-protect (progn (if buffer (set-process-buffer nntp-server-process buffer)) (let ((nntp-server-buffer (or buffer nntp-server-buffer)) (art (or (and (numberp id) (int-to-string id)) id))) (prog1 ! (and (nntp-send-command "^\\.\r?\n" "ARTICLE" art) ! (if (numberp id) ! (cons nntp-current-group id) ! ;; We find out what the article number was. ! (nntp-find-group-and-number))) (nntp-decode-text) (and nntp-async-articles (nntp-async-fetch-articles id))))) (if buffer (set-process-buffer *************** *** 486,493 **** "Request head of article ID (message-id or number)." (nntp-possibly-change-server newsgroup server) (prog1 ! (nntp-send-command ! "^\\.\r?\n" "HEAD" (or (and (numberp id) (int-to-string id)) id)) (nntp-decode-text))) (defun nntp-request-stat (id &optional newsgroup server) --- 491,501 ---- "Request head of article ID (message-id or number)." (nntp-possibly-change-server newsgroup server) (prog1 ! (and (nntp-send-command ! "^\\.\r?\n" "HEAD" (if (numberp id) (int-to-string id) id)) ! (if (numberp id) id ! ;; We find out what the article number was. ! (nntp-find-group-and-number))) (nntp-decode-text))) (defun nntp-request-stat (id &optional newsgroup server) *************** *** 722,727 **** --- 730,736 ---- (setq servers (cdr servers))) (setq server (car (car servers)))) (and server + nntp-warn-about-losing-connection (progn (message "nntp: Connection closed to server %s" server) (ding))))) *************** *** 875,881 **** ;;; Low-Level Interface to NNTP Server. ;;; ! (defun nntp-retrieve-headers-with-xover (sequence) (erase-buffer) (cond --- 884,925 ---- ;;; Low-Level Interface to NNTP Server. ;;; ! (defun nntp-find-group-and-number () ! (save-excursion ! (save-restriction ! (set-buffer nntp-server-buffer) ! (narrow-to-region (goto-char (point-min)) ! (or (search-forward "\n\n" nil t) (point-max))) ! (goto-char (point-min)) ! ;; We first find the number by looking at the status line. ! (let ((number (and (looking-at "2[0-9][0-9] +\\([0-9]+\\) ") ! (int-to-string ! (buffer-substring (match-beginning 0) ! (match-end 0))))) ! group newsgroups xref) ! ;; Then we find the group name. ! (setq group ! (cond ! ;; If there is only one group in the Newsgroups header, ! ;; then it seems quite likely that this article comes ! ;; from that group, I'd say. ! ((and (setq newsgroups (mail-fetch-field "newsgroups")) ! (not (string-match "," newsgroups))) ! newsgroups) ! ;; If there is more than one group in the Newsgroups ! ;; header, then the Xref header should be filled out. ! ;; We hazard a guess that the group that has this ! ;; article number in the Xref header is the one we are ! ;; looking for. This might very well be wrong if this ! ;; article happens to have the same number in several ! ;; groups, but that's life. ! ((and (setq xref (mail-fetch-field "xref")) ! (string-match (format "\\([^ :]+\\):%d" number) xref)) ! (substring xref (match-beginning 1) (match-end 1))) ! (t ""))) ! (cons group number))))) ! ! (defun nntp-retrieve-headers-with-xover (sequence &optional fetch-old) (erase-buffer) (cond *************** *** 884,892 **** nil) ;; We don't care about gaps. ! ((not nntp-nov-gap) (nntp-send-xover-command ! (car sequence) (nntp-last-element sequence) 'wait) (goto-char (point-min)) (if (looking-at "[1-5][0-9][0-9] ") --- 928,942 ---- nil) ;; We don't care about gaps. ! ((or (not nntp-nov-gap) ! fetch-old) (nntp-send-xover-command ! (if fetch-old ! (if (numberp fetch-old) ! (max 1 (- (car sequence) fetch-old)) ! 1) ! (car sequence)) ! (nntp-last-element sequence) 'wait) (goto-char (point-min)) (if (looking-at "[1-5][0-9][0-9] ") *** pub/sgnus/lisp/nnvirtual.el Sat Sep 16 09:56:07 1995 --- sgnus/lisp/nnvirtual.el Wed Sep 20 18:49:49 1995 *************** *** 51,57 **** ;;; Interface functions. ! (defun nnvirtual-retrieve-headers (sequence &optional newsgroup server) "Retrieve the headers for the articles in SEQUENCE." (nnvirtual-possibly-change-newsgroups newsgroup server t) (save-excursion --- 51,57 ---- ;;; Interface functions. ! (defun nnvirtual-retrieve-headers (sequence &optional newsgroup server fetch-old) "Retrieve the headers for the articles in SEQUENCE." (nnvirtual-possibly-change-newsgroups newsgroup server t) (save-excursion *** pub/sgnus/lisp/ChangeLog Sat Sep 16 09:56:12 1995 --- sgnus/lisp/ChangeLog Wed Sep 20 23:20:49 1995 *************** *** 1,2926 **** ! Sat Sep 16 06:44:33 1995 Lars Magne Ingebrigtsen ! * gnus.el (gnus-group-make-group): Be able to create native ! groups. ! (gnus-group-set-info): Create native groups. ! * gnus-msg.el (gnus-post-news): Just use Cc to do the ! `gnus-auto-mail-to-author'. ! * gnus-uu.el (gnus-uu-grab-articles): Widen the article buffer. ! * gnus.el (gnus-group-get-new-news): Check more groups. ! (gnus-score-find-bnews): "nntp+" score files were not recognized. ! (gnus-summary-search-subject): Unhide thread. ! * nneething.el (nneething-retrieve-headers): Didn't work over ! ange-ftp. ! * gnus.el (gnus-group-read-only-p): New function. ! (gnus-summary-edit-article): Take a prefix argument to force. ! (gnus-summary-edit-article-done): Warn when editing in a read-only ! group. ! Fri Sep 15 15:42:28 1995 Per Abrahamsen ! * nntp.el (nntp-request-post-buffer): Did the opposite of what the ! user wanted w.r.t. (eq respect-poster 'ask). ! Sat Sep 16 06:28:35 1995 Lars Magne Ingebrigtsen ! * gnus-msg.el (gnus-inews-article): Bind the newsgroup name by ! looking at the Newsgroups line. ! * gnus-cache.el (gnus-cache-possibly-enter-article): Don't bug out ! so much on malformed lines. ! ! * gnus-uu.el (gnus-uu-save-article): Didn't make buffer ! non-read-only. ! ! Fri Sep 15 11:09:52 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 5.0.3 is released. ! ! * gnus.el (gnus-summary-catchup): Would make all dormants read. ! ! * gnus-msg.el (gnus-article-mail-with-original): Removed function. ! ! Wed Sep 13 17:50:12 1995 Per Abrahamsen ! ! * custom.el (custom-type-properties): List with uninitialized ! fields are valid (required for `gnus-score-customize' to work). ! ! Fri Sep 15 09:31:21 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-catchup-all): Wrong interactive spec. ! (gnus-select-method): Would sometimes set select method with a ! bogus service value. ! ! Thu Sep 14 06:07:37 1995 Lars Magne Ingebrigtsen ! ! * nnmail.el (nnmail-request-post-buffer): Would bug out under ! XEmacs. ! ! Thu Sep 14 06:04:52 1995 Lars Magne Ingebrigtsen ! ! * gnus-ems.el (gnus-set-text-properties-xemacs): Wrong definition. ! ! Thu Sep 14 03:44:27 1995 Lars Magne Ingebrigtsen ! ! * gnus-msg.el (gnus-inews-user-name): Check for too-verbose ! user-mail-address variables. ! ! Wed Sep 13 05:38:21 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 5.0.2 is released. ! ! * nntp.el (nntp-async-fetch-articles): Wouldn't allow entry into ! groups. ! ! Tue Sep 12 17:02:03 1995 Per Abrahamsen ! ! * nnmail.el (nnmail-request-post-buffer): Don't CC the address in ! the To field. ! ! Tue Sep 12 06:11:12 1995 Lars Magne Ingebrigtsen ! ! * gnus-ems.el: Use the new definition of `set-text-properties'. ! ! Tue Sep 12 05:28:03 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 5.0.1 is released. ! ! Tue Sep 12 13:53:48 1995 Scott Byer ! ! * nnfolder.el (nnfolder-active-number) Save away the active file ! after bumping the highest active number. ! ! Sun Sep 10 00:39:41 1995 Lars Ingebrigtsen ! ! * gnus-msg.el (gnus-post-news): Set the name of the newsgroup for ! later use. ! ! * gnus.el (gnus-group-unsubscribe-group): Don't accept empty group ! names. ! ! * nnbabyl.el (nnbabyl-get-new-mail): If moving is unsuccessful, ! don't pretend it went ok. ! * nnmbox.el (nnmbox-get-new-mail): Ditto. ! * nnfolder.el (nnfolder-get-new-mail): Ditto. ! * nnmh.el (nnmh-get-new-mail): Ditto. ! * nnml.el (nnml-get-new-mail): Ditto. ! ! * gnus-vis.el (gnus-group-menu-hook, gnus-summary-menu-hook, ! gnus-article-menu-hook, gnus-server-menu-hook, ! gnus-browse-menu-hook): New hooks. ! ! Fri Sep 8 19:08:29 1995 Per Abrahamsen ! ! * nnmail.el (nnmail-request-post-buffer): Newer send to `sender', ! don't put everything in the `To' header, filter the `CC' header ! through `rmail-dont-reply-to'. ! ! Fri Sep 8 20:42:27 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-group-make-archive-group): Wrong interactive spec. ! (gnus-select-method): Take `gnus-nntp-service' into account for ! backwards compatability. ! ! Thu Sep 7 22:17:33 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-setup-news): Find new groups before finding ! numbers of unread articles in the groups. ! ! * gnus-score.el (gnus-summary-score-entry): Fuzzy wrong match ! value. ! ! * gnus.el ('gnus-load-hook): Run this hook while loading. ! ! * gnus-vis.el (gnus-summary-make-menu-bar): Would re-generate the ! summary buffers on each group entry. ! ! * gnus-score.el (gnus-score-save): Don't try to write a score file ! unless one can. ! ! Wed Sep 6 20:38:43 1995 Per Abrahamsen ! ! * gnus-cite.el (gnus-cite-parse-max-size): New variable. ! (gnus-cite-parse-maybe): Use it. ! (gnus-cite-parse): Move parser initialization to ! `gnus-cite-parse-maybe' and reformat. ! * gnus-vis.el (gnus-article-add-buttons): Force citation parsing ! if called interactively. ! * gnus-cite.el (gnus-article-highlight-citation): Ditto. ! (gnus-article-hide-citation): Ditto. ! (gnus-article-hide-citation-maybe): Ditto. ! (gnus-article-highlight): Ditto. ! (gnus-article-highlight-some): Ditto. ! (gnus-article-hide): Ditto. ! ! Thu Sep 7 00:52:36 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-summary-show-thread): Expand hidden subthreads as ! well. ! ! Wed Sep 6 20:38:43 1995 Per Abrahamsen ! ! * gnus-msg.el (gnus-use-followup-to): New value `ask' will make ! Gnus always ask before obeying the followup-to header. Changed ! default to t to confirm with the Seal. ! (gnus-summary-followup): Support `ask' value of ! `gnus-use-followup-to'. ! * nntp.el (nntp-request-post-buffer): Support `ask' value of ! `gnus-use-followup-to'. ! * gnus.texi (Post): Document `ask' value of ! `gnus-use-followup-to'. ! ! Thu Sep 7 00:20:44 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-select-newsgroup): Checked the server twice. ! (gnus-select-newsgroup): Wouldn't respond properly to unwell ! groups. ! ! Wed Sep 6 00:11:00 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-read-old-newsrc-el-file): Didn't parse options ! lines from the .el file. ! (gnus-summary-prepare-threads): When using empty make-false-root, ! and the subject changed, that wouldn't be reflected in the summary ! buffer. ! ! * nnfolder.el (nnfolder-read-folder): Make absofuckinutely sure ! that active numbers never, ever decrease. ! ! * nnbabyl.el (nnbabyl-request-expire-articles): Remove all text ! props. ! (nnbabyl-read-mbox): If an rmail buffer is in rmail mode, make it ! ordinary. ! ! * gnus.el (gnus-summary-kill-thread): Did not kill hidden ! threads. ! ! * gnus-uu.el (gnus-uu-save-article): Didn't remove text props. ! ! * gnus.el (gnus-group-make-articles-read): Would not do ! crosspostings in one obscure instance. ! (gnus-summary-update-mark): Would compute score-markedness even ! when setting the process mark. ! ! Tue Sep 5 21:50:33 1995 Lars Ingebrigtsen ! ! * gnus-msg.el (gnus-inews-news): Would choke on trailing ! commands. Also used `replace-regexp'. ! (gnus-inews-news): Would, for some reason, fold all lines ! sometimes. ! ! * gnus-ems.el: Force our definition of `set-text-properties'. So ! there! ! ! * gnus.el (gnus-summary-sort-by-subject): Sorted oddly for (1/2) ! stuff. ! (gnus-request-body): Had gone missing for some reason. ! (gnus-group-exit): Would quit out of an empty group buffer without ! confirmation. ! ! Mon Sep 4 00:44:38 1995 Per Abrahamsen ! ! * custom.el (custom-field-face): Check that the face is defined. ! (custom-face-tag): New function. ! (custom-group-accept): Use it. ! (custom-group-insert): Ditto. ! (custom-type-properties): Give `face->other' a default value. ! (custom-facep): New function. ! (custom-face-lookup): Use it. ! ! Sun Sep 3 19:36:29 1995 Per Abrahamsen ! ! * custom.el (custom-local-type-properties): Added extra line of ! documentation. ! (custom-valid, custom-const-valid): Changed legal to valid in doc ! string. ! (custom-match): More documentation. ! (custom-field-update): Doc. clarification. ! (custom-field-accept): Ditto. ! (custom-type-properties): More documentation. ! ! Fri Sep 1 15:39:56 1995 Per Abrahamsen ! ! * custom.el (menu-bar): Added XEmacs and Emacs 19.28 support. ! ! Fri Sep 1 15:39:56 1995 Per Abrahamsen ! ! * custom.el (plist-put): Fixed bogus definition. ! ! Thu Aug 31 15:21:23 1995 Per Abrahamsen ! ! * gnus-cus.el: Removed dead code. ! ! Thu Aug 31 10:45:26 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 5.0 is released. ! ! * gnus-cus.el (gnus-face-dark-name-list): Use dark blue instead of ! sky blue. ! ! * gnus.el: Don't read the .gnus file on load, anyway. ! ! Wed Aug 30 17:56:34 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.28 is released. ! ! * custom.el ((string-match "XEmacs" emacs-version)): Would barf if ! the menu-bar wasn't in use. ! ! Wed Aug 30 08:46:48 1995 Lars Magne Ingebrigtsen ! ! * gnus.el ('(gnus-read-init-file 'inhibit)): Don't load while ! compiling. ! (gnus-summary-next-article): Would not go to the next group when ! all articles were canceled. ! (gnus-summary-prepare): Create the hashtb before running the ! prepare hook. ! ! * gnus.el: Renamed all `header-' macros `mail-header-'. Ran ! `indent-sexp' on all functions in all files. ! ! * nnbabyl.el (nnbabyl-read-mbox): Would doubly insert RMAIL file ! sometimes. ! ! * gnus-ems.el (appt-select-lowest-window): Not defined in XEmacs. ! ! * gnus-score.el (gnus-summary-header): Would bug out if there were ! pseudo-articles in the buffer. ! ! Wed Aug 30 06:08:13 1995 Lars Magne Ingebrigtsen ! ! * gnus-score.el (gnus-score-find-trace): Didn't kill "*Gnus ! Scores*" buffer on exit. ! ! Tue Aug 29 17:21:37 1995 Lars Magne Ingebrigtsen ! ! * gnus-msg.el (gnus-mail-reply-using-mail): Set auto-save-mode if ! that is wanted. ! ! * gnus-ems.el (gnus-rebuild-thread-xemacs): Bugged out near the ! end of buffers. ! ! * gnus.el (gnus-summary-read-group): Force a summary config. ! ! Tue Aug 29 05:55:19 1995 Lars Magne Ingebrigtsen ! ! * nntp.el: Do some pussy-footing around `accept-process-output'. ! ! Tue Aug 29 05:55:19 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.27 is released. ! ! * gnus-msg.el (gnus-delete-supersedes-headers): Delete ! Supersedes. ! ! * gnus-score.el (gnus-score-adaptive): Did not like matches on ! numbers or dates. ! ! * gnus.el (gnus-server-kill-server): Did not mark the dribble ! buffer as changed. ! ! * gnus-score.el (gnus-score-string): Did not do traces on fuzzy ! scores. ! ! * gnus.el (gnus-read-init-file): Run on load. ! ! * gnus-cus.el (gnus-face-dark-name-list): Dark salmon isn't very ! dark. ! ! * gnus-msg.el (gnus-inews-insert-headers): Don't insert multiple ! Original-Sender headers. ! ! * gnus-vis.el (gnus-group-make-menu-bar): New submenu for editing ! groups. ! ! * gnus-msg.el (gnus-removable-headers): New variable. ! (gnus-inews-remove-headers): Use it. ! ! Mon Aug 28 17:19:41 1995 Per Abrahamsen ! ! * custom.el (custom-help-button): Add `custom-jump' property. ! (custom-forward-field): Ignore fields with `custom-jump' property. ! ! Mon Aug 28 13:59:04 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-newsrc-to-gnus-format): Would totally barf on ! illegal group names. ! ! Mon Aug 28 05:09:47 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.26 is released. ! ! * nntp.el (nntp-send-region-to-server): Would hang. ! ! * nnmail.el (nnmail-delete-incoming): Doc fix. ! ! * gnus.el (rmail-default-file, rmail-default-rmail-file): Don't ! init these variables. ! ! Mon Aug 28 05:09:47 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.25 is released. ! ! * gnus-vis.el (gnus-summary-make-menu-bar): Date menu was odd. ! ! * custom.el: Choked under non-X Emacs. ! ! Sun Aug 27 05:05:05 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.24 is released. ! ! * nnvirtual.el (nnvirtual-create-mapping): Numbering ! irregularities - would be off by 1 for each of some component ! groups. ! ! * custom.el: make-face does not exist on non-X Emacsen. ! ! * gnus-vm.el (gnus-vm-make-folder): Removed the removal of the ! toolbar since that led to other problems later. ! ! * gnus-msg.el (gnus-inews-news): Don't insert Message-ID on BCC if ! that's not required. ! ! * gnus-msg.el: Autoload gnus-uu-post-news. ! ! Sat Aug 26 03:18:39 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.23 is released. ! ! * gnus-uu.el (gnus-uu-grab-articles): Didn't update mode line. ! ! * gnus.el (gnus-replace-chars-in-string): Translate pairs. ! ! Sat Aug 26 02:54:16 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-next-article): `n' `SPC' etc in XEmacs ! didn't work. ! ! Sat Aug 26 00:07:59 1995 Lars Magne Ingebrigtsen ! ! * nntp.el (nntp-open-server): Would try to reconnect to the same ! dead server. ! ! * gnus.el (gnus-group-insert-group-line): Didn't insert process ! marks. ! (gnus-read-active-file): Would screw up the group info if a ! secondary server was down. ! ! * gnus-vm.el (gnus-vm-make-folder): Don't use toolbar. ! ! * nnfolder.el (nnfolder-save-mail): Would delete one \n too much. ! ! * gnus.el (gnus-start-news-server): Give better error message. ! ! * nntp.el (nntp-open-server-semi-internal): Save the error message ! on unsuccessful connects. ! ! * nnfolder.el (nnfolder-request-move-article): Deleted wrong ! article marker. ! (nnfolder-request-accept-article): Ditto. ! ! * gnus.el (gnus-summary-refer-article): Would bug out if the ! article buffer didn't exist. ! ! * gnus-cache.el (gnus-cache-braid-nov): Would skip every other ! line. ! ! Fri Aug 25 23:22:07 1995 Lars Magne Ingebrigtsen ! ! * gnus-msg.el (gnus-inews-news): Would kill connection after ! posting to a foreign server. ! ! * gnus.el (gnus): Read init file before doing splash. ! ! Fri Aug 25 18:08:35 1995 Ulrik Dickow ! ! * gnus-msg.el (gnus-post-news): Treat `gnus-auto-mail-to-author' right. ! ! Fri Aug 25 15:04:37 1995 Per Abrahamsen ! ! * gnus-cus.el (gnus-custom-import-cite-face-list): Support old ! light and dark settings of `gnus-cite-face-list'. ! ! Fri Aug 25 06:03:51 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-modtime-botch): New variable. ! ! Fri Aug 25 05:44:07 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.20-22 is released. ! ! Fri Aug 25 02:57:19 1995 Lars Magne Ingebrigtsen ! ! * nndir.el (nndir-status-message): Wrong number of arguments. ! ! * gnus.el (gnus-summary-next-article): Woundn't go to the next ! group. ! (gnus-group-recent-archive-directory): New variable. ! (gnus-group-make-archive-group): Now makes both the recent and the ! full groups. ! ! * gnus-vis.el (gnus-easymenu): Require gnus-ems first. ! ! Fri Aug 25 01:13:52 1995 Lars Magne Ingebrigtsen ! ! * gnus-vis.el (gnus-highlight-selected-summary): Would underline ! wrong part of line without mouse-face. ! ! * gnus.el (gnus-summary-refer-article): Would mess up window ! config when not useing full windows. ! ! Fri Aug 25 00:22:14 1995 Per Abrahamsen ! ! * gnus-vis.el (gnus-group-make-menu-bar): Disable ! `gnus-score-customize' in XEmacs. ! ! * gnus-cus.el: Removed variables declared in `gnus-cus.el'. ! * gnus.el: Ditto. ! * gnus-cite.el: Ditto. ! ! Fri Aug 25 00:06:35 1995 Lars Magne Ingebrigtsen ! ! * custom.el: New version. ! ! * gnus.el (gnus-summary-fetch-faq): Would bug out. ! ! Thu Aug 24 23:54:13 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-apply-kill-hook): Doc fix. ! ! Thu Aug 24 16:25:17 1995 Ulrik Dickow ! ! * gnus-msg.el (gnus-post-news): Respect Reply-To when handling ! `gnus-auto-mail-to-author'. ! ! Thu Aug 24 01:41:33 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-end-of-article): Recenter at -3. ! ! * gnus-vis.el (gnus-summary-make-menu-bar): Commented out score ! thingies. ! ! * gnus.el (gnus-summary-best-unread-article): Would not find the ! best unread. ! (gnus-article-display-x-face): Did not work if x-face-too-ugly was ! nil. ! ! * gnus-vis.el (gnus-article-highlight-headers): Would infloop with ! 19.28. ! ! Thu Aug 24 01:41:33 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.19 is released. ! ! * gnus.el (gnus-group-faq-directory): Changed the default to point ! to aol. ! (gnus-newsrc-to-gnus-format): Would bug out when there were bogus ! groups in the .newsrc file. ! ! * gnus-ems.el: Don't bug out if x-get-resource isn't defined under ! XEmacs. ! ! * gnus.el (gnus-ask-server-for-new-groups): Would sometimes ! iterate over obarray instead of hashtb. ! (gnus-summary-next-article): Would give wrong message when going ! to canceled articles and gnus-auto-select-same was non-nil. ! ! Wed Aug 23 22:39:03 1995 Per Abrahamsen ! ! * custom.el (custom-save): New variable. ! (custom-save-and-exit): New function. ! (custom-buffer-create): Document it. ! (custom-mode-map): Bind it. ! (custom-buffer-create): New optional argument `SAVE' to overwrite ! `custom-save'. ! * gnus-edit.el (gnus-score-customize): Use new argument. ! ! Wed Aug 23 22:39:03 1995 Per Abrahamsen ! ! * custom.el (custom-mode): Insert appropiate check in hook if ! `make-local-hook' doesn't exists. ! (custom-post-command): Remove check for mode here. ! ! Wed Aug 23 22:03:50 1995 Per Abrahamsen ! ! * custom.el (custom-factory-reset-all): Removed dead code. ! (custom-field-factory-reset): Removed dead code. ! (custom-default-factory-reset): Didn't import the default value. ! (custom-save): Didn't import the default value. ! ! Wed Aug 23 01:41:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-ask-server-for-new-groups): Might not ignore bogus ! groups. ! ! * gnus-score.el (gnus-score-insert-help): `I??' would bug out. ! ! * gnus.el (gnus-article-display-x-face): Reverse logic a bit. ! (gnus): Do the startup message earlier. ! (gnus-group-list-groups): Void variable. ! (gnus-summary-raise-thread): Increase by (- 1 arg). ! ! * nnbabyl.el (nnbabyl-read-mbox): Would create extra dummy ! articles. ! ! Wed Aug 23 00:49:17 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-next-article): `SPC' `n' didn't work under ! XEmacs. ! ! Tue Aug 22 22:20:06 1995 Per Abrahamsen ! ! * custom.el (custom-default): Add support for calculated ! defaults values. ! * gnus-cus.el: Use it. ! ! Tue Aug 22 21:05:42 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.18 is released. ! ! Tue Aug 22 22:20:06 1995 Per Abrahamsen ! ! * custom.el (custom-forward-field): Allow negative args. ! (custom-backward-field): New function. ! (custom-mode-map): Bind it. ! (custom-buffer-create): Document it. ! ! Tue Aug 22 21:05:42 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-gnus-to-newsrc-format): Clear modtime. ! (gnus-offer-save-summaries): Don't prompt for any summary buffers ! that aren't Gnus summary buffers. ! (gnus-setup-news): Would bug out when started with ! `gnus-no-server'. ! (gnus-get-unread-articles): Would always connect to the server. ! (gnus-groups-to-gnus-format): Really find out whether the server ! is native or not. ! (gnus-article-hide-headers): Would never hide "From " lines. ! ! * gnus-msg.el (gnus-bug): Put point on Subject line. ! ! * gnus-ems.el: Would set invisible props to nil in 19.28. ! ! * gnus.el (gnus-summary-fetch-faq): Use `gnus-group-fetch-faq'. ! ! Tue Aug 22 15:16:15 1995 Per Abrahamsen ! ! * nnmail.el (nnmail-article-group): Protect call to ! `nnmail-split-methods' against errors. We don't wan't the user to ! lose mail if he made an error in `nnmail-split-methods'. ! ! Tue Aug 22 04:37:27 1995 Lars Magne Ingebrigtsen ! ! * gnus-vis.el (gnus-header-face-alist): SkyeBlue. ! ! * gnus.el (gnus-newsrc-to-gnus-format): Would later cause bugouts ! in a different function. ! ! Tue Aug 22 03:08:09 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-offer-save-summaries): Would bug out under XEmacs ! when there was no buffers to update. ! ! Tue Aug 22 02:31:52 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.17 is released. ! ! * gnus.el: Bugged out during 19.28 compilation. ! ! Mon Aug 21 20:47:08 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.16 is releaed. ! ! * gnus.el (gnus-group-list-groups): Didn't use default-list-level. ! ! * nntp.el (nntp-retrieve-groups): Did not delete error messages. ! ! * gnus.el (gnus-offer-save-summaries): Use `map-y-or-n-p'. ! (gnus-update-group-mark-positions): Bind "dummy.group" in the ! active hashtb. ! (gnus-gnus-to-newsrc-format): Avoid `set-visited-file-name'. ! (gnus-save-newsrc-file): Ditto. ! (gnus-window-top-edge): Renamed from `gnus-window-left-corner'. ! (gnus-remove-some-windows): Don't rely on `frame-height'. ! ! * nnmail.el (nnmail-move-inbox): Make sure the directory we move ! to exists. ! ! Sun Aug 20 16:04:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.15 is released. ! ! * gnus.el (gnus-ignored-newsgroups): Totally bogus value. ! ! * nnmail.el (nnmail-delete-incoming): NB! WILL NOW DELETE INCOMING ! FILES. NB! (damn that shift lock key) ! ! Sun Aug 20 16:04:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.14 is released. ! ! * gnus.el (gnus-summary-number-of-articles-in-thread): Include ! adopted articles in the count. ! (gnus-active-to-gnus-format): Would bug out on non-symbol stuff. ! (gnus-ignored-newsgroups): Reinstated regexp. ! ! * nnheader.el (nnheader-insert-file-contents-literally): Don't ! bind `file-name-handler-list' to nil. ! ! Sun Aug 20 01:04:45 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.13 is released. ! ! * gnus-ems.el (gnus-ems-redefine): One entry too many; XEmacs ! bugout. ! ! Sat Aug 19 22:41:22 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-article-treat-overstrike): Make overstrikes ! invisible instead of deleting them. ! (gnus-summary-mode-map): Changed the "M p" and "M s" keymaps. ! (gnus-update-active-hashtb-from-killed): New function. ! (gnus-setup-news): Use it. ! ! Sat Aug 19 22:03:14 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-window-left-corner): New function. ! * gnus-ems.el (gnus-window-left-corner-xemacs): Redefine it. ! ! * gnus-ems.el (gnus-rebuild-thread-xemacs): Would infloop. ! (gnus-highlight-selected-summary-xemacs): Did not work on the ! first line in a group. ! ! Sat Aug 19 16:37:58 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.12 is released. ! ! * nnbabyl.el (nnbabyl-read-mbox): Would create ghost articles. ! ! * gnus.el (gnus-summary-move-article): Would barf on respooling to ! (as-yet) non-existant groups. ! (gnus-summary-best-unread-article): Really go to the best article. ! (gnus-activate-group): Continue on non-available groups. ! ! * gnus-score.el (gnus-score-change-score-file): Prompt from dir, ! not cache. ! ! * nnfolder.el (nnfolder-read-folder): Ghost articles would be ! produced when there were more than 1 consecutive "From " line. ! ! * gnus.el (gnus-update-read-articles): Would display the wrong ! number of unread articles in the group buffer when updates have ! been done while the summary buffer was active. ! (gnus-summary-read-group): `O' old-fetched articles would be ! improperly inited. ! (gnus-ignored-newsgroups): Removed again. ! (gnus-active-to-gnus-format): Understand groups that have strange ! chars in the names. ! (gnus-select-newsgroup): Would ignore the first article from all ! backends that did not support NOV when using ! `gnus-fetch-old-headers'. ! (gnus-article-mode-map): Disabled all summary commands in the ! article buffer. ! (gnus-get-unread-articles): Make sure that the server connection ! is up. ! ! Sat Aug 19 16:07:59 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-group-catchup): Would bug out on `all' sometimes. ! ! Thu Aug 17 20:19:07 1995 Per Abrahamsen ! ! * gnus-cus.el: Added `gnus-summary-highlight'. ! ! Wed Aug 16 16:07:35 1995 Per Abrahamsen ! ! * custom.el: Added support for including values that needs to be ! evaluated in lists. ! ! Fri Aug 18 15:27:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-ignored-newsgroups): Start ignoring stuff again. ! (gnus-summary-show-article): Removed interpretation of prefix arg. ! ! Wed Aug 16 08:22:05 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-mark-same-subject): Update number mode ! line. ! ! Tue Aug 15 19:21:55 1995 Per Abrahamsen ! ! * custom.el: Allow all field to contain invalid data. Only parse ! field when point leaves it or when the value is needed, not ! after each change as previously. ! ! Wed Aug 16 08:11:24 1995 Lars Magne Ingebrigtsen ! ! * gnus-ems.el: Don't destroy the hidden props in 19.28. ! ! Tue Aug 15 09:03:11 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-offer-save-summaries): Allow ! and q as answers. ! (gnus-summary-mode-map): Defined date keys in the wrong map. ! ! * gnus-vis.el (gnus-button-url): Use w3 if it exists. ! ! Mon Aug 14 15:51:08 1995 Lars Magne Ingebrigtsen ! ! * gnus-vis.el (gnus-group-make-menu-bar): Removed "post" menu. ! ! Mon Aug 14 11:37:39 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-edit-article-done): Do the visual hook ! after returning to the summary buffer. ! ! * gnus-score.el (gnus-score-save): Ignore score files that can't ! be saved. ! ! Sun Aug 13 17:15:22 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.11 is released. ! ! * gnus.el (gnus-groups-to-gnus-format): Don't skip everything if a ! simple error occurs; just ignore the buggy line. ! ! * gnus-vis.el (gnus-netscape-start-url): Don't use shell-command. ! (gnus-button-alist): Didn't match mailto urls. ! ! * gnus.el (gnus-group-select-group-all): New command and menu-bar ! entry. ! ('gnus-article-display-hook): Do some article highlighting by ! default. ! ! * gnus-score.el (gnus-default-adaptive-score-alist): Changed to ! Jason's defaults. ! ! * gnus.el (gnus-summary-mode-map): Completele redesign of article ! wash map. ! (gnus-summary-caesar-message): Don't use recenter. ! ! Sat Aug 12 23:23:45 1995 Lars Magne Ingebrigtsen ! ! * gnus-vis.el (gnus-button-url): Changed default slightly. ! ! * gnus.el: Removed gnus-soup.el and nnsoup.el from distribution. ! ! Sat Aug 12 15:09:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.10 is released. ! ! * nnml.el (nnml-request-create-group): Would create new groups ! with 0 0 instead of 1 0. ! ! * gnus.el (gnus-newsgroup-saveable-name): New function. ! (gnus-score-file-name): Use it. ! (gnus-remove-some-windows): Would leave more space for the windows ! above. ! ! * gnus-msg.el (gnus-debug): Don't quote nil and t. ! ! * gnus.el (gnus-groups-to-gnus-format): Might lead to possible ! bugouts. ! (gnus-activate-foreign-newsgroups): Changed default to 5 from nil. ! ! * gnus-score.el (gnus-score-body): "all" didn't work. ! ! * gnus-uu.el (gnus-uu-save-files): Would bug out on non-existing ! files. ! ! * gnus.el (gnus-active-to-gnus-format): Didn't always set ! group-sym to nil. ! ! * gnus-vis.el (gnus-summary-make-menu-bar): Merge the two score ! menus. ! ! * nndoc.el (nndoc-type-to-regexp): Be more lenient in article end ! markers for digests. *Sigh*. ! ! * gnus.el (gnus-group-first-unread-group): Don't move if there is ! no urnead groups. ! ! Sat Aug 12 12:20:22 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-group-list-all-groups): Ignored the prefix arg. ! ! * gnus-score.el (gnus-score-string): Would loop forever on ! possibly-empty regexps. ! ! * gnus-uu.el (gnus-uu-choose-action): Bind case-fold-search to t. ! ! * gnus.el (gnus-summary-first-unread-article): Would not work with ! hidden threads. ! (gnus-setup-news): Update format specs here. ! (gnus-find-new-newsgroups): Really do ignore illegal groups. ! (gnus-group-kill-all-zombies): List groups at the right level. ! ! * nnbabyl.el (nnbabyl-read-mbox): Ensure forward progress. ! ! * gnus.el (gnus-summary-sort-by-author): Preserve subject order. ! (gnus-summary-sort-by-subject): Preserve author order. ! ! Sat Aug 12 11:38:32 1995 Lars Magne Ingebrigtsen ! ! * nneething.el (nneething-get-head): Don't use file-regular-p. ! ! * nndoc.el (nndoc-set-header-dependent-regexps): Don't use ! buffer-substring-no-props. ! ! * gnus-msg.el (gnus-inews-article): Unquoted hook. ! ! Fri Aug 11 11:11:26 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-remove-lines-marked-as-read): Remove ! canceled articles as well. ! (gnus-group-first-unread-group): Would bug out on un-activated ! groups. ! ! * nnmbox.el (nnmbox-get-new-mail): Did not delete incomings. ! ! Thu Aug 10 12:15:34 1995 Lars Magne Ingebrigtsen ! ! * nnkiboze.el (nnkiboze-enter-nov): Insert Xref: instead of Xref. ! ! Wed Aug 9 11:56:18 1995 Per Abrahamsen ! ! * custom.el (custom-field-accept): Protect call with a ! `inhibit-point-motion-hooks' around it. ! ! Wed Aug 9 13:57:55 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-read-active-file): Did not like virtual servers in ! secondary select methods. ! (gnus-secondary-method-p): More correct implementation. ! ! Tue Aug 8 16:44:41 1995 Per Abrahamsen ! ! * custom.el: Put initial defvars in an `eval-when-compile'. ! The `help' menu was renamed to `help-menu'. Adjust code. ! ! Tue Aug 8 14:49:30 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-mark-unread-as-read): Mark read-marked ! articles as read. Yup. ! ! * gnus-vis.el (gnus-button-url): Change default to use w3-fetch ! when no window system. ! ! * gnus.el (gnus-gnus-to-quick-newsrc-format): Add the gnus version ! to the .newsrc.eld file. ! ! * gnus-msg.el (gnus-inews-insert-headers): Don't delete original ! sender, just change it to "Original-Sender". ! ! Tue Aug 8 12:39:28 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.9 is released. ! ! * gnus.el (gnus-group-unsubscribe-group): Wouldn't let you sub to ! groups not in active. ! (gnus): Would barf on second startup. ! (gnus-select-newsgroup): Would refuse entry of non-activated ! dead groups. ! ! Tue Aug 8 09:58:27 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.8 is released. ! ! * gnus-ems.el (gnus-summary-insert-pseudos-xemacs): Would bug out ! on the end of the buffer. ! ! Tue Aug 8 07:22:17 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-group-list-groups): Did not properly respect ! permanent levels. ! ! * nnheader.el (nnheader-find-file-noselect): Didn't work on ! XEmacs. ! ! * gnus.el (gnus-group-get-new-news): Would do the wrong thing ! without permanent levels. ! (gnus-update-format-specifications): Did not update group mark ! pos. ! ! * nntp.el (nntp-retrieve-headers-with-xover): Did not remove nntp ! server gruft. ! ! * gnus-cache.el (gnus-cache-save-buffers): Did not write .overview ! file. ! ! Mon Aug 7 02:32:03 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.7 is released. ! ! * gnus.el (gnus-group-list-mode): New variable. ! (gnus-have-all-newsgroups): Obsolete variable. ! (gnus-group-list-groups): Use new variable. ! ! Sun Aug 6 06:34:37 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-group-check-bogus-groups): Would list all groups. ! ! Thu Jul 20 05:19:06 1995 Sudish Joseph ! ! * gnus-score.el (gnus-score-insert-help): Now displays help in ! shrink-wrapped window at bottom of frame with items aligned in ! columns. ! ! Sun Aug 6 02:25:31 1995 Lars Magne Ingebrigtsen ! ! * gnus-score.el (gnus-score-adaptive): Use fuzzy matches. ! ! * gnus-uu.el (gnus-uu-mark-thread): Move cursor. ! ! * nnvirtual.el (nnvirtual-retrieve-headers): Did not properly open ! methods. ! (nnvirtual-possibly-change-newsgroups): Would refuse to include ! component groups with similar names to itself. ! ! * nnmail.el (nnmail-activate): Did not set timestamp properly. ! ! * gnus.el (gnus-group-default-level): New function. ! (gnus-group-get-new-news): Use it. ! (gnus-group-list-groups): Ditto. ! (gnus-setup-news): Would not activate groups for `gnus-no-server'. ! ! Sat Aug 5 00:12:33 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.6 is released. ! ! * gnus.el (gnus-summary-next-article): Don't bug out on the end of ! the group buffer. ! ! * nnmail.el (nnmail-move-inbox): Use it. ! ! * gnus.el (gnus-summary-best-unread-article): Would go to articles ! below the default score before the articles with default score. ! ! * gnus-score.el (gnus-summary-increase-score): Only allow ! substring and regexp on body. ! ! * gnus.el (gnus-score-find-alist): Would produce recursive lists. ! (gnus-summary-mode-map): Changed mucho keys. ! ! * gnus-score.el (gnus-summary-header): Don't give errors when ! doing score-effect. ! ! * gnus.el (gnus-group-apropos): Ignore nil actives. ! (gnus-remove-some-windows): Would bug out. ! (gnus-update-group-mark-positions): New function. ! (gnus-group-mark-group): Follow the group line spec on process ! marks. ! ! * nndoc.el (nndoc-retrieve-headers): Did not do Lines right with ! digests that had a non-blank separator line. ! (nndoc-request-article): Did not do anything right with the above. ! (nndoc-set-header-dependent-regexps): Did not like more than a ! single space after Content-Type. ! ! Fri Aug 4 23:56:58 1995 Lars Magne Ingebrigtsen ! ! * nnfolder.el (nnfolder-request-group): Be sure to activate. ! ! Fri Aug 4 23:50:12 1995 Lars Magne Ingebrigtsen ! ! * gnus-ems.el (gnus-ems-redefine): XEmacs insertion of pseudos was ! buggy. ! ! Fri Aug 4 22:34:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-newsgroup-reads): New variable. Used throughout ! the file. ! ! Fri Aug 4 03:44:13 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.5 is released. (Hah!) ! ! * nnheader.el (nnheader-find-file-noselect): Did not work. ! ! Fri Aug 4 00:08:59 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.4 is released. ! ! * nnheader.el (nnheader-find-file-noselect): New function. ! * nnfolder.el (nnfolder-read-folder): Use it. ! * nnmbox.el (nnmbox-possibly-change-newsgroup): Ditto. ! ! * gnus-msg.el (gnus-inews-check-post): Use y-or-n instead of ! yes-or-no. ! ! * nntp.el (nntp-open-server): Didn't use port number when opening. ! ! * gnus.el (gnus): Set the name of the current startup file here. ! ! Thu Aug 3 22:15:06 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-remove-some-windows): Didn't delete all summary ! windows. ! ! * nntp.el (nntp-send-xover-command): Wait for reply. ! (nntp-retrieve-headers-with-xover): Would not do anything useful ! if nntp-nov-gap was nil. ! ! Thu Aug 3 21:48:51 1995 Lars Magne Ingebrigtsen ! ! * gnus-msg.el (gnus-debug): Don't quote non-lists. ! ! Wed Aug 2 15:08:10 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.3 is released. ! ! * gnus.el (gnus): Don't read the dribble file that early after ! all. ! (gnus-active-to-gnus-format): Set group to nil anyway. ! (gnus-find-new-newsgroups): Ignore null groups. ! ! * nnml.el (nnml-get-new-mail): Didn't activate before splitting. ! ! * gnus-msg.el (gnus-forward-using-post): Make sure we post, even ! if we are in a mail group. ! ! * gnus.el (gnus-summary-prepare-threads): Always removed dormant ! articles. ! (gnus-save-newsrc-file): Always save when you don't use the ! dribble file. ! (gnus-group-make-doc-group): Would respond with "%c" on errs. ! ! * gnus-msg.el (gnus-inews-check-post): Would bug out on long ! .sigs. ! ! * gnus.el (gnus): Would open two dribble buffers. ! (gnus-group-change-level): Refuse to subscribe to groups that are ! already subscribed. ! (gnus-active-to-gnus-format): Don't `set' bogus group symbols to ! nil - just ignore them. ! (gnus-summary-number-of-articles-in-thread): Gave the wrong answer ! on gathered articles. ! (gnus-select-newsgroup): Bind nntp-nov-gap to nil when building ! old threads. ! ! Wed Aug 2 14:13:16 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99.2 is released. ! ! * nnfolder.el (nnfolder-active-number): Did not work. ! ! Sun Jul 30 22:02:46 1995 Lars Magne Ingebrigtsen ! ! * 0.99.1 is released. ! ! * gnus-msg.el (gnus-debug): Remove null chars. ! ! * nnfolder.el (nnfolder-active-number): Would return t instead of ! the active number. ! ! Sun Jul 30 00:00:26 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.99 is released. ! ! * gnus.el (gnus-active-to-gnus-format): Ignore groups that have ! flags that are not y, n or m. ! (gnus-summary-expire-articles): Turn off the cache. ! (gnus-setup-news): Read the dribble file before everything. ! (gnus-dribble-eval-file): New function. ! ! * gnus-ems.el (gnus-make-overlay): Use some indirection. ! ! * gnus.el (gnus-make-threads): Would chop off threads that changed ! subject on re-generation. ! (gnus-make-threads-and-expunge): Ditto. ! ! * gnus-vis.el (gnus-button-alist): Match URLS with periods ! following. ! ! Sat Jul 29 21:31:15 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: Added &optional to all `(interactive "P")' functions. ! (gnus-summary-prepare-exit-hook): Changed name. ! (gnus-summary-exit-hook): New hook. ! ! * nnkiboze.el (nnkiboze-generate-group): Don't bug out on ! non-active groups. ! ! Sat Jul 29 19:40:51 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.98.6 is released. ! ! * gnus.el (gnus-get-unread-articles): Would doubly activate native ! groups. ! (gnus-summary-prepare-threads): Always removed dormant articles. ! (gnus-summary-show-all-dormant): Did not show dormants. ! (gnus-summary-show-all-expunged): Ditto for expunged. ! ! * nntp.el (nntp-async-request-group): Would pretend to close down ! async connections. ! ! Sat Jul 29 02:06:26 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.98.5. is released. ! ! * nntp.el (nntp-open-server-semi-internal): Define servers that we ! can't reach as unreachable. ! ! * nnvirtual.el (nnvirtual-create-mapping): Don't ding so much. ! ! * nneething.el (nneething-map-file): Make sure that the .neething ! dir exists. ! ! Fri Jul 21 14:52:06 1995 Ulrik Dickow ! ! * nndoc.el (nndoc-digest-type): New variable. ! (nndoc-set-header-dependent-regexps): Set it. ! (nndoc-request-article): Use it -- don't unquote MIME digests. ! ! Sat Jul 29 00:54:09 1995 Lars Magne Ingebrigtsen ! ! * nntp.el (nntp-request-close): Kill all async connections. ! ! * gnus-uu.el (gnus-uu-decode-binhex): Bugged out. ! ! Fri Jul 28 20:35:34 1995 Lars Magne Ingebrigtsen ! ! * gnus-msg.el (gnus-group-mail): Don't call `gnus-mail-hook'. ! ! * gnus.el (gnus-summary-mode-map): Changed `W d' to `W m'. ! (gnus-summary-mark-unread-as-read): Would sometimes mark the wrong ! article as read. ! (gnus-summary-toggle-header): Wouldn't toggle headers after ! miming. ! (gnus-summary-next-article): Would offer to go to the next group ! when happening upon canceled articles. ! (gnus-summary-insert-pseudos): Did not properly note that ! extracetd articles were unread. ! (gnus-summary-sort-by-number): Protect against macroism. ! (gnus-summary-verbose-headers): Didn't turn on/off verbose ! headers. ! ! * gnus-score.el (gnus-score-string): Mis-scored when matching on ! "". ! ! * gnus-ems.el (gnus-ems-redefine): Remove long-lines and ! control-chars checking for Mule. ! ! * gnus.el (gnus-summary-prepare-unthreaded): Cull unwanted ! articles. ! (gnus-group-jump-to-group): If we haven't read the active file, ! don't require a match. ! ! Thu Jul 27 13:32:12 1995 Lars Magne Ingebrigtsen ! ! * nnml.el (nnml-request-group): Didn't split mail. ! ! * nnmh.el (nnmh-active-number): Create new groups at the drop of a ! hat. ! ! * nnmail.el (nnmail-get-active): Don't activate any groups just ! because they're mentioned in `nnmail-split-methods'. ! ! * nnml.el (nnml-get-new-mail): Would bug out on multiple spool ! files. ! * nnmbox.el (nnmbox-get-new-mail): Ditto. ! * nnbabyl.el (nnbabyl-get-new-mail): Ditto. ! * nnfolder.el (nnfolder-get-new-mail): Ditto. ! (nnfolder-active-number): Don't try to switch to a group before it ! has been "created". ! ! * nnmh.el (nnmh-get-new-mail): Ditto. ! ! Wed Jul 26 17:18:50 1995 Lars Magne Ingebrigtsen ! ! * gnus-ems.el (gnus-ems-redefine): Would bug out on rebuiling ! (referred) threads in XEmacs. ! ! * gnus-msg.el (gnus-inews-insert-signature): Would insert one \n ! too many. ! ! Wed Jul 26 09:38:36 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.98.4 is released. ! ! * gnus-msg.el (gnus-deletable-headers): Make Date a deletable ! header. ! ! * nnmail.el (nnmail-split-incoming): Treat Content-length headers ! more sanely. ! (nnmail-split-incoming): Would totally by out. ! ! * nnmh.el (nnmh-request-group): Give a better error message. ! ! * gnus.el (gnus-article-date-ut): Allow futurity ! ! * gnus-msg.el (gnus-inews-user-address): New function. ! (gnus-inews-news): Give better error messages. ! ! * nnml.el (nnml-request-group): Don't check so much. ! * nnmail.el (nnmail-activate): Check everything. ! ! * gnus-msg.el (gnus-inews-check-post): Didn't match properly on ! from. ! (gnus-check-before-posting): Didn't actually check anything before ! posting. ! ! Tue Jul 25 13:35:01 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.98.3 is released. ! ! * nnml.el (nnml-request-replace-article): Would kill a random ! buffer. ! ! * gnus.el (gnus-group-read-group): Doc fix. ! (gnus-update-format-specifications): New implementation. ! (gnus-summary-read-group): Update format specs. ! (gnus-summary-catchup): Expose threads before catching up. Would ! infloop. ! (gnus-summary-save-article): Would change window config. ! (gnus-group-archive-directory): Changed address. ! ! * nnmail.el (nnmail-get-split-group): Make sure that ! nnmail-procmail-directory is a directory. ! ! Sun Jul 23 22:27:25 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-mark-article): Would bug out on string ! marks. ! ! Sun Jul 23 16:49:38 1995 Lars INGEBRIGTSEN UiO ! ! * gnus.el: 0.98.2 is released. ! ! * nnmail.el (nnmail-split-incoming): Ignore duplicate messages, ! but create new message-ids for messages that do not have one. ! ! * gnus.el (gnus-thread-sort-by-score): Totally bombed out. ! ! * gnus-score.el (gnus-score-insert-help): Do the `select-window' ! outside the `save-excursion'. ! ! * gnus.el (gnus-article-mode-map): Remove the summary `s' binding. ! ! * gnus-uu.el (gnus-uu-grab-articles): Wouldn't mark some articles ! as read. ! (gnus-uu-save-files): Don't ask twice whether to overwrite a file. ! ! * gnus.el (gnus-summary-show-thread): Avoid `save-excursion'. ! (gnus-summary-mark-same-subject): Did not expose hidden threads, ! and would infloop. ! ! Sat Jul 22 04:34:25 1995 Lars INGEBRIGTSEN UiO ! ! * gnus-cache.el (gnus-cache-file-name): Also translate :'s. ! ! * gnus.el (gnus-dribble-file-name): Use the current startup file ! name as the basis. ! ! Sat Jul 22 00:26:49 1995 Lars INGEBRIGTSEN UiO ! ! * gnus.el: 0.98.1 is released. ! ! * gnus.el (gnus-summary-mark-unread-as-read): Don't mark already ! marked articles. ! (gnus-summary-edit-article): Widen before editing. ! (gnus-summary-edit-article-done): Remove all text properties. ! (gnus-summary-prepare-threads): Inline `gnus-summary-insert-line'. ! (gnus-summary-mark-article-as-read): Faster, simpler function for ! marking an article. ! (gnus-summary-mark-same-subject): Faster implementation. ! (gnus-summary-search-forward): Changed to macro. ! (gnus-summary-search-backward): Ditto. ! (gnus-summary-thread-level): Ditto. ! (gnus-summary-article-number): Ditto. ! (gnus-summary-article-mark): Ditto. ! ! * gnus-uu.el (gnus-uu-grab-articles): Disable async. ! ! Fri Jul 21 22:00:03 1995 Lars Magne Ingebrigtsen ! ! * nndoc.el (nndoc-type-to-regexp): Use the new default to avoud ! the 1,, line in babyl files. ! ! * nnml.el (nnml-request-group): Force re-reading of the active ! file if the file is new. ! ! * gnus-vis.el (gnus-article-add-buttons): Turn off the header ! buttonizing again. ! ! * nntp.el (nntp-async-request-group): Really save async state. ! ! Thu Jul 20 00:02:30 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.98 is released. ! ! * gnus-vis.el (gnus-article-add-buttons): Buttonize the headers. ! ! * nndoc.el (nndoc-insert-article): Don't insert the status line. ! ! * gnus-vis.el (gnus-article-add-buttons): Do a `nil t' on the ! search. ! ! * nnml.el (nnml-request-replace-article): Would bug out on ! slightly corrupted NOV files. ! ! * gnus-ems.el (gnus-ems-redefine): max-width for Mule was wrong. ! ! * nnbabyl.el (nnbabyl-request-expire-articles): Didn't use the ! is-old shortcut. ! * nnmbox.el (nnmbox-request-expire-articles): Ditto. ! ! * gnus-msg.el (gnus-mail-forward-using-mail): Force window config. ! (gnus-bug-mail-send-and-exit): New command. ! (gnus-bug): Use it. ! (gnus-summary-mail-other-window): Configured windows strangely. ! ! * gnus.el (gnus-gnus-to-newsrc-format): Wouldn't save ! .newsrc-SERVER, but just .newsrc. ! (gnus-make-newsrc-file): Would not find .newsrc-SERVER.eld if ! .newsrc-SERVER didn't exist. ! ! * nndoc.el (nndoc-set-header-dependent-regexps): New function. ! (nndoc-request-group): Use it. ! ! Wed Jul 19 17:07:11 1995 Lars Magne Ingebrigtsen ! ! * gnus-ems.el: Defvar instead of setq. ! ! * gnus.el (gnus-summary-expire-articles): Don't do anything if ! there are no articles to expire. ! (gnus-unload): New command. ! ! * nnmh.el (nnmh-possibly-create-directory): Would create "a/b/c" ! dirs when "a.b.c" dir was requested. ! ! * gnus.el (gnus-newsrc-to-gnus-format): Also recognize "Options". ! ! * nnmail.el (nnmail-activate): New function for faster activation. ! ! * gnus.el (gnus-summary-expire-articles): Be slightly faster. ! ! * gnus-cache.el (gnus-cache-possibly-enter-article): Bugged out on ! dummy roots. ! ! * gnus.el (gnus-summary-update-lines): Didn't set the article number. ! (gnus-summary-exit): Force a group window config. ! (gnus-select-newsgroup): Copy all marks lists. ! (gnus-group-sort-groups): Would not heed the last `l' or `L'. ! ! * nndoc.el (nndoc-retrieve-headers): Would sometimes be in the ! wrong buffer for folding continuation lines. ! ! * gnus-ems.el (gnus-ems-redefine): Redefine ! `gnus-article-add-button' for XEmacs. ! ! * gnus.el (gnus-summary-mark-forward): Never go to the next unread ! article when marking as unread. ! ! * gnus-kill.el (gnus-kill-file-enter-kill): Wouldn't allow editing ! of the global kill file. ! ! * gnus.el (gnus-summary-mode): Don't update format specs. ! ! Tue Jul 18 16:39:31 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-number-of-articles-in-thread): Didn't work ! with the new thread machine. ! ! Tue Jul 18 13:38:27 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.97.2 is released. ! ! * gnus.el (gnus-thread-header): Define as a macro. ! (gnus-all-windows-visible-p): Don't barf on horizontal specs. ! (gnus-mouse-face-function, gnus-max-width-function): Separate into ! functions to make it easier for XEmacs and Mule to redefine. ! ! * gnus-cache.el (gnus-cache-save-buffers): Make sure that the ! directory exists. ! ! * gnus-msg.el (gnus-group-mail): Don't do configure. ! ! * gnus.el (gnus-all-windows-visible-p): Almost always reported ! nil. ! ! Tue Jul 18 11:04:02 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.97.1 is released. ! ! * gnus.el (gnus-parse-format): Use macros instead of defuns. ! ! * gnus-msg.el (gnus-debug): Slap more condition-cases around ! everything. ! ! * gnus.el (gnus-summary-prepare-threads): Slight rewrite. ! (gnus-summary-prepare-threads): Would bug out on culling. ! (gnus-summary-expand-window): Didn't. ! ! Mon Jul 17 16:31:22 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-goto-unread): New default. ! ! Mon Jul 17 12:28:36 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.97 is released. ! ! * gnus.el (gnus-summary-prepare-threads): New implementation. ! ! * gnus-vis.el (gnus-netscape-open-url): Used 10.29isms. ! ! * gnus.el (gnus-summary-exit-no-update): Removed call to the cache ! removal company. ! (gnus-summary-prepare-untreaded): New function to prepare an ! unthreaded summary buffer faster. ! (gnus-summary-mode-map): Bound hide-citation-maybe to `W C'. ! ! Mon Jul 17 04:24:40 1995 Sudish Joseph ! ! * gnus-cache.el (gnus-cache-save-buffers): Only save the overview ! file if absolutely necessary. Delete cache subdirectories when ! the overview file is empty...actually when the buffer to be saved ! is empty, so it doesn't delete any existing empty subdirs. ! ! * gnus-cache.el (gnus-cache-change-buffer): All saving of ! overviews is through gnus-cache-save-buffers now. More careful ! about modification flags on overview buffers to save redundant ! file reads/writes. ! ! * gnus-cache.el (gnus-cache-possibly-remove-articles): Added call ! to gnus-cache-save-buffers to ensure that overviews are written ! out on group exit. ! ! Mon Jul 17 10:15:35 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-update-lines): Faster implementation. ! ! * gnus-uu.el (gnus-uu-command): Also escape &'s. ! ! * gnus-vis.el (gnus-article-make-menu-bar): Only the first menu ! bar item was defined. ! ! Sun Jul 16 15:15:01 1995 Lars Magne Ingebrigtsen ! ! * gnus-msg.el (gnus-summary-supersede-article): Reversed comaprison. ! ! * gnus.el (gnus-read-old-newsrc-el-file): Add "options" to the ! options string. ! ! * nndoc.el (nndoc-insert-article): Weed out babyl extra headers. ! ! * gnus-msg.el (gnus-summary-mail-other-window): Configure windows ! better. ! ! * gnus-ems.el (gnus-ems-redefine): Redefine gnus-rebuild-thread ! for XEmacs. ! ! * gnus.el (gnus-all-windows-visible-p): New function. Don't ! configure windows if all buffers are visible. ! (gnus-summary-expand-window): Allow forcing of `article' config. ! ! * nnbabyl.el (nnbabyl-active-number): Create new groups on the ! fly. ! * nnfolder.el (nnfolder-active-number): Ditto. ! * nnmbox.el (nnmbox-active-number): Ditto. ! ! * gnus.el (gnus-summary-expire-articles): Didn't use total-expire. ! ! Sat Jul 15 20:08:47 1995 Lars Magne Ingebrigtsen ! ! * gnus-kill.el (gnus-kill-save-kill-file): New variable. ! (gnus-kill-parse-gnus-kill-file): Don't save kill files unless you ! really want to. ! ! * gnus.el: 0.96 is released. ! ! Sat Jul 15 03:54:00 1995 Sudish Joseph ! ! * gnus-vis.el (gnus-article-add-button): Use overlays for ! gnus-article-button-face to ensure that it gets priority ! during display. ! ! Sat Jul 15 17:50:23 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-article-summary-command-nosave): Pop instead of ! switch to the summary buffer. ! ! * gnus-score.el (gnus-summary-increase-score): Make sure ! gnus-score-winconf isn't nil. ! ! * gnus-vm.el: Use gnus-article-copy instead of the article buffer. ! ! * gnus-vis.el (gnus-summary-make-menu-bar): Don't recreate menus ! if the are already created. ! ! * gnus.el (gnus-group-get-new-news): Would not check unread ! articles when using permament levels. ! ! * nnfolder.el (nnfolder-request-accept-article): Didn't accept a ! respool request. ! ! * gnus-score.el (gnus-score-add-followups): Bugged out all over ! the place. ! ! Fri Jul 14 15:25:20 1995 Per Abrahamsen ! ! * gnus-vis.el (gnus-button-url): Default to `gnus-netscape-open-url'. ! (gnus-netscape-open-url): New function. ! (gnus-netscape-start-url): New function. ! ! Fri Jul 14 10:03:07 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-cache-removeable-articles): Make this a local ! variable to the summary buffers. ! ! * gnus-cache.el (gnus-cache-change-buffer): Don't reset ! gnus-cache-removeable-articles here. ! ! * gnus-msg.el (gnus-summary-followup): Make sure we get the ! current headers. ! ! * gnus-ems.el: Removed def for `gnus-header-face-alist'. ! (gnus-ems-redefine): Redefined gnus-article-push-button for ! XEmacs. ! ! Thu Jul 13 12:12:15 1995 Scott Byer ! ! * nnfolder.el (nnfolder-request-expire-articles) commented out ! line that was causing a problem when exiting group. ! ! * nnfolder.el (nnfolder-request-list) always get the active list ! from the file, since we're being more careful to keep it up to ! date. Fixes new-group creation problems. ! ! * nnfolder.el (nnfolder-request-group) added timestamp check on ! active file. Fixed problem of new messages not being shown upon ! first starting up (ding). ! ! Thu Jul 13 00:14:09 1995 Lars Magne Ingebrigtsen ! ! * 0.95 is released. ! ! * nndoc.el (nndoc-type-to-regexp): Some digests do not start with ! the required over-long --- line. ! ! * gnus.el (gnus-article-prepare): Didn't set gnus-have-all-headers ! in the right buffer. ! (gnus-read-mark): Swicthed marks around. ! (gnus-summary-next-group): Would barf on unactivated groups. ! ! * gnus-vis.el (gnus-visual-score-map): Turn score menus off. ! ! Wed Jul 12 21:02:22 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-save-newsrc-file): Allow backups of files. ! (gnus-gnus-to-newsrc-format): Ditto. ! (gnus-article-mode-map): Don't use summary buffer def for return. ! ! * gnus-ems.el: set-text-properties did not work for XEmacs. ! ! * gnus-uu.el (gnus-uu-initialize): Don't check for generated files ! - this would delete any previously decoded files. ! (gnus-uu-output-buffer-name): Changed name. ! (gnus-uu-initialize): Maintain an alist of tmp dirs. ! ! * gnus.el (gnus-group-search-forward): Would also find group with ! a lower level than LEVEL. ! ! * nntp.el: `telnet' was autoloaded as a non-interactive function. ! ! * gnus.el (gnus-summary-next-group): Configure windows properly on ! `C-g'. ! (gnus-summary-refer-article): Make sure overlays are copied by ! renaming the buffer. ! ! * gnus-msg.el (gnus-inews-insert-mime-headers): Bind ! mail-header-separator to "". ! ! Tue Jul 11 16:38:32 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-exit): Run the exit hook before updating ! info. ! ! Tue Jul 11 09:36:28 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.94 is released. ! ! * gnus-msg.el (gnus-debug): A `sit-for' may sometimes change ! active buffer. ! ! * nn*.el: Fix in expire article which would nix out the active ! file. ! ! * gnus-ems.el (gnus-ems-redefine): Mule redefinition. ! ! * gnus.el (gnus-summary-respool-article): Didn't allow respooling. ! ! * gnus-uu.el (gnus-uu-command): Also escape !s. ! ! * gnus-cache.el (gnus-cache-change-buffer): Reset ! gnus-cache-removeable-articles. ! (gnus-cache-possibly-remove-articles): Don't stat everything ! between heaven and earth. ! ! * gnus.el (gnus-summary-expire-articles-now): Use -1 as the expiry ! wait period. ! (gnus-summary-caesar-message): Changed somewhat. Removed all ! caesar code from gnus - use the functions in rnews.el instead. ! ! Mon Jul 10 20:42:14 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-catchup-to-here): Don't mark current ! article as read. ! ! Mon Jul 10 10:44:46 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.93 is released. ! ! * gnus-ems.el (gnus-ems-redefine): Redefine for XEmacs. ! ! * gnus.el (gnus-summary-expire-articles-now): New function and ! keystrokem by popular demand. ! (gnus-summary-exit-hook): New variable. ! ! * gnus-vis.el (gnus-visual-turn-off-edit-menus): New function. ! ! * nnml.el (nnml-request-expire-articles): When you have found one ! new article, the rest are probably also new, so stop checking, ! already. ! * nnbabyl.el (nnbabyl-request-expire-articles): Ditto. ! * nnfolder.el (nnfolder-request-expire-articles): Ditto. ! * nnmh.el (nnmh-request-expire-articles): Ditto. ! * nnmbox.el (nnmbox-request-expire-articles): Ditto. ! ! * gnus-ems.el: Setq gnus-display-type and gnus-background-mode for ! XEmacs. ! ! * gnus-vis.el (gnus-summary-highlight): Defvarred twice. ! ! * gnus-uu.el (gnus-uu-uustrip-article): Remove any non-body line ! after the begin line. ! ! Sun Jul 9 15:01:58 1995 Lars Magne Ingebrigtsen ! ! * gnus-uu.el (gnus-uu-get-actions): Substitute "file" for ! "gnus-uu-archive". ! ! * gnus-vis.el (gnus-group-make-menu-bar): Disable the Edit menu in ! all Gnus modes. ! ! * gnus-msg.el (gnus-insert-mime-headers): New function. ! (gnus-inews-insert-headers): Make deletable headers italic. ! (gnus-inews-check-post): Stricter From header checks. ! ! * gnus.el (gnus-subject-equal): Would bug out on numerical ! gather-limits. ! (gnus-limit-string): New function. ! (gnus-score-score-files): Translate the ":" to "/". ! (gnus-score-find-bnews): Ditto. ! ('gnus-startup-hook): Remove all hilit hooks by default. ! ! * gnus-score.el (gnus-default-adaptive-score-alist): Don't let ! ticks affect adaptive score. ! ! * gnus-msg.el ('rmail): Require rmail. ! ! * gnus-mh.el (gnus-mail-reply-using-mhe): Make sure the To isn't ! empty. ! ! * gnus-msg.el (gnus-inews-news): Don't restore window config if ! article is rejected. ! ! * gnus.el (gnus-summary-show-article): Now takes a prefix. ! (gnus-browse-exit): List all groups on exit. ! (gnus-summary-edit-article): Make sure the article buffer is the ! selected window before editing. ! ! Sat Jul 8 16:57:03 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.92 is released. ! ! * gnus.el (gnus-summary-fetch-faq): Get the real name. ! (gnus-summary-fetch-faq): Don't do the config thing unless the ! fetch is successful. ! (gnus-group-group-unread): New function. ! ! * gnus-score.el (gnus-summary-header): Beep on pseudo-articles. ! ! * gnus.el (gnus-group-expire-all-groups): Don't move the cursor. ! (gnus-group-remove-mark): Don't be so verbose. ! (gnus-summary-read-group): Return the the server buffer if ! quitting a group entry from the server buffer. ! ! * gnus-score.el (gnus-score-add-followups): Local variable shadows ! parameter. ! ! * gnus.el (gnus-summary-exit): Didn't update cache when proceeding ! to the next group. ! (gnus-summary-next-group): Didn't respect `gnus-keep-same-level'. ! (gnus-summary-remove-lines-marked-as-read): Also remove canceled ! articles. ! ! * gnus-score.el (gnus-score-insert-help): Make the summary buffer ! the selected window. ! ! * gnus-vis.el (gnus-visual-score-map): New function to create a ! gazillion menu bar entries. ! ! * gnus.el (gnus-summary-next-group): New implementation. ! ! Fri Jul 7 12:55:47 1995 Lars Magne Ingebrigtsen ! ! * gnus-cache.el (gnus-cache-possibly-remove-article): Don't barf ! on corrupted .overview files. ! ! * gnus.el (gnus-summary-copy-article): Make sure to open ! connection. ! (gnus-summary-move-article): Ditto. ! (gnus-group-make-group): Initialized active entry with wrong data. ! (gnus-summary-mark-article): Don't mark ancients as expirable. ! ! * nnbabyl.el (nnbabyl-request-create-group): New function. ! ! * gnus.el (gnus-group-make-group): Did not check to see whether ! the backend was loaded. ! ! * gnus-vis.el (gnus-header-face-alist): New colours. ! ! Thu Jul 6 15:30:00 1995 Per Abrahamsen ! ! * gnus-vis.el: Use `custom-face-lookup' to create faces for ! concistency. ! ! Thu Jul 6 14:17:34 1995 Lars Magne Ingebrigtsen ! ! * nntp.el (nntp-async-request-group): New function to save async ! state between groups that are open at the same time. ! ! * nnbabyl.el (nnbabyl-retrieve-headers): Possible removal of ! newlines. ! ! * nnmbox.el (nnmbox-retrieve-headers): Ditto. ! ! Wed Jul 5 18:21:26 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-mode): Set the name of the group here. ! ! * gnus-ems.el: `set-text-properties' doesn't work on strings. ! (gnus-ems-redefine): Require gnus-msg on startup. ! ! Mon Jul 3 12:04:43 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-group-startup-message): Tweaked message. ! ! Sun Jul 2 14:11:14 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.91 and 0.91.1 is released. ! ! * nnvirtual.el (nnvirtual-catchup-group): Would kill the group ! buffer. ! ! * gnus-ems.el (gnus-ems-redefine): Redefine insertion of group ! lines to avoid that awfol front-stickyness of extents. ! (gnus-ems-redefine): Redefine gnus-copy-article-buffer. ! (gnus-ems-redefine): Redefine gnus-summary-refer-article. ! ! * nnml.el (nnml-request-expire-articles): Would delete everything ! over ange-ftp. ! ! * gnus-ems.el (gnus-ems-redefine): Really redefine ! gnus-highlight-selected-summary. ! ! * gnus-ems.el (gnus-ems-redefine): Redefine gnus-summary-recenter. ! ! Sun Jul 2 13:02:19 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: Removed tons of unreferenced local variables from all ! files. ! (gnus-read-active-file): When using several nntp servers, the ! native nntp server often would not be consulted for an active ! file. ! ! Sun Jul 2 12:03:18 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-group-make-articles-read): name instead of group. ! ! Sat Jul 1 16:04:13 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.90 is released. ! ! * gnus.el (gnus-summary-edit-article-done): No arguments to ! buffer-disable-undo. ! ! * nnkiboze.el (nnkiboze-generate-group): Turn off slow stuff. ! ! * gnus-msg.el (gnus-inews-news): Don't restore the summary config ! if posting is unsuccessful. ! ! * gnus-score.el (gnus-score-find-trace): Don't pop to score window ! if no scores apply. ! ! * gnus-msg.el (gnus-summary-cancel-article): Don't mark article as ! cancelled if they are not. ! (gnus-mail-reply-using-mail): Change map after running mail-setup. ! ! * gnus.el (gnus-group-best-unread-group): Would return a group ! that was supposed to be excluded. ! (gnus-summary-next-group): Skip empty groups. ! ! * nntp.el (nntp-open-server-semi-internal): Don't attempt a second ! async connection if the server is down. ! ! * gnus.el (gnus-summary-goto-last-article): Doc fix. ! (gnus-no-server): Use permanent levels. ! ! * gnus-msg.el: Unhide and hide was unnecessary when forwarding and ! replying and stuff. ! ! * nnvirtual.el (nnvirtual-retrieve-headers): Mark cancelled and ! expired articles as read in the component group. ! (nnvirtual-update-marked): When removing all marks, they wouldn't ! go away. ! ! * gnus.el (gnus-summary-catchup): Do thorough nnvirtual catchups. ! ! Fri Jun 30 09:10:57 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: gnus-bug wasn't interactive. ! ! Thu Jun 29 13:42:33 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-catchup-to-here): Would mark one article ! too many. ! (gnus-articles-to-read): Accept whitespace. ! (gnus-summary-go-to-next-thread): Didn't go to next thread when ! threads were hidden. ! (gnus-summary-display-article): When the first article was ! cancelled, point would remain in the group buffer. ! ! Wed Jun 28 16:24:38 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.89 is released. ! ! * nnfolder.el (nnfolder-directory): file-name-as-directory thing. ! ! * gnus-mh.el (gnus-mail-reply-using-mhe): Set gnus-mail-buffer to ! the right buffer. ! ! * gnus.el (gnus-article-mode-map): Copy all summary keystrokes. ! (gnus-summary-insert-pseudos): Don't view if you ask to save ! (gnus-summary-edit-article): Enable undo. ! ! Sun Jun 25 11:47:24 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-next-group): Fixed possible bug on `n' on ! last group. ! (gnus-remove-some-windows): Didn't delete all Gnus windows. ! (gnus-group-unsubscribe-current-group): Use universal-argument as ! expected. ! (gnus-summary-beginning-of-article): Didn't configure windows. ! (gnus-compress-newsrc-alist): Be more lenient in compressing. ! (gnus-newsrc-parse-options): "-" was counted as a non-word ! character for some reason. ! (gnus-articles-to-read): Accept white space. ! (gnus-truncate-string): Did the opposite of what it should. ! ! Sat Jun 24 14:11:58 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.88 is released. ! ! * gnus.el (gnus-bug): Use gnus-mail-send-and-exit. ! (gnus-summary-line-format-alist): Int instead of char with %e. ! (gnus-format-max-width): Mule refefinition. ! ! Sat Jun 24 13:14:40 1995 Lars INGEBRIGTSEN UiO ! ! * gnus.el (gnus-subject-eq): New function. ! (gnus-summary-search-subject): Use it. ! ! * gnus-msg.el (gnus-cancel-news): Use previous distribution, if ! any. ! ! * gnus.el (gnus-summary-next-group): Tried exiting while in the ! group buffer. ! ! Sat Jun 24 10:35:33 1995 Lars INGEBRIGTSEN UiO ! ! * gnus.el (gnus-article-date-ut): Slap a condition-case on the ! timezone functions. ! (gnus-summary-mode-hook): Doc fix. ! (gnus-group-get-new-news): Update native and secondary groups of ! the proper levels if levels are wanted. ! ! * gnus-msg.el (gnus-inews-insert-signature): Checked whether ! `gnus-signature-function' was a function. ! ! Sat Jun 17 02:38:33 1995 Lars Ingebrigtsen ! ! * gnus.el: 0.87 is released. ! ! * nnkiboze.el (nnkiboze-close-group): Don't bug out on missing nov ! files. ! ! * gnus-cache.el (gnus-cache-possibly-remove-articles): Wait until ! exit to remove articles from the cache. ! ! * gnus.el (gnus-summary-next-group): Go to the next group, or exit ! if no articles. ! (gnus-summary-search-article-forward): Cleaned up. ! (gnus-summary-search-article-backward): New implementation. ! ! * gnus-uu.el (gnus-uu-decode-with-method): Make sure the dir name ! is a directory. ! ! * gnus.el (gnus-summary-mode-map): Add binding for gnus-bug. ! (gnus-article-mode-map): Ditto. ! (gnus-browse-mode-map): Ditto. ! ! * nnmh.el (nnmh-request-expire-articles): Possibly keep last ! article; and return the right `rest' undeleted list. ! ! * gnus.el (gnus-summary-mark-article): Don't auto-expire ancient ! articles. ! ! * nnbabyl.el (nnbabyl-request-expire-articles): Would infloop. ! ! * gnus.el (gnus-summary-mark-article): Would possibly enter a nil ! into the lists of articles. ! ! Fri Jun 16 01:51:01 1995 Lars Ingebrigtsen ! ! * nneething.el (nneething-get-head): Returned nil. ! ! * gnus-cache.el (gnus-cache-possibly-enter-article): Make doubly ! sure that point as at the start of the line. ! ! * gnus-score.el (gnus-summary-score-entry): Matches on lines were ! entered with strings, leading to later bugouts. ! ! * nntp.el (nntp-request-asynchronous): Error message slightly ! off. ! ! * gnus.el (gnus-summary-verbose-header): New command and keystroke ! for POG compatability. ! (gnus-article-hide-headers-if-wanted): Fix to the same. ! ! * gnus-score.el (gnus-score-edit-alist): Use it new config. ! ! * gnus.el (gnus-summary-refer-parent-article): Give a more ! unabiguous error message. ! (gnus-summary-refer-article): Save the article buffer before ! trying to refer some other. ! (gnus-summary-refer-article): Don't blank out the old article ! buffer. ! (gnus-buffer-configuration): New entry for summary-edit-score. ! ! * gnus-mh.el (gnus-mail-reply-using-mhe): Set mail-bug to wrong ! thing. ! ! * gnus.el (gnus-article-word-wrap): Let adaptive-fill-regexp be ! somewhat more permissive. ! (gnus-summary-first-subject): Did not go to the first article. ! ! Thu Jun 15 21:31:38 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-setup-news): Read active file from secondary ! servers even if native is down. ! (gnus-get-unread-articles): Didn't display unread articles when ! started on a low level. ! (gnus-get-unread-articles): More efficient implementation. ! ! Thu Jun 15 05:28:03 1995 Lars Magne Ingebrigtsen ! ! * gnus-score.el (gnus-score-save): Delete empty score files. ! ! Thu Jun 15 03:34:23 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.86 is released. ! ! * gnus.el (gnus-summary-refer-article): Recenter after fetching. ! ! Wed Jun 14 10:34:20 1995 Lars Ingebrigtsen ! ! * gnus-uu.el (gnus-uu-digest-mail-forward): Don't initialize ! twice. ! ! * gnus-msg.el (gnus-mail-buffer): New variable. ! ! * gnus-score.el (gnus-summary-increase-score): Restore window ! config after help. ! ! * nnmail.el (nnmail-use-procmail): New variable. ! ! * nntp.el (nntp-send-strings-to-server): Really reopen connection ! if closed. ! ! * gnus.el (gnus-group-exit): Remove carpal window on exit. ! (gnus-summary-recenter): Center on line 2 when in small windows. ! (gnus-newsrc-to-gnus-format): Reset the options list. ! (gnus-read-active-file): Would not activate primary groups when ! 'some. ! (gnus-get-unread-articles): Don't activate secondary groups ! again. ! ! Tue Jun 13 00:26:45 1995 Lars Magne Ingebrigtsen ! ! * Treat empty comments fields. ! ! * gnus.el (gnus-newsrc-to-gnus-format): Exponentiality revealed. ! (gnus-score-find-hierarchical): Didn't really work for adaptive ! files. ! (gnus-select-newsgroup): Really strip the first unwanted article. ! ! * gnus-score.el (gnus-summary-score-entry): Doc fix. ! ! Tue Jun 13 10:02:57 1995 Scott Byer ! ! * nnfolder.el (nnfolder-possibly-change-group) An added check for ! a file being a directory also checked for a symlink without ! verifying that the symlink actually pointed to a directory. This ! would seriosly mess up some mail setups. ! ! * nnfolder.el (nnfolder-server-opened) ! (nnfolder-possibly-change-group) Made sure checks for buffer ! existence included checks for the name being nil, since ! buffer-name with a nil name returns some random buffer. ! ! Sat Jun 10 00:15:13 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-ask-server-for-new-groups): Ignore errors while ! reading newgroups files. ! (gnus-summary-next-group): Would bug out when all articles were ! expinged from scoring. ! (gnus-simplify-subject-fuzzy): Totally bugged out. ! ! * gnus.el: 0.85 is released. ! ! Thu Jun 8 22:27:07 1995 Per Abrahamsen ! ! * custom.el: Added support for faces, sexp, and pair types. Added ! support for declaring emacs packages. Added support for loading, ! saveing, and editing Emacs customization. Declared all user ! variables in the custom package itself. ! ! * gnus-edit.el: Added support for `eval', `adapt', and `local' ! entries. ! ! * gnus-cus.el: New file. ! ! Fri Jun 9 00:07:16 1995 Lars Ingebrigtsen ! ! * gnus-uu.el (gnus-uu-initialize): Create tmp dir recursively. ! ! * gnus.el (gnus-group-edit-group): Refuse to edit killed groups. ! (gnus-summary-enter-digest-group): Have followups in digest groups ! go to the parent group. ! (gnus-newsrc-to-gnus-format): Would infloop on empty lines. ! ! * gnus-score.el (gnus-score-load-file): Have adapt nil do nothing ! much. ! (gnus-score-load-file): Have a nil 'adapt entry mean "use current ! value". ! ! * gnus-vis.el (gnus-article-highlight-headers): Would sometimes ! bug out. ! ! * gnus.el (gnus-configure-windows): Accept integer hor specs. ! ! * nnfolder.el (nnfolder-request-create-group): Make sure new ! groups that are created are, indeedn, created. ! (nnfolder-request-accept-article): Would save two copies of all ! mail. ! ! Fri Jun 9 00:07:16 1995 Lars Ingebrigtsen ! ! * gnus.el: 0.84 is released. ! ! * nneething.el (nneething-retrieve-headers): Check for empty ! files. ! ! * gnus-msg.el (gnus-inews-insert-headers): Did not delete the ! required headers. ! (gnus-inews-organization): Be a bit more clever about missing ! files. ! ! * gnus-score.el (gnus-score-body): Didn't work at all. ! ! * gnus-msg.el (gnus-summary-supersede-article): Did not select ! article before superseding. ! (gnus-summary-supersede-article): Delete certain headers before ! superseding. ! (gnus-delete-supersedes-headers): New variable. ! ! Thu Jun 8 20:15:24 1995 Lars Ingebrigtsen ! ! * nnmh.el (nnmh-request-list): Would add a "." to the group name ! if nnmh-directory didn't end with /. ! ! * nnmail.el (nnmail-resplit-incoming): New variable. ! ! * nnml.el (nnml-get-new-mail): Wrong group name. ! ! * gnus.el (gnus-simplify-subject-fuzzy): Inline ! simplify-buffer-fuzzy. ! (gnus-simplify-buffer-fuzzy): New Re: match. ! ! * gnus-uu.el (gnus-uu-initialize): Make a more unique temp name. ! (gnus-uu-decode-unshar-and-save): Start working. ! ! * gnus.el (gnus-score-find-single): Find both SCORE and ADAPT ! file. ! (gnus-score-find-hierarchical): Ditto. ! ! Thu Jun 8 15:38:58 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-newsrc-to-gnus-format): Don't enter native groups ! from the .eld files of they do not exist in the .newsrc file. ! ! * gnus.el: Doc string typo corrections galore courtesy of Frank D. ! Cringle. ! ! * gnus-ems.el: Bind buffer-substring-no-properties if not bound. ! ! * gnus.el (gnus-select-newsgroup): Did the wrong thing to remove ! (gnus-matches-options-n): Reversed match, sort of. ! (gnus-extract-address-components): Didn't treat chopped-off lines ! well. ! (gnus-read-all-descriptions-files): Returned nil. ! (gnus-gmt-to-local): Wouldn't strip props before calling timzone. ! ! Wed Jun 7 15:04:20 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-select-newsgroup): Don't add an extra 1 if there ! already is one. ! (gnus-summary-reselect-current-group): Did not allow reselecting. ! ! * nndoc.el (nndoc-retrieve-headers): Would fetch headers ! strangely. ! ! * gnus.el (gnus-summary-search-subject): Don't bug out on ! psedu-articles. ! (gnus-score-score-files): Use file-exists instead of ! file-readable because of os/2 bug. ! (gnus-select-newsgroup): Didn't remove the first fetched article ! when not using nov. ! ! * gnus.el: 0.83 is released. ! ! Wed Jun 7 12:59:46 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-configure-windows): Also make the selected buffer ! in the selected window the current buffer. ! ! Mon Jun 5 23:04:27 1995 Lars Ingebrigtsen ! ! * nntp.el: Anchor all lines with \n instead of $. ! ! Sun Jun 4 17:03:38 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-summary-remove-lines-marked-with): Unbalanced ! parens. ! ! Sun Jun 4 00:48:38 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-group-catchup): Would not properly catchup all ! ticked articles. ! ! * nndoc.el (nndoc-number-of-articles): Would totally bug out on ! mbox types. ! ! * gnus.el: 0.82 is released. ! ! Sat Jun 3 00:27:41 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-summary-sort): Re-send async info after sorting. ! (gnus-strict-mime): New variable. ! (gnus-extract-address-components): XOVER From headers might not ! support folded lines. ! ! * nnmail.el (nnmail-move-inbox): Always use movemail to move ! incoming mail. ! ! * gnus.el (gnus-summary-zcore-fuzz): New variable. ! (gnus-summary-insert-line): Use it. ! ! * gnus-score.el (gnus-summary-score-entry): Remove Re:'s from ! substring and regexp matches. ! ! * gnus-msg.el (gnus-inews-insert-headers): Would bug out on ! existing message-ids. ! ! * gnus-ems.el: Provide gnusutil for Mule users. ! ! * gnus.el (gnus-summary-catchup): Would nix out dormant articles. ! ! * nntp.el (nntp-retrieve-headers-with-xover): Would give erronous ! results on non-xover servers. ! ! * gnus.el (gnus-group-make-group): Would insert groups at the end ! of the list at the beginning. ! ! * gnus-kill.el (gnus-kill-parse-gnus-kill-file): Switch to the ! summary buffer before evaling nok-kill forms. ! ! * gnus-score.el (gnus-score-edit-done): Make sure the directory ! where we save the score file exists. ! ! * gnus.el (gnus-retrieve-headers): Don't try to retrieve headers ! by id from the cache. ! ! * nnsoup.el (nnsoup-read-areas): New packets would bomb. ! ! * gnus.el (gnus-get-unread-articles): Check secondary groups kinda ! unconditionally. ! (gnus-read-descriptions-file): Don't try to re-read desc file if ! it failed the first time. ! (gnus-add-configuration): New function. ! (gnus-summary-next-article): The group window was selected. We ! select the summary buffer. ! (gnus-active-to-gnus-format): Would leave illegal group symbols ! undefined. ! ! Fri Jun 2 20:58:58 1995 Lars Ingebrigtsen ! ! * nnvirtual.el (nnvirtual-possibly-change-newsgroups): Make sure ! the nnvirtual group doesn't include itself. ! ! * gnus-score.el (gnus-score-body): Changed message to "num of ! tot". ! ! * nnbabyl.el (nnbabyl-get-new-mail): Remove ^_-s from incoming ! mails. ! ! * gnus.el (gnus-mark-article-as-read): Did not remove articles ! from the cache. ! ! * nnmail.el (nnmail-get-spool-files): Remove directories that ! match the suffix. ! ! * gnus-score.el (gnus-summary-increase-score): Use sit-fors to ! better mimic a keymap. ! (gnus-summary-increase-score): Don't display match types that are ! illegal for the header to be scored on. ! (gnus-summary-increase-score): Allow C-h to list help. ! ! * nnmail.el (nnmail-get-split-group): Get the right group to split ! in when doing procmail splits. ! ! Fri Jun 2 17:25:28 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.81 is released. ! ! Fri Jun 2 14:56:40 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-group-exit): Would offer to save summaries after ! it was too late. ! ! * nnvirtual.el (nnvirtual-request-close): Function for cleaning up ! nnvirtual. ! ! Wed May 31 16:37:02 1995 Per Abrahamsen ! ! * gnus-vis.el (gnus-summary-make-menu-bar): Added menu entry to ! highlight article. ! ! Fri Jun 2 00:29:57 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-read-descriptions-file): Allow reading from ! different servers. ! (gnus-group-describe-group): Wouldn't describe foreign groups. ! (gnus-read-all-descriptions-files): New function. ! (gnus-group-get-new-news-this-group): Would step to the bottom of ! the list. ! (gnus-group-update-group): Would often insert groups one below ! where they were supposed to go. ! ! * gnus-msg.el (gnus-copy-article-buffer): Didn't widen before ! copying. ! ! * gnus.el (gnus-article-get-xrefs): Would bug out in obscure ! circumstances. ! ! * gnus-ems.el: Would define make-face, which would confuse Info. ! ! * gnus.el (gnus-summary-next-article): Execute keystroke after `n' ! in the right buffer. ! ! * gnus-edit.el (gnus-score-customize): Added keystroke and ! autoload. ! ! * gnus.el (gnus-ask-server-for-new-groups): Did not open servers ! before requesting. ! (gnus-group-check-bogus-groups): Prefix now means "don't ask". ! (gnus-check-bogus-newsgroups): Would bug out on several bogus ! groups with the same name. ! ! Thu Jun 1 01:17:01 1995 Lars Ingebrigtsen ! ! * gnus-msg.el (gnus-post-news): Would 'ask even when posting. ! (gnus-inews-insert-headers): Only remove message-id previously ! generated by Gnus. ! (gnus-inews-news): Insert the same message-id in mail copies of ! news articles. ! (gnus-deletable-headers): New variable. ! ! * nnmh.el (nnmh-request-list): Would mess up the list. ! ! * gnus.el (gnus-group-make-empty-virtual): Create a group that ! matches nothing, not everything. ! (gnus-group-catchup-current): Catch up component nnvirtual ! groups. ! ! * gnus-soup.el: New file. ! ! * nnsoup.el: New file. ! ! * gnus-msg.el (gnus-inews-article-function): New variable. ! (gnus-inews-article): Check headers after they have been ! generated. ! ! Wed May 31 11:37:22 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-expire-articles): Cancelled instead of ! canceled. ! ! Wed May 31 03:45:35 1995 Lars Magne Ingebrigtsen ! ! * nnmh.el (nnmh-request-expire-articles): If a file can't be ! deleted, don't remove it from the list of expirables. ! ! * gnus.el: 0.80 is released. ! ! Tue May 30 10:59:22 1995 Per Abrahamsen ! ! * gnus-cite.el (gnus-cite-attribution-postfix): Accept VinVN ! `says' attribution, no matter how stupid it sounds. ! ! Wed May 31 00:46:27 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-read-group): Recenter in wrong window. ! ! Tue May 30 10:05:54 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-make-hashtable-from-newsrc-alist): Make sure no ! new dummy.groups are prepended. ! (gnus-make-hashtable-from-newsrc-alist): Would potentially be ! destructive. ! ! Mon May 29 09:03:02 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-summary-goto-subject): Would not report ! non-existing numbers. ! ! * gnus-msg.el (gnus-inews-insert-signature): Don't do sig if ! mail-signature is non-nil. ! (gnus-post-news): Would set gnus-newsgroup-name to something ! strange. ! ! * gnus.el (gnus-configure-windows): Would, in obscure cases, ! display a buffer in two windows. ! ! Mon May 29 09:03:02 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.79 is released. ! ! * nnmail.el (nnmail-delete-incoming): New variable. ! ! * gnus.el (gnus-summary-read-group): Would scroll to the end of ! the article. ! ! * gnus-msg.el (gnus-mail-reply-using-mail): Don't run ! news-reply-header-hook if mail-yank-hooks is non-nil. ! ! Sun May 28 15:25:02 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-summary-update-mark): Would add unread marks to ! articles that had been marked with the process mark. ! (gnus-summary-read-group): Forcibly recenter group buffer if ! visible. ! ! * gnus-score.el (gnus-summary-increase-score): Allow "?"s. ! ! * gnus.el (gnus-summary-import-article): New command and ! keystroke. ! ! * gnus-kill.el (gnus-kill-parse-rn-kill-file): Also parse rn ! killfiles. ! ! * gnus.el (gnus-group-get-new-news): Did not use ! default-list-level properly. ! ! Sun May 28 10:01:10 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-article-word-wrap): Use fill-column. ! ! * gnus-score.el (gnus-score-remove-lines-adaptive): Would switch ! score files. ! ! * nnspool.el (nnspool-find-article-by-message-id): Did not work. ! ! * gnus-score.el (gnus-score-adaptive): Would try to score one too ! many. ! ! * gnus.el (gnus-group-make-help-group): Use new doc backend. ! ! * nndoc.el (nndoc-type-to-regexp): Find out when the end of file ! has been reached in digests. ! ! Sun May 28 01:30:59 1995 Lars Ingebrigtsen ! ! * nnmbox.el (nnmbox-possibly-change-newsgroup): Act more robustly ! even if the user kills the mbox buffer. ! ! Sat May 27 20:16:34 1995 Lars Ingebrigtsen ! ! * nneething.el (nneething-make-head): Produced buggy From headers. ! (nneething-article-p): More strict definition. ! * gnus.el (gnus-summary-next-page): Would show end of buffer. ! (gnus-group-exit): Really offer to save summaries. ! (gnus-offer-save-summaries): Reverse match. ! Sat May 27 09:25:52 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.78 is released. ! * nnmail.el (nnmail-split-incoming): Would bug out on long ! content-lengths. ! * gnus.el (gnus-active-to-gnus-format): Do more checking. ! (gnus-summary-prev-page): Would not configure windows. ! * gnus-cache.el (gnus-cache-possibly-enter-article): Did not ! insert From headers in nov files. ! * nnbabyl.el (nnbabyl-retrieve-headers): Misspelled func name. ! * gnus.el (gnus-browse-group-name): Did not work. ! (gnus-browse-select-group): No interactive spec. ! * gnus-msg.el (gnus-mail-reply-using-mail): `C-c C-y' woyld yank ! only headers. ! Fri May 26 06:34:55 1995 Lars Ingebrigtsen ! * gnus.el (gnus-group-make-doc-group): New command and keystroke. ! * nndoc.el (nndoc-open-server): New implementation. Now does ! babyl, mbox and digest. ! * nnspool.el (nnspool-request-post): Use a pipe instead of a pty. ! * gnus-msg.el (gnus-inews-insert-headers): Do the _-_ a bit more ! intelligently. ! Thu May 25 13:05:05 1995 Lars Ingebrigtsen ! * gnus.el (gnus-summary-enter-digest-group): Did not work. ! * nndigest.el (nndigest-current-buffer): Doc fix. ! * nnmh.el (nnmh-request-list): Would recurse needlessly. ! Thu May 25 05:34:16 1995 Lars Magne Ingebrigtsen ! * gnus.el: 0.77 is released. ! ! * gnus.el (gnus-article-date-ut): Ignore missing dates. ! (gnus-group-enter-directory): New command and keystroke. ! * nnspool.el (nnspool-retrieve-headers-with-nov): Don't be picky ! on dirs. ! * gnus-mh.el (gnus-mail-forward-using-mhe): Make better Subject. ! * gnus.el (gnus-score-find-alist): New function. ! (gnus-score-score-files): ADAPT files would nix out all other ! files. ! (gnus-score-score-files): Would not find any when short names were ! used. ! Sat May 20 06:45:04 1995 Sudish Joseph ! * gnus-score.el (gnus-score-find-alist): New function. ! (gnus-possibly-score-headers): Use it. ! * gnus.el (gnus-score-file-(single|multiple)-match-alist): New ! variables. ! Thu May 25 03:44:53 1995 Lars Magne Ingebrigtsen ! * gnus-kill.el (gnus-expunge): Would infloop. ! * nnspool.el (nnspool-inews-sentinel): Did not kill the error ! buffer. ! * nnmail.el (nnmail-article-group): Would but out on function in ! the split method. ! * nnmh.el (nnmh-get-new-mail): Don't rescan if already scanned. * nnml.el (nnml-get-new-mail): Ditto. ! * gnus.el (gnus-start-news-server): Don't let the nnmh backend ! fetch new mail. ! ! Wed May 24 07:59:39 1995 Lars Ingebrigtsen ! ! * nneething.el: New backend. ! ! Wed May 24 02:35:49 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.76 is released. ! ! * nnfolder.el (nnfolder-close-group): New version. Don't close if ! already closed. ! ! * gnus-msg.el (gnus-inews-news): Wouldn't restore winconf. ! ! * gnus.el (gnus-summary-delete-article): Would make all expirable ! articles disappear. ! ! * gnus-msg.el (gnus-summary-cancel-article): Don't mark as ! cancelled before it actually is cancelled. ! (gnus-mail-reply-using-mail): Did not narrow to headers. ! (gnus-group-mail): Use the mail-other-window method. ! ! * gnus.el (gnus-signature-separator): Moved to gnus.el. ! (gnus-debug): Ignore nils in load-path. ! (gnus-score-score-files): Did not find adapt files when using ! short file names. ! (gnus-score-score-files): Changing from short to long file names ! would bug out. ! (gnus-get-newsgroup-headers): Would bug out on empty articles. ! ! * nnheader.el (nnheader-insert-head): Would stop before getting ! the entire head. ! ! * gnus-msg.el (gnus-mail-reply-using-mail): Would unmark process ! marks in the wrong buffer. ! (gnus-post-news): Ditto. ! (gnus-inews-do-fcc): Would make a directory out of the file name. ! ! Tue May 23 07:24:52 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-group-real-name): Get the word after the last ! colon, not after the first colon. ! ! * nnmail.el (nnmail-split-incoming): When "splitting" for just a ! single group, narrow the split method to just the single group. ! ! * gnus-uu.el (gnus-uu-unpack-files): Expunge generated files on ! group exit. ! ! * gnus-score.el (gnus-score-load-file): Added the `local' atom. ! ! * gnus.el (gnus-group-make-empty-virtual): New function and ! keystroke. ! (gnus-dummy-mark): New variable. ! (gnus-summary-remove-lines-marked-with): Remove dummy roots that ! have no children. ! (gnus-articles-to-read): Allow the user to specify how many ! articles to read with a numerical prefix. ! (gnus-browse-read-group): New command and keystroke. ! (gnus-summary-insert-line): Go back to using normal plists for ! article info. Changes all over in the summary code. ! (gnus-summary-first-subject): New implementation. ! ! Tue May 23 02:54:05 1995 Lars Magne Ingebrigtsen ! ! * nnmail.el (nnmail-move-inbox): tofile fix. ! ! * gnus-msg.el (gnus-group-mail): Moved here. ! (gnus-group-mail): Run gnus-mail-hook. ! ! * gnus.el (gnus-article-prepare): Let buffer-read-only to nil. ! ! * nnfolder.el (nnfolder-possibly-activate-groups): Don't use ! gnus-group-real-name. ! ! * gnus.el (gnus-active-to-gnus-format): Add more error control. ! ! * gnus-score.el (gnus-summary-increase-score): Would bug out on ! certain keystrokes. ! ! * gnus.el (gnus-group-sort-groups): Would rescan. ! (gnus-group-sort-groups): Added keystroke. ! (gnus-article-setup-buffer): Always set article mode. ! (gnus-group-add-to-virtual): Prompt with nnvirtual:. ! ! Sun May 21 07:33:20 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-offer-save-summaries): Save any still-existing ! summary buffer on exit from Gnus. ! ! Sun May 21 00:11:00 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.75 is released. ! ! * gnus-cache.el (gnus-cache-retrieve-headers): Don't bug out on ! changed source groups. ! ! * gnus.el (gnus-matches-options-n): Did not find matching options. ! (gnus-configure-windows): Signal error with missing point. ! (gnus-narrow-to-headers): Don't bug out on malformed mail. ! ! * gnus-uu.el: Made prompts more explicit. ! ! * gnus.el (gnus-article-prepare): Show thread before doing visual ! marks. ! (gnus-summary-scroll-up): Would recenter oddly. ! ! Sat May 20 23:37:42 1995 Lars Magne Ingebrigtsen ! ! * gnus-score.el (gnus-score-headers): gnus-current-score-file ! would be nil. ! ! * gnus-cite.el (gnus-supercite-regexp): New value. ! ! Sat May 20 04:56:14 1995 Lars Ingebrigtsen ! ! * nnbabyl.el (nnbabyl-retrieve-headers): Faster routine. ! ! * nnheader.el (nnheader-insert-head): New function to speed up ! HEADer reading. ! ! * nnspool.el (nnspool-retrieve-headers): Use it. ! * nnmh.el (nnmh-retrieve-headers): Ditto. ! * nnml.el (nnml-retrieve-headers): Ditto. ! ! * nnmh.el (nnmh-be-safe): New variable and serious speedup. ! ! Sat May 20 17:11:50 1995 Lars Ingebrigtsen ! ! * gnus.el: 0.74 is released. ! ! Sat May 20 00:11:59 1995 Lars Ingebrigtsen ! ! * gnus.el: 0.73 is released. ! ! * gnus-msg.el (gnus-mail-reply-using-mail): Don't barf wifout a ! message-id. ! ! * gnus-score.el (gnus-score-load-file): 'eval was not right. ! ! * gnus.el (gnus-make-articles-unread): Would deliver wrong ! results. ! ! Fri May 19 01:10:34 1995 Lars Ingebrigtsen ! ! * nnbabyl.el (nnbabyl-insert-newsgroup-line): Did not translate ! "From " lines. ! (nnbabyl-insert-lines): Wrong number of lines. ! (nnbabyl-request-accept-article): Bugged out. ! ! * nnmh.el (nnmh-request-accept-article): Would never accept an ! article. ! ! * gnus-vis.el (gnus-article-add-buttons): `Entry' would be nil ! sometimes. ! ! * gnus-ems.el (gnus-ems-redefine): Redefine buffer-display-table. ! ! * gnus.el (gnus): Init server buffer, just in case. ! ! * nnml.el (nnml-request-create-group): string-to-int instead of ! int-to-string. ! ! * gnus.el (gnus-group-use-permament-levels): New variable, ! supersedes other variables. ! (gnus-article-prepare): Let buffer-read-only nil before calling ! hooks. ! (gnus-summary-next-group): Recenter group buffer. ! (gnus-get-newsgroup-headers): Articles without message-id's ! fetched in separate batches would be clobbered. ! ! * gnus-msg.el (gnus-inews-do-fcc): Make sure the fcc dir exists. ! (gnus-inews-news): If both mailing and posting, remove the Fcc ! before posting. ! ! * nnvirtual.el (nnvirtual-request-post-buffer): Don't suggest any ! newsgroups to post in. ! ! * gnus.el (gnus-list-of-read-articles): Would totally bug out. ! ! * gnus-score.el (gnus-score-string): Add tracing. ! (gnus-score-find-trace): New command and keystroke. ! ! * nnmbox.el (nnmbox-request-expire-articles): When deleting the ! last article, would infloop. ! ! * nnbabyl.el (nnbabyl-article-string): Did not anchor end of ! number. ! ! * gnus-msg.el (gnus-forward-insert-buffer): Don't do double ! copying of article buffer. ! (gnus-copy-article-buffer): Would barf when the article buffer ! didn't exist. ! ! * gnus.el (gnus-configure-windows): Split the opposite way. ! (gnus-summary-next-group): Would cycle on 0 on the last group. ! ! * gnus-score.el (gnus-summary-increase-score): Give fuller ! prompts. ! ! Sun May 14 10:01:49 1995 Per Abrahamsen ! ! * gnus.el: Use (point-min) instead if `1'. ! ! * gnus.el (gnus-hidden-properties): Added. ! (gnus-summary-toggle-header, gnus-article-show-all-headers, ! gnus-article-hide-headers): Use it. ! ! * gnus-cite.el (gnus-article-hide-citation, ! gnus-article-hide-citation-maybe, gnus-cite-toggle): Use it. ! ! * gnus-vis.el (gnus-article-hide-signature, ! gnus-signature-toggle): use it. ! ! * gnus.el (gnus-article-hide-signature): Deleted. Use the version ! in `gnus-vis.el' instead. ! ! * gnus-vis.el (gnus-article-next-button): New function and ! keybinding. ! ! Thu May 18 03:10:03 1995 Lars Ingebrigtsen ! ! * gnus-score.el (gnus-score-edit-alist): Really save winconf. ! ! * gnus.el (gnus-summary-enter-digest-group): Don't use / in group ! names. ! ! * nnmail.el (nnmail-split-incoming): Use Content-Length header. ! ! * gnus-score.el (gnus-score-headers): Let current-score-file. ! ! * gnus-ems.el: Don't use intagible before 19.29. ! ! * nndigest.el (nndigest-narrow-to-article): Stop before that *End ! of digest* line. ! ! * gnus-score.el (gnus-score-score-files): Expand the kill-file ! path before using it. ! (gnus-summary-increase-score): Double quoting of types. ! ! * gnus-mh.el (gnus-mail-forward-using-mhe): Use the incoming ! buffer. ! ! * gnus.el (gnus-summary-prepare-threads): False roots would get ! incorrect number of children. ! ! * nnspool.el (nnspool-inews-sentinel): condition-case the sending ! of eof. ! ! * gnus.el (gnus-summary-mark-article): Always un-hide threads. ! (gnus-update-read-articles): Peel off expired article numbers. ! (gnus-article-set-window-start): New function. ! (gnus-summary-refer-article): Would scroll to the end of the ! buffer. ! ! * gnus-uu.el (gnus-uu-save-article): Grabbed one char to many when ! snarfing headers. ! ! * gnus-score.el (gnus-score-add-followups): Don't enter if there ! already is one. ! ! * gnus.el (gnus-nov-read-integer): Condition-case the read. ! ! * nnvirtual.el (nnvirtual-close-group): Always handle a close. ! ! * gnus-vm.el (gnus-mail-forward-using-vm): Accept an argument. ! ! * gnus-mh.el (gnus-mail-forward-using-mhe): Ditto. ! ! * gnus.el (gnus-summary-make-display-table): New function. ! ! Thu May 18 00:58:54 1995 Lars Ingebrigtsen ! ! * gnus.el (gnus-summary-mode): Display-table would be nil. ! ! * gnus.el: 0.72 is released. ! ! Wed May 17 19:38:43 1995 Lars Magne Ingebrigtsen ! ! * gnus.el: 0.71 is released. ! ! Mon May 15 15:53:00 1995 Scott Byer ! ! * nnfolder.el (nnfolder-possibly-activate-groups) New function. ! nnmail-get-active returns a bogus list the second time around, so ! we want to make sure we only call it once. ! ! * nnfolder.el (nnfolder-active-number) Mase things a little more ! paranoid in the case where we enter this procedure from splitting ! mail - it will do a possibly-change-group, which, if ! nnfolder-use-active-file is nil, will figure out the _true_ active ! numbers from the nnfolder mail file. ! ! Wed May 17 17:43:27 1995 Lars Magne Ingebrigtsen ! ! * gnus.el (gnus-article-date-ut): Lapsed would fail when toggling ! headers. ! (gnus-summary-catchup): Reversed comparison. ! (gnus-summary-mode): Set mode line before group name was defined. ! (gnus-short-group-name): New implementation. ! (gnus-article-display-x-face): New implementation. ! (gnus-article-x-face-too-ugly): New variable. ! (gnus-remove-some-windows): Don't bug out on non-defined buffers. ! ! Wed May 17 14:23:37 1995 Lars Ingebrigtsen ! ! * gnus-msg.el (gnus-check-before-posting): New semantics. Allow ! finer granulatity than on/off. ! ! * gnus-score.el (gnus-summary-increase-score): Changed the maps ! and score file entry commands. ! ! Tue May 16 00:40:38 1995 Lars Ingebrigtsen ! ! * gnus-score.el (gnus-summary-score-entry): When used ! interactively, didn't do the right TYPE. ! (gnus-summary-score-entry): Added keystroke. ! ! * gnus.el (gnus-summary-current-score): New command and keystroke. ! ! * nnmail.el (nnmail-incoming-mail-directory): New variable. ! (nnmail-get-spool-files): Use it. ! ! * nndigest.el (nndigest-request-group): Would not widen before ! inserting, resulting in a partial digest group. ! ! * gnus.el (gnus-article-summary-command): Use `call-interactively' ! instead of executing macro. ! (gnus-article-get-xrefs): Would sometimes bug out. ! ! * gnus-score.el (gnus-score-exact-adapt-limit): New variable. ! ! * nnfolder.el (nn*-prepare-save-mail-hook): New variables. ! ! * gnus.el (gnus-summary-next-group): Would step one group to far ! when using `quietly'. ! (gnus-newsgroup-directory-form): Don't make directory form of the ! entire foreign group name. ! ! * gnus-uu.el (gnus-uu-save-article): Get continuation lines. ! ! * gnus-msg.el (gnus-inews-news): Don't include courtesy message on ! Bcc mail. ! ! * nnmail.el (nnmail-split-fancy): New variable and stuff. ! ! * nnkiboze.el (nnkiboze-request-group): Barfed on non-generated ! groups. ! ! * gnus.el (gnus-summary-mode): Modify buffer-display-table to not ! display control characters and the like. ! (gnus-active-to-gnus-format): Faster implementation. ! (gnus-ignored-newsgroups): Semi-obsolescent. ! (gnus-bug): Offer a help page. ! (gnus-article-prepare): Made summary and article buffer writable. ! (gnus-group-make-kiboze-group): Created incorrect score files. ! ! Mon May 15 21:40:15 1995 Lars Ingebrigtsen ! * nntp.el (nntp-nov-gap): New variable. ! (nntp-retrieve-headers-with-xover): Use it. --- 1,192 ---- ! Wed Sep 20 22:20:09 1995 Lars Magne Ingebrigtsen ! * gnus.el (gnus-create-xref-hashtb): Our newsreader has Xrefs with ! "group/number" instead of "group:number". ! * gnus-msg.el (gnus-cancel-news): Make sure the From line is the ! read address. ! Wed Sep 20 01:42:46 1995 Lars Ingebrigtsen ! * gnus-uu.el (gnus-uu-unmark-thread): New command and keystroke. ! * gnus-msg.el (gnus-inews-check-post): Check for Approved. ! * nnspool.el (nnspool-rejected-article-hook): New hook. ! * gnus-msg.el (gnus-make-draft-group): New function. ! (gnus-summary-send-draft): New command. ! (gnus-draft-group-directory): New variable. ! (gnus-message-sent-hook): New hook. ! * nnmh.el (nnmh-request-create-group): New function. ! * nndir.el (nndir-request-accept-article): New function. ! (nndir-request-expire-articles): New function. ! (nndir-request-create-group): New function. ! * gnus-msg.el (gnus-required-mail-headers): New variable. ! (gnus-inews-do-gcc): New function. ! (gnus-outgoing-message-group): New variable. ! * gnus.el (gnus-select-newsgroup): Don't use magic to fetch old headers. ! (gnus-select-newsgroup): Don't fetch old headers if there is only ! 1 article in the group. ! Tue Sep 19 20:16:24 1995 Lars Ingebrigtsen ! * gnus-msg.el (gnus-inews-article): Remove To and Cc headers after ! posting. ! * gnus.el (gnus-writable-groups): New function. ! * gnus-msg.el (gnus-bounced-headers-junk): New variable. ! (gnus-resend-bounced-mail): New command and keystroke. ! * gnus.el (gnus-newsgroup-threads): Removed variable all over. ! (gnus-asynchronous-article-function): Removed variable. ! * gnus-msg.el (gnus-inews-article): Do mail sending after all the ! headers have been generated. ! * nnheader.el (nnheader-set-temp-buffer): New function. ! * gnus-msg.el (gnus-inews-remove-headers-after-mail): New ! function. ! * nnheader.el (nnheader-remove-header): New function. ! * gnus-msg.el (gnus-inews-cleanup-headers): Forked out into a ! separate function. ! Sun Sep 17 01:11:10 1995 Sudish Joseph ! * gnus-score.el (gnus-score-trace): (car gnus-score-trace) now ! contains the score file from which the 'cdr was loaded, instead ! of the (unused) article number. ! Modified each of the gnus-score-{type} functions to use the ! above format for gnus-score-trace. ! (gnus-score-find-trace): Show score file from which each entry ! was loaded. ! Tue Sep 19 17:03:17 1995 Lars Magne Ingebrigtsen ! * nntp.el (nntp-warn-about-losing-connection): New variable. ! Mon Sep 18 14:54:30 1995 Per Abrahamsen ! * gnus.el (gnus-summary-respool-query): Rename from ! `gnus-summary-fancy-query' and made it work with all values for ! `nnmail-split-methods'. ! (gnus-summary-mode-map): Updated for above change. ! Tue Sep 19 00:03:57 1995 Lars Ingebrigtsen ! * gnus.el (gnus-read-header): All the backends now deliver group ! name and number when fetching by Message-ID, so article numbers ! should be better. ! * nntp.el (nntp-find-group-and-number): New function. ! * nnspool.el (nnspool-find-article-by-message-id): Didn't kill the ! work buffer. ! (nnspool-article-pathname): Changed logic. ! * gnus.el (gnus-read-header): Don't use nn*-retrieve-headers. ! * nnmbox.el (nnmbox-request-article): Allow fetches by ! Message-ID. ! * nnbabyl.el (nnbabyl-request-article): Ditto. ! * nnfolder.el (nnfolder-request-article): Ditto. ! * nnml.el (nnml-id-to-number): New function. ! (nnml-request-article): Allow fetches by Message-ID. ! * gnus.el (gnus-summary-import-article): Insert Message-ID and ! Lines. ! (gnus-summary-set-local-parameters): New function to allow local ! variables in group parameters. ! (gnus-summary-mode-line-format-alist): Allow unprefixed group name ! in the mode lines. ! * gnus-msg.el (gnus-mail-reply-using-mail): New key in mail ! buffers. ! (gnus-put-message): New function. ! Mon Sep 18 11:42:37 1995 Lars Ingebrigtsen ! * gnus.el (gnus-article-date-original): New command and keystroke. ! (gnus-article-parent-p): New function. ! (gnus-summary-article-parent): New function. ! (gnus-summary-article-children): New function. ! (gnus-summary-go-down-thread): New implementation. ! (gnus-summary-go-up-thread): Ditto. ! (gnus-getenv-nntpserver): New function to use /etc/nntpserver. ! (gnus-select-method): Use it. ! (gnus-nntp-server-file): New variable. ! (gnus-summary-gather-exclude-subject): New variable. ! (gnus-gather-threads): Use it. ! (gnus-summary-refer-references): New command and keystroke. ! * gnus-cite.el (gnus-cite-attribution-suffix): Changed name from ! `gnus-cite-attribution-postfix'. ! * nnml.el (nnml-request-expire-articles): Feature group name in ! message. ! * nnmbox.el (nnmbox-request-expire-articles): Ditto. ! * nnbabyl.el (nnbabyl-request-expire-articles): Ditoo. ! * nnmh.el (nnmh-request-expire-articles): Ditto. ! * nnfolder.el (nnfolder-request-expire-articles): Ditto. ! * gnus-uu.el (gnus-uu-mark-buffer): New command and keystroke. + * gnus.el (gnus-make-threads): Minimized implementation. + (gnus-make-threads-and-expunge): Removed. + (gnus-get-newsgroup-headers): Do full threading here. + (gnus-summary-prepare-threads): Do weeding here. + (gnus-summary-prepare-unthreaded): And here. + (gnus-nov-parse-line): Do full threading here as well. + (gnus-request-scan): New function, and new functions in all the + mail backends. + (gnus-activate-group): Possibly scan. + (gnus-master-read-slave-newsrc): New function. + (gnus-slave-save-newsrc): New function. + (gnus-read-newsrc-file): Use them. + (gnus-slave): New command. + + Sun Sep 17 16:04:38 1995 Lars Ingebrigtsen + + * gnus.el (gnus-total-expirable-newsgroups): New variable. + (gnus-group-total-expirable-p): New function; use it. + (gnus-group-auto-expirable-p): New function. Allow + `(auto-expire . t)'. + (gnus-get-newsgroup-headers): Faster implementation. + + * nnheader.el (nnheader-insert-references): Used a Gnus function. + + * nnmail.el (nnmail-delete-incoming): Changed default to nil. + (nnmail-get-new-mail): New function. + * nnfolder.el (nnfolder-get-new-mail): Use it. + * nnmh.el (nnmh-get-new-mail): Ditto. * nnml.el (nnml-get-new-mail): Ditto. + * nnmbox.el (nnmbox-get-new-mail): Ditto. + * nnbabyl.el (nnbabyl-get-new-mail): Ditto. ! * nnheader.el (nnheader-max-head-length): New variable. ! (nnheader-insert-head): Use it. ! * gnus.el (gnus-summary-find-matching): New function. ! (gnus-newsgroup-data-reverse, gnus-newsgroup-limit, ! gnus-newsgroup-limits, gnus-newsgroup-data): New variables. ! (gnus-summary-mode-map): New limit map. ! (gnus-summary-limit-to-subject): New command and keystroke. ! (gnus-summary-limit-to-articles): New command and keystroke. ! (gnus-summary-limit-to-unread): Changed name. ! (gnus-summary-limit-to-score): Changed name. ! (gnus-summary-unlimit-dormant): Changed name. ! (gnus-summary-limit-to-nondormant): Changed name. ! (gnus-summary-limit): New function. ! (gnus-data-*): New macros and functions. ! (gnus-summary-limit-to-marks): Changed name. *** pub/sgnus/texi/gnus.texi Sat Sep 16 09:56:16 1995 --- sgnus/texi/gnus.texi Wed Sep 20 23:20:59 1995 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @comment %**start of header (This is for running Texinfo on a region.) @setfilename gnus.info ! @settitle Gnus 5.0 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @comment %**start of header (This is for running Texinfo on a region.) @setfilename gnus.info ! @settitle September Gnus Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 45,51 **** @iftex @titlepage ! @title Gnus Manual @author by Lars Magne Ingebrigtsen @page --- 45,51 ---- @iftex @titlepage ! @title September Gnus Manual @author by Lars Magne Ingebrigtsen @page *************** *** 134,139 **** --- 134,140 ---- * Why?:: What's the point of Gnus? * Compatibility:: Just how compatible is Gnus with @sc{gnus}? * Conformity:: Gnus tries to conform to all standards. + * Emacsen:: Gnus can be run on a few modern Emacsen. * Contributors:: Oodles of people. * New Features:: Pointers to some of the new stuff in Gnus. * Newest Features:: Features so new that they haven't been written yet. *************** *** 280,285 **** --- 281,320 ---- don't hesitate to drop a note to Gnus Towers and let us know. + @node Emacsen + @section Emacsen + @cindex Emacsen + @cindex XEmacs + @cindex Mule + @cindex Emacs + + Gnus should work on Emacs 19.26 and up, XEmacs 19.12 and up and Mule. + There are some vague differences in what Gnus does, though: + + @itemize @bullet + + @item + The mouse-face on Gnus lines under Emacs and Mule is delimited to + certain parts of the lines while they cover the entire line under + XEmacs. + + @item + The same with current-article marking -- XEmacs puts an underline under + the entire article while Emacs and Mule are nicer and kinder. + + @item + XEmacs features more graphics -- a logo and a toolbar. + + @item + Citation highlighting us better under Emacs and Mule than under XEmacs. + + @item + Emacs 19.26-19.28 have tangible hidden headers, which can be a bit + confusing. + + @end itemize + + @node Contributors @section Contributors @cindex contributors *************** *** 633,638 **** --- 668,674 ---- * Finding the News:: Choosing a method for getting news. * The First Time:: What does Gnus do the first time you start it? * The Server is Down:: How can I read my mail then? + * Slave Gnusii:: You can have more than one Gnus active at a time. * New Groups:: What is Gnus supposed to do with new groups? * Startup Files:: Those pesky startup files - @file{.newsrc}. * Auto Save:: Recovering from a crash. *************** *** 666,675 **** If you can use a local spool, you probably should, as it will almost certainly be much faster. If this variable is not set, Gnus will take a look at the ! @code{NNTPSERVER} environment variable. If that isn't set either, it ! will try to use the machine that is running Emacs as an @sc{nntp} ! server. @vindex gnus-nntp-server If @code{gnus-nntp-server} is set, this variable will override --- 702,716 ---- If you can use a local spool, you probably should, as it will almost certainly be much faster. + @vindex gnus-nntpserver-file + @cindex NNTPSERVER + @cindex nntp server If this variable is not set, Gnus will take a look at the ! @code{NNTPSERVER} environment variable. If that variable isn't set, ! Gnus will see whether @code{gnus-nntpserver-file} (default ! @file{/etc/nntpserver}) has any opinions in the matter. It that fails ! as well, Gnus will will try to use the machine that is running Emacs as ! an @sc{nntp} server. That's a longshot, though. @vindex gnus-nntp-server If @code{gnus-nntp-server} is set, this variable will override *************** *** 751,756 **** --- 792,837 ---- find it difficult to actually do anything in the group buffer. But, hey, that's your problem. Blllrph! + @findex gnus-no-server + If you know that the server is definitely down, or you just want to read + your mail without bothering with the server at all, you can use the + @code{gnus-no-server} command to start Gnus. That might come in handy + if you're in a hurry as well. + + + @node Slave Gnusii + @section Slave Gnusii + @cindex slave + + You might with to run more than one Emacs with more than one Gnus at the + same time. If you are using different @file{.newsrc} files (eg., if you + are using the two different Gnusii to read from two different servers), + that is no problem whatsoever. You just do it. + + The problem appears when you want to run two Gnusii that uses the same + @code{.newsrc} file. + + To work around that problem some, we here at the Think-Tank at the Gnus + Towers have come up with a new concept: @dfn{Master} and + @dfn{servants}. (We have applied for a patent on this concept, and have + taken out a copyright on those words. If you wish to use those words in + conjunction with each other, you have to send ¢1 per usage to me. Usage + of the patent (@dfn{Master/Slave Relationships In Computer + Applications}), that will be much more expensive, of course.) + + Anyways, you start one Gnus up the normal way with @kbd{M-x gnus} (or + however you do it). Each subsequent slave Gnusii should be started with + @kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc} + files, but some slave files that contains only information on what + groups have been read in the slave session. When a master Gnus starts, + it will read (and delete) these slave files, incorporating all + information from all of them. (The slave files will be read in the + sequence they were created, so the latest changes will have presedence.) + + Information from the slave files has, of course, presedence over the + information in the normal (i. e., master) @code{.newsrc} file. + + @node New Groups @section New Groups @cindex new groups *************** *** 949,958 **** If this variable is @code{nil}, Gnus will as for group info in total lock-step, which isn't very fast. If it is @code{some} and you use an ! NNTP server, Gnus will pump out commands as fast as it can, and read all ! the replies in one swoop. This will normally result in better performance, but if the server does not support the aforementioned ! @samp{LIST ACTIVE group} command, this isn't very nice to the server. In any case, if you use @code{some} or @code{nil}, you should kill all groups that you aren't interested in. --- 1030,1039 ---- If this variable is @code{nil}, Gnus will as for group info in total lock-step, which isn't very fast. If it is @code{some} and you use an ! @sc{nntp} server, Gnus will pump out commands as fast as it can, and ! read all the replies in one swoop. This will normally result in better performance, but if the server does not support the aforementioned ! @samp{LIST ACTIVE group} command, this isn't very nice to the server. In any case, if you use @code{some} or @code{nil}, you should kill all groups that you aren't interested in. *************** *** 1688,1693 **** --- 1769,1780 ---- that it can without bound. If it is @code{nil}, no pre-fetching will be made. + @item nntp-warn-about-losing-connection + @vindex nntp-warn-about-losing-connection + If this variable is non-@code{nil}, some noise will be made when a + server closes connection. + + @end table @node nnspool *************** *** 2297,2314 **** expire the final article in a mail newsgroup. This is to make life easier for procmail users. By the way, that line up there about Gnus never expiring non-expirable articles is a lie. If you put @code{total-expire} in the group parameters, articles will not be marked as expirable, but all read articles will be put through the expiry process. Use with extreme ! caution. - Note that at present, Gnus will not actually delete any expirable - articles automatically. You have to enter one of the expiry functions - (eg. `C-c M-c-x' in the group buffer) to actually run articles through - the expiry process. Or you can add a call to the expiry function in the - group exit hook. Gnus will probably do all this automatically in the - future. @node Not Reading Mail @subsubsection Not Reading Mail --- 2384,2404 ---- expire the final article in a mail newsgroup. This is to make life easier for procmail users. + @vindex gnus-total-expirable-newsgroups By the way, that line up there about Gnus never expiring non-expirable articles is a lie. If you put @code{total-expire} in the group parameters, articles will not be marked as expirable, but all read articles will be put through the expiry process. Use with extreme ! caution. Even more dangerous is the ! @code{gnus-total-expirable-newsgroups} variable. All groups that match ! this regexp will have all read articles put through the expiry process, ! which means that @emph{all} old mail articles in the groups in question ! will be deleted after a while. Use with extreme caution, and don't come ! crying to me when you discover that the regexp you used matched the ! wrong group and all your important mail has disappeared. Be a ! @emph{man}! Or a @emph{woman}! Whatever you feel more comfortable ! with! So there! @node Not Reading Mail @subsubsection Not Reading Mail *************** *** 2544,2550 **** In fact, the vast majority of groups will normally only have the first three elements, which saves quite a lot of cons cells. ! At present, there's not much you can put in the group parameters list: @table @code @item to-address --- 2634,2640 ---- In fact, the vast majority of groups will normally only have the first three elements, which saves quite a lot of cons cells. ! The group parameters stores information local to a particular group: @table @code @item to-address *************** *** 2577,2587 **** If this symbol is present, all read articles will be put through the expiry process, even if they are not marked as expirable. Use with caution. @end table ! If you want to change the group parameters (or anything else of the ! group info) you can use the @kbd{G E} to edit enter a buffer where you ! can edit the group info. You usually don't want to edit the entire group info, so you'd be better off using the @kbd{G p} command to just edit the group parameters. --- 2667,2692 ---- If this symbol is present, all read articles will be put through the expiry process, even if they are not marked as expirable. Use with caution. + + @item @var{(variable form)} + You can use the group parameters to set variables local to the group you + are entering. Say you want to turn threading off in + @samp{news.answers}. You'd then put @code{(gnus-show-threads nil)} in + the group parameters of that group. @code{gnus-show-threads} will be + made into a local variable in the summary buffer you enter, and the form + @code{nil} will be @code{eval}ed there. + + This can also be used as a group-specific hook function, if you'd like. + If you want to hear a beep when you enter the group + @samp{alt.binaries.pictures.furniture}, you could put something like + @code{(dummy-variable (ding))} in the parameters of that group. + @code{dummy-variable} will be set to the result of the @code{(ding)} + form, but who cares? + @end table ! If you want to change the group info you can use the @kbd{G E} command ! to enter a buffer where you can edit it. You usually don't want to edit the entire group info, so you'd be better off using the @kbd{G p} command to just edit the group parameters. *************** *** 2897,2902 **** --- 3002,3008 ---- * Reply Followup and Post:: Posting articles. * Canceling and Superseding:: "Whoops, I shouldn't have called him that." * Marking Articles:: Marking articles as read, expirable, etc. + * Limiting:: You can limit the summary buffer. * Threading:: How threads are made. * Asynchronous Fetching:: Gnus might be able to pre-fetch articles. * Article Caching:: You may store articles in a cache. *************** *** 2904,2909 **** --- 3010,3016 ---- * Process/Prefix:: A convention used by many treatment commands. * Saving Articles:: Ways of customizing article saving. * Decoding Articles:: Gnus can treat series of (uu)encoded articles. + * Article Treatment:: The article buffer can be mangled at will. * Various Article Stuff:: Various stuff dealing with articles. * Summary Sorting:: You can sort the summary buffer four ways. * Finding the Parent:: No child support? Get the parent. *************** *** 3048,3053 **** --- 3155,3162 ---- @table @samp @item G Group name. + @item p + Unprefixed group name. @item A Current article number. @item V *************** *** 3263,3274 **** --- 3372,3385 ---- @cindex article scrolling @table @kbd + @item SPACE @kindex SPACE (Summary) @findex gnus-summary-next-page Pressing @kbd{SPACE} will scroll the current article forward one page, or, if you have come to the end of the current article, will choose the next article (@code{gnus-summary-next-page}). + @item DEL @kindex DEL (Summary) @findex gnus-summary-prev-page *************** *** 3278,3283 **** --- 3389,3395 ---- @findex gnus-summary-scroll-up Scroll the current article one line forward (@code{gnus-summary-scroll-up}). + @item A < @itemx < @kindex < (Summary) *************** *** 3285,3296 **** --- 3397,3416 ---- @findex gnus-summary-beginning-of-article Scroll to the beginning of the article (@code{gnus-summary-beginning-of-article}). + @item A > @itemx > @kindex > (Summary) @kindex A > (Summary) @findex gnus-summary-end-of-article Scroll to the end of the article (@code{gnus-summary-end-of-article}). + + @item A s + @kindex A s (Summary) + @findex gnus-summary-isearch-article + Perform an isearch in the article buffer + (@code{gnus-summary-isearch-article}). + @end table @node Reply Followup and Post *************** *** 3311,3316 **** --- 3431,3437 ---- * Mail:: Mailing & replying. * Post:: Posting and following up. * Mail & Post:: Mailing and posting at the same time. + * Drafts:: Postponing messages and rejected messages. @end menu @node Mail *************** *** 3351,3356 **** --- 3472,3490 ---- @findex gnus-summary-mail-other-window Send a mail to some other person (@code{gnus-summary-mail-other-window}). + @item S D b + @kindex S D b (Summary) + @findex gnus-summary-resend-bounced-mail + If you have sent a mail, but the mail was bounced back to you for some + reason (wrong address, transient failure), you can use this command to + resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You + will be popped into a mail buffer where you can edit the headers before + sending the mail off again. The headers that match the regexp + @code{gnus-bounced-headers-junk} (default @samp{^Received:}) are + automatically deleted first. If you give a prefix to this command, and + the bounced mail is a reply to some other mail, Gnus will try to fetch + that mail and display it for easy perusal of its headers. This might + very well fail, though. @item S O m @kindex S O m (Summary) @findex gnus-uu-digest-mail-forward *************** *** 3411,3420 **** --- 3545,3578 ---- headers will be included in the sequence they are matched. @item gnus-mail-hook + @vindex gnus-mail-hook Hook called as the last thing after setting up a mail buffer. + @item gnus-required-mail-headers + @vindex gnus-required-mail-headers + Gnus will generate headers in all outgoing mail instead of letting + @code{sendmail} do it for us. This makes it possible to do more neat + stuff, like putting mail without sending it, do hairy @code{Fcc} + handling, and much more. This variable controls what headers Gnus will + generate, and is of the exact same form as @code{gnus-required-headers}, + which does the same for news articles (@pxref{Post}). + + The @code{Newsgroups} header is illegal in this list, while @code{To} is + required, and @code{X-Mailer} can be added if you so should want. + @end table + @kindex C-c C-c (Mail) + @kindex C-c C-p (Mail) + @findex gnus-put-message + You normally send a mail message by pressing @kbd{C-c C-c}. However, + you may wish to just put the mail message you have just written in your + own local mail group instead of sending it. Sounds quite unlikely, but + I found that useful, so you can now also press @kbd{C-c C-p} to + @dfn{put} the article in the current mail group, or, if there is no such + thing, you will be prompted for a mail group, and then the article will + be put there. This means that the article is @dfn{not} mailed. + There are three "methods" for handling all mail. The default is @code{sendmail}. Some people like what @code{mh} does better, and some people prefer @code{vm}. *************** *** 3715,3720 **** --- 3873,3881 ---- Check whether there is any new text in the messages. @item signature Check the length of the signature + @item approved + Check whether the article has an @code{Approved} header, which is + something only moderators should include. @end table @end table *************** *** 3828,3833 **** --- 3989,4006 ---- This is a string that will be prepended to all mails that are the result of using the variable described above. + @item gnus-outgoing-message-group + @vindex gnus-outgoing-message-group + All outgoing messages will be put in this group. If you want to store + all your outgoing mail and articles in the group @samp{nnml:archive}, + you set this variable to that value. This variable can also be a list of + group names. + + If you want to have greater control over what group to put each + message in, you can set this variable to a function that checks the + current newsgroup name and then returns a suitable group name (or list + of names). + @end table You may want to do spell-checking on messages that you send out. Or, if *************** *** 3846,3851 **** --- 4019,4084 ---- @code{gnus-inews-insert-mime-headers} to @code{gnus-inews-article-hook}. + @node Drafts + @subsection Drafts + @cindex drafts + + If you are writing a message (mail or news) and suddenly remember that + you have a steak in the oven (or pesto in the food processor, you craazy + vegetarians), you'll probably wish there was a method to save the + message you are writing so that you can continue editing it some other + day, and send it when you feel its finished. + + @kindex C-c C-d (Mail) + @kindex C-c C-d (Post) + @findex gnus-enter-into-draft-group + @vindex gnus-group-draft-directory + What you then do is simply push @kbd{C-c C-d} + (@code{gnus-enter-into-draft-group}). This will put the current + (unfinished) message in a special draft group (which is implemented as + an @code{nndir} group, if you absolutely have to know) called + @samp{nndir:drafts}. The variable @code{gnus-group-draft-directory} + controls both the name of the group and the location -- the leaf element + in the path will be used as the name of the group. + + If the group doesn't exist, it will be created and subscribed to. + + @findex gnus-summary-send-draft + @kindex S D c + When you want to continue editing, you simply enter the draft group and + push @kbd{S D c} (@code{gnus-summary-send-draft}) to do that. You will + be placed in a buffer where you left off. + + Rejected articles will also be put in this draft group (@pxref{Rejected + Articles}). + + @findex gnus-summary-send-all-drafts + If you have lots of rejected messages you want to post (or mail) without + doing further editing, you can use the @kbd{S D a} command + (@code{gnus-summary-send-all-drafts}). This command understands the + process/prefix convention. + + + @node Rejected Articles + @subsection Rejected Articles + @cindex rejected articles + + Sometimes a news server will reject an article. Perhaps the server + doesn't like your face. Perhaps it just feels miserable. Perhaps there + be demons. Perhaps you have included too much cited text. Perhaps the + disk is full. Perhaps the server is down. + + These situations are, of course, totally beyond the control of Gnus. + (Gnus, of course, loves the way you look, always feels great, has angels + fluttering around in it, doesn't care about how much cited text you + include, never runs full and never goes down.) So what Gnus does is + saves these articles until some later time when the server feels better. + + The rejected articles will automatically be put in a special draft group + (@pxref{Drafts}). When the server comes back up again, you'd then + typically enter that group and send all the articles off. + + @node Canceling and Superseding @section Canceling Articles @cindex canceling articles *************** *** 4091,4096 **** --- 4324,4334 ---- @findex gnus-summary-mark-region-as-read Mark all articles between point and mark as read (@code{gnus-summary-mark-region-as-read}). + @item M V k + @kindex M V k (Summary) + @findex gnus-summary-kill-below + Kill all articles with scores below the default score (or below the + numeric prefix) (@code{gnus-summary-kill-below}). @item M c @itemx M-u @kindex M c (Summary) *************** *** 4115,4149 **** @findex gnus-summary-remove-bookmark Remove the bookmark from the current article (@code{gnus-summary-remove-bookmark}). - @item M M-r - @itemx x - @kindex M M-r (Summary) - @kindex M-d (Summary) - @findex gnus-summary-remove-lines-marked-as-read - Expunge all deleted articles from the summary buffer - (@code{gnus-summary-remove-lines-marked-as-read}). - @item M M-C-r - @kindex M M-C-r (Summary) - @findex gnus-summary-remove-lines-marked-with - Ask for a mark and then expunge all articles that have been marked with - that mark (@code{gnus-summary-remove-lines-marked-with}). - @item M S - @kindex M S (Summary) - @findex gnus-summary-show-all-expunged - Display all expunged articles (@code{gnus-summary-show-all-expunged}). - @item M D - @kindex M D (Summary) - @findex gnus-summary-show-all-dormant - Display all dormant articles (@code{gnus-summary-show-all-dormant}). - @item M M-D - @kindex M M-D (Summary) - @findex gnus-summary-hide-all-dormant - Hide all dormant articles (@code{gnus-summary-hide-all-dormant}). - @item M V k - @kindex M V k (Summary) - @findex gnus-summary-kill-below - Kill all articles with scores below the default score (or below the - numeric prefix) (@code{gnus-summary-kill-below}). @item M V c @kindex M V c (Summary) @findex gnus-summary-clear-above --- 4353,4358 ---- *************** *** 4168,4173 **** --- 4377,4383 ---- the next/previous unread article. If @code{nil}, point will just move one line up or down. + @node Setting Process Marks @subsection Setting Process Marks @cindex setting process marks *************** *** 4205,4210 **** --- 4415,4425 ---- @findex gnus-uu-mark-thread Mark all articles in the current (sub)thread (@code{gnus-uu-mark-thread}). + @item M P T + @kindex M P T (Summary) + @findex gnus-uu-unmark-thread + Unmark all articles in the current (sub)thread + (@code{gnus-uu-unmark-thread}). @item M P s @kindex M P s (Summary) @findex gnus-uu-mark-series *************** *** 4218,4225 **** --- 4433,4524 ---- @kindex M P a (Summary) @findex gnus-uu-mark-all Mark all articles in series order (@code{gnus-uu-mark-series}). + @item M P b + @kindex M P b (Summary) + @findex gnus-uu-mark-buffer + Mark all articles in the buffer in the order they appear + (@code{gnus-uu-mark-buffer}). @end table + + @node Limiting + @subsection Limiting + + It can be convenient to limit the summary buffer to just show some + subset of the articles currently in the group. The effect most limit + commands have is to remove a few (or many) articles from the summary + buffer. + + @table @kbd + + @item M N u + @itemx x + @kindex M N u (Summary) + @kindex x (Summary) + @findex gnus-summary-limit-to-unread + Limit the summary buffer to articles that are not marked as read + (@code{gnus-summary-limit-to-unread}). If given a prefix, limit the + buffer to articles that are strictly unread. This means that ticked and + dormant articles will also be excluded. + + @item M N m + @kindex M N m (Summary) + @findex gnus-summary-limit-to-marks + Ask for a mark and then limit to all articles that have not been marked + with that mark (@code{gnus-summary-limit-to-marks}). + + @item M N n + @kindex M N n (Summary) + @findex + Limit the summary buffer to the current article + (@code{gnus-summary-limit-to-articles}). Uses the process/prefix + convention (@pxref{Process/Prefix}). + + @item M N w + @kindex M N w (Summary) + @findex gnus-summary-pop-limit + Pop the previous limit off the stack and restore it + (@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off + the stack. + + @item M N s + @itemx / + @kindex M N s (Summary) + @kindex / (Summary) + @findex gnus-summary-limit-to-subject + Limit the summary buffer to articles that have a subject that matches a + regexp (@code{gnus-summary-limit-to-subject}). + + @item M N v + @kindex M N v (Summary) + @findex gnus-summary-limit-to-score + Limit the summary buffer to articles that have a score at or above some + score (@code{gnus-summary-limit-to-score}). + + @item M S + @kindex M S (Summary) + @findex gnus-summary-show-all-expunged + Display all expunged articles (@code{gnus-summary-show-all-expunged}). + + @item M N D + @kindex M N D (Summary) + @findex gnus-summary-limit-include-dormant + Display all dormant articles (@code{gnus-summary-limit-include-dormant}). + + @item M N d + @kindex M N d (Summary) + @findex gnus-summary-limit-exclude-dormant + Hide all dormant articles (@code{gnus-summary-limit-exclude-dormant}). + + @item M N c + @kindex M N c (Summary) + @findex gnus-summary-limit-exclude-childless-dormant + Hide all dormant articles that have no children + (@code{gnus-summary-limit-exclude-childless-dormant}). + + + + @node Threading @section Threading @cindex threading *************** *** 4247,4263 **** the rest of the variables here will have no effect. Turning threading off will speed group selection up a bit, but it is sure to make reading slower and more awkward. @item gnus-fetch-old-headers @vindex gnus-fetch-old-headers If non-@code{nil}, Gnus will attempt to build old threads by fetching more old headers - headers to articles that are marked as read. If you would like to display as few summary lines as possible, but still connect as many loose threads as possible, you should set this variable ! to @code{some}. In either case, fetching old headers only works if the ! backend you are using carries overview files -- this would normally be ! @code{nntp}, @code{nnspool} and @code{nnml}. Also remember that if the ! root of the thread has been expired by the server, there's not much Gnus ! can do about that. @item gnus-summary-gather-subject-limit Loose threads are gathered by comparing subjects of articles. If this --- 4546,4564 ---- the rest of the variables here will have no effect. Turning threading off will speed group selection up a bit, but it is sure to make reading slower and more awkward. + @item gnus-fetch-old-headers @vindex gnus-fetch-old-headers If non-@code{nil}, Gnus will attempt to build old threads by fetching more old headers - headers to articles that are marked as read. If you would like to display as few summary lines as possible, but still connect as many loose threads as possible, you should set this variable ! to @code{some} or a number. If you set it to a number, no more than ! that number of extra old headers will be fetched. In either case, ! fetching old headers only works if the backend you are using carries ! overview files -- this would normally be @code{nntp}, @code{nnspool} and ! @code{nnml}. Also remember that if the root of the thread has been ! expired by the server, there's not much Gnus can do about that. @item gnus-summary-gather-subject-limit Loose threads are gathered by comparing subjects of articles. If this *************** *** 4274,4279 **** --- 4575,4588 ---- If you set this variable to the special value @code{fuzzy}, Gnus will use a fuzzy string comparison algorithm on the subjects. + @vindex gnus-summary-gather-exclude-subject + Since loose thread gathering is done on subjects only, that might lead + to many false hits, especially with certain common subjects like + @samp{""} and @samp{"(none)"}. To make the situation slightly better, + you can use the regexp @code{gnus-summary-gather-exclude-subject} to say + what subjects should be excluded from the gathering process. The + default is @samp{"^ *$\\|^(none)$"}. + @item gnus-summary-make-false-root @vindex gnus-summary-make-false-root If non-@code{nil}, Gnus will gather all loose subtrees into one big tree *************** *** 4359,4366 **** @item T # @kindex T # (Summary) @findex gnus-uu-mark-thread ! Mark the current thread with the process mark (@code{gnus-uu-mark-thread}). @item T T @kindex T T (Summary) @findex gnus-summary-toggle-threads --- 4668,4680 ---- @item T # @kindex T # (Summary) @findex gnus-uu-mark-thread ! Set the process mark on the current thread (@code{gnus-uu-mark-thread}). + @item T M-# + @kindex T M-# (Summary) + @findex gnus-uu-unmark-thread + Remove the process mark from the current thread + (@code{gnus-uu-unmark-thread}). @item T T @kindex T T (Summary) @findex gnus-summary-toggle-threads *************** *** 5105,5129 **** @emph{virtual newsgroup} from the @emph{virtual server}; and you think: Why isn't anything real anymore? How did we get here? ! @node Various Article Stuff ! @section Various Article Stuff @table @kbd @item W l @kindex W l (Summary) @findex gnus-summary-stop-page-breaking Remove page breaks from the current article (@code{gnus-summary-stop-page-breaking}). ! @item A s ! @kindex A s (Summary) ! @findex gnus-summary-isearch-article ! Perform an isearch in the article buffer ! (@code{gnus-summary-isearch-article}). @item W r @kindex W r (Summary) @findex gnus-summary-caesar-message Do a Caesar rotate (rot13) on the article buffer (@code{gnus-summary-caesar-message}). @item A g @kindex A g (Summary) @findex gnus-summary-show-article --- 5419,5604 ---- @emph{virtual newsgroup} from the @emph{virtual server}; and you think: Why isn't anything real anymore? How did we get here? ! ! @node Article Treatment ! @section Article Treatment ! ! Reading through this huge manual, you may have quite forgotten that the ! object of newsreaders are to actually, like, read what people have ! written. Reading articles. Unfortunately, people are quite bad at ! writing, so there are tons of functions and variables to make reading ! these articles easier. ! ! @menu ! * Article Highlighting:: You want to make the article look like fruit salad. ! * Article Hiding:: You also want to make certain info go away. ! * Article Mangling:: Lots of way-neat functions to make life better. ! * Article Date:: Grumble, UT! ! @end menu ! ! ! @node Article Highlighing ! @subsection Article Highlighting ! @cindex highlight ! ! Not only do you want your article buffer to look like fruit salad, but ! you want it to look like techicolor fruit salad. @table @kbd + + @item W H a + @kindex W H a + @findex gnus-article-highlight + Highlight the current article (@code{gnus-article-highlight}). + + @item W H h + @kindex W H h + @findex gnus-article-highlight-headers + @vindex gnus-header-face-alist + Highlight the headers (@code{gnus-article-highlight-headers}). The + highlighting will be done according to the @code{gnus-header-face-alist} + variable, which is a list where each element has the form @var{(regexp + name content)}. @var{regexp} is a regular expression for matching the + header, @var{name} is the face used for highling the header name and + @var{content} is the face for highlighting the header value. The first + match made will be used. + + @item W H c + @kindex W H c + @findex gnus-article-highlight-citation + Highlight cited text (@code{gnus-article-highlight-citation}). + + Some variables to customize the citation highlights: + + @table @code + @vindex gnus-cite-parse-max-size + @item gnus-cite-parse-max-size + If the article size if bigger than this variable (which is 25000 by + default), no citation highlighting will be performed. + + @item gnus-cite-prefix-regexp + @vindex gnus-cite-prefix-regexp + Regexp mathcing the longest possible citation prefix on a line. + + @item gnus-cite-max-prefix + @vindex gnus-cite-max-prefix + Maximum possible length for a citation prefix (default 20). + + @item gnus-supercite-regexp + @vindex gnus-supercite-regexp + Regexp matching normal SuperCite attribution lines. + + @item gnus-supercite-secondary-regexp + @vindex gnus-supercite-secondary-regexp + Regexp matching mangled SuperCite attribution lines. + + @item gnus-cite-minimum-match-count + @vindex gnus-cite-minimum-match-count + Minimum number of identical prefixes we have to see before we believe + that it's a citation. + + @item gnus-cire-attribution-prefix + @vindex gnus-cire-attribution-prefix + Regexp matching the beginning of an attribution line. + + @item gnus-cite-addtribution-suffix + @vindex gnus-cite-addtribution-suffix + Regexp matching the end of an attribution line. + + @item gnus-cite-attribution-face + @vindex gnus-cite-attribution-face + Face used for attribution lines. It is merged with the face for the + cited text belonging to the attribution. + + @end table + + + @item W H s + @kindex W H s + @vindex gnus-signature-separator + @findex gnus-article-highlight-signature + Highlight the signature (@code{gnus-article-highlight-signature}). + Everything after @code{gnus-signature-separator} in an article will be + considered a signature. + + @end table + + + @node Article Hiding + + Or rather, hiding certain things in each article. There usually is much + to much gruft in most articles. + + @table @kbd + + @item W W a + @kindex W W a (Summary) + @findex gnus-article-hide + Do maximum hiding on the summary buffer (@kbd{gnus-article-hide}). + + @item W W h + @kindex W W h (Summary) + @findex gnus-article-hide-headers + Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding + Headers}. + + @item W W s + @kindex W W s (Summary) + @findex gnus-article-hide-signature + Hide signature (@code{gnus-article-hide-signature}). + + @item W W c + @kindex W W c (Summary) + @findex gnus-article-hide-citation + Hide citation (@code{gnus-article-hide-citation}). Two variables for + customizing the hiding: + + @table @code + + @item gnus-cite-hide-percentage + @vindex gnus-cite-hide-percentage + If the cited text is of a bigger percentage than this variable (default + 50), hide the cited text. + + @item gnus-cite-hide-absolute + @vindex gnus-cite-hide-absolute + The cited text must be have at least this length (default 10) before it + is hidden. + + @end table + + Also see @xref{Article Highlighting} for further variables for + citation customization. + + @end table + + @end table + + + @node Article Washing + @section Article Washin + + We call this "article washing" for a really good reason. Namely, the + @kbd{A} key was taken, so we had to use the @kbd{W} key instead. + + @dfn{Washing} is defined by us as "changing something from something to + something else", but normally results in something looking better. + Cleaner, perhaps. + + @table @kbd + @item W l @kindex W l (Summary) @findex gnus-summary-stop-page-breaking Remove page breaks from the current article (@code{gnus-summary-stop-page-breaking}). ! @item W r @kindex W r (Summary) @findex gnus-summary-caesar-message Do a Caesar rotate (rot13) on the article buffer (@code{gnus-summary-caesar-message}). + @item A g @kindex A g (Summary) @findex gnus-summary-show-article *************** *** 5131,5179 **** given a prefix, don't actually refetch any articles, just jump to the current article and configure the windows to display the current article. @item W t @kindex W t (Summary) @findex gnus-summary-toggle-header Toggle whether to display all headers in the article buffer (@code{gnus-summary-toggle-header}). @item W m @kindex W m (Summary) @findex gnus-summary-toggle-mime Toggle whether to run the article through @sc{mime} before displaying (@code{gnus-summary-toggle-mime}). - @end table - There's a battery of commands for washing the article buffer: - - @table @kbd - @item W W h - @kindex W W h (Summary) - @findex gnus-article-hide-headers - Hide headers (@code{gnus-article-hide-headers}). - @item W W s - @kindex W W s (Summary) - @findex gnus-article-hide-signature - Hide signature (@code{gnus-article-hide-signature}). - @item W W c - @kindex W W c (Summary) - @findex gnus-article-hide-citation - Hide citation (@code{gnus-article-hide-citation}). @item W o @kindex W o (Summary) @findex gnus-article-treat-overstrike Treat overstrike (@code{gnus-article-treat-overstrike}). @item W w @kindex W w (Summary) @findex gnus-article-word-wrap Do word wrap (@code{gnus-article-word-wrap}). @item W c @kindex W c (Summary) @findex gnus-article-remove-cr Remove CR (@code{gnus-article-remove-cr}). @item W q @kindex W q (Summary) @findex gnus-article-de-quoted-unreadable Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}). @item W f @kindex W f (Summary) @cindex x-face --- 5606,5644 ---- given a prefix, don't actually refetch any articles, just jump to the current article and configure the windows to display the current article. + @item W t @kindex W t (Summary) @findex gnus-summary-toggle-header Toggle whether to display all headers in the article buffer (@code{gnus-summary-toggle-header}). + @item W m @kindex W m (Summary) @findex gnus-summary-toggle-mime Toggle whether to run the article through @sc{mime} before displaying (@code{gnus-summary-toggle-mime}). @item W o @kindex W o (Summary) @findex gnus-article-treat-overstrike Treat overstrike (@code{gnus-article-treat-overstrike}). + @item W w @kindex W w (Summary) @findex gnus-article-word-wrap Do word wrap (@code{gnus-article-word-wrap}). + @item W c @kindex W c (Summary) @findex gnus-article-remove-cr Remove CR (@code{gnus-article-remove-cr}). + @item W q @kindex W q (Summary) @findex gnus-article-de-quoted-unreadable Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}). + @item W f @kindex W f (Summary) @cindex x-face *************** *** 5189,5234 **** argument. If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches the @code{From} header, the face will not be shown. ! @item W H a ! @kindex W H a ! @findex gnus-article-highlight ! Highlight the current article (@code{gnus-article-highlight}). ! @item W H h ! @kindex W H h ! @findex gnus-article-highlight-headers ! Highlight the headers (@code{gnus-article-highlight-headers}). ! @item W H c ! @kindex W H c ! @findex gnus-article-highlight-citation ! Highlight cited text (@code{gnus-article-highlight-citation}). ! @item W H s ! @kindex W H s ! @findex gnus-article-highlight-signature ! Highlight the signature (@code{gnus-article-highlight-signature}). @item W T u ! @kindex W T u @findex gnus-article-date-ut Display the date in UT (aka. GMT, aka ZULU) (@code{gnus-article-date-ut}). @item W T l ! @kindex W T l @findex gnus-article-date-local Display the date in the local timezone (@code{gnus-article-date-local}). @item W T e ! @kindex W T e @findex gnus-article-date-lapsed Say how much time has (e)lapsed between the article was posted and now (@code{gnus-article-date-lapsed}). @end table @node Summary Sorting @section Summary Sorting @cindex summary sorting --- 5654,5699 ---- argument. If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches the @code{From} header, the face will not be shown. ! @end table ! @node Article Date ! @section Article Date ! The date is most likely generated in some obscure timezone you've never ! heard of, so it's quite nice to be able to find out what the time was ! when the article was sent. ! @table @kbd @item W T u ! @kindex W T u (Summary) @findex gnus-article-date-ut Display the date in UT (aka. GMT, aka ZULU) (@code{gnus-article-date-ut}). @item W T l ! @kindex W T l (Summary) @findex gnus-article-date-local Display the date in the local timezone (@code{gnus-article-date-local}). @item W T e ! @kindex W T e (Summary) @findex gnus-article-date-lapsed Say how much time has (e)lapsed between the article was posted and now (@code{gnus-article-date-lapsed}). + @item W T o + @item W T o (Summary) + @findex gnus-article-date-original + Display the original date (@code{gnus-article-date-original}). This can + be useful if you normally use some other conversion function and is + worried that it might be doing something totally wrong. Say, claiming + that the article was posted in 1854. Although something like that is + @emph{totally} impossible. Don't you trust me? *titter* @end table + @node Summary Sorting @section Summary Sorting @cindex summary sorting *************** *** 5266,5271 **** --- 5731,5737 ---- toggle whether to use threading, type @kbd{T T} (@pxref{Thread Commands}). + @node Finding the Parent @section Finding the Parent @cindex parent articles *************** *** 5282,5287 **** --- 5748,5759 ---- you'll get the parent. If the parent is already displayed in the summary buffer, point will just move to this article. + @findex gnus-summary-refer-references + @kindex A R (Summary) + You can have Gnus fetch all articles mentioned in the @code{References} + header of the article by pushing @kbd{A R} + (code{gnus-summary-refer-references}). + @findex gnus-summary-refer-article @kindex M-^ (Summary) You can also ask the @sc{nntp} server for an arbitrary article, no *************** *** 5299,5304 **** --- 5771,5783 ---- as the one that keeps the spool you are reading from updated, but that's not really necessary. + Most of the mail backends support fetching by @code{Message-ID}, but do + not do a particularly excellent job of it. That is, @code{nnmbox} and + @code{nnbabyl} are able to locate articles from any groups, while + @code{nnml} and @code{nnfolder} are only able to locate articles that + have been posted to the current group. (Anything else would be too time + consuming.) @code{nnmh} does not support this at all. + @node Score Files @section Score Files @cindex score files *************** *** 6093,6098 **** --- 6572,6582 ---- (@code{gnus-summary-import-article}). You will be prompted for a file name, a @code{From} header and a @code{Subject} header. + Something similar can be done by just starting to compose a mail + message. Instead of typing @kbd{C-c C-c} to mail it off, you can type + @kbd{C-c C-p} instead. This will put the message you have just created + into the current mail group. + @item B r @kindex B r (Summary) @findex gnus-summary-respool-article *************** *** 6834,6839 **** --- 7318,7335 ---- set the resource @code{Emacs.backgroundMode} in your @file{~/.Xdefaults}. `gnus-display-type'. + @item nnheader-max-head-length + @vindex nnheader-max-head-length + When the backends read straight heads of articles, they all try to read + as little as possible. This variable (default @code{4096}) specifies + the absolute max length the backends will try to read before giving up + on finding a separator line between the head and the body. If this + variable is @code{nil}, there is no upper read bound. If it is + @code{t}, the backends won't try to read the articles piece by piece, + but read the entire articles. This makes sense with some versions of + @code{ange-ftp}. + + @end table @node Customization *************** *** 7085,7090 **** --- 7581,7588 ---- In the examples and definitions I will refer to the imaginary backend @code{nnchoke}. + @cindex nnchoke + @menu * Required Backend Functions:: Functions that must be implemented. * Optional Backend Functions:: Functions that need not be implemented. *************** *** 7096,7102 **** @table @code ! @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER) @var{articles} is either a range of article numbers or a list of @code{Message-ID}s. Current backends do not fully support either - only --- 7594,7600 ---- @table @code ! @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD) @var{articles} is either a range of article numbers or a list of @code{Message-ID}s. Current backends do not fully support either - only *************** *** 7107,7112 **** --- 7605,7618 ---- value should either be @code{headers} or @code{nov} to reflect this. This might later be expanded to @code{various}, which will be a mixture of HEADs and NOV lines, but this is currently not supported by Gnus. + + If @var{fetch-old} is non-@code{nil} it says to try to fetch "extra" + headers, in some meaning of the word. This is generally done by + fetching (at most) @var{fetch-old} extra headers less than the smallest + article number in @code{articles}, and fill in the gaps as well. The + presence of this parameter can be ignored if the backend finds it + cumbersome to follow the request. If this is non-@code{nil} and not a + number, do maximum fetches. Here's an example HEAD: *** pub/sgnus/texi/ChangeLog Thu Sep 21 01:16:37 1995 --- sgnus/texi/ChangeLog Wed Sep 20 17:36:11 1995 *************** *** 0 **** --- 1,26 ---- + Wed Sep 20 16:14:11 1995 Lars Ingebrigtsen + + * gnus.texi (Drafts): New. + (Thread Commands): Addition. + (Rejected Articles): New. + + Tue Sep 19 00:30:15 1995 Lars Ingebrigtsen + + * gnus.texi (Mail): Addition. + (Mail Group Commands): Addition. + (Group Parameters): Addition. + (Summary Buffer Mode Line): Addition. + (Finding the Parent): Addition. + + Mon Sep 18 11:49:16 1995 Lars Ingebrigtsen + + * gnus.texi (Limiting): New. + (Slave Gnusii): New. + (Setting Process Marks): Addition. + (The Server is Down): Change. + (Article Treatment): New. + (Article Hiding): New. + (Article Washing): New. + (Article Date): New. + (Finding the News): Addition. + (Customizing Threading): Addition.