X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fnnvirtual.el;h=60fe0a51e58314898b4310cc130a7882e423d001;hb=65570b6780a379ac06efde3226f8c93c0139801e;hp=556b318e222f5292846d85a29e3f6c6217502bfe;hpb=a629ef97108075cbae0b8b69b2dd1a4723a520c8;p=gnus diff --git a/lisp/nnvirtual.el b/lisp/nnvirtual.el index 556b318e2..60fe0a51e 100644 --- a/lisp/nnvirtual.el +++ b/lisp/nnvirtual.el @@ -1,8 +1,8 @@ ;;; nnvirtual.el --- virtual newsgroups access for Gnus -;; Copyright (C) 1994,95,96,97,98 Free Software Foundation, Inc. +;; Copyright (C) 1994,95,96,97,98,99 Free Software Foundation, Inc. ;; Author: David Moore -;; Lars Magne Ingebrigtsen +;; Lars Magne Ingebrigtsen ;; Masanobu UMEDA ;; Keywords: news @@ -38,16 +38,16 @@ (require 'gnus-util) (require 'gnus-start) (require 'gnus-sum) +(require 'gnus-msg) (require 'cl) (nnoo-declare nnvirtual) -(defvoo nnvirtual-always-rescan nil +(defvoo nnvirtual-always-rescan t "*If non-nil, always scan groups for unread articles when entering a group. -If this variable is nil (which is the default) and you read articles -in a component group after the virtual group has been activated, the -read articles from the component group will show up when you enter the -virtual group.") +If this variable is nil and you read articles in a component group +after the virtual group has been activated, the read articles from the +component group will show up when you enter the virtual group.") (defvoo nnvirtual-component-regexp nil "*Regexp to match component groups.") @@ -218,7 +218,9 @@ to virtual article number.") (if buffer (save-excursion (set-buffer buffer) - (gnus-request-article-this-buffer (cdr amap) cgroup)) + ;; We bind this here to avoid double decoding. + (let ((gnus-article-decode-hook nil)) + (gnus-request-article-this-buffer (cdr amap) cgroup))) (gnus-request-article (cdr amap) cgroup)))))))) @@ -258,10 +260,14 @@ to virtual article number.") (setq nnvirtual-current-group nil) (nnheader-report 'nnvirtual "No component groups in %s" group)) (t + (setq nnvirtual-current-group group) (when (or (not dont-check) nnvirtual-always-rescan) - (nnvirtual-create-mapping)) - (setq nnvirtual-current-group group) + (nnvirtual-create-mapping) + (when nnvirtual-always-rescan + (nnvirtual-request-update-info + (nnvirtual-current-group) + (gnus-get-info (nnvirtual-current-group))))) (nnheader-insert "211 %d 1 %d %s\n" nnvirtual-mapping-len nnvirtual-mapping-len group)))) @@ -269,9 +275,12 @@ to virtual article number.") (deffoo nnvirtual-request-type (group &optional article) (if (not article) 'unknown - (let ((mart (nnvirtual-map-article article))) - (when mart - (gnus-request-type (car mart) (cdr mart)))))) + (if (numberp article) + (let ((mart (nnvirtual-map-article article))) + (if mart + (gnus-request-type (car mart) (cdr mart)))) + (gnus-request-type + nnvirtual-last-accessed-component-group nil)))) (deffoo nnvirtual-request-update-mark (group article mark) (let* ((nart (nnvirtual-map-article article)) @@ -279,6 +288,7 @@ to virtual article number.") ;; The component group might be a virtual group. (nmark (gnus-request-update-mark cgroup (cdr nart) mark))) (when (and nart + (memq mark gnus-auto-expirable-marks) (= mark nmark) (gnus-group-auto-expirable-p cgroup)) (setq mark gnus-expirable-mark))) @@ -351,6 +361,15 @@ to virtual article number.") (cdr gnus-message-group-art))))) (gnus-request-post (gnus-find-method-for-group group))))) + +(deffoo nnvirtual-request-expire-articles (articles group + &optional server force) + (nnvirtual-possibly-change-server server) + (setq nnvirtual-component-groups + (delete (nnvirtual-current-group) nnvirtual-component-groups)) + (dolist (group nnvirtual-component-groups) + (gnus-group-expire-articles-1 group))) + ;;; Internal functions. @@ -377,7 +396,7 @@ to virtual article number.") (insert "\t")) ;; Remove any spaces at the beginning of the Xref field. - (while (= (char-after (1- (point))) ? ) + (while (eq (char-after (1- (point))) ? ) (forward-char -1) (delete-char 1)) @@ -396,7 +415,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)) @@ -409,7 +428,7 @@ to virtual article number.") ;; Ensure a trailing \t. (end-of-line) - (or (= (char-after (1- (point))) ?\t) + (or (eq (char-after (1- (point))) ?\t) (insert ?\t))) @@ -428,19 +447,24 @@ If UPDATE-P is not nil, call gnus-group-update-group on the components." (nnvirtual-partition-sequence (gnus-list-of-unread-articles (nnvirtual-current-group))))) - (type-marks (mapcar (lambda (ml) - (cons (car ml) - (nnvirtual-partition-sequence (cdr ml)))) - (gnus-info-marks (gnus-get-info - (nnvirtual-current-group))))) + (type-marks + (delq nil + (mapcar (lambda (ml) + (if (eq (car ml) 'score) + nil + (cons (car ml) + (nnvirtual-partition-sequence (cdr ml))))) + (gnus-info-marks (gnus-get-info + (nnvirtual-current-group)))))) mark type groups carticles info entry) ;; Ok, atomically move all of the (un)read info, clear any old ;; marks, and move all of the current marks. This way if someone ;; hits C-g, you won't leave the component groups in a half-way state. - (gnus-atomic-progn + (progn ;; move (un)read - (let ((gnus-newsgroup-active nil)) ;workaround guns-update-read-articles + ;; bind for workaround guns-update-read-articles + (let ((gnus-newsgroup-active nil)) (while (setq entry (pop unreads)) (gnus-update-read-articles (car entry) (cdr entry)))) @@ -449,7 +473,11 @@ If UPDATE-P is not nil, call gnus-group-update-group on the components." (while groups (when (and (setq info (gnus-get-info (pop groups))) (gnus-info-marks info)) - (gnus-info-set-marks info nil))) + (gnus-info-set-marks + info + (if (assq 'score (gnus-info-marks info)) + (list (assq 'score (gnus-info-marks info))) + nil)))) ;; Ok, currently type-marks is an assq list with keys of a mark type, ;; with data of an assq list with keys of component group names