[Mew-Win32 00348] Re: mew-folder-list (Re: C-uZ)

YAMAGUCHI, Shuhei yamagus at example.com
1998年 3月 3日 (火) 22:51:05 JST


やまぐち@ねっとらぴゅたの住人、です。

テストにお付き合いしてくださったみなさん、ありがとうございます。 :-)

>>> In article <19980303173220E.shirai at example.com>,
>>>    Hideyuki SHIRAI <Shirai at example.com> writes:

  山口> しかし、mew-use-folders-file-pもmew-folder-listもtの場合、C-uZ時にリス
  山口> トが倍になるみたいです。
  Shirai> 
  Shirai> ありゃ、ごめんなさい。
  Shirai> 確認しようと思ったら、自分で改造したの上書きしちゃった。

あれ、おかしいなぁ、先のバージョンでも再現しますよ。 ;_;
#ごめんなさい、今度こそ直ったはずです…。 ^^;;;


  Shirai> しかし、ということは……
  Shirai> 
  Shirai> 山口> ##これにすぐ気付けないとは…ぷろぐらまの素質ないなぁ、我ながら。 ^^;
  Shirai> 
  Shirai> これにすぐ気付けないとは…『まったく』ぷろぐらまの素質ないなぁ。^^;;;
  Shirai> 
  Shirai> # ぷろぐらまが本業でなくて良かった、良かった。

#う…やばい、本業だ…。 ^^;
#「直したつもり」には気をつけましょう。 (自戒 ^^;;;)


さて、今回のバージョンですが、シンボリックリンクなフォルダもUNIX版の
impathと同様にしました。
また、この寄生形態では必要のないprovideも付けてみました。 ^^;

#これで予定していた機能は一応実装できたつもりなので、機能としてはこれ
#を最終形としたいと思います。
#もちろん、バグ報告は歓迎します。
##あ、稚拙なdoc-stringの添削は大大大歓迎です。 ^^;

UNIX版のimpathでは、
Mail/
  foo/
    hoge/ --> ../bar
  bar/
  honya/  --> ./bar
のような場合だと、+honyaもフォルダとして認識されますが、+foo/hogeはフォ
ルダとして認識されません。

これは、シンボリックリンクはリンクカウントに影響しないので、当然といえ
ば当然なのですが、なんとなく気持ち悪いです。
しかし、その気持ち悪さを抑え、忠実に(自然と)再現しました。

#まぁ、すべてのシンボリックリンクを追えば、リンクカウントの効能がなく
#なってしまいますから、気持ち悪いとはいえ、一番妥当だと思います。
##そうそう、+barのメールの整理先として「+bar,+honya」と指定しても、期
##待を裏切って(というか、きちんと ^^;)倍になりました。


ところで、機能としては最終形ですが、形態としては、この寄生型とパッチの
どちらがいいでしょう?
Win32という環境をメインに考えると、バージョンが上がるたびにパッチを充
てるのは面倒な気もしますが、いかがでしょう?

#予想以上に効果があったので、+imgに投げてみようかと思います。 :-)
#なので、パッチを一度は作成する予定ですから、パッチ作成自体はやぶさか
#ではありません。


  Shirai> どうもどうも ^^;
  Shirai> 後から聞いた話だと、私が総武線にのるのに後10分遅れたら、今度は山
  Shirai> の手線が、品川駅の停電でとまったそうな。:-P

実は、私、品川での停電しかしらなかったです。 ^^;
いつも南部線の(上り方面で)一番後ろに乗るんですが、乗務員向けの振り替え
輸送アナウンスが聞こえました。
#私はとっても朝に弱い。 ^^;

でわでわ
-- 
yamagus at example.com / やまぐち@ねっとらぴゅたの住人
  yamagus at example.com / 山口 修平
