[mew-dist 24962] mew-refile-guess-by-alist2 failes by some regexps.

Kyotaro HORIGUCHI horiguti at example.com
2004年 5月 28日 (金) 19:45:35 JST


堀口です.

string-match は regexp の書き方によっては (match-data) の中に nil 
が入ることがあります. こんな感じです.

> (if (string-match "\\(abc\\|cdf\\)@a.jp\\|\\(efg\\|hij\\)@b.jp"
> 		  "efg at example.com")
>     (match-data)
>   nil)
> (0 8 nil nil 0 3)

 これが原因で mew-refile-geuss-alist の内容によっては refile の処理中に 
mew-refile-guess-by-alist2 の中でエラーで止まってしまうことがあります.
(これは私が実際に困っていることです.)

 これに単純に対処すると, 今度は最後にマッチしたmatch(?)より後ろには要素が無
いので, 以下のようにすると期待した(のかな? 私はやってませんが..)動作をせずに
エラーになります.

> (mew-refile-guess-by-alist2 
>  "\\(abc\\|cdf\\)@\\(a\\).jp\\|\\(efg\\|hij\\)@\\(b\\).jp"
>  "efg at example.com"
>  "+\\2\\4/\\1\\3/hoge")

 以下のパッチで以上の問題への対処になると思います.

Index: mew-refile.el
===================================================================
RCS file: /cvsmew/mew/mew-refile.el,v
retrieving revision 1.113
diff -u -r1.113 mew-refile.el
--- mew-refile.el	21 May 2004 03:25:34 -0000	1.113
+++ mew-refile.el	28 May 2004 10:31:33 -0000
@@ -261,13 +261,17 @@
     (string-match regex string)
     (setq match (cdr (cdr (match-data))))
     (while match
-      (setq str (substring string (car match) (car (cdr match))))
+      (setq str 
+	    (if (car match)
+		(substring string (car match) (car (cdr match)))
+	      nil))
       (setq strs (cons str strs))
       (setq match (cdr (cdr match))))
     (setq strs (cons nil (nreverse strs))) ;; cons nil for 0th
     (while (string-match "\\\\\\([1-9]\\)" template)
       (setq repl (nth (string-to-int (match-string 1 template)) strs))
-      (setq template (replace-match repl nil nil template)))
+      (setq template
+	    (replace-match (if repl repl "") nil nil template)))
     template))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-- 
堀口恭太郎
 



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