From: ichikawa Date: Fri, 26 Jun 1998 13:52:16 +0000 (+0000) Subject: sync up with MainBranch .. gnus-6_7_3 X-Git-Tag: ichikawa-199811302358~55 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28719fdf2bca485254cc8f995e0ab58deb8aacd9;p=elisp%2Fgnus.git- sync up with MainBranch .. gnus-6_7_3 --- diff --git a/ChangeLog b/ChangeLog index d09700b..fd0d0d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,93 @@ +1998-06-26 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.7.3. + + * lisp/gnus-sum.el (gnus-summary-move-article): Use + `gnus-request-article-this-buffer'. + (gnus-request-partial-message): Likewise. + + * lisp/gnus-art.el (gnus-article-prepare): Use + `gnus-request-article-this-buffer'. + (gnus-request-article-this-buffer): Renamed from + `gnus-request-original-article'; abolish conventional + implementation. + - Abolish unused setting for `mime-view-show-summary-method'. + +1998-06-26 MORIOKA Tomohiko + + * readme, texi/ChangeLog, texi/gnus.texi, texi/message.texi, + lisp/ChangeLog, lisp/gnus.el, lisp/nnmail.el, lisp/nnheader.el, + lisp/nngateway.el, lisp/nnfolder.el, lisp/nnagent.el, + lisp/message.el, lisp/gnus-sum.el, lisp/gnus-score.el, + lisp/gnus-salt.el, lisp/gnus-msg.el, lisp/gnus-cus.el, + lisp/gnus-cache.el, lisp/gnus-art.el: Sync up with gnus-5_6_15. + +1998-06-24 MORIOKA Tomohiko + + * texi/gnus.texi, texi/message.texi, texi/ChangeLog: Sync up with + Gnus 5.6.13. + +1998-06-14 Tatsuya Ichikawa + + * Sync up with Gnus 5.6.13. + +1998-06-24 MORIOKA Tomohiko + + * lisp/gnus-art.el (gnus-article-display-mime-message): Don't + `save-excursion'. + (gnus-article-prepare): Use `mime-fetch-field' instead of + `mime-entity-fetch-field'. + +1998-06-19 MORIOKA Tomohiko + + * lisp/gnus-art.el (gnus-article-display-mime-message): Use + `mime-display-message' instead of `mime-view-buffer'. + (gnus-article-display-traditional-message): Set + `gnus-article-buffer'. + (gnus-article-display-message-with-encoded-word): Modify for + `gnus-article-display-traditional-message'. + (gnus-article-prepare): Use `mime-parse-buffer' and + `mime-entity-fetch-field'; don't set gnus-article-buffer. + +1998-06-19 MORIOKA Tomohiko + + * lisp/gnus-sum.el (gnus-summary-move-article): Use + `gnus-request-original-article' instead of + `gnus-request-article-this-buffer'. + +1998-06-19 MORIOKA Tomohiko + + * texi/gnus-ja.texi, texi/gnus.texi (Using MIME): Modify + description about new display mechanism. + +1998-06-19 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.6.0. + (gnus-version): Modify for this branch. + + * lisp/gnus-art.el (gnus-article-display-method-for-mime): New + variable; abolish `gnus-show-mime-method'. + (gnus-article-display-method-for-encoded-word): New variable; + abolish `gnus-decode-encoded-word-method'. + (gnus-article-display-method-for-traditional): New variable. + (gnus-article-display-mime-message): New function; abolish + `gnus-article-preview-mime-message'. + (gnus-article-display-traditional-message): New function. + (gnus-article-display-message-with-encoded-word): New function; + abolish `gnus-article-decode-encoded-word'. + (gnus-article-prepare): Change display mechanism; use + `gnus-request-original-article' instead of + `gnus-request-article-this-buffer'. + (gnus-request-original-article): New function. + +1998-06-22 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.6.0. + (gnus-version): Modify for SEMI 1.8. + + * lisp/gnus-sum.el: Modify for interface change in SEMI 1.8 about + automatic message/partial combining. + 1998-06-19 MORIOKA Tomohiko * lisp/gnus.el (gnus-version-number): Update to 6.5.0. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7054db5..7da8130 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,151 @@ +Fri Jun 26 04:23:12 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.15 is released. + +Fri Jun 26 03:39:32 1998 Lars Magne Ingebrigtsen + + * nnfolder.el (nnfolder-request-replace-article): Delete old + delimiter. + + * gnus-msg.el (gnus-summary-reply): Use it. + + * message.el (message-reply): Removed parameter. + (message-wide-reply): Ditto. + + * gnus-msg.el (gnus-msg-treat-broken-reply-to): New function. + + * gnus-art.el (gnus-check-group-server): New function. + (gnus-request-article-this-buffer): Don't try to waken the server + before needing to. + +Thu Jun 25 10:35:48 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-delete-article): Sort the articles + before deleting. + + * nngateway.el (nngateway-request-post): Return success. + + * nnheader.el (nnheader-insert-file-contents): Bind more hooks. + + * gnus-sum.el (gnus-summary-limit-to-age): Reverse logic. + + * gnus-score.el (gnus-summary-score-entry): Removed interactive + spec. + ((gnus-summary-score-map "V" gnus-summary-mode-map)): Removed + keystroke. + + * gnus-art.el (gnus-article-show-summary): Position point. + + * gnus-cache.el (gnus-cache-update-article): Change group first. + + * gnus.el (gnus-short-group-name): Collapse more. + +Thu Jun 25 08:48:06 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.14 is released. + +Thu Jun 25 05:13:31 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-rebuild-thread): Accept a line argument. + (gnus-rebuild-thread): Would skip around a lot when `P'-ing past + the beginning. + + * gnus-msg.el (gnus-post-method): Present all known servers if + `C-u 0'. + + * gnus-salt.el (gnus-pick-mode-map): Reinstated keymap. + + * gnus-sum.el (gnus-build-sparse-threads): Put the proper date + in. + +Wed Jun 24 07:52:30 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.13 is released. + +Wed Jun 24 07:47:04 1998 Lars Magne Ingebrigtsen + + * gnus-topic.el (gnus-topic-rename): Disallow "nil". + +Wed Jun 24 07:33:17 1998 Vladimir Alexiev + + * nnvirtual.el (nnvirtual-update-xref-header): Regexp-quote group + name. + +Wed Jun 24 06:15:27 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-build-sparse-threads): Give all the sparse + articles the date of the current child. + + * gnus-topic.el (gnus-group-topic-parameters): Didn't compute. + +Wed Jun 24 03:27:44 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.12 is released. + +Wed Jun 10 11:06:35 1998 Andreas Schwab + + * message.el (message-mail-other-window): Bind message-this-is-mail. + (message-mail-other-frame): Likewise. + (message-news-other-window): Bind message-this-is-news. + (message-news-other-frame): Likewise. + +1998-06-09 Sam Steingold + + * gnus-uu.el (gnus-uu-default-view-rules): make sed kill ^M only + at the end of line. + +1998-06-05 Hrvoje Niksic + + * nnmail.el (nnmail-get-split-group): Don't regexp-quote + nnmail-procmail-suffix. + +Wed Jun 24 03:04:05 1998 Kim-Minh Kaplan + + * gnus-sum.el (gnus-build-get-header): Fix obarray. + +Wed Jun 24 02:49:57 1998 Castor + + * nntp.el (nntp-open-ssl-stream): + +Wed Jun 24 02:31:46 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-nov-parse-line): Cleaned up. + (gnus-build-all-threads): Put things in the wrong obarray. + +Wed Jun 24 01:43:26 1998 Decklin Foster + + * nngateway.el (nngateway-mail2news-header-transformation): New + function. + +Wed Jun 24 00:25:45 1998 Lars Magne Ingebrigtsen + + * message.el (message-shorten-references): New function. + (message-header-format-alist): Use it. + + * gnus-start.el (gnus-always-read-dribble-file): Customized. + + * message.el (message-generate-new-buffers): Dox fox. + +Tue Jun 23 23:58:48 1998 Lars Magne Ingebrigtsen + + * gnus-topic.el (gnus-topic-prepare-topic): Respect visible topic + param. + (gnus-topic-hierarchical-parameters): New function. + +1998-06-02 Didier Verna + + * gnus-picon.el (gnus-get-buffer-name): use get-buffer-create + instead of get-buffer + +Wed Jun 3 04:41:45 1998 Lars Magne Ingebrigtsen + + * nnkiboze.el (nnkiboze-request-delete-group): Delete .newsrc + file. + + * nnmail.el (nnmail-article-group): Nuke looong lines. + + * gnus-art.el (gnus-button-alist): Buggy default. + Wed Jun 3 04:03:37 1998 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.6.11 is released. diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index 0508d68..11c72f7 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -368,14 +368,23 @@ be used as possible file names." :group 'gnus-article-mime :type 'boolean) -(defcustom gnus-show-mime-method 'gnus-article-preview-mime-message - "Function to process a MIME message. +(defcustom gnus-article-display-method-for-mime + 'gnus-article-display-mime-message + "Function to display a MIME message. The function is called from the article buffer." :group 'gnus-article-mime :type 'function) -(defcustom gnus-decode-encoded-word-method 'gnus-article-decode-encoded-word - "*Function to decode MIME encoded words. +(defcustom gnus-article-display-method-for-encoded-word + 'gnus-article-display-message-with-encoded-word + "*Function to display a message with MIME encoded-words. +The function is called from the article buffer." + :group 'gnus-article-mime + :type 'function) + +(defcustom gnus-article-display-method-for-traditional + 'gnus-article-display-traditional-message + "*Function to display a traditional message. The function is called from the article buffer." :group 'gnus-article-mime :type 'function) @@ -1948,7 +1957,8 @@ commands: ;;; @@ article filters ;;; -(defun gnus-article-preview-mime-message () +(defun gnus-article-display-mime-message () + "Article display method for MIME message." (make-local-variable 'mime-button-mother-dispatcher) (setq mime-button-mother-dispatcher (function gnus-article-push-button)) @@ -1957,22 +1967,32 @@ commands: (set-buffer gnus-summary-buffer) default-mime-charset)) ) - (save-excursion - (mime-view-buffer gnus-original-article-buffer gnus-article-buffer - nil gnus-article-mode-map) - )) + (mime-display-message mime-message-structure + gnus-article-buffer nil gnus-article-mode-map) + ) (run-hooks 'gnus-mime-article-prepare-hook) ) -(defun gnus-article-decode-encoded-word () - "Header filter for gnus-article-mode." +(defun gnus-article-display-traditional-message () + "Article display method for traditional message." + (set-buffer gnus-article-buffer) + (let (buffer-read-only) + (erase-buffer) + (insert-buffer-substring gnus-original-article-buffer) + )) + +(defun gnus-article-display-message-with-encoded-word () + "Article display method for message with encoded-words." (let ((charset (save-excursion (set-buffer gnus-summary-buffer) default-mime-charset))) - (eword-decode-header charset) - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (decode-mime-charset-region (match-end 0) (point-max) charset)) + (gnus-article-display-traditional-message) + (let (buffer-read-only) + (eword-decode-header charset) + (goto-char (point-min)) + (if (search-forward "\n\n" nil t) + (decode-mime-charset-region (match-end 0) (point-max) charset)) + ) (mime-maybe-hide-echo-buffer) ) (gnus-run-hooks 'gnus-mime-article-prepare-hook) @@ -1988,11 +2008,6 @@ If ALL-HEADERS is non-nil, no headers are hidden." (unless (eq major-mode 'gnus-summary-mode) (set-buffer gnus-summary-buffer)) (setq gnus-summary-buffer (current-buffer)) - ;; Make sure the connection to the server is alive. - (unless (gnus-server-opened - (gnus-find-method-for-group gnus-newsgroup-name)) - (gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name)) - (gnus-request-group gnus-newsgroup-name t)) (let* ((gnus-article (if header (mail-header-number header) article)) (summary-buffer (current-buffer)) (internal-hook gnus-article-internal-prepare-hook) @@ -2000,7 +2015,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." result) (save-excursion (gnus-article-setup-buffer) - (set-buffer gnus-article-buffer) + (set-buffer gnus-original-article-buffer) ;; Deactivate active regions. (when (and (boundp 'transient-mark-mode) transient-mark-mode) @@ -2070,17 +2085,21 @@ If ALL-HEADERS is non-nil, no headers are hidden." (or all-headers gnus-show-all-headers)))) (when (or (numberp article) (stringp article)) - ;; Hooks for getting information from the article. - ;; This hook must be called before being narrowed. - (let (buffer-read-only) + (let ((method + (if gnus-show-mime + (progn + (mime-parse-buffer) + (if (or (not gnus-strict-mime) + (mime-fetch-field "MIME-Version")) + gnus-article-display-method-for-mime + gnus-article-display-method-for-encoded-word)) + gnus-article-display-method-for-traditional))) + ;; Hooks for getting information from the article. + ;; This hook must be called before being narrowed. (gnus-run-hooks 'internal-hook) (gnus-run-hooks 'gnus-article-prepare-hook) - ;; Decode MIME message. - (when gnus-show-mime - (if (or (not gnus-strict-mime) - (gnus-fetch-field "Mime-Version")) - (funcall gnus-show-mime-method) - (funcall gnus-decode-encoded-word-method))) + ;; Display message. + (funcall method) ;; Perform the article display hooks. (gnus-run-hooks 'gnus-article-display-hook)) ;; Do page break. @@ -2256,7 +2275,8 @@ Argument LINES specifies lines to be scrolled down." (error "There is no summary buffer for this article buffer") (gnus-article-set-globals) (gnus-configure-windows 'article) - (gnus-summary-goto-subject gnus-current-article))) + (gnus-summary-goto-subject gnus-current-article) + (gnus-summary-position-point))) (defun gnus-article-describe-briefly () "Describe article mode commands briefly." @@ -2368,6 +2388,13 @@ If given a prefix, show the hidden text instead." (when (gnus-visual-p 'article-highlight 'highlight) (gnus-article-highlight-some))) +(defun gnus-check-group-server () + ;; Make sure the connection to the server is alive. + (unless (gnus-server-opened + (gnus-find-method-for-group gnus-newsgroup-name)) + (gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name)) + (gnus-request-group gnus-newsgroup-name t))) + (defun gnus-request-article-this-buffer (article group) "Get an article and insert it into this buffer." (let (do-update-line) @@ -2377,9 +2404,6 @@ If given a prefix, show the hidden text instead." (gnus-kill-all-overlays) (setq group (or group gnus-newsgroup-name)) - ;; Open server if it has closed. - (gnus-check-server (gnus-find-method-for-group group)) - ;; Using `gnus-request-article' directly will insert the article into ;; `nntp-server-buffer' - so we'll save some time by not having to ;; copy it from the server buffer into the article buffer. @@ -2439,15 +2463,6 @@ If given a prefix, show the hidden text instead." (assq article gnus-newsgroup-reads))) gnus-canceled-mark)) nil) - ;; We first check `gnus-original-article-buffer'. - ((and (get-buffer gnus-original-article-buffer) - (numberp article) - (save-excursion - (set-buffer gnus-original-article-buffer) - (and (equal (car gnus-original-article) group) - (eq (cdr gnus-original-article) article)))) - (insert-buffer-substring gnus-original-article-buffer) - 'article) ;; Check the backlog. ((and gnus-keep-backlog (gnus-backlog-request-article group article (current-buffer))) @@ -2470,6 +2485,7 @@ If given a prefix, show the hidden text instead." (buffer-read-only nil)) (erase-buffer) (gnus-kill-all-overlays) + (gnus-check-group-server) (when (gnus-request-article article group (current-buffer)) (when (numberp article) (gnus-async-prefetch-next group article gnus-summary-buffer) @@ -2482,24 +2498,6 @@ If given a prefix, show the hidden text instead." ;; Associate this article with the current summary buffer. (setq gnus-article-current-summary gnus-summary-buffer) - - ;; Take the article from the original article buffer - ;; and place it in the buffer it's supposed to be in. - (when (and (get-buffer gnus-article-buffer) - (equal (buffer-name (current-buffer)) - (buffer-name (get-buffer gnus-article-buffer)))) - (save-excursion - (if (get-buffer gnus-original-article-buffer) - (set-buffer gnus-original-article-buffer) - (set-buffer (get-buffer-create gnus-original-article-buffer)) - (buffer-disable-undo (current-buffer)) - (setq major-mode 'gnus-original-article-mode) - (setq buffer-read-only t) - (gnus-add-current-to-buffer-list)) - (let (buffer-read-only) - (erase-buffer) - (insert-buffer-substring gnus-article-buffer)) - (setq gnus-original-article (cons group article)))) ;; Update sparse articles. (when (and do-update-line @@ -2682,7 +2680,7 @@ groups." ("\\bin\\( +article\\| +message\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2 t gnus-button-message-id 3) ("\\( \n\t]+\\)>" 0 t gnus-url-mailto 2) - ("mailto:\\([a-zA-Z.-@_+0-9%]+\\)" 0 t gnus-url-mailto 2) + ("mailto:\\([a-zA-Z.-@_+0-9%]+\\)" 0 t gnus-url-mailto 1) ("\\bmailto:\\([^ \n\t]+\\)" 0 t gnus-url-mailto 1) ;; This is how URLs _should_ be embedded in text... ("]*\\)>" 0 t gnus-button-embedded-url 1) @@ -3260,10 +3258,6 @@ forbidden in URL encoding." 'gnus-original-article-mode #'mime-preview-quitting-method-for-gnus) -(set-alist 'mime-view-show-summary-method - 'gnus-original-article-mode - #'mime-preview-quitting-method-for-gnus) - (defun gnus-following-method (buf) (set-buffer buf) (message-followup) diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el index 04a3ad7..21e3c50 100644 --- a/lisp/gnus-cache.el +++ b/lisp/gnus-cache.el @@ -405,7 +405,8 @@ Returns the list of articles removed." (defun gnus-cache-update-article (group article) "If ARTICLE is in the cache, remove it and re-enter it." - (when (gnus-cache-possibly-remove-article article nil nil nil t) + (gnus-cache-change-buffer group) + (when (gnus-cache-possibly-remove-article article nil nil nil t) (let ((gnus-use-cache nil)) (gnus-cache-possibly-enter-article gnus-newsgroup-name article (gnus-summary-article-header article) diff --git a/lisp/gnus-cus.el b/lisp/gnus-cus.el index 4416895..1bd882d 100644 --- a/lisp/gnus-cus.el +++ b/lisp/gnus-cus.el @@ -651,4 +651,3 @@ articles in the thread. (provide 'gnus-cus) ;;; gnus-cus.el ends here - diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index a489f2b..0b9018e 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -427,12 +427,19 @@ header line with the old Message-ID." (push (list 'gnus-inews-add-to-address pgroup) message-send-actions))) (set-buffer gnus-article-copy) - (message-wide-reply to-address - (gnus-group-find-parameter - gnus-newsgroup-name 'broken-reply-to)))) + (gnus-msg-treat-broken-reply-to) + (message-wide-reply to-address))) (when yank (gnus-inews-yank-articles yank)))))) +(defun gnus-msg-treat-broken-reply-to () + "Remove the Reply-to header iff broken-reply-to." + (when (gnus-group-find-parameter + gnus-newsgroup-name 'broken-reply-to) + (save-restriction + (message-narrow-to-head) + (message-remove-header "reply-to")))) + (defun gnus-post-method (arg group &optional silent) "Return the posting method based on GROUP and ARG. If SILENT, don't prompt the user." @@ -462,6 +469,7 @@ If SILENT, don't prompt the user." gnus-post-method (list gnus-post-method))) gnus-secondary-select-methods + (mapcar 'cdr gnus-server-alist) (list gnus-select-method) (list group-method))) method-alist post-methods method) @@ -508,7 +516,7 @@ If SILENT, don't prompt the user." ;;; as well include the Emacs version as well. ;;; The following function works with later GNU Emacs, and XEmacs. (defun gnus-extended-version () - "Stringified Gnus version." + "Stringified gnus version." (interactive) gnus-version) @@ -533,8 +541,8 @@ automatically." (gnus-setup-message (if yank 'reply-yank 'reply) (gnus-summary-select-article) (set-buffer (gnus-copy-article-buffer)) - (message-reply nil wide (gnus-group-find-parameter - gnus-newsgroup-name 'broken-reply-to)) + (gnus-msg-treat-broken-reply-to) + (message-reply nil wide) (when yank (gnus-inews-yank-articles yank))))) diff --git a/lisp/gnus-picon.el b/lisp/gnus-picon.el index 7579b0c..be64979 100644 --- a/lisp/gnus-picon.el +++ b/lisp/gnus-picon.el @@ -184,8 +184,9 @@ arguments necessary for the job.") (defun gnus-get-buffer-name (variable) "Returns the buffer name associated with the contents of a variable." - (let ((buf (get-buffer (gnus-window-to-buffer-helper - (cdr (assq variable gnus-window-to-buffer)))))) + (let ((buf (get-buffer-create (gnus-window-to-buffer-helper + (cdr + (assq variable gnus-window-to-buffer)))))) (and buf (buffer-name buf)))) diff --git a/lisp/gnus-salt.el b/lisp/gnus-salt.el index 1efaa60..9a56f37 100644 --- a/lisp/gnus-salt.el +++ b/lisp/gnus-salt.el @@ -77,18 +77,18 @@ It accepts the same format specs that `gnus-summary-line-format' does." "." gnus-pick-article gnus-down-mouse-2 gnus-pick-mouse-pick-region "\r" gnus-pick-start-reading - ;; "t" gnus-uu-mark-thread - ;; "T" gnus-uu-unmark-thread - ;; "U" gnus-summary-unmark-all-processable - ;; "v" gnus-uu-mark-over - ;; "r" gnus-uu-mark-region - ;; "R" gnus-uu-unmark-region - ;; "e" gnus-uu-mark-by-regexp - ;; "E" gnus-uu-mark-by-regexp - ;; "b" gnus-uu-mark-buffer - ;; "B" gnus-uu-unmark-buffer - ;;gnus-mouse-2 gnus-pick-mouse-pick - ;; "X" gnus-pick-start-reading + "t" gnus-uu-mark-thread + "T" gnus-uu-unmark-thread + "U" gnus-summary-unmark-all-processable + "v" gnus-uu-mark-over + "r" gnus-uu-mark-region + "R" gnus-uu-unmark-region + "e" gnus-uu-mark-by-regexp + "E" gnus-uu-mark-by-regexp + "b" gnus-uu-mark-buffer + "B" gnus-uu-unmark-buffer + gnus-mouse-2 gnus-pick-mouse-pick + "X" gnus-pick-start-reading )) (defun gnus-pick-make-menu-bar () diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index f324be2..08bf0f0 100644 --- a/lisp/gnus-score.el +++ b/lisp/gnus-score.el @@ -454,7 +454,6 @@ of the last successful match.") (gnus-define-keys (gnus-summary-score-map "V" gnus-summary-mode-map) "s" gnus-summary-set-score - "a" gnus-summary-score-entry "S" gnus-summary-current-score "c" gnus-score-change-score-file "C" gnus-score-customize @@ -752,20 +751,6 @@ SCORE is the score to add. DATE is the expire date, or nil for no expire, or 'now for immediate expire. If optional argument `PROMPT' is non-nil, allow user to edit match. If optional argument `SILENT' is nil, show effect of score entry." - (interactive - (list (completing-read "Header: " - gnus-header-index - (lambda (x) (fboundp (nth 2 x))) - t) - (read-string "Match: ") - (if (y-or-n-p "Use regexp match? ") 'r 's) - (and current-prefix-arg - (prefix-numeric-value current-prefix-arg)) - (cond ((not (y-or-n-p "Add to score file? ")) - 'now) - ((y-or-n-p "Expire kill? ") - (current-time-string)) - (t nil)))) ;; Regexp is the default type. (when (eq type t) (setq type 'r)) diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index d83f15f..29b6b04 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -383,10 +383,12 @@ Can be used to turn version control on or off." :group 'gnus-newsrc :type 'hook) -;;; Internal variables +(defcustom gnus-always-read-dribble-file nil + "Uncoditionally read the dribble file." + :group 'gnus-newsrc + :type 'boolean) -(defvar gnus-always-read-dribble-file nil - "Uncoditionally read the dribble file.") +;;; Internal variables (defvar gnus-newsrc-file-version nil) (defvar gnus-override-subscribe-method nil) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 07a1b65..c64afeb 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -34,7 +34,6 @@ (require 'gnus-range) (require 'gnus-int) (require 'gnus-undo) -(require 'std11) (require 'mime-view) (autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t) @@ -2871,25 +2870,24 @@ If NO-DISPLAY, don't generate a summary buffer." (defun gnus-dependencies-add-header (header dependencies force-new) "Enter HEADER into the DEPENDENCIES table if it is not already there. -If FORCE-NEW is not NIL, enter HEADER into the DEPENDENCIES table even +If FORCE-NEW is not nil, enter HEADER into the DEPENDENCIES table even if it was already present. -If `gnus-summary-ignore-duplicates' is NIL then duplicate Message-IDs +If `gnus-summary-ignore-duplicates' is nil then duplicate Message-IDs will not be entered in the DEPENDENCIES table. Otherwise duplicate Message-IDs will be renamed be renamed to a unique Message-ID before being entered. -Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." - +Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." (let* ((id (mail-header-id header)) (id-dep (and id (intern id dependencies))) ref ref-dep ref-header) - ;; Enter this `header' in the `dependencies' table + ;; Enter this `header' in the `dependencies' table. (cond ((not id-dep) (setq header nil)) - ;; The first two cases do the normal part : enter a new `header' - ;; in the `dependencies' table, + ;; The first two cases do the normal part: enter a new `header' + ;; in the `dependencies' table. ((not (boundp id-dep)) (set id-dep (list header))) ((null (car (symbol-value id-dep))) @@ -2897,10 +2895,9 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." ;; From here the `header' was already present in the ;; `dependencies' table. - (force-new - ;; Overrides an existing entry, - ;; Just set the header part of the entry. + ;; Overrides an existing entry; + ;; just set the header part of the entry. (setcar (symbol-value id-dep) header)) ;; Renames the existing `header' to a unique Message-ID. @@ -2911,11 +2908,11 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (list header)) (mail-header-set-id header id)) - ;; - The last case ignores an existing entry, except it adds - ;; any additional Xrefs (in case the two articles came from - ;; different servers. - ;; Also sets `header' to `nil' meaning that the - ;; `dependencies' table was *not* modified. + ;; The last case ignores an existing entry, except it adds any + ;; additional Xrefs (in case the two articles came from different + ;; servers. + ;; Also sets `header' to `nil' meaning that the `dependencies' + ;; table was *not* modified. (t (mail-header-set-xref (car (symbol-value id-dep)) @@ -2932,9 +2929,10 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (boundp ref-dep) (setq ref-header (car (symbol-value ref-dep)))) (if (string= id ref) - ;; Yuk ! This is a reference loop. Make the article be a + ;; Yuk! This is a reference loop. Make the article be a ;; root article. (progn + (debug) (mail-header-set-references (car (symbol-value id-dep)) "none") (setq ref nil)) (setq ref (gnus-parent-id (mail-header-references ref-header))))) @@ -2950,7 +2948,7 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (defun gnus-build-sparse-threads () (let ((headers gnus-newsgroup-headers) header references generation relations - cthread subject child end pthread relation new-child) + cthread subject child end pthread relation new-child date) ;; First we create an alist of generations/relations, where ;; generations is how much we trust the relation, and the relation ;; is parent/child. @@ -2962,32 +2960,35 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (not (string= references ""))) (insert references) (setq child (mail-header-id header) - subject (mail-header-subject header)) - (setq generation 0) + subject (mail-header-subject header) + date (mail-header-date header) + generation 0) (while (search-backward ">" nil t) (setq end (1+ (point))) (if (search-backward "<" nil t) (push (list (incf generation) child (setq child new-child) - subject) + subject date) relations))) (push (list (1+ generation) child nil subject) relations) (erase-buffer))) (kill-buffer (current-buffer))) ;; Sort over trustworthiness. - (mapc #'(lambda (relation) - (when (gnus-dependencies-add-header - (make-full-mail-header gnus-reffed-article-number - (cadddr relation) - "" "" (cadr relation) - (or (caddr relation) "") 0 0 "") - gnus-newsgroup-dependencies nil) - (push gnus-reffed-article-number gnus-newsgroup-limit) - (push gnus-reffed-article-number gnus-newsgroup-sparse) - (push (cons gnus-reffed-article-number gnus-sparse-mark) - gnus-newsgroup-reads) - (decf gnus-reffed-article-number))) - (sort relations 'car-less-than-car)) + (mapcar + (lambda (relation) + (when (gnus-dependencies-add-header + (make-full-mail-header + gnus-reffed-article-number + (nth 3 relation) "" (nth 4 relation) + (nth 1 relation) + (or (nth 2 relation) "") 0 0 "") + gnus-newsgroup-dependencies nil) + (push gnus-reffed-article-number gnus-newsgroup-limit) + (push gnus-reffed-article-number gnus-newsgroup-sparse) + (push (cons gnus-reffed-article-number gnus-sparse-mark) + gnus-newsgroup-reads) + (decf gnus-reffed-article-number))) + (sort relations 'car-less-than-car)) (gnus-message 7 "Making sparse threads...done"))) (defun gnus-build-old-threads () @@ -3010,11 +3011,66 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (setq heads nil))))) gnus-newsgroup-dependencies))) +;; The following macros and functions were written by Felix Lee +;; . + +(defmacro gnus-nov-read-integer () + '(prog1 + (if (= (following-char) ?\t) + 0 + (let ((num (ignore-errors (read buffer)))) + (if (numberp num) num 0))) + (unless (eobp) + (search-forward "\t" eol 'move)))) + +(defmacro gnus-nov-skip-field () + '(search-forward "\t" eol 'move)) + +(defmacro gnus-nov-field () + '(buffer-substring (point) (if (gnus-nov-skip-field) (1- (point)) eol))) + +;; This function has to be called with point after the article number +;; on the beginning of the line. +(defsubst gnus-nov-parse-line (number dependencies &optional force-new) + (let ((eol (gnus-point-at-eol)) + (buffer (current-buffer)) + header) + + ;; overview: [num subject from date id refs chars lines misc] + (unwind-protect + (progn + (narrow-to-region (point) eol) + (unless (eobp) + (forward-char)) + + (setq header + (make-full-mail-header + number ; number + (funcall + gnus-unstructured-field-decoder (gnus-nov-field)) ; subject + (funcall + gnus-structured-field-decoder (gnus-nov-field)) ; from + (gnus-nov-field) ; date + (or (gnus-nov-field) + (nnheader-generate-fake-message-id)) ; id + (gnus-nov-field) ; refs + (gnus-nov-read-integer) ; chars + (gnus-nov-read-integer) ; lines + (unless (= (following-char) ?\n) + (gnus-nov-field))))) ; misc + + (widen)) + + (when gnus-alter-header-function + (funcall gnus-alter-header-function header)) + (gnus-dependencies-add-header header dependencies force-new))) + (defun gnus-build-get-header (id) ;; Look through the buffer of NOV lines and find the header to ;; ID. Enter this line into the dependencies hash table, and return ;; the id of the parent article (if any). - (let (found header) + (let ((deps gnus-newsgroup-dependencies) + found header) (prog1 (save-excursion (set-buffer nntp-server-buffer) @@ -3030,8 +3086,8 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (when found (beginning-of-line) (and - (setq header (gnus-nov-parse-line (read (current-buffer)) - gnus-newsgroup-dependencies)) + (setq header (gnus-nov-parse-line + (read (current-buffer)) deps)) (gnus-parent-id (mail-header-references header)))))) (when header (let ((number (mail-header-number header))) @@ -3047,6 +3103,7 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (defun gnus-build-all-threads () "Read all the headers." (let ((gnus-summary-ignore-duplicates t) + (dependencies gnus-newsgroup-dependencies) found header article) (save-excursion (set-buffer nntp-server-buffer) @@ -3054,9 +3111,9 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (goto-char (point-min)) (while (not (eobp)) (ignore-errors - (setq article (read (current-buffer))) - (setq header (gnus-nov-parse-line article - gnus-newsgroup-dependencies))) + (setq article (read (current-buffer)) + header (gnus-nov-parse-line + article dependencies))) (when header (push header gnus-newsgroup-headers) (if (memq (setq article (mail-header-number header)) @@ -3141,8 +3198,9 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (setcar thread old) nil)))) -(defun gnus-rebuild-thread (id) - "Rebuild the thread containing ID." +(defun gnus-rebuild-thread (id &optional line) + "Rebuild the thread containing ID. +If LINE, insert the rebuilt thread starting on line LINE." (let ((buffer-read-only nil) old-pos current thread data) (if (not gnus-show-threads) @@ -3172,6 +3230,9 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (setq thread (cons subject (gnus-sort-threads roots)))))) (let (threads) ;; We then insert this thread into the summary buffer. + (when line + (goto-char (point-min)) + (forward-line (1- line))) (let (gnus-newsgroup-data gnus-newsgroup-threads) (if gnus-show-threads (gnus-summary-prepare-threads (gnus-cut-threads (list thread))) @@ -3179,8 +3240,14 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (setq data (nreverse gnus-newsgroup-data)) (setq threads gnus-newsgroup-threads)) ;; We splice the new data into the data structure. - (gnus-data-enter-list current data (- (point) old-pos)) - (setq gnus-newsgroup-threads (nconc threads gnus-newsgroup-threads))))) + ;;!!! This is kinda bogus. We assume that in LINE is non-nil, + ;;!!! then we want to insert at the beginning of the buffer. + ;;!!! That happens to be true with Gnus now, but that may + ;;!!! change in the future. Perhaps. + (gnus-data-enter-list (if line nil current) data (- (point) old-pos)) + (setq gnus-newsgroup-threads (nconc threads gnus-newsgroup-threads)) + (when line + (gnus-data-compute-positions))))) (defun gnus-number-to-header (number) "Return the header for article NUMBER." @@ -4402,76 +4469,14 @@ The resulting hash table is returned, or nil if no Xrefs were found." (setq id (mail-header-id header) ref (gnus-parent-id (mail-header-references header)))) - (setq header - (gnus-dependencies-add-header header dependencies force-new)) - (if header - (push header headers)) + (when (setq header + (gnus-dependencies-add-header + header dependencies force-new)) + (push header headers)) (goto-char (point-max)) (widen)) (nreverse headers))))) -;; The following macros and functions were written by Felix Lee -;; . - -(defmacro gnus-nov-read-integer () - '(prog1 - (if (= (following-char) ?\t) - 0 - (let ((num (ignore-errors (read buffer)))) - (if (numberp num) num 0))) - (unless (eobp) - (search-forward "\t" eol 'move)))) - -(defmacro gnus-nov-skip-field () - '(search-forward "\t" eol 'move)) - -(defmacro gnus-nov-field () - '(buffer-substring (point) (if (gnus-nov-skip-field) (1- (point)) eol))) - -;; (defvar gnus-nov-none-counter 0) - -;; This function has to be called with point after the article number -;; on the beginning of the line. -(defun gnus-nov-parse-line (number dependencies &optional force-new) - (let ((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] - (unwind-protect - (progn - (narrow-to-region (point) eol) - (unless (eobp) - (forward-char)) - - (setq header - (make-full-mail-header - number ; number - (funcall - gnus-unstructured-field-decoder (gnus-nov-field)) ; subject - (funcall - gnus-structured-field-decoder (gnus-nov-field)) ; from - (gnus-nov-field) ; date - (or (gnus-nov-field) - (nnheader-generate-fake-message-id)) ; id - (gnus-nov-field) ; refs - (gnus-nov-read-integer) ; chars - (gnus-nov-read-integer) ; lines - (unless (= (following-char) ?\n) - (gnus-nov-field))))) ; misc - - (widen)) - - (when gnus-alter-header-function - (funcall gnus-alter-header-function header)) - - (setq id (mail-header-id header) - ref (gnus-parent-id (mail-header-references header))) - - (gnus-dependencies-add-header header dependencies force-new) - - header)) - ;; Goes through the xover lines and returns a list of vectors (defun gnus-get-newsgroup-headers-xover (sequence &optional force-new dependencies @@ -4548,8 +4553,12 @@ This is meant to be called in `gnus-article-internal-prepare-hook'." (mail-header-set-xref headers xref))))))) (defun gnus-summary-insert-subject (id &optional old-header use-old-header) - "Find article ID and insert the summary line for that article." - (let ((header (cond ((and old-header use-old-header) + "Find article ID and insert the summary line for that article. +OLD-HEADER can either be a header or a line number to insert +the subject line on." + (let* ((line (and (numberp old-header) old-header)) + (old-header (and (vectorp old-header) old-header)) + (header (cond ((and old-header use-old-header) old-header) ((and (numberp id) (gnus-number-to-header id)) @@ -4579,7 +4588,7 @@ This is meant to be called in `gnus-article-internal-prepare-hook'." gnus-newsgroup-sparse)) (setq gnus-newsgroup-ancient (delq number gnus-newsgroup-ancient)) (push number gnus-newsgroup-limit) - (gnus-rebuild-thread (mail-header-id header)) + (gnus-rebuild-thread (mail-header-id header) line) (gnus-summary-goto-subject number nil t)) (when (and (numberp number) (> number 0)) @@ -5419,7 +5428,10 @@ If FORCE, also allow jumping to articles not currently shown." ;; We read in the article if we have to. (and (not data) force - (gnus-summary-insert-subject article (and (vectorp force) force) t) + (gnus-summary-insert-subject + article + (if (or (numberp force) (vectorp force)) force) + t) (setq data (gnus-data-find article))) (goto-char b) (if (not data) @@ -5529,7 +5541,7 @@ If BACKWARD, the previous article is selected instead of the next." (not unread) (not subject)) (gnus-summary-goto-article (if backward (1- gnus-newsgroup-begin) (1+ gnus-newsgroup-end)) - nil t)) + nil (count-lines (point-min) (point)))) ;; Go to next/previous group. (t (unless (gnus-ephemeral-group-p gnus-newsgroup-name) @@ -5805,7 +5817,9 @@ Return nil if there are no articles." (defun gnus-summary-goto-article (article &optional all-headers force) "Fetch ARTICLE (article number or Message-ID) and display it if it exists. -If ALL-HEADERS is non-nil, no header lines are hidden." +If ALL-HEADERS is non-nil, no header lines are hidden. +If FORCE, go to the article even if it isn't displayed. If FORCE +is a number, it is the line the article is to be displayed on." (interactive (list (completing-read @@ -5906,8 +5920,8 @@ articles that are younger than AGE days." (nnmail-time-since (nnmail-date-to-time date)) cutoff)) (when (if younger-p - (not is-younger) - is-younger) + is-younger + (not is-younger)) (push (gnus-data-number d) articles)))) (gnus-summary-limit (nreverse articles))) (gnus-summary-position-point))) @@ -7230,7 +7244,7 @@ delete these instead." gnus-newsgroup-name) (error "The current newsgroup does not support article deletion")) ;; Compute the list of articles to delete. - (let ((articles (gnus-summary-work-articles n)) + (let ((articles (sort (copy-sequence (gnus-summary-work-articles n)) '<)) not-deleted) (if (and gnus-novice-user (not (gnus-yes-or-no-p @@ -8923,9 +8937,17 @@ save those articles instead." ;;; @ for mime-partial ;;; -(defun gnus-mime-partial-preview-function () - (gnus-summary-preview-mime-message (gnus-summary-article-number)) - ) +(defun gnus-request-partial-message () + (save-excursion + (let ((number (gnus-summary-article-number)) + (group gnus-newsgroup-name) + (mother gnus-article-buffer)) + (set-buffer (get-buffer-create " *Partial Article*")) + (erase-buffer) + (setq mime-preview-buffer mother) + (gnus-request-article-this-buffer number group) + (mime-parse-buffer) + ))) (autoload 'mime-combine-message/partial-pieces-automatically "mime-partial" @@ -8936,12 +8958,9 @@ save those articles instead." (major-mode . gnus-original-article-mode) (method . mime-combine-message/partial-pieces-automatically) (summary-buffer-exp . gnus-summary-buffer) + (request-partial-message-method . gnus-request-partial-message) )) -(set-alist 'mime-view-partial-message-method-alist - 'gnus-original-article-mode - 'gnus-mime-partial-preview-function) - ;;; @ end ;;; diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el index 249367d..15e036b 100644 --- a/lisp/gnus-topic.el +++ b/lisp/gnus-topic.el @@ -166,9 +166,10 @@ with some simple extensions. (when result (symbol-name result)))) -(defun gnus-current-topics () - "Return a list of all current topics, lowest in hierarchy first." - (let ((topic (gnus-current-topic)) +(defun gnus-current-topics (&optional topic) + "Return a list of all current topics, lowest in hierarchy first. +If TOPIC, start with that topic." + (let ((topic (or topic (gnus-current-topic))) topics) (while topic (push topic topics) @@ -199,7 +200,8 @@ with some simple extensions. active (- (1+ (cdr active)) (car active)))) clevel (or (gnus-info-level info) - (if (member group gnus-zombie-list) gnus-level-zombie gnus-level-killed)))) + (if (member group gnus-zombie-list) + gnus-level-zombie gnus-level-killed)))) (and unread ; nil means that the group is dead. (<= clevel level) @@ -324,27 +326,32 @@ with some simple extensions. (defun gnus-group-topic-parameters (group) "Compute the group parameters for GROUP taking into account inheritance from topics." - (let ((params-list (list (gnus-group-get-parameter group))) - topics params param out) + (let ((params-list (copy-sequence (gnus-group-get-parameter group)))) (save-excursion (gnus-group-goto-group group) - (setq topics (gnus-current-topics)) - (while topics - (push (gnus-topic-parameters (pop topics)) params-list)) - ;; We probably have lots of nil elements here, so - ;; we remove them. Probably faster than doing this "properly". - (setq params-list (delq nil params-list)) - ;; Now we have all the parameters, so we go through them - ;; and do inheritance in the obvious way. - (while (setq params (pop params-list)) - (while (setq param (pop params)) - (when (atom param) - (setq param (cons param t))) - ;; Override any old versions of this param. - (setq out (delq (assq (car param) out) out)) - (push param out))) - ;; Return the resulting parameter list. - out))) + (nconc params-list + (gnus-topic-hierarchical-parameters (gnus-current-topic)))))) + +(defun gnus-topic-hierarchical-parameters (topic) + "Return a topic list computed for TOPIC." + (let ((topics (gnus-current-topics topic)) + params-list param out params) + (while topics + (push (gnus-topic-parameters (pop topics)) params-list)) + ;; We probably have lots of nil elements here, so + ;; we remove them. Probably faster than doing this "properly". + (setq params-list (delq nil params-list)) + ;; Now we have all the parameters, so we go through them + ;; and do inheritance in the obvious way. + (while (setq params (pop params-list)) + (while (setq param (pop params)) + (when (atom param) + (setq param (cons param t))) + ;; Override any old versions of this param. + (setq out (delq (assq (car param) out) out)) + (push param out))) + ;; Return the resulting parameter list. + out)) ;;; General utility functions @@ -406,7 +413,13 @@ If LOWEST is non-nil, list all newsgroups of level LOWEST or higher." If SILENT, don't insert anything. Return the number of unread articles in the topic and its subtopics." (let* ((type (pop topicl)) - (entries (gnus-topic-find-groups (car type) list-level all lowest)) + (entries (gnus-topic-find-groups + (car type) list-level + (or all + (cdr (assq 'visible + (gnus-topic-hierarchical-parameters + (car type))))) + lowest)) (visiblep (and (eq (nth 1 type) 'visible) (not silent))) (gnus-group-indentation (make-string (* gnus-topic-indent-level level) ? )) @@ -1254,6 +1267,10 @@ If COPYP, copy the groups instead." ;; Check whether the new name exists. (when (gnus-topic-find-topology new-name) (error "Topic '%s' already exists")) + ;; "nil" is an invalid name, for reasons I'd rather not go + ;; into here. Trust me. + (when (equal new-name "nil") + (error "Invalid name: %s" nil)) ;; Do the renaming. (let ((top (gnus-topic-find-topology old-name)) (entry (assoc old-name gnus-topic-alist))) diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el index 7b28e53..3a0bf91 100644 --- a/lisp/gnus-uu.el +++ b/lisp/gnus-uu.el @@ -54,8 +54,8 @@ ;; Default viewing action rules (defcustom gnus-uu-default-view-rules - '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed s/\r//g") - ("\\.pas$" "cat %s | sed s/\r//g") + '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed 's/\r$//'") + ("\\.pas$" "cat %s | sed 's/\r$//'") ("\\.[1-9]$" "groff -mandoc -Tascii %s | sed s/\b.//g") ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "xv") ("\\.tga$" "tgatoppm %s | xv -") diff --git a/lisp/gnus.el b/lisp/gnus.el index 116ad40..64a39fe 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -250,11 +250,11 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "6.5.0" +(defconst gnus-version-number "6.7.3" "Version number for this version of gnus.") (defconst gnus-version - (format "Semi-gnus %s (based on Gnus 5.6.11; for SEMI 1.7)" + (format "Semi-gnus %s (based on Gnus 5.6.15; for SEMI 1.8)" gnus-version-number) "Version string for this version of gnus.") @@ -2477,7 +2477,10 @@ If SCORE is nil, add 1 to the score of GROUP." "Collapse GROUP name LEVELS. Select methods are stripped and any remote host name is stripped down to just the host name." - (let* ((name "") (foreign "") (depth -1) (skip 1) + (let* ((name "") + (foreign "") + (depth 0) + (skip 1) (levels (or levels (progn (while (string-match "\\." group skip) diff --git a/lisp/message.el b/lisp/message.el index 08fac7d..2b63157 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -251,7 +251,7 @@ nil means let mailer mail back a message to report errors." :type 'boolean) (defcustom message-generate-new-buffers t - "*Non-nil means that a new message buffer will be created whenever `mail-setup' is called. + "*Non-nil means that a new message buffer will be created whenever `message-setup' is called. If this is a function, call that function with three parameters: The type, the to address and the group name. (Any of these may be nil.) The function should return the new buffer name." @@ -927,7 +927,7 @@ The cdr of ech entry is a function for applying the face to a region.") (Lines) (Expires) (Message-ID) - (References . message-fill-references) + (References . message-shorten-references) (X-Mailer) (X-Newsreader)) "Alist used for formatting headers.") @@ -1062,7 +1062,7 @@ If REGEXP, HEADER is a regular expression. If FIRST, only remove the first instance of the header. Return the number of headers removed." (goto-char (point-min)) - (let ((regexp (if is-regexp header (concat "^" header ":"))) + (let ((regexp (if is-regexp header (concat "^" (regexp-quote header) ":"))) (number 0) (case-fold-search t) last) @@ -3183,6 +3183,24 @@ Headers already prepared in the buffer are not modified." (replace-match " " t t)) (goto-char (point-max))))) +(defun message-shorten-references (header references) + "Limit REFERENCES to be shorter than 988 characters." + (let ((max 988) + (cut 4) + refs) + (nnheader-temp-write nil + (insert references) + (goto-char (point-min)) + (while (re-search-forward "<[^>]+>" nil t) + (push (match-string 0) refs)) + (setq refs (nreverse refs)) + (while (> (length (mapconcat 'identity refs " ")) max) + (when (< (length refs) (1+ cut)) + (decf cut)) + (setcdr (nthcdr cut refs) (cddr (nthcdr cut refs))))) + (insert (capitalize (symbol-name header)) ": " + (mapconcat 'identity refs " ") "\n"))) + (defun message-position-point () "Move point to where the user probably wants to find it." (message-narrow-to-headers) @@ -3370,7 +3388,7 @@ Headers already prepared in the buffer are not modified." (Subject . ,(or subject "")))))) ;;;###autoload -(defun message-reply (&optional to-address wide ignore-reply-to) +(defun message-reply (&optional to-address wide) "Start editing a reply to the article in the current buffer." (interactive) (let ((cur (current-buffer)) @@ -3397,7 +3415,7 @@ Headers already prepared in the buffer are not modified." to (message-fetch-field "to") cc (message-fetch-field "cc") mct (message-fetch-field "mail-copies-to") - reply-to (unless ignore-reply-to (message-fetch-field "reply-to")) + reply-to (message-fetch-field "reply-to") references (message-fetch-field "references") message-id (message-fetch-field "message-id" t)) ;; Remove any (buggy) Re:'s that are present and make a @@ -3477,10 +3495,10 @@ Headers already prepared in the buffer are not modified." cur))) ;;;###autoload -(defun message-wide-reply (&optional to-address ignore-reply-to) +(defun message-wide-reply (&optional to-address) "Make a \"wide\" reply to the message in the current buffer." (interactive) - (message-reply to-address t ignore-reply-to)) + (message-reply to-address t)) ;;;###autoload (defun message-followup (&optional to-newsgroups) @@ -3847,7 +3865,8 @@ you." (same-window-buffer-names nil) (same-window-regexps nil)) (message-pop-to-buffer (message-buffer-name "mail" to))) - (message-setup `((To . ,(or to "")) (Subject . ,(or subject ""))))) + (let ((message-this-is-mail t)) + (message-setup `((To . ,(or to "")) (Subject . ,(or subject "")))))) ;;;###autoload (defun message-mail-other-frame (&optional to subject) @@ -3859,7 +3878,8 @@ you." (same-window-buffer-names nil) (same-window-regexps nil)) (message-pop-to-buffer (message-buffer-name "mail" to))) - (message-setup `((To . ,(or to "")) (Subject . ,(or subject ""))))) + (let ((message-this-is-mail t)) + (message-setup `((To . ,(or to "")) (Subject . ,(or subject "")))))) ;;;###autoload (defun message-news-other-window (&optional newsgroups subject) @@ -3871,8 +3891,9 @@ you." (same-window-buffer-names nil) (same-window-regexps nil)) (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject ""))))) + (let ((message-this-is-news t)) + (message-setup `((Newsgroups . ,(or newsgroups "")) + (Subject . ,(or subject "")))))) ;;;###autoload (defun message-news-other-frame (&optional newsgroups subject) @@ -3884,8 +3905,9 @@ you." (same-window-buffer-names nil) (same-window-regexps nil)) (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject ""))))) + (let ((message-this-is-news t)) + (message-setup `((Newsgroups . ,(or newsgroups "")) + (Subject . ,(or subject "")))))) ;;; underline.el diff --git a/lisp/nnagent.el b/lisp/nnagent.el index 90667cb..b42ddf9 100644 --- a/lisp/nnagent.el +++ b/lisp/nnagent.el @@ -27,7 +27,7 @@ (require 'nnheader) (require 'nnoo) -(require 'cl) +(eval-when-compile (require 'cl)) (require 'gnus-agent) (require 'nnml) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 334b2b6..5f399d8 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -31,7 +31,7 @@ (require 'message) (require 'nnmail) (require 'nnoo) -(require 'cl) +(eval-when-compile (require 'cl)) (require 'gnus-util) (nnoo-declare nnfolder) @@ -397,14 +397,16 @@ time saver for large mailboxes.") (save-excursion (set-buffer buffer) (goto-char (point-min)) - (when (looking-at "X-From-Line: ") - (replace-match "From ")) + (if (looking-at "X-From-Line: ") + (replace-match "From ") + (unless (looking-at message-unix-mail-delimiter) + (insert "From nobody " (current-time-string) "\n"))) (nnfolder-normalize-buffer) (set-buffer nnfolder-current-buffer) (goto-char (point-min)) (if (not (nnfolder-goto-article article)) nil - (nnfolder-delete-mail t) + (nnfolder-delete-mail) (insert-buffer-substring buffer) (nnfolder-save-buffer) t))) diff --git a/lisp/nngateway.el b/lisp/nngateway.el index 909e4f8..6b59be5 100644 --- a/lisp/nngateway.el +++ b/lisp/nngateway.el @@ -62,7 +62,8 @@ parameter -- the gateway address.") (insert mail-header-separator "\n") (widen) (let (message-required-mail-headers) - (funcall message-send-mail-function)))))) + (funcall message-send-mail-function)) + t)))) ;;; Internal functions @@ -75,6 +76,13 @@ parameter -- the gateway address.") (insert "To: " (nnheader-replace-chars-in-string newsgroups ?. ?-) "@" gateway "\n"))) +(defun nngateway-mail2news-header-transformation (gateway) + "Transform the headers for sending to a mail2news gateway." + (message-remove-header "to") + (message-remove-header "cc") + (goto-char (point-min)) + (insert "To: mail2news@" gateway "\n")) + (nnoo-define-skeleton nngateway) (provide 'nngateway) diff --git a/lisp/nnheader.el b/lisp/nnheader.el index cffbedb..e0de0a4 100644 --- a/lisp/nnheader.el +++ b/lisp/nnheader.el @@ -773,7 +773,9 @@ find-file-hooks, etc. (let ((format-alist nil) (auto-mode-alist (nnheader-auto-mode-alist)) (default-major-mode 'fundamental-mode) + (enable-local-variables nil) (after-insert-file-functions nil) + (find-file-hooks nil) (coding-system-for-read nnheader-file-coding-system)) (insert-file-contents filename visit beg end replace))) diff --git a/lisp/nnkiboze.el b/lisp/nnkiboze.el index 0df788d..b122d3e 100644 --- a/lisp/nnkiboze.el +++ b/lisp/nnkiboze.el @@ -158,9 +158,7 @@ (let ((files (nconc (nnkiboze-score-file group) (list (nnkiboze-nov-file-name) - (concat nnkiboze-directory - (nnheader-translate-file-chars - (concat group ".newsrc"))))))) + (nnkiboze-nov-file-name ".newsrc"))))) (while files (and (file-exists-p (car files)) (file-writable-p (car files)) @@ -358,10 +356,11 @@ Finds out what articles are to be part of the nnkiboze groups." (goto-char (1+ (match-beginning 0))) (insert prefix))))) -(defun nnkiboze-nov-file-name () +(defun nnkiboze-nov-file-name (&optional suffix) (concat (file-name-as-directory nnkiboze-directory) (nnheader-translate-file-chars - (concat (nnkiboze-prefixed-name nnkiboze-current-group) ".nov")))) + (concat (nnkiboze-prefixed-name nnkiboze-current-group) + (or suffix ".nov"))))) (provide 'nnkiboze) diff --git a/lisp/nnmail.el b/lisp/nnmail.el index 516e8b1..5ae4d74 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -25,7 +25,7 @@ ;;; Code: -(eval-when-compile (require 'cl)) +(require 'cl) (require 'nnheader) (require 'timezone) @@ -722,7 +722,7 @@ is a spool. If not using procmail, return GROUP." (file-name-as-directory nnmail-procmail-directory))) "\\([^/]*\\)" - (regexp-quote nnmail-procmail-suffix) "$") + nnmail-procmail-suffix "$") (expand-file-name file)) (let ((procmail-group (substring (expand-file-name file) (match-beginning 1) @@ -1069,7 +1069,18 @@ FUNC will be called with the group name to determine the article number." (goto-char (point-min)) (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) (replace-match " " t t)) + ;; Nuke pathologically long headers. Since Gnus applies + ;; pathologically complex regexps to the buffer, lines + ;; that are looong will take longer than the Universe's + ;; existence to process. + (goto-char (point-min)) + (while (not (eobp)) + (end-of-line) + (if (> (current-column) 1024) + (gnus-delete-line) + (forward-line 1))) ;; Allow washing. + (goto-char (point-min)) (run-hooks 'nnmail-split-hook) (if (and (symbolp nnmail-split-methods) (fboundp nnmail-split-methods)) diff --git a/lisp/nntp.el b/lisp/nntp.el index 1d8cfd1..67eafb7 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -211,7 +211,8 @@ server there that you can connect to. See also (defvoo nntp-server-list-active-group 'try) (eval-and-compile - (autoload 'nnmail-read-passwd "nnmail")) + (autoload 'nnmail-read-passwd "nnmail") + (autoload 'open-ssl-stream "ssl")) @@ -845,6 +846,16 @@ password contained in '~/.nntp-authinfo'." (defun nntp-open-network-stream (buffer) (open-network-stream "nntpd" buffer nntp-address nntp-port-number)) +(defun nntp-open-ssl-stream (buffer) + (let* ((ssl-program-arguments '("-connect" (concat host ":" service))) + (proc (open-ssl-stream "nntpd" buffer nntp-address nntp-port-number))) + (save-excursion + (set-buffer buffer) + (nntp-wait-for-string "^\r*20[01]") + (beginning-of-line) + (delete-region (point-min) (point)) + proc))) + (defun nntp-read-server-type () "Find out what the name of the server we have connected to is." ;; Wait for the status string to arrive. diff --git a/lisp/nnvirtual.el b/lisp/nnvirtual.el index df61450..d83356d 100644 --- a/lisp/nnvirtual.el +++ b/lisp/nnvirtual.el @@ -399,7 +399,7 @@ to virtual article number.") (replace-match "" t t)) (goto-char (point-min)) (when (re-search-forward - (concat (gnus-group-real-name group) ":[0-9]+") + (concat (regexp-quote (gnus-group-real-name group)) ":[0-9]+") nil t) (replace-match "" t t)) (unless (= (point) (point-max)) diff --git a/readme b/readme index a232075..e3064ef 100644 --- a/readme +++ b/readme @@ -9,7 +9,7 @@ You should definitely byte-compile the source files. To do that, you can simply say "./configure; make" in this directory. If you are using XEmacs, you *must* say "make EMACS=xemacs". In that case you may also want to pull down the package of nice glyphs from -. It should be installed +. It should be installed into the "gnus-5.4.53/etc" directory. Then you have to tell Emacs where Gnus is. You might put something diff --git a/texi/ChangeLog b/texi/ChangeLog index 1e7d48d..ac91f20 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,13 @@ +Thu Jun 25 11:24:14 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Summary Score Commands): Deletia. + +Wed Jun 24 00:37:32 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Auto Save): Addition. + (Mail-To-News Gateways): Addition. + (NNTP): Addition. + Wed Jun 3 03:30:47 1998 Lars Magne Ingebrigtsen * message.texi (Message Headers): Addition. diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index 811c94e..d06b99c 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -7718,14 +7718,14 @@ Gnus $B$O%X%C%@!<$NJB$YBX$((B(sort)$B$b9T$$$^$9!J$3$l$O%G%#%U%)%k%H$G9T$o$l$^ $B3J9%$N5-;v$GKd$a9~$`$3$H$5$(2DG=$K$7$^$9!#(B @vindex gnus-show-mime -@vindex gnus-show-mime-method +@vindex gnus-article-display-method-for-mime @vindex gnus-strict-mime -@findex metamail-buffer -Gnus $B$O(B @code{gnus-show-mime-method} $B$K5-;v$r2!$7IU$1$k$3$H$G(B @sc{mime} $B$r(B -$B07$$$^$9!#$3$l$O%G%#%U%)%k%H$G$O(B @code{gnus-show-mime-method} $B$G$9!#$3$N4X(B -$B?t$O(B SEMI MIME-View $B%W%m%0%i%`$r8F$S=P$7$F\$7$$>pJs$O!"%^%K%e%"%k$r;2>H$7$F$/$@$5$$!J$^$@$J$$$1$I(B -(;_;)$B!K!#(B +@findex gnus-article-display-mime-message +Gnus $B$O(B @code{gnus-article-display-method-for-mime} $B$K5-;v$r2!$7IU$1$k$3(B +$B$H$G(B @sc{mime} $B$r07$$$^$9!#$3$N=i4|CM$O(B +@code{gnus-article-display-mime-message} $B$G$9!#$3$N4X?t$O(B SEMI MIME-View +$B%W%m%0%i%`$r8F$S=P$7$F\$7(B +$B$$>pJs$O!"%^%K%e%"%k$r;2>H$7$F$/$@$5$$!J$^$@$J$$$1$I(B(;_;)$B!K!#(B @sc{mime} $B$r>o$K;HMQ$7$?$1$l$P!"(B@code{gnus-show-mime} $B$r(B @code{t} $B$K@_Dj$7$F$/$@$5$$!#$7$+$7!"(B@code{gnus-strict-mime} $B$,(B diff --git a/texi/gnus.texi b/texi/gnus.texi index 1c66d0d..d5c5e7e 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename gnus -@settitle Semi-gnus 6.4.0 Manual +@settitle Semi-gnus 6.7.2 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -316,7 +316,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Semi-gnus 6.4.0 Manual +@title Semi-gnus 6.7.2 Manual @author by Lars Magne Ingebrigtsen @page @@ -359,7 +359,7 @@ internationalization/localization and multiscript features based on MULE API. So Semi-gnus does not discriminate various language communities. Oh, if you are a Klingon, please wait Unicode Next Generation. -This manual corresponds to Semi-gnus 6.4.0. +This manual corresponds to Semi-gnus 6.7.2. @end ifinfo @@ -941,6 +941,10 @@ into the directory where the @file{.newsrc} file is located. (This is normally the user's home directory.) The dribble file will get the same file permissions as the @code{.newsrc} file. +@vindex gnus-always-read-dribble-file +If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will +read the dribble file on startup without querying the user. + @node The Active File @section The Active File @@ -1945,10 +1949,12 @@ Add the current group to an @code{nnvirtual} group methods. @vindex gnus-activate-foreign-newsgroups -If @code{gnus-activate-foreign-newsgroups} is a positive number, gnus -will check all foreign groups with this level or lower at startup. This -might take quite a while, especially if you subscribe to lots of groups -from different @sc{nntp} servers. +If @code{gnus-activate-foreign-newsgroups} is a positive number, +gnus will check all foreign groups with this level or lower at startup. +This might take quite a while, especially if you subscribe to lots of +groups from different @sc{nntp} servers. Also @pxref{Group Levels}; +@code{gnus-activate-level} also affects activation of foreign +newsgroups. @node Group Parameters @@ -7817,14 +7823,15 @@ of the characters, and it also makes it possible to embed pictures and other naughty stuff in innocent-looking articles. @vindex gnus-show-mime -@vindex gnus-show-mime-method +@vindex gnus-article-display-method-for-mime @vindex gnus-strict-mime -@findex metamail-buffer +@findex gnus-article-display-mime-message Gnus handles @sc{mime} by pushing the articles through -@code{gnus-show-mime-method}, which is @code{gnus-show-mime-method} by -default. This function calls the SEMI MIME-View program to actually do -the work. For more information on SEMI MIME-View, see its manual page -(however it is not existed yet, sorry). +@code{gnus-article-display-method-for-mime}, which is +@code{gnus-article-display-mime-message} by default. This function +calls the SEMI MIME-View program to actually do the work. For more +information on SEMI MIME-View, see its manual page (however it is not +existed yet, sorry). Set @code{gnus-show-mime} to @code{t} if you want to use @sc{mime} all the time. However, if @code{gnus-strict-mime} is @@ -9029,14 +9036,18 @@ server. @findex nntp-open-network-stream @item nntp-open-connection-function @vindex nntp-open-connection-function -This function is used to connect to the remote system. Three pre-made -functions are @code{nntp-open-network-stream}, which is the default, and -simply connects to some port or other on the remote system. The other -two are @code{nntp-open-rlogin}, which does an @samp{rlogin} on the +This function is used to connect to the remote system. Four pre-made +functions are supplied: + +@table @code +@item nntp-open-network-stream +This is the default, and simply connects to some port or other on the +remote system. + +@item nntp-open-rlogin +Does an @samp{rlogin} on the remote system, and then does a @samp{telnet} to the @sc{nntp} server -available there, and @code{nntp-open-telnet}, which does a @samp{telnet} -to the remote system and then another @samp{telnet} to get to the -@sc{nntp} server. +available there. @code{nntp-open-rlogin}-related variables: @@ -9057,6 +9068,10 @@ User name on the remote system. @end table +@item nntp-open-telnet +Does a @samp{telnet} to the remote system and then another @samp{telnet} +to get to the @sc{nntp} server. + @code{nntp-open-telnet}-related variables: @table @code @@ -9094,6 +9109,27 @@ This works for Solaris @code{telnet}, for instance. @end table +@findex nntp-open-ssl-stream +@item nntp-open-ssl-stream +Opens a connection to a server over a @dfn{secure} channel. To use this +you must have SSLay installed +(@file{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need +@file{ssl.el} (from the W3 distributeion, for instance). You then +define a server as follows: + +@lisp +;; Type `C-c C-c' after you've finished editing. +;; +;; "snews" is port 563 and is predefined in our /etc/services +;; +(nntp "snews.bar.com" + (nntp-open-connection-function nntp-open-ssl-stream) + (nntp-port-number "snews") + (nntp-address "snews.bar.com")) +@end lisp + +@end table + @item nntp-end-of-line @vindex nntp-end-of-line String to use as end-of-line marker when talking to the @sc{nntp} @@ -11019,6 +11055,24 @@ will get this @code{From} header inserted: To: alt-religion-emacs@@GATEWAY @end example +The following pre-defined functions exist: + +@findex nngateway-simple-header-transformation +@table @code + +@item nngateway-simple-header-transformation +Creates a @code{To} header that looks like +@var{newsgroup}@@@code{nngateway-address}. + +@findex nngateway-mail2news-header-transformation + +@item nngateway-mail2news-header-transformation +Creates a @code{To} header that looks like +@samp{mail2news}@@@code{nngateway-address}. + +@end table + + @end table So, to use this, simply say something like: @@ -11821,12 +11875,6 @@ Run the current summary through the scoring process around with your score files behind Gnus' back and want to see the effect you're having. -@item V a -@kindex V a (Summary) -@findex gnus-summary-score-entry -Add a new score entry, and allow specifying all elements -(@code{gnus-summary-score-entry}). - @item V c @kindex V c (Summary) @findex gnus-score-change-score-file @@ -15728,7 +15776,7 @@ actually are people who are using Gnus. Who'd'a thunk it! * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. * September Gnus:: The Thing Formally Known As Gnus 5.3/5.3. * Red Gnus:: Third time best---Gnus 5.4/5.5. -* Quassia Gnus:: Two times two is four, or Gnus 5.6.11. +* Quassia Gnus:: Two times two is four, or Gnus 5.6.15. @end menu These lists are, of course, just @emph{short} overviews of the @@ -16263,7 +16311,7 @@ Emphasized text can be properly fontisized: @node Quassia Gnus @subsubsection Quassia Gnus -New features in Gnus 5.6.11: +New features in Gnus 5.6.15: @itemize @bullet @@ -17559,6 +17607,15 @@ New spec: %~(tab 56) to put point on column 56 Allow Gnus Agent scoring to use normal score files. @item +Rething the Agent active file thing. `M-g' doesn't update the active +file, for instance. + +@item +With dummy roots, `^' and then selecing the first article +in any other dummy thread will make gnus highlight the +dummy root instead of the first article. + +@item Solve the halting problem. @c TODO diff --git a/texi/message.texi b/texi/message.texi index cdb63f4..069ee96 100644 --- a/texi/message.texi +++ b/texi/message.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename message -@settitle Message 5.6.11 Manual +@settitle Message 5.6.15 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Message 5.6.11 Manual +@title Message 5.6.15 Manual @author by Lars Magne Ingebrigtsen @page @@ -83,7 +83,7 @@ Message mode buffers. * Key Index:: List of Message mode keys. @end menu -This manual corresponds to Message 5.6.11. Message is distributed with +This manual corresponds to Message 5.6.15. Message is distributed with the Gnus distribution bearing the same version number as this manual has.