[Mew-Win32 02335] Re: すべてのフォルダに対してソートしたい

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2000年 1月 5日 (水) 10:19:25 JST


こんにちは、白井です。今日から仕事初めです。

# 結局、年末年始は何にも出来なかった。

From: Masahiro EGUCHI (江口 尚裕) <egu at example.com> さん曰く
Subject: [Mew-Win32 02333] すべてのフォルダに対してソートしたい
Message-ID: <20000104140927H.egu at example.com>
Date: Tue, 04 Jan 2000 14:09:27 +0900 (JST)

egu> Meadow1.10+mew1.94.1+im130を使っていますが、すべてのフォルダを
egu> それぞれ日付でソートしたいのですが、何か良い方法はありませんで
egu> しょうか?

sort 自体は、elisp から実行するよりも shell script(あるいは
bat)から実行する方が簡単だと思います。sort を行なうのは 'imsort'
で使い方は 'imsort --help' で見れますが、その folder のすべての
message を日付で sort するのは

% imsort --src=+inbox --field=date --mode=date all

なので、この '+inbox' を変えて folder の数だけ実行すればいいと思
います。じゃ、すべての folder は? というと、'~/Mail/.folders'
file に書いてあるので、'.folders' を適当にコピーして、sort した
い folder を抜き出して上記の command を実行するように書く、とい
うのが一番お手軽かしら? その後、各 folder の '.mew-cache' を更
新、あるいは削除するという感じ。


とここまでメールを書いたんですけど、リハビリがてらに elisp でやっ
てみました。Mew を立ち上げて、以下の関数を評価したあとで
'M-x mew-sort-all' ってやってください。それなりに時間はかかると
思いますけど。


(defun mew-sort-all ()
  (interactive)
  (let ((folder-list mew-folder-list)
	folder)
    (while (setq folder (car folder-list))
      (condition-case err
	  (mew-sort-folder (directory-file-name folder))
	(error nil))
      (setq folder-list (cdr folder-list))))
  (message "Sort all folders done."))

(defun mew-sort-folder (folder)
  (let ((skip-folders '()))
    ;; sort したくない folder があったら、上記の行を
    ;; (let ((skip-folders '("+inbox" "+tmp")))
    ;; の様に書き換えます
    (if (or (mew-folder-remotep folder)
	    (mew-folder-virtualp folder)
	    (member folder skip-folders))
	()
      (let* ((folder-dir (mew-expand-folder folder))
	     (cache-file (expand-file-name mew-summary-cache-file folder-dir))
	     (range "all"))
	(message "Sort messages in %s ..." folder)
	(apply (function call-process)
	       mew-prog-imsort
	       nil nil nil
	       (list
		(format "--src=%s" folder)
		"--field=date"
		"--mode=date"
		range))
	(message "Scan in %s ..." folder)
	(if (and (file-readable-p cache-file)
		 (file-writable-p cache-file))
	    (delete-file cache-file))
	(mew-set-buffer-tmp)
	(mew-piolet
	 mew-cs-scan mew-cs-scan
	 (apply (function call-process)
		mew-prog-imls
		nil
		(current-buffer)
		nil
		(list
		 (format "--width=%d" (if mew-summary-scan-width
					  mew-summary-scan-width
					(if (< (window-width) 80)
					    80
					  (window-width))))
		 (format "--mimedecodequoted=%s" (if mew-decode-quoted
						     "yes" "no"))
		 "--thread=no"
		 (concat "--src=" folder)
		 range)))
	(goto-char (point-min))
	(while (not (eobp))
	  (if (not (looking-at "^ *\\([1-9][0-9]*\\)[^0-9]"))
	      (let (pos)
		(beginning-of-line)
		(setq pos (point))
		(forward-line)
		(delete-region pos (point)))
	    (forward-line)))
	(if (= (point-min) (point-max))
	    ()
	  (mew-frwlet
	   mew-cs-scan mew-cs-scan
	   (write-region (point-min) (point-max) cache-file nil 'no-msg)))
	(message "Scan in %s ... done." folder)))))

# とりあえず、動かして実験してみましたけど、不具合があったらごめ
# んなさい。

-- 
白井秀行@というわけで、今年もよろしくお願い致します。(_ _)



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