markの位置に印をつける(その2)

一応マークに色をつけるだけのはずなんだけど、色々あってダラダラ長くなった感じ。
前にも書いてるけど
himadatenodeの日記 - マークの位置に印をつける
http://d.hatena.ne.jp/himadatanode/20060912/p1
前に書いたのだとparenのときの表示で色が消えてしまうので、それの対策をしてみた。ら、妙に面倒だった。

;キー設定C-F5でmarkを表示しないかするかをon/off
;;markのトグル
(global-set-key #\C-F5 'marker-view-toggle)
(set-function-bar-label #\C-F5 "F5 : mark toggle")
;;マークの位置を表示
(global-set-key #\C-F4 'view-point-color)
(set-function-bar-label #\C-F4 "F4 : view mark")

;マークの開始
;デフォルトではC-@ | C-SPCでは領域を反転しない(rv-)
(global-set-key #\C-@ 'my-set-mark-command)

;マークをつけるときに色を変える感じ
;mark操作が、よく分かっていないので無駄がありそうな木もするけど、まあよしとした。
;マークの強調表示
(defun my-set-mark-command ()
  (interactive)
  (delete-text-attributes 'mark-pointer)
  (set-mark-command)
  (change-point-color(point))
  (setq my-mark-point (make-marker (selected-buffer)))
  (set-marker my-mark-point (point)))

;指定の場所を色づけ
;なにかと便利そうなので関数にして
(defun change-point-color (from)
  (set-text-attribute from (+ from 1) 'mark-pointer
					  ;色とかは好みで好きにこの辺を変えても良い感じ。
					  :bold t
					  :foreground 0 :background 2
					  :underline t))

;マークの色が消えてるときにマークした場所を再カラーリング
;エラーの処理の仕方がよく分からないので怪しい感じ。まあ望んだようには動く。
(defun view-point-color()
  (interactive)
  (delete-text-attributes 'mark-pointer)
  (handler-case
	  (set-text-attribute (marker-point my-mark-point)
						  (+ (marker-point my-mark-point) 1)
						  'mark-pointer
						  :bold t
						  :foreground 0 :background 1
						  :underline t)
	(error (c)
	  (plain-error "マークがないよ" )))
  )

;parenで画面が書きえられるのの対策に
;*post-command-hook*を使って
;toggleで切り替え
(defvar *marker-toggle* nil)
;適当に判別して切り替え
(defun marker-view-toggle()
  (interactive)
  (delete-text-attributes 'mark-pointer)
  (if *marker-toggle*
	  (progn 
		(delete-hook '*post-command-hook* 'view-point-color)
		(setq *marker-toggle* nil)
		(message "marker-off"))
	(progn
	  (add-hook '*post-command-hook* 'view-point-color)
	  (setq *marker-toggle* t)
	  (message "marker-on"))
	))

なんだか、エラーが出まくったので、よくわからないエラー処理とかマークの操作を、適当に読んだ感じと、動かした感じで何とか誤魔かして色々する感じに。しかも*post-command-hook*使うとエラーが出ると悲惨なので、ついでに試しているときに作ったトグルするのも、其のまま実用することに、もし変なことになったら直ぐに機能をoffに出来るように安全機能用。
矩形リージョンを表示とかも地味に欲しい気もしないでもない。