正規表現で色分けを適当に使ってみた

アレを試してみたところ。意外なほど動作が重たかったので、多少その辺を考えて見えない所は色を塗らない方が良いかなぁと思いとどまって適当にした感じ。

;; coloring ui
(defun pickup-screen-regexp(pattern)
  "今見えてる画面の所にpatternがあれば色を塗る。"
  (interactive "sPattern : ")
  (let* ((from (get-window-start-line))
		 (to  (+ from (window-height))))
	(save-excursion
	  (narrow-to-region (and (goto-line from)(point))
						(and (goto-line to)(point)))
	  (goto-char (point-min))
	  (if pattern
		  (pickup-regexp pattern)
		(delete-text-attributes *regexp-color-tag*))
	  (widen))
	pattern))

色を消す時は引数にnilで。
で、これはisearchがデフォの人なら適当にhookとかに引っ掛けると一応色は付いたりする。igsearchとかisearch-decoとか入れてる人はエラーが出ると思うのでやらない方がいいけど。

(setq ed::*isearch-scanner-hook* 'pickup-screen-regexp)
;setqじゃない方が良いかもしれないが、よくしらないので。

 デフォのisearchだとC-gとかRETした時にisearchから抜ける場合のhookがないから色が残ってしまうのが難点と言えば難点。あと^とかisearch出来ないので、正規表現とか微妙というかコード自体がサンプル程度にしかなってない感じ。色消すのとか色付けをトグルさせるのでも作れば多少マシかもしれないが。あんまりやる意味ないので止めた。

■烏賊実りのない同でもいい話。
 それよりigsearchに適応させて色分けとかもしてみようかと思ったけど。igsearchコードが1000行くらいあって例によって難しくて何をしているのかよく分からないので適当な所で挫折してみた。関数とか結構長いのが多いので本体をガリガリ改造するのはあんまりやりたくない感じ。regexpにhookとかで簡単にすまないかなぁとか妄想してみたけど。そもそもhookが殆どなかった。あと色塗るのが色んな機能の関数内部にちりばめられたset-text-attributeで実行されている様子なのでなんか、そのまま組み込むのには向いていないような気もする。逆にigsearchとかのタグで実行したら色消しとかは勝手にやってくれそうな気はしたけど。