マークの場所に色を付ける(その3)

色々試してみたら、随分短くできたので、もう一度

;------------------------------------------------------------
;マークの場所を色を変えて表示

;指定の場所を色づけ
(defun change-point-color (from)
  (set-text-attribute from (+ from 1) 'mark-pointer
					  ;この辺の所で色とかは好みで好きに
					  :bold t
					  :foreground 0 :background 2
					  :underline t))

;マークのセットと強調表示
(defun my-set-mark-command ()
  (interactive)
  (delete-text-attributes 'mark-pointer)
  (set-mark-command)
  (change-point-color(point)))

;マークの色が消えてるときに場所を再カラーリング
(defun view-mark-color()
  (delete-text-attributes 'mark-pointer)
  (handler-case
	  (change-point-color (mark))
	(error (c)
	  (marker-view-toggle)
	  (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-mark-color)
		(setq *marker-toggle* nil)
		(message "marker-off"))
	(progn
	  (add-hook '*post-command-hook* 'view-mark-color)
	  (setq *marker-toggle* t)
	  (message "marker-on"))))

;;markのトグルのキー設定
(global-set-key #\C-F5 'marker-view-toggle)
(set-function-bar-label #\C-F5 "F5 : mark toggle")

リージョンの反転するlispを入れている人はC-@(C-SPC)で反転されなくなるので、M-SPCで使い分けると良いかも。
■追記
まだ残ってる問題点は

  • マークがないときにonにしているとparenが機能しなくなる、というかエラーがでまくる。あ、じゃあ、エラーが出たときに機能をオフにすればよいね。早速修正してみた。手間をかけないならマークをセットするときに機能をオンにすればよいね。何となく*post-command-hook*ってのをやると負荷が上がりそうな気がするので、トグルを自分でONにするままこれは放置で好みで変えてもらうことに。

一応、やり方も書くと、(defun my-set-mark-command 以下空行までの塊を下のに替えたらいいかも。

(defun my-set-mark-command ()
  (interactive)
  (delete-text-attributes 'mark-pointer)
  (set-mark-command)
  (add-hook '*post-command-hook* 'view-mark-color))
  • parenで強調表示しているときに中にマークがあると一時的に消えてしまう。(重ね方がよく分からない)
  • マークの位置に貼り付けると全体に色がマークの色になってしまう。(何かすれば直ぐに再表示されるから問題じゃないような木もするけど)