[mew-dist 29400] ~/Mail/inbox

Masamichi HOSODA trueroad at example.com
2011年 7月 9日 (土) 13:47:45 JST


細田です。

mew-inbox-folder を +inbox から変更して使っていたりすると、
~/Mail/inbox が自動的に掘られず、存在しない状態になったりします。

~/Mail/inbox が無いと、

・k/ で検索しても検索結果が 1 件も出てこない
・V で「対話」を表示させようとしても 1 件も出てこない

等の事象が発生します。

原因は、folder を指定せずに mewl を呼び出すと、
mewl はデフォルトの +inbox へ chdir しようとし、
+inbox が存在しないとエラーになるため、だと思われます。

一応、単に

mkdir ~/Mail/inbox

してやれば直りますが、使っているわけではない ~/Mail/inbox が無くても
問題ないようにするパッチを 2 通り作ってみました。

どちらか適切だと思われるほうを取り込んでいただければと思います。
(両方取り込んでしまっても害は無いと思いますが…)

・mewl を修正する方法

mewl に -i が指定されていて、かつ、
コマンドラインオプションで folder が指定されていなかった場合に、
デフォルトの +inbox へ chdir できなくてもエラー終了しないようにします。

-i で指定された Input_file 内で改めて folder が指定されるので、
+inbox へ chdir できなくても正常動作します。

デフォルトの +inbox へ chdir できなかったとき、
Input_file 内で folder が指定される前にファイルが指定された場合には、
別途エラーにするようにしています。

-----------------------------------ここから-----------------
--- mewl.c.org	2011-06-29 14:35:01.000000000 +0900
+++ mewl.c	2011-07-09 12:53:29.248609200 +0900
@@ -111,6 +111,9 @@
 private int PrintNumOfMsg = NO;
 private int Suffix_len = 0;
 
+private int no_fld_flag = 0;
+private int default_fld_error_flag = 0;
+
 /****************************************************************
  *
  * prototype
@@ -261,8 +264,12 @@
 		ch_mail_home(Mail_home);
 		if (p == NUL)
 			break;
-		if (chdir(p) != 0)
-			warn_exit("can't change folder to %s.", folder);
+		if (chdir(p) != 0) {
+			if( no_fld_flag != 0 )
+				default_fld_error_flag = 1;
+			else
+				warn_exit("can't change folder to %s.", folder);
+		}
 		break;
 	case '~':
 		ch_home();
@@ -886,6 +893,8 @@
 			while ((c = getchar()) != LF && c != EOF) ;
 		}
 		if (STRCMP(p, CHDIR) == 0) {
+			no_fld_flag = 0;
+			default_fld_error_flag = 0;
 			p = p + strlen(CHDIR);
 			while (*p == SP || *p == TAB) p++;
 			if (strlen(p) >= sizeof(Current_folder))
@@ -895,6 +904,8 @@
 			*foldername = Current_folder;
 			continue;
 		}
+		if(default_fld_error_flag != 0)
+			warn_exit("default folder is not exist.");
 		while (*p == SP || *p == TAB) p++;
 		if (isdigit((unsigned char)*p) == 0) continue;
 		*filename = p;
@@ -1075,6 +1086,7 @@
 		switch (rest) { /* lim == 0 */
 		case 0:
 			set_fld_rng(&Folders[lim++], NULL, NULL);
+			no_fld_flag = 1;
 			break;
 		case 1:
 			set_fld_rng(&Folders[lim++], argv[Optind], NULL);
-----------------------------------ここまで-----------------

・lisp を修正する方法

mewl を -i 付きで呼び出すときも必ず存在する folder を指定するようにします。
最初は mew-inbox-folder を指定してやればよいかと思っていたのですが、
それだと case が効かないし、IMAP のときにも困りそうなので、
本当はメールの folder ではないですが、mew-mail-path にしてしました。

どうせ Input_file で正しい folder が指定されるので、
どんな folder を指定しても影響は無く、
必ず存在するはずの mew-mail-path ならいいだろう、
といったところです。

-----------------------------------ここから-----------------
--- mew-search.el.org	2011-06-29 14:35:01.000000000 +0900
+++ mew-search.el	2011-07-09 10:55:37.859009200 +0900
@@ -160,7 +160,7 @@
 		(setq file-rttl (funcall func pattern flds filter)))))
 	  (mew-set '(file rttl) file-rttl)
 	  (setq dfunc `(lambda () (mew-delete-file ,file)))
-	  (setq opts (list "-i" file))
+	  (setq opts (list "-i" file "-s" mew-mail-path))
 	  (mew-local-retrieve 'vir opts dfunc nil nil rttl))))))
 
 (defun mew-summary-make-index-folder ()
@@ -703,7 +703,7 @@
 	    (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write
 	      (write-region (point-min) (point-max) file nil 'no-msg))))
 	(setq dfunc `(lambda () (mew-delete-file ,file)))
-	(setq opts (list "-i" file))
+	(setq opts (list "-i" file "-s" mew-mail-path))
 	(mew-local-retrieve 'vir opts dfunc nil nil rttl))))))
 
 (defun mew-summary-get-subject ()
--- mew-summary4.el.org	2011-06-29 14:35:01.000000000 +0900
+++ mew-summary4.el	2011-07-09 10:56:35.084609200 +0900
@@ -630,7 +630,8 @@
 	 (call-process mew-prog-mewl nil t nil
 		       "-b" mew-mail-path "-l" "0"
 		       "-x" mew-suffix
-		       "-i" tfile "-d" "content-type")
+		       "-i" tfile "-d" "content-type"
+		       "-s" mew-mail-path)
 	 (mew-delete-file tfile)
 	 (goto-char (point-min))
 	 (while (not (eobp))
--- mew-virtual.el.org	2011-06-29 14:35:01.000000000 +0900
+++ mew-virtual.el	2011-07-09 10:57:04.674209200 +0900
@@ -118,7 +118,7 @@
 	file rttl func args)
     (mew-set '(file rttl) file-rttl)
     (setq func `(lambda () (mew-delete-file ,file)))
-    (setq args (list "-i" file))
+    (setq args (list "-i" file "-s" mew-mail-path))
     (mew-local-retrieve 'vir args func lra nil rttl)))
 
 (defun mew-summary-selection-by-pick-with-grep1 (prog opts pattern folder msgs)
--- mew-virtual.el.org	2011-06-29 14:35:01.000000000 +0900
+++ mew-virtual.el	2011-07-09 10:57:04.674209200 +0900
@@ -118,7 +118,7 @@
 	file rttl func args)
     (mew-set '(file rttl) file-rttl)
     (setq func `(lambda () (mew-delete-file ,file)))
-    (setq args (list "-i" file))
+    (setq args (list "-i" file "-s" mew-mail-path))
     (mew-local-retrieve 'vir args func lra nil rttl)))
 
 (defun mew-summary-selection-by-pick-with-grep1 (prog opts pattern folder msgs)
-----------------------------------ここまで-----------------

他に、第三の方法として、mew-inbox-folder が変更されていても、
IMAP の設定しかなくても、無条件で ~/Mail/inbox が存在しなければ掘る、
というのもあるかとは思います。

以上、よろしくお願いいたします。

  細田 真道 <trueroad at example.com>


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