[mew-dist 21213] Re: mew-summary-ls-all-folders

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2002年 7月 22日 (月) 10:04:21 JST


白井です。

From:  rio-t at example.com < rio-t at example.com> さん曰く
Subject: [mew-dist 21203] mew-summary-ls-all-folders
Message-ID: <20020719.193807.110252884.rio-t at example.com>
Date: Fri, 19 Jul 2002 19:38:07 +0900 (JST)

> mew-summary-lsを、任意の複数(もしくは全て)のフォルダに対して
> 一括して行う方法はないでしょうか。
> 
> ということがあるので、ときどき全フォルダを手動で巡回してリス
> トを更新したりしています。
> フォルダの数が多くなってくるとこれもなかなか面倒で。

ぼくもこう思って、数年前に作ったものがあるのでのせます。
基本的な使い方は M-x mew-make-cache-all で scan が必要な folder
だけ scan します。

以下、注意点。

(1) UNIX でも、ずっと mew-touch-folder-p => t で使っているので、
    今、mew-touch-folder-p => nil な環境向けに拡張したので、その
    辺 enbug していたらごめんなさい。

(2) なるだけ速く全部の scan が終わるように、summary で動かすいろ
    いろな hook を外してしまいます。そのため、
    mew-make-cache-all() が終了した後は、一度 Mew も終了して、再
    度 M-x mew した方が幸せです。

P.S.
これ作っていたときに、ふと気付いたバグ(仕様?)を思い出してしまっ
たので、その話は、また、後程。

-- 
白井秀行 (mailto:shirai at example.com)

(defun mew-make-cache-all (&optional arg)
  ".mew-cache を一気に作る"
  (interactive "P")
  (let ((fldlst (mapcar 'car mew-local-folder-alist))
	(mew-summary-mode-hook nil)
	(font-lock-mode nil)
	(font-lock-support-mode nil)
	fld)
    (while (setq fld (car fldlst))
      (condition-case err
	  (mew-make-cache arg (directory-file-name fld))
	(error nil))
      (setq fldlst (cdr fldlst))))
  (mew-summary-visit-folder mew-inbox-folder)
  (message "Make .mew-cache done")
  (mew-summary-quit))

(defun mew-make-cache (arg fld)
  (if (or (mew-folder-virtualp fld)
	  (and (fboundp 'mew-nmz-skip-folder) (mew-nmz-skip-folder fld))
	  (not (mew-dir-messages (mew-expand-folder fld)))
	  (and (not arg) (not (mew-make-folder-dir-newp fld))))
      (message "no Make %s" fld)
    (message "Make %s in %s ..." mew-summary-cache-file fld)
    (let ((mew-summary-mode-hook nil)
	  (mew-scan-sentinel-hook nil)
	  (mew-scan-wait-for 0))
      (mew-summary-visit-folder fld)
      (font-lock-mode -1)
      (while mew-summary-buffer-process
	(sit-for 0.5)
	(discard-input))
      (message "Make %s in %s ...done" mew-summary-cache-file fld))))

(defun mew-make-folder-dir-newp (fld)
  (let* ((dir (file-chase-links (mew-expand-folder fld)))
	 (tdir (if mew-touch-folder-p
		   (mew-file-get-time
		    (expand-file-name mew-summary-touch-file
				      (mew-expand-folder dir)))
		 (mew-file-get-time dir)))
	 (cache (expand-file-name mew-summary-cache-file dir))
	 (tcache (mew-file-get-time cache))
	 t1 t2)
    (setq t1 tdir)
    (setq t2 tcache)
    (cond
     ((null t1)
      (if mew-touch-folder-p
	  (if (and (file-writable-p (expand-file-name mew-summary-touch-file
						      (mew-expand-folder dir)))
		   (mew-dir-messages (mew-expand-folder dir)))
	      (progn (mew-touch-folder fld) t)
	    nil)
	nil))
     ((null t2) t) ;; do update
     ((> (nth 0 t1) (nth 0 t2)) t)
     ((= (nth 0 t1) (nth 0 t2))
      (if (> (nth 1 t1) (nth 1 t2)) t nil)) ;; nil if equal
     (t nil))))



Mew-dist メーリングリストの案内