From 8745225c20877a30e9c12da7dc8d6be8b19d5822 Mon Sep 17 00:00:00 2001 From: ichikawa Date: Mon, 29 Jun 1998 04:41:54 +0000 Subject: [PATCH] Sync up with Gnus 5.6.21 --- ChangeLog | 118 ++++++++++++++- lisp/ChangeLog | 271 +++++++++++++++++++++++++++++++++++ lisp/gnus-art.el | 152 +++++++++----------- lisp/gnus-cache.el | 3 +- lisp/gnus-demon.el | 5 +- lisp/gnus-ems.el | 10 ++ lisp/gnus-group.el | 4 +- lisp/gnus-msg.el | 21 ++- lisp/gnus-salt.el | 26 ++-- lisp/gnus-score.el | 146 ++++++++++--------- lisp/gnus-soup.el | 2 + lisp/gnus-spec.el | 8 +- lisp/gnus-start.el | 8 +- lisp/gnus-sum.el | 406 +++++++++++++++++++++++++++------------------------- lisp/gnus-topic.el | 66 +++++---- lisp/gnus-util.el | 55 +++++-- lisp/gnus-uu.el | 4 +- lisp/gnus.el | 11 +- lisp/lpath.el | 5 +- lisp/message.el | 77 ++++++---- lisp/nnagent.el | 2 +- lisp/nndoc.el | 4 +- lisp/nnfolder.el | 15 +- lisp/nngateway.el | 10 +- lisp/nnheader.el | 2 + lisp/nnkiboze.el | 9 +- lisp/nnmail.el | 19 ++- lisp/nntp.el | 13 +- lisp/nnvirtual.el | 2 +- texi/ChangeLog | 25 ++++ texi/gnus-ja.texi | 14 +- texi/gnus.texi | 219 +++++++++++++++++++++------- texi/message.texi | 6 +- 33 files changed, 1211 insertions(+), 527 deletions(-) diff --git a/ChangeLog b/ChangeLog index 25d53e2..fc4c146 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,122 @@ +1998-06-29 Tatsuya Ichikawa + + * lisp/gnus.el (gnus-version-number): Update to 6.7.6. + * Sync up with Gnus 5.6.21 + +1998-06-27 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.7.6. + +1998-06-27 MORIOKA Tomohiko + + * lisp/gnus-art.el (gnus-mime-preview-quitting-method): Renamed + from `mime-preview-quitting-method-for-gnus'. + +1998-06-27 MORIOKA Tomohiko + + * lisp/gnus-sum.el (gnus-summary-preview-mime-message): New + implementation. + + * lisp/gnus-art.el (mime-preview-quitting-method-for-gnus): Use + `gnus-article-show-summary' is `gnus-show-mime' is not nil. + +1998-06-27 MORIOKA Tomohiko + + * texi/ChangeLog, texi/gnus.texi, texi/message.texi, + lisp/ChangeLog, lisp/gnus.el, lisp/nngateway.el, lisp/nnfolder.el, + lisp/message.el, lisp/gnus-sum.el, lisp/gnus-soup.el: Sync up with + Gnus 5.6.20. + +1998-06-26 MORIOKA Tomohiko + + * readme, README, texi/ChangeLog, texi/gnus.texi, + texi/message.texi, lisp/ChangeLog, lisp/nnweb.el, lisp/nnmail.el, + lisp/nndoc.el, lisp/message.el, lisp/lpath.el, lisp/gnus.el, + lisp/gnus-util.el, lisp/gnus-topic.el, lisp/gnus-sum.el, + lisp/gnus-score.el, lisp/gnus-group.el, lisp/gnus-ems.el, + lisp/gnus-demon.el, lisp/gnus-art.el: Sync up with Gnus 5.6.16. + +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 - * lisp/gnus-sum.el (gnus-request-partial-message): Fix typo. + * 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 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7054db5..8db48c8 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,274 @@ +Sun Jun 28 09:54:52 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.21 is released. + +Sun Jun 28 08:51:39 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-edit-article-done): Copy the buffer to + a temp buffer before replacing. + + * gnus-msg.el (gnus-post-news): Treat broken-reply-to in + followups. + + * gnus-sum.el (gnus-summary-goto-subject): Position point. + +Sat Jun 27 09:19:20 1998 Lars Magne Ingebrigtsen + + * gnus-demon.el (gnus-util): Required. + + * gnus-score.el (gnus-score-body): Message fix. + + * gnus-group.el (gnus-group-highlight-line): Use it. + + * gnus-util.el + (gnus-put-text-properties-excluding-characters-with-faces): New + function. + +Sat Jun 27 08:56:08 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.20 is released. + +Sat Jun 27 08:49:51 1998 Arne Georg Gleditsch + + * gnus-sum.el (gnus-parent-headers): Check better for headers. + +Sat Jun 27 08:45:09 1998 Lars Magne Ingebrigtsen + + * message.el (message-check-news-body-syntax): Buggy checksum + check. + +Sat Jun 27 07:59:22 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.19 is released. + +Sat Jun 27 07:50:50 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.18 is released. + +Sat Jun 27 03:18:57 1998 Lars Magne Ingebrigtsen + + * gnus-soup.el (gnus-soup-save-areas): Made interactive. + + * nnfolder.el (nnfolder-request-replace-article): Check all X-From + headers. + + * gnus-sum.el (gnus-update-marks): Don't nix out cache lists. + + * nngateway.el (nngateway-mail2news-header-transformation): + Changed semantics. + + * message.el (message-check-news-body-syntax): Don't look at + buffer size to see whether text has been added. + +Fri Jun 26 15:46:05 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.16 is released. + +Fri Jun 26 15:36:25 1998 Lars Magne Ingebrigtsen + + * gnus-util.el (gnus-delete-assq): Removed. + (gnus-delete-assoc): Ditto. + + * gnus.el: Use throughout. + + * gnus-util.el (gnus-pull): New macro. + +1998-06-26 Simon Josefsson + + * gnus-sum.el (gnus-get-newsgroup-headers): parse Chars: headers + +Fri Jun 26 13:45:24 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-update-marks): Use it. + + * gnus-util.el (gnus-delete-alist): New function. + + * gnus-sum.el (gnus-update-marks): Don't save list of cached + articles. + + * message.el (message-mode-menu): Include kill-buffer. + + * nnmail.el (nnmail-purge-split-history): Use it. + + * gnus-util.el (gnus-delete-if): New function. + + * nnmail.el (nnmail-article-group): Use gnus-remove-duplicates. + +Fri Jun 26 13:45:09 1998 Richard Stallman + + * gnus-util.el (gnus-remove-duplicates): New function. + +Fri Jun 26 13:30:42 1998 Kevin Christian + + * gnus-score.el (gnus-score-string): Do updating of scores after + fuzzies. + +Fri Jun 26 07:26:03 1998 Lars Magne Ingebrigtsen + + * message.el (message-mode): Don't do the intern dance. + +Fri Jun 26 07:13:49 1998 Richard Stallman + + * message.el (message-mode): Adaptive fill changes. + +Fri Jun 26 04:29:44 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-mode-line-format-alist): Allow article + score. + + * gnus-score.el (gnus-score-load-file): Would ignore all score + files without un-advanced rules. + + * gnus-ems.el ((fboundp 'split-string)): Use it where it exists. + +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..830e8bf 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) @@ -3062,14 +3060,6 @@ specified by `gnus-button-alist'." (match-string 3 address) "nntp"))))))) -(defun gnus-split-string (string pattern) - "Return a list of substrings of STRING which are separated by PATTERN." - (let (parts (start 0)) - (while (string-match pattern string start) - (setq parts (cons (substring string start (match-beginning 0)) parts) - start (match-end 0))) - (nreverse (cons (substring string start) parts)))) - (defun gnus-url-parse-query-string (query &optional downcase) (let (retval pairs cur key val) (setq pairs (gnus-split-string query "&")) @@ -3243,26 +3233,20 @@ forbidden in URL encoding." 'gnus-original-article-mode #'gnus-article-header-presentation-method) -(defun mime-preview-quitting-method-for-gnus () - (if (not gnus-show-mime) - (mime-preview-kill-buffer)) - (delete-other-windows) - (gnus-article-show-summary) - (if (or (not gnus-show-mime) - (null gnus-have-all-headers)) - (gnus-summary-select-article nil t) +(defun gnus-mime-preview-quitting-method () + (if gnus-show-mime + (gnus-article-show-summary) + (mime-preview-kill-buffer) + (delete-other-windows) + (gnus-article-show-summary) + (gnus-summary-select-article nil t) )) (set-alist 'mime-raw-representation-type-alist 'gnus-original-article-mode 'binary) (set-alist 'mime-preview-quitting-method-alist - '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) + 'gnus-original-article-mode #'gnus-mime-preview-quitting-method) (defun gnus-following-method (buf) (set-buffer buf) 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-demon.el b/lisp/gnus-demon.el index 594bc9f..0015a90 100644 --- a/lisp/gnus-demon.el +++ b/lisp/gnus-demon.el @@ -32,6 +32,7 @@ (require 'nnheader) (require 'nntp) (require 'nnmail) +(require 'gnus-util) (eval-and-compile (if (string-match "XEmacs" (emacs-version)) (require 'itimer) @@ -97,9 +98,7 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's." (defun gnus-demon-remove-handler (function &optional no-init) "Remove the handler FUNCTION from the list of handlers." - (setq gnus-demon-handlers - (delq (assq function gnus-demon-handlers) - gnus-demon-handlers)) + (gnus-pull function gnus-demon-handlers) (unless no-init (gnus-demon-init))) diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el index 24b240a..7328093 100644 --- a/lisp/gnus-ems.el +++ b/lisp/gnus-ems.el @@ -315,6 +315,16 @@ (goto-char (point-min)) (sit-for 0)))))) +(if (fboundp 'split-string) + (fset 'gnus-split-string 'split-string) + (defun gnus-split-string (string pattern) + "Return a list of substrings of STRING which are separated by PATTERN." + (let (parts (start 0)) + (while (string-match pattern string start) + (setq parts (cons (substring string start (match-beginning 0)) parts) + start (match-end 0))) + (nreverse (cons (substring string start) parts))))) + (provide 'gnus-ems) ;; Local Variables: diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index d4bfd54..3d9fc88 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -1127,7 +1127,7 @@ If REGEXP, only list groups matching REGEXP." (setq list (cdr list))) (let ((face (cdar list))) (unless (eq face (get-text-property beg 'face)) - (gnus-put-text-property + (gnus-put-text-property-excluding-characters-with-faces beg end 'face (setq face (if (boundp face) (symbol-value face) face))) (gnus-extent-start-open beg))) @@ -3333,7 +3333,7 @@ and the second element is the address." (if force (if (null articles) (setcar (nthcdr 3 info) - (delq (assq type (car marked)) (car marked))) + (gnus-delete-alist type (car marked))) (setcdr m (gnus-compress-sequence articles t))) (setcdr m (gnus-compress-sequence (sort (nconc (gnus-uncompress-range (cdr m)) diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index a489f2b..0c830cb 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -414,6 +414,7 @@ header line with the old Message-ID." (if post (message-news (or to-group group)) (set-buffer gnus-article-copy) + (gnus-msg-treat-broken-reply-to) (message-followup (if (or newsgroup-p force-news) nil to-group))) ;; The is mail. (if post @@ -427,12 +428,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 +470,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 +517,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 +542,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-salt.el b/lisp/gnus-salt.el index 1efaa60..0dbf148 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 () @@ -638,7 +638,7 @@ Two predefined functions are available: (not (eval (caar list)))) (setq list (cdr list))))) (unless (eq (setq face (cdar list)) (get-text-property beg 'face)) - (gnus-put-text-property + (gnus-put-text-property-excluding-characters-with-faces beg end 'face (if (boundp face) (symbol-value face) face))))) diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index f324be2..68f9c69 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)) @@ -1104,9 +1089,13 @@ SCORE is the score to add." found) (while a ;; Downcase all header names. - (when (stringp (caar a)) + (cond + ((stringp (caar a)) (setcar (car a) (downcase (caar a))) (setq found t)) + ;; Advanced scoring. + ((consp (caar a)) + (setq found t))) (pop a)) ;; If there are actual scores in the alist, we add it to the ;; return value of this function. @@ -1322,7 +1311,7 @@ SCORE is the score to add." (and (file-exists-p file) (not (file-writable-p file)))) () - (setq score (setcdr entry (delq (assq 'touched score) score))) + (setq score (setcdr entry (gnus-delete-alist 'touched score))) (erase-buffer) (let (emacs-lisp-mode-hook) (if (string-match @@ -1662,7 +1651,7 @@ SCORE is the score to add." (setq request-func 'gnus-request-article)) (while articles (setq article (mail-header-number (caar articles))) - (gnus-message 7 "Scoring on article %s of %s..." article last) + (gnus-message 7 "Scoring article %s of %s..." article last) (when (funcall request-func article gnus-newsgroup-name) (widen) (goto-char (point-min)) @@ -1876,7 +1865,7 @@ SCORE is the score to add." (while (setq art (pop articles)) (setq this (aref (car art) gnus-score-index)) (if simplify - (setq this (gnus-map-function gnus-simplify-subject-functions this))) + (setq this (gnus-map-function gnus-simplify-subject-functions this))) (if (equal last this) ;; O(N*H) cons-cells used here, where H is the number of ;; headers. @@ -1909,7 +1898,7 @@ SCORE is the score to add." (mt (aref (symbol-name type) 0)) (case-fold-search (not (memq mt '(?R ?S ?E ?F)))) (dmt (downcase mt)) - ; Assume user already simplified regexp and fuzzies + ; Assume user already simplified regexp and fuzzies (match (if (and simplify (not (memq dmt '(?f ?r)))) (gnus-map-function gnus-simplify-subject-functions @@ -1923,10 +1912,12 @@ SCORE is the score to add." (cond ;; Fuzzy matches. We save these for later. ((= dmt ?f) - (push (cons entries alist) fuzzies)) + (push (cons entries alist) fuzzies) + (setq entries (cdr entries))) ;; Word matches. Save these for even later. ((= dmt ?w) - (push (cons entries alist) words)) + (push (cons entries alist) words) + (setq entries (cdr entries))) ;; Exact matches. ((= dmt ?e) ;; Do exact matching. @@ -1951,7 +1942,26 @@ SCORE is the score to add." gnus-score-trace)) (while (setq art (pop arts)) (setcdr art (+ score (cdr art))))))) - (forward-line 1))) + (forward-line 1)) + ;; Update expiry date + (if trace + (setq entries (cdr entries)) + (cond + ;; Permanent entry. + ((null date) + (setq entries (cdr entries))) + ;; We have a match, so we update the date. + ((and found gnus-update-score-entry-dates) + (gnus-score-set 'touched '(t) alist) + (setcar (nthcdr 2 kill) now) + (setq entries (cdr entries))) + ;; This entry has expired, so we remove it. + ((and expire (< date expire)) + (gnus-score-set 'touched '(t) alist) + (setcdr entries (cddr entries))) + ;; No match; go to next entry. + (t + (setq entries (cdr entries)))))) ;; Regexp and substring matching. (t (goto-char (point-min)) @@ -1970,26 +1980,26 @@ SCORE is the score to add." gnus-score-trace)) (while (setq art (pop arts)) (setcdr art (+ score (cdr art))))) - (forward-line 1)))) - ;; Update expiry date - (if trace - (setq entries (cdr entries)) - (cond - ;; Permanent entry. - ((null date) - (setq entries (cdr entries))) - ;; We have a match, so we update the date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now) - (setq entries (cdr entries))) - ;; This entry has expired, so we remove it. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cddr entries))) - ;; No match; go to next entry. - (t - (setq entries (cdr entries)))))))) + (forward-line 1)) + ;; Update expiry date + (if trace + (setq entries (cdr entries)) + (cond + ;; Permanent entry. + ((null date) + (setq entries (cdr entries))) + ;; We have a match, so we update the date. + ((and found gnus-update-score-entry-dates) + (gnus-score-set 'touched '(t) alist) + (setcar (nthcdr 2 kill) now) + (setq entries (cdr entries))) + ;; This entry has expired, so we remove it. + ((and expire (< date expire)) + (gnus-score-set 'touched '(t) alist) + (setcdr entries (cddr entries))) + ;; No match; go to next entry. + (t + (setq entries (cdr entries)))))))))) ;; Find fuzzy matches. (when fuzzies @@ -2021,18 +2031,19 @@ SCORE is the score to add." (setcdr art (+ score (cdr art)))))) (forward-line 1)) ;; Update expiry date - (cond - ;; Permanent. - ((null date) - ) - ;; Match, update date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) (cdar fuzzies)) - (setcar (nthcdr 2 kill) now)) - ;; Old entry, remove. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) (cdar fuzzies)) - (setcdr (caar fuzzies) (cddaar fuzzies)))) + (if (not trace) + (cond + ;; Permanent. + ((null date) + ) + ;; Match, update date. + ((and found gnus-update-score-entry-dates) + (gnus-score-set 'touched '(t) (cdar fuzzies)) + (setcar (nthcdr 2 kill) now)) + ;; Old entry, remove. + ((and expire (< date expire)) + (gnus-score-set 'touched '(t) (cdar fuzzies)) + (setcdr (caar fuzzies) (cddaar fuzzies))))) (setq fuzzies (cdr fuzzies))))) (when words @@ -2058,18 +2069,19 @@ SCORE is the score to add." (while (setq art (pop arts)) (setcdr art (+ score (cdr art)))))) ;; Update expiry date - (cond - ;; Permanent. - ((null date) - ) - ;; Match, update date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) (cdar words)) - (setcar (nthcdr 2 kill) now)) - ;; Old entry, remove. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) (cdar words)) - (setcdr (caar words) (cddaar words)))) + (if (not trace) + (cond + ;; Permanent. + ((null date) + ) + ;; Match, update date. + ((and found gnus-update-score-entry-dates) + (gnus-score-set 'touched '(t) (cdar words)) + (setcar (nthcdr 2 kill) now)) + ;; Old entry, remove. + ((and expire (< date expire)) + (gnus-score-set 'touched '(t) (cdar words)) + (setcdr (caar words) (cddaar words))))) (setq words (cdr words)))))) nil)) diff --git a/lisp/gnus-soup.el b/lisp/gnus-soup.el index 8e92821..be089bf 100644 --- a/lisp/gnus-soup.el +++ b/lisp/gnus-soup.el @@ -310,6 +310,8 @@ If NOT-ALL, don't pack ticked articles." (or (mail-header-lines header) "0")))) (defun gnus-soup-save-areas () + "Write all SOUP buffers." + (interactive) (gnus-soup-write-areas) (save-excursion (let (buf) diff --git a/lisp/gnus-spec.el b/lisp/gnus-spec.el index 138dff8..9163180 100644 --- a/lisp/gnus-spec.el +++ b/lisp/gnus-spec.el @@ -237,9 +237,10 @@ (defvar gnus-face-4 'bold) (defun gnus-face-face-function (form type) - `(gnus-put-text-property + `(gnus-add-text-properties (point) (progn ,@form (point)) - 'face ',(symbol-value (intern (format "gnus-face-%d" type))))) + '(gnus-face t + face ',(symbol-value (intern (format "gnus-face-%d" type)))))) (defun gnus-tilde-max-form (el max-width) "Return a form that limits EL to MAX-WIDTH." @@ -307,7 +308,8 @@ (let ((number (if (match-beginning 1) (match-string 1) "0")) (delim (aref (match-string 2) 0))) - (if (or (= delim ?\() (= delim ?\{)) + (if (or (= delim ?\() + (= delim ?\{)) (replace-match (concat "\"(" (if (= delim ?\() "mouse" "face") " " number " \"")) (replace-match "\")\"")))) 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 f1837ac..1e2ab96 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) @@ -514,6 +513,7 @@ with some simple extensions: %G Group name %p Unprefixed group name %A Current article number +%z Current article score %V Gnus version %U Number of unread articles in the group %e Number of unselected articles in the group @@ -875,6 +875,7 @@ variable (string, integer, character, etc).") (?d (length gnus-newsgroup-dormant) ?d) (?t (length gnus-newsgroup-marked) ?d) (?r (length gnus-newsgroup-reads) ?d) + (?z (gnus-summary-article-score gnus-tmp-article-number) ?d) (?E gnus-newsgroup-expunged-tally ?d) (?s (gnus-current-score-file-nondirectory) ?s))) @@ -2424,7 +2425,7 @@ marks of articles." (setq gnus-tmp-name gnus-tmp-from)) (unless (numberp gnus-tmp-lines) (setq gnus-tmp-lines 0)) - (gnus-put-text-property + (gnus-put-text-property-excluding-characters-with-faces (point) (progn (eval gnus-summary-line-format-spec) (point)) 'gnus-number gnus-tmp-number) @@ -2871,25 +2872,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 +2897,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 +2910,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 +2931,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 +2950,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 +2962,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 +3013,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 +3088,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 +3105,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 +3113,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 +3200,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 +3232,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 +3242,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." @@ -3199,13 +3268,13 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns NIL otherwise." (headers in-headers) references) (while (and parent - headers (not (zerop generation)) (setq references (mail-header-references headers))) - (when (and references - (setq parent (gnus-parent-id references)) - (setq headers (car (gnus-id-to-thread parent)))) - (decf generation))) + (setq headers (if (and references + (setq parent (gnus-parent-id references))) + (car (gnus-id-to-thread parent)) + nil)) + (decf generation)) (and (not (eq headers in-headers)) headers))) @@ -3693,7 +3762,7 @@ or a straight list of headers." (setq gnus-tmp-name gnus-tmp-from)) (unless (numberp gnus-tmp-lines) (setq gnus-tmp-lines 0)) - (gnus-put-text-property + (gnus-put-text-property-excluding-characters-with-faces (point) (progn (eval gnus-summary-line-format-spec) (point)) 'gnus-number number) @@ -4292,7 +4361,7 @@ The resulting hash table is returned, or nil if no Xrefs were found." (subst-char-in-region (point-min) (point-max) ?\t ? t) (gnus-run-hooks 'gnus-parse-headers-hook) (let ((case-fold-search t) - in-reply-to header p lines) + in-reply-to header p lines chars) (goto-char (point-min)) ;; Search to the beginning of the next header. Error messages ;; do not begin with 2 or 3. @@ -4381,7 +4450,12 @@ The resulting hash table is returned, or nil if no Xrefs were found." (setq ref ref2)))) (setq ref nil)))) ;; Chars. - 0 + (progn + (goto-char p) + (if (search-forward "\nchars: " nil t) + (if (numberp (setq chars (ignore-errors (read cur)))) + chars 0) + 0)) ;; Lines. (progn (goto-char p) @@ -4402,76 +4476,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 +4560,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 +4595,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)) @@ -5151,17 +5167,12 @@ The state which existed when entering the ephemeral is reset." (defun gnus-summary-preview-mime-message (arg) "MIME decode and play this message." (interactive "P") - (let ((gnus-break-pages nil)) - (gnus-summary-select-article t t) - ) - (pop-to-buffer gnus-original-article-buffer t) - (let (buffer-read-only) - (if (text-property-any (point-min) (point-max) 'invisible t) - (remove-text-properties (point-min) (point-max) - gnus-hidden-properties) - )) - (mime-view-mode nil nil nil gnus-original-article-buffer - gnus-article-buffer) + (or gnus-show-mime + (let ((gnus-break-pages nil) + (gnus-show-mime t)) + (gnus-summary-select-article t t) + )) + (select-window (get-buffer-window gnus-article-buffer)) ) (defun gnus-summary-scroll-down () @@ -5419,7 +5430,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) @@ -5428,6 +5442,7 @@ If FORCE, also allow jumping to articles not currently shown." (gnus-message 3 "Can't find article %d" article)) nil) (goto-char (gnus-data-pos data)) + (gnus-summary-position-point) article))) ;; Walking around summary lines with displaying articles. @@ -5529,7 +5544,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 +5820,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 +5923,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 +7247,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 @@ -7285,55 +7302,58 @@ groups." "Make edits to the current article permanent." (interactive) ;; Replace the article. - (if (and (not read-only) - (not (gnus-request-replace-article - (cdr gnus-article-current) (car gnus-article-current) - (current-buffer)))) - (error "Couldn't replace article") - ;; Update the summary buffer. - (if (and references - (equal (message-tokenize-header references " ") - (message-tokenize-header - (or (message-fetch-field "references") "") " "))) - ;; We only have to update this line. - (save-excursion - (save-restriction - (message-narrow-to-head) - (let ((head (buffer-string)) - header) - (nnheader-temp-write nil - (insert (format "211 %d Article retrieved.\n" - (cdr gnus-article-current))) - (insert head) - (insert ".\n") - (let ((nntp-server-buffer (current-buffer))) - (setq header (car (gnus-get-newsgroup-headers - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-dependencies) - t)))) - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-data-set-header - (gnus-data-find (cdr gnus-article-current)) - header) - (gnus-summary-update-article-line - (cdr gnus-article-current) header)))))) - ;; Update threads. - (set-buffer (or buffer gnus-summary-buffer)) - (gnus-summary-update-article (cdr gnus-article-current))) - ;; Prettify the article buffer again. - (unless no-highlight - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-run-hooks 'gnus-article-display-hook) - (set-buffer gnus-original-article-buffer) - (gnus-request-article - (cdr gnus-article-current) - (car gnus-article-current) (current-buffer)))) - ;; Prettify the summary buffer line. - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-visual-mark-article-hook)))) + (let ((buf (current-buffer))) + (nnheader-temp-write nil + (insert-buffer buf) + (if (and (not read-only) + (not (gnus-request-replace-article + (cdr gnus-article-current) (car gnus-article-current) + (current-buffer)))) + (error "Couldn't replace article") + ;; Update the summary buffer. + (if (and references + (equal (message-tokenize-header references " ") + (message-tokenize-header + (or (message-fetch-field "references") "") " "))) + ;; We only have to update this line. + (save-excursion + (save-restriction + (message-narrow-to-head) + (let ((head (buffer-string)) + header) + (nnheader-temp-write nil + (insert (format "211 %d Article retrieved.\n" + (cdr gnus-article-current))) + (insert head) + (insert ".\n") + (let ((nntp-server-buffer (current-buffer))) + (setq header (car (gnus-get-newsgroup-headers + (save-excursion + (set-buffer gnus-summary-buffer) + gnus-newsgroup-dependencies) + t)))) + (save-excursion + (set-buffer gnus-summary-buffer) + (gnus-data-set-header + (gnus-data-find (cdr gnus-article-current)) + header) + (gnus-summary-update-article-line + (cdr gnus-article-current) header)))))) + ;; Update threads. + (set-buffer (or buffer gnus-summary-buffer)) + (gnus-summary-update-article (cdr gnus-article-current))) + ;; Prettify the article buffer again. + (unless no-highlight + (save-excursion + (set-buffer gnus-article-buffer) + (gnus-run-hooks 'gnus-article-display-hook) + (set-buffer gnus-original-article-buffer) + (gnus-request-article + (cdr gnus-article-current) + (car gnus-article-current) (current-buffer)))) + ;; Prettify the summary buffer line. + (when (gnus-visual-p 'summary-highlight 'highlight) + (gnus-run-hooks 'gnus-visual-mark-article-hook)))))) (defun gnus-summary-edit-wash (key) "Perform editing command KEY in the article buffer." @@ -7631,9 +7651,7 @@ returned." (push article gnus-newsgroup-dormant)) (t (push article gnus-newsgroup-unreads))) - (setq gnus-newsgroup-reads - (delq (assq article gnus-newsgroup-reads) - gnus-newsgroup-reads)) + (gnus-pull article gnus-newsgroup-reads) ;; See whether the article is to be put in the cache. (and gnus-use-cache @@ -7774,9 +7792,7 @@ marked." (push article gnus-newsgroup-dormant)) (t (push article gnus-newsgroup-unreads))) - (setq gnus-newsgroup-reads - (delq (assq article gnus-newsgroup-reads) - gnus-newsgroup-reads)) + (gnus-pull article gnus-newsgroup-reads) t))) (defalias 'gnus-summary-mark-as-unread-forward @@ -8835,7 +8851,7 @@ save those articles instead." (setq list (cdr list)))) (let ((face (cdar list))) (unless (eq face (get-text-property beg 'face)) - (gnus-put-text-property + (gnus-put-text-property-excluding-characters-with-faces beg end 'face (setq face (if (boundp face) (symbol-value face) face))) (when gnus-summary-highlight-line-function diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el index 249367d..1f404ba 100644 --- a/lisp/gnus-topic.el +++ b/lisp/gnus-topic.el @@ -31,6 +31,7 @@ (require 'gnus) (require 'gnus-group) (require 'gnus-start) +(require 'gnus-util) (defgroup gnus-topic nil "Group topics." @@ -166,9 +167,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 +201,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 +327,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. + (gnus-pull (car param) out) + (push param out))) + ;; Return the resulting parameter list. + out)) ;;; General utility functions @@ -406,7 +414,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 +1268,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-util.el b/lisp/gnus-util.el index 1665191..82e7f94 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -603,14 +603,6 @@ Bind `print-quoted' and `print-readably' to t while printing." ;; Write the buffer. (write-region (point-min) (point-max) file nil 'quietly)) -(defmacro gnus-delete-assq (key list) - `(let ((listval (eval ,list))) - (setq ,list (delq (assq ,key listval) listval)))) - -(defmacro gnus-delete-assoc (key list) - `(let ((listval ,list)) - (setq ,list (delq (assoc ,key listval) listval)))) - (defun gnus-delete-file (file) "Delete FILE if it exists." (when (file-exists-p file) @@ -629,10 +621,22 @@ Bind `print-quoted' and `print-readably' to t while printing." (save-restriction (goto-char beg) (while (re-search-forward "[ \t]*\n" end 'move) - (put-text-property beg (match-beginning 0) prop val) + (gnus-put-text-property beg (match-beginning 0) prop val) (setq beg (point))) - (put-text-property beg (point) prop val))))) - + (gnus-put-text-property beg (point) prop val))))) + +(defun gnus-put-text-property-excluding-characters-with-faces (beg end + prop val) + "The same as `put-text-property', but don't put props on characters with the `gnus-face' property." + (let ((b beg)) + (while (/= b end) + (when (get-text-property b 'gnus-face) + (setq b (next-single-property-change b 'gnus-face nil end))) + (when (/= b end) + (gnus-put-text-property + b (setq b (next-single-property-change b 'gnus-face nil end)) + prop val))))) + ;;; Protected and atomic operations. dmoore@ucsd.edu 21.11.1996 ;;; The primary idea here is to try to protect internal datastructures ;;; from becoming corrupted when the user hits C-g, or if a hook or @@ -933,6 +937,35 @@ ARG is passed to the first function." (set-buffer gnus-group-buffer) (eq major-mode 'gnus-group-mode)))) +(defun gnus-remove-duplicates (list) + (let (new (tail list)) + (while tail + (or (member (car tail) new) + (setq new (cons (car tail) new))) + (setq tail (cdr tail))) + (nreverse new))) + +(defun gnus-delete-if (predicate list) + "Delete elements from LIST that satisfy PREDICATE." + (let (out) + (while list + (when (funcall predicate (car list)) + (push (car list) out)) + (pop list)) + (nreverse out))) + +(defun gnus-delete-alist (key alist) + "Delete all entries in ALIST that have a key eq to KEY." + (let (entry) + (while (setq entry (assq key alist)) + (setq alist (delq entry alist))) + alist)) + +(defmacro gnus-pull (key alist) + "Modify ALIST to be without KEY." + (unless (symbolp alist) + (error "Not a symbol: %s" alist)) + `(setq ,alist (delq (assq ,key ,alist) ,alist))) (provide 'gnus-util) 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 a41ad38..f87290f 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.6.0" +(defconst gnus-version-number "6.7.7" "Version number for this version of gnus.") (defconst gnus-version - (format "Semi-gnus %s (based on Gnus 5.6.11; for SEMI 1.8)" + (format "Semi-gnus %s (based on Gnus 5.6.21; for SEMI 1.8)" gnus-version-number) "Version string for this version of gnus.") @@ -2462,7 +2462,7 @@ also examines the topic parameters." (when params (setq params (delq name params)) (while (assq name params) - (setq params (delq (assq name params) params))) + (gnus-pull name params)) (gnus-info-set-params info params)))))) (defun gnus-group-add-score (group &optional score) @@ -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/lpath.el b/lisp/lpath.el index b4b458c..c8ee274 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -35,7 +35,7 @@ make-char-table set-char-table-range font-create-object x-color-values widget-make-intangible error-message-string w3-form-encode-xwfu gnus-mule-get-coding-system - decode-coding-string)) + decode-coding-string mail-aliases-setup)) (maybe-bind '(global-face-data mark-active transient-mark-mode mouse-selection-click-count mouse-selection-click-count-buffer buffer-display-table @@ -58,7 +58,8 @@ set-glyph-property event-glyph glyph-property event-point device-on-window-system-p make-gui-button Info-goto-node pp-to-string color-name - gnus-mule-get-coding-system decode-coding-string))) + gnus-mule-get-coding-system decode-coding-string + mail-aliases-setup))) (setq load-path (cons "." load-path)) (require 'custom) diff --git a/lisp/message.el b/lisp/message.el index 08fac7d..f761af0 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) @@ -1241,7 +1241,8 @@ Return the number of headers removed." ["Spellcheck" ispell-message t] "----" ["Send Message" message-send-and-exit t] - ["Abort Message" message-dont-send t])) + ["Abort Message" message-dont-send t] + ["Kill Message" message-kill-buffer t])) (easy-menu-define message-mode-field-menu message-mode-map "" @@ -1314,19 +1315,18 @@ C-c C-r message-caesar-buffer-body (rot13 the message body)." facemenu-remove-face-function t) (make-local-variable 'paragraph-separate) (make-local-variable 'paragraph-start) + ;; `-- ' precedes the signature. `-----' appears at the start of the + ;; lines that delimit forwarded messages. + ;; Lines containing just >= 3 dashes, perhaps after whitespace, + ;; are also sometimes used and should be separators. (setq paragraph-start (concat (regexp-quote mail-header-separator) - "$\\|[ \t]*[-_][-_][-_]+$\\|" - "-- $\\|" + "$\\|[ \t]*[a-z0-9A-Z]*>+[ \t]*$\\|[ \t]*$\\|" + "-- $\\|---+$\\|" + page-delimiter ;;!!! Uhm... shurely this can't be right? - "[> " (regexp-quote message-yank-prefix) "]+$\\|" - paragraph-start)) - (setq paragraph-separate - (concat (regexp-quote mail-header-separator) - "$\\|[ \t]*[-_][-_][-_]+$\\|" - "-- $\\|" - "[> " (regexp-quote message-yank-prefix) "]+$\\|" - paragraph-separate)) + "[> " (regexp-quote message-yank-prefix) "]+$")) + (setq paragraph-separate paragraph-start) (make-local-variable 'message-reply-headers) (setq message-reply-headers nil) (make-local-variable 'message-newsreader) @@ -1346,7 +1346,7 @@ C-c C-r message-caesar-buffer-body (rot13 the message body)." (when (eq message-mail-alias-type 'abbrev) (if (fboundp 'mail-abbrevs-setup) (mail-abbrevs-setup) - (funcall (intern "mail-aliases-setup")))) + (mail-aliases-setup))) (message-set-auto-save-file-name) (unless (string-match "XEmacs" emacs-version) (set (make-local-variable 'font-lock-defaults) @@ -1732,7 +1732,7 @@ prefix, and don't delete any headers." (unless (bolp) (insert ?\n)) (unless modified - (setq message-checksum (cons (message-checksum) (buffer-size))))))) + (setq message-checksum (message-checksum)))))) (defun message-cite-original-without-signature () "Cite function in the standard Message manner." @@ -2614,8 +2614,7 @@ to find out how to use this." (message-check 'new-text (or (not message-checksum) - (not (and (eq (message-checksum) (car message-checksum)) - (eq (buffer-size) (cdr message-checksum)))) + (not (eq (message-checksum) message-checksum)) (y-or-n-p "It looks like no new text has been added. Really post? "))) ;; Check the length of the signature. @@ -3183,6 +3182,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 +3387,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 +3414,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 +3494,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 +3864,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 +3877,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 +3890,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 +3904,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/nndoc.el b/lisp/nndoc.el index 96b45d5..0092ac0 100644 --- a/lisp/nndoc.el +++ b/lisp/nndoc.el @@ -616,9 +616,7 @@ as the last checked definition, if t or `first', add as the first definition, and if any other symbol, add after that symbol in the alist." ;; First remove any old instances. - (setq nndoc-type-alist - (delq (assq (car definition) nndoc-type-alist) - nndoc-type-alist)) + (gnus-pull (car definition) nndoc-type-alist) ;; Then enter the new definition in the proper place. (cond ((or (null position) (eq position 'last)) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 334b2b6..db9666b 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,21 @@ time saver for large mailboxes.") (save-excursion (set-buffer buffer) (goto-char (point-min)) - (when (looking-at "X-From-Line: ") - (replace-match "From ")) + (let (xfrom) + (while (re-search-forward "^X-From-Line: \\(.*\\)$" nil t) + (setq xfrom (match-string 1)) + (gnus-delete-line)) + (goto-char (point-min)) + (if xfrom + (insert "From " xfrom "\n") + (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..2139885 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: " 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..e761868 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -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)) @@ -1085,7 +1096,7 @@ FUNC will be called with the group name to determine the article number." "Error in `nnmail-split-methods'; using `bogus' mail group") (sit-for 1) '("bogus"))))) - (setq split (remove-duplicates split :test 'equal)) + (setq split (gnus-remove-duplicates split)) ;; The article may be "cross-posted" to `junk'. What ;; to do? Just remove the `junk' spec. Don't really ;; see anything else to do... @@ -1747,8 +1758,8 @@ If ARGS, PROMPT is used as an argument to `format'." (let ((history nnmail-split-history) prev) (while history - (setcar history (delete-if (lambda (e) (string= (car e) group)) - (car history))) + (setcar history (gnus-delete-if (lambda (e) (string= (car e) group)) + (car history))) (pop history)) (setq nnmail-split-history (delq nil nnmail-split-history)))) 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/texi/ChangeLog b/texi/ChangeLog index 1e7d48d..ae2a27f 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,28 @@ +Sat Jun 27 04:37:14 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Mail-To-News Gateways): Addition. + (Mail-To-News Gateways): Typo. + +Fri Jun 26 13:33:00 1998 Yoshiki Hayashi + + * gnus.texi (Summary Buffer Lines): Typo fix. + +Fri Jun 26 05:53:22 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Score File Format): Addition. + (Mode Line Formatting): New. + (Summary Buffer Mode Line): Addition. + +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..c64f97e 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.7 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.7 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.7. @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 @@ -1254,7 +1258,7 @@ group, or a bogus native group. @vindex gnus-group-mode-line-format The mode line can be changed by setting -@code{gnus-group-mode-line-format} (@pxref{Formatting Variables}). It +@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It doesn't understand that many format specifiers: @table @samp @@ -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 @@ -3285,7 +3291,7 @@ Score as a number (@pxref{Scoring}). @vindex gnus-summary-zcore-fuzz Zcore, @samp{+} if above the default level and @samp{-} if below the default level. If the difference between -@code{gnus-summary-default-level} and the score is less than +@code{gnus-summary-default-score} and the score is less than @code{gnus-summary-zcore-fuzz}, this spec will not be used. @item V Total thread score. @@ -3337,9 +3343,9 @@ This restriction may disappear in later versions of gnus. @subsection Summary Buffer Mode Line @vindex gnus-summary-mode-line-format -You can also change the format of the summary mode bar. Set -@code{gnus-summary-mode-line-format} to whatever you like. The default -is @samp{Gnus: %%b [%A] %Z}. +You can also change the format of the summary mode bar (@pxref{Mode Line +Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you +like. The default is @samp{Gnus: %%b [%A] %Z}. Here are the elements you can play with: @@ -3350,6 +3356,8 @@ Group name. Unprefixed group name. @item A Current article number. +@item z +Current article score. @item V Gnus version. @item U @@ -6319,7 +6327,8 @@ Cleaner, perhaps. @kindex W l (Summary) @findex gnus-summary-stop-page-breaking Remove page breaks from the current article -(@code{gnus-summary-stop-page-breaking}). +(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article} for page +delimiters. @item W r @kindex W r (Summary) @@ -6989,9 +6998,9 @@ A hook called in all tree mode buffers. @item gnus-tree-mode-line-format @vindex gnus-tree-mode-line-format -A format string for the mode bar in the tree mode buffers. The default -is @samp{Gnus: %%b %S %Z}. For a list of valid specs, @pxref{Summary -Buffer Mode Line}. +A format string for the mode bar in the tree mode buffers (@pxref{Mode +Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list +of valid specs, @pxref{Summary Buffer Mode Line}. @item gnus-selected-tree-face @vindex gnus-selected-tree-face @@ -7817,14 +7826,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 @@ -7976,8 +7986,9 @@ Syntax table used in article buffers. It is initialized from @vindex gnus-article-mode-line-format @item gnus-article-mode-line-format This variable is a format string along the same lines as -@code{gnus-summary-mode-line-format}. It accepts the same -format specifications as that variable, with one extension: +@code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}). It +accepts the same format specifications as that variable, with one +extension: @table @samp @item w @@ -8557,8 +8568,8 @@ The opened/closed/denied status of the server. @vindex gnus-server-mode-line-format The mode line can also be customized by using the -@code{gnus-server-mode-line-format} variable. The following specs are -understood: +@code{gnus-server-mode-line-format} variable (@pxref{Mode Line +Formatting}). The following specs are understood: @table @samp @item S @@ -9029,14 +9040,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 +9072,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 +9113,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 +11059,33 @@ 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 +@code{nngateway-address}. + +Here's an example: + +@lisp +(setq gnus-post-method + '(nngateway "mail2news@@replay.com" + (nngateway-header-transformation + nngateway-mail2news-header-transformation))) +@end lisp + +@end table + + @end table So, to use this, simply say something like: @@ -11475,7 +11542,7 @@ The number of groups in the category. @item gnus-category-mode-line-format @vindex gnus-category-mode-line-format -Format of the category mode line. +Format of the category mode line (@pxref{Mode Line Formatting}). @item gnus-agent-short-article @vindex gnus-agent-short-article @@ -11821,12 +11888,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 @@ -12297,11 +12358,31 @@ instead, if you feel like. @item Lines, Chars These two headers use different match types: @code{<}, @code{>}, -@code{=}, @code{>=} and @code{<=}. When matching on @code{Lines}, be -careful because some backends (like @code{nndir}) do not generate -@code{Lines} header, so every article ends up being marked as having 0 -lines. This can lead to strange results if you happen to lower score of -the articles with few lines. +@code{=}, @code{>=} and @code{<=}. + +These predicates are true if + +@example +(PREDICATE HEADER MATCH) +@end example + +evaluates to non-@code{nil}. For instance, the advanced match +@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the +following form: + +@lisp +(< header-value 4) +@end lisp + +Or to put it another way: When using @code{<} on @code{Lines} with 4 as +the match, we get the score added if the article has less than 4 lines. +(It's easy to get confused and think it's the other way around. But +it's not. I think.) + +When matching on @code{Lines}, be careful because some backends (like +@code{nndir}) do not generate @code{Lines} header, so every article ends +up being marked as having 0 lines. This can lead to strange results if +you happen to lower score of the articles with few lines. @item Date For the Date header we have three kinda silly match types: @@ -13596,7 +13677,8 @@ Interactive}. @section Formatting Variables @cindex formatting variables -Throughout this manual you've probably noticed lots of variables called things like @code{gnus-group-line-format} and +Throughout this manual you've probably noticed lots of variables called +things like @code{gnus-group-line-format} and @code{gnus-summary-mode-line-format}. These control how Gnus is to output lines in the various buffers. There's quite a lot of them. Fortunately, they all use the same syntax, so there's not that much to @@ -13608,6 +13690,7 @@ lots of percentages everywhere. @menu * Formatting Basics:: A formatting variable is basically a format string. +* Mode Line Formatting:: Some rules about mode line formatting variables. * Advanced Formatting:: Modifying output in various ways. * User-Defined Specs:: Having Gnus call your own functions. * Formatting Fonts:: Making the formatting look colorful and nice. @@ -13654,6 +13737,31 @@ means that the field will never be more than 6 characters wide and never less than 4 characters wide. +@node Mode Line Formatting +@subsection Mode Line Formatting + +Mode line formatting variables (e.g., +@code{gnus-summary-mode-line-format}) follow the same rules as other, +buffer line oriented formatting variables (@pxref{Formatting Basics}) +with the following two differences: + +@enumerate + +@item +There must be no newline (@samp{\n}) at the end. + +@item +The special @samp{%%b} spec can be used to display the buffer name. +Well, it's no spec at all, really---@samp{%%} is just a way to quote +@samp{%} to allow it to pass through the formatting machinery unmangled, +so that Emacs receives @samp{%b}, which is something the Emacs mode line +display interprets to mean ``show the buffer name''. For a full list of +mode line specs Emacs understands, see the documentation of the +@code{mode-line-format} variable. + +@end enumerate + + @node Advanced Formatting @subsection Advanced Formatting @@ -15559,6 +15667,7 @@ Also thanks to the following for patches and stuff: Jari Aalto, Adrian Aichner, +Vladimir Alexiev, Russ Allbery, Peter Arius, Matt Armstrong, @@ -15577,7 +15686,9 @@ Alastair Burt, Joao Cachopo, Zlatko Calusic, Massimo Campostrini, +Castor, Dan Christensen, +Kevin Christian, Michael R. Cook, Glenn Coombs, Frank D. Cringle, @@ -15596,6 +15707,7 @@ Luc Van Eycken, Sam Falkner, Nelson Jose dos Santos Ferreira, Sigbjorn Finne, +Decklin Foster, Gary D. Foster, Paul Franklin, Guy Geens, @@ -15678,6 +15790,7 @@ Loren Schall, Dan Schmidt, Ralph Schleicher, Philippe Schnoebelen, +Andreas Schwab, Randal L. Schwartz, Justin Sheehy, Danny Siu, @@ -15689,6 +15802,7 @@ Michael Sperber, Darren Stalder, Richard Stallman, Greg Stark, +Sam Steingold, Paul Stodghill, Kurt Swanson, Samuel Tardieu, @@ -15728,7 +15842,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.21. @end menu These lists are, of course, just @emph{short} overviews of the @@ -16263,7 +16377,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.21: @itemize @bullet @@ -17559,6 +17673,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..8abddd6 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.21 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.21 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.21. Message is distributed with the Gnus distribution bearing the same version number as this manual has. -- 1.7.10.4