riece-keywords に正規表現を

riece-keyword.el を眺めていたところ riece-keywords に正規表現が指定できる事に気付きました。

(defcustom riece-keywords nil
  "Keywords to be highlightened."
  :type '(repeat (choice (string :tag "Keyword")
                         (cons (string :tag "Regexp")
                               (integer :tag "Match"))))

そこで以下のように riece-keywords を設定してみました。

(setq riece-keywords '(("[Ee]lim" . 0)
		       ("[Ee]macs" . 0)))

しかしこれでは alist が ( ("[Ee]lim" . 0) ("[Ee]macs" . 0) ("" . 0) ) となってしまい、望み通りにマッチしないようです。

riece-keywords が使われる個所を探ると以下のように書かれていました。(let の body 以降は省略しました)

(defun riece-keyword-message-filter (message)
  (if (and (get 'riece-keyword 'riece-addon-enabled)
	   riece-keywords
	   ;; Ignore messages which belongs to myself.
	   (not (riece-message-own-p message)))
      (let* (keywords
	     (alist
	      (nconc
	       (delq nil (mapcar
			  (lambda (matcher)
			    (if (stringp matcher)
				(ignore
				 (setq keywords (cons matcher keywords)))
			      matcher))
			  riece-keywords))
	       (list (cons (regexp-opt keywords) 0))))
	     index)

ここで riece-keywords 内の各要素が文字列か調べて、文字列の場合は後で纏めて正規表現にし、それ以外はそのまま正規表現として使っているようです。

ところでこの関数へ正規表現のリストだけを渡した場合

  1. keywords が nil のままになる
  2. regexp-opt へ nil が渡る
  3. regexp-opt が nil を "" にして返す
  4. alist へ ("" . 0) が追加される

ことがわかりました。

そこで以下のように書き換える事で、望み通りマッチするようになりました。

--- riece-keyword.el.orig	2008-03-26 22:49:05.000000000 +0900
+++ riece-keyword.el	2008-03-26 22:49:25.000000000 +0900
@@ -86,7 +86,8 @@
 				 (setq keywords (cons matcher keywords)))
 			      matcher))
 			  riece-keywords))
-	       (list (cons (regexp-opt keywords) 0))))
+	       (when keywords
+		 (list (cons (regexp-opt keywords) 0)))))
 	     index)
 	(while alist
 	  (setq index 0)


さっそく(CVS に)取り込んでいただけました :)