PGP-Fingerprint: 25 0F 6F E1 57 AD 56 08  3A BC D0 9B 48 AF 31 7A
-------------- next part --------------
;; -*- emacs-lisp -*-
;; mew-parasite.el --- Parasitic on Mew, then tune it up!
;;
;;                       "YAMAGUCHI, Shuhei" <yamagus at example.com>
;;                                            Created: <03/03/1998>
;;                                Revised: Time-stamp: <03/03/1998 21:20>
;;
;; To use mew-parasite.el, put the following codes in your .emacs.
;; (eval-after-load "mew" '(load "mew-parasite"))

(defconst mew-parasite-version "Mew parasite version 1.00"
  "Version string of mew-parasite.")

(defvar mew-use-folder-list-function t
  "If t, Mew uses mew-folder-list function as a subsutitute for
'impath --list'.
You decide to use this package, this shall be t.")

(defvar mew-folder-list-use-file-attributes
  (or (not (or (eq system-type 'windows-nt)
	       (memq system-type '(OS/2 emx))))
      (fboundp 'Meadow-version))
  "If t, 2nd element of a returned list from file-attributes, aka
LINK-COUNT, works.
Otherwise, mew-folder-list function never use file-attributes for
checking existence of subfolders, and any system can make list safety,
but too slow.

For Mule for Win32 and OS/2 Mule users:
This might be set to nil.")

(defvar mew-folder-list-skip-pattern "^\\(\\.\\.?\\|^[0-9]+\\)$"
  "If a file-name matches this pattern, mew-folder-list function never
consider it as a folder without checking it's file-type.

Default is \"^\\\\(\\\\.\\\\.?\\\\|^[0-9]+\\\\)$\", and it assumes
you never have numeric folders like \"+foo/199803\".
If you have such numeric folders, \"^\\\\.\\\\.?\" is a good selection,
but it is not good in sight of performance.
If numeric folders assume dates, folders like \"+foo/Mar-1998\" are
better solution other than like \"+foo/199803\".")

(defun mew-file-attributes (filename)
  "Same as file-attributes, but chase it if FILENAME is a symbolic-link."
  (let ((w32-get-true-file-link-count t) ; for Meadow
	attr symlnk)
    (while (stringp (setq symlnk (car (setq attr (file-attributes filename)))))
      (setq filename
	    (expand-file-name symlnk (file-name-directory filename))))
    attr))

(defun mew-folder-list (folder)
  "List up subfolders of FOLDER."
  (let ((case-fold-search t)
	(w32-get-true-file-link-count t)
	folders curdir dirent relpath abspath attr
	subprefix subfolder)
    (setq curdir (mew-expand-folder folder))
    (if (string-match "^[+=]$" folder)
	(setq subprefix folder)
      (setq subprefix (concat folder "/")))
    (setq dirent (directory-files curdir))
    (while dirent
      (setq relpath (car dirent))
      (setq dirent (cdr dirent))
      (setq abspath (expand-file-name relpath curdir))
      (and
       (not (string-match mew-folder-list-skip-pattern relpath))
       (eq (nth 0 (setq attr (mew-file-attributes abspath))) t)
       (setq subfolder (concat subprefix relpath))
       (setq folders (nconc folders (list subfolder)))
       (or
	(and
	 mew-folder-list-use-file-attributes
	 (>= 2 (nth 1 attr)))
	(setq folders (nconc folders (mew-folder-list subfolder))))))
    folders))


(defun mew-folder-make-list (updatep)
  (save-excursion
    (let ((case-fold-search t)
	  (folders ())
	  (folder nil)
	  (start nil)
	  (file (expand-file-name mew-folders-file mew-mail-path)))
      (mew-set-buffer-tmp)
      (cond
       ((and (not updatep)
	     mew-use-folders-file-p
	     (file-readable-p file))
	(insert-file-contents file))
       (mew-use-folder-list-function
	(setq folders (nconc (mew-folder-list "+")
			     (mew-folder-list "=")))
	(if mew-use-folders-file-p
	    (progn
	      (while folder
		(insert (car folder) "\n")
		(setq folder (cdr folder)))
;	      (mapcar
;	       (lambda (folder)
;		 (insert folder "\n"))
;	       folders)
	      (write-region (point-min) (point-max) file nil 'no-msg))))
       (t
	(mew-im-call-process nil mew-prog-impath "--list=yes" "--src=+")
	(mew-im-call-process nil mew-prog-impath "--list=yes" "--src==")
	(if mew-use-folders-file-p
	    (write-region (point-min) (point-max) file nil 'no-msg))))
      (if (< (point-min) (point-max))
	  (progn
	    (goto-char (point-min))
	    (while (not (eobp))
	      (setq start (point))
	      (if (not (looking-at "[+=]"))
		  (forward-line)
		(forward-line)
		(setq folder (mew-buffer-substring start (1- (point))))
		(if (and (car folders)
			 (string-match (concat "^" (regexp-quote 
						    (file-name-as-directory
						     (car folders))))
				       folder))
		    ;; regexp-quote is not necessary since not "+".
		    (setq folders 
			  (cons folder 
				(cons (file-name-as-directory (car folders))
				      (cdr folders))))
		  (setq folders (cons folder folders))))
	      )))
      folders ;; return value
      )))

(provide 'mew-parasite)


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