;;; color-mate-face.el -- Coloring mule/emacs to more easier and more fun.

;; Copyright (C) YOKOTA Hiroshi

;; Author: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
;; Maintainer: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
;; Version: 10.0.1
;; Keywords: color hilit19 font-lock color-mate paren
;; Content-Type: text/plain; charset=x-euc-jp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;   Color-Mate  Ver.10.0.1
;;         by 横田 裕思 (yokota@netlab.is.tsukuba.ac.jp)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;   Coloring mule/emacs to more easier and more fun.
;;   mule / emacs で、色を使用して見やすい画面にします。
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; Commentary:
;; (1) This Library require hilit19.el and font-lock.el.
;; (2) Write these lines to your ~/.emacs
;;        (if (and (>= (string-to-int emacs-version) 19)
;;	           window-system )
;;            (progn
;;               (require 'color-mate-face)
;;               (color-mate-face)
;;               ))
;;     or Add "color-mate.emacs.add"'s contents to your ~/.emacs
;;
;;  If you use mule, and you want to more, see skk-cursor.el, egg-cursor.el,
;; canna-cursor.el and sj3-cursor.el

;$Id: color-mate-face.el,v 10.2 1999/08/07 21:58:23 elca Exp $

;; -*-mode: emacs-lisp-*-

;;; Code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                          文字への着色
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; hilit19 と font-lock を使って文字に着色する。
;; Canna を使っているなら、 Canna の着色機能も有効にする。
;;

;; hilit19, font-lock 用の追加設定。 (mule FAQ より)

; Color-Mate は hilit19 と font-lock を同時に使用しているので、
; それらの間での調整のために文字のカラーを勝手に書き換えています。
; もしあなたが既に hilit19 や font-lock を使っているなら、設定が変わって
; しまう恐れがあります。その時は .emacs に記述された
;
;   (require 'color-mate-face)
;   (color-mate:face)
;
; を削除してこの機能を使わないようにして下さい。

(require 'color-mate-util)

(defun color-mate:face ()
  "Color-Mate's face utility routine. This routine use with Color-Mate."
  (interactive)
  (progn
    ;; 起動メッセージ
    (message "Loading Color-Mate face utility...")

    ;; xemacs では hilit19.el は使えないようだ。
    (if (not (color-mate:is-xemacs))
	(color-mate:face:hilight19))
    (color-mate:face:font-lock)

    (color-mate:face:paren)
    ;(color-mate:face:region)
    (color-mate:face:kanakan)

    ;; 起動完了メッセージ
    (message "Loading Color-Mate face utility...done")
    ))

;---------------------------------------------------------------------------;

;;----------------;
;; hilit19 の設定
;;----------------;
;;
;; hilit19 の追加着色
;;
;; hilit-translate は関数ではなくマクロであるのでバイトコンパイル時に
;; emacs/mule にマクロである事を認識させる必要がある。
;; 詳しくは color-mate-compile.el を参照。
;;
(defun color-mate:face:hilight19 ()
  "Set up \"hilit19.el\""
  (progn
    (require 'hilit19)
    ;; Ｃ言語の int などの変数型への着色
    (hilit-translate type     'RoyalBlue)
    ))

;---------------------------------------------------------------------------;

;;------------------;
;; font-lock の設定
;;------------------;
(defun color-mate:face:font-lock ()
  "Set up \"font-lock.el\""
  (progn
    (require 'font-lock)

    ;; 古い emacs/mule に付属している font-lock.el には font-lock-mode の
    ;; 自動呼びだしルーチンがないので追加する。
    (if (string< emacs-version "19.29")
	(defun turn-on-font-lock ()
	  "Hook routine for font-lock. (By color-mate-face.el)"
	  (font-lock-mode 1)))

    ;; font-lock.el による文字の着色を自動化
    (add-hook 'find-file-hooks 'turn-on-font-lock)

    (if (boundp 'MULE)
	(color-mate:face:font-lock:mule-face)
      (color-mate:face:font-lock:emacs-face))
      ))


;; hilit19 の設定と同じになるようにする
(defun color-mate:face:font-lock:mule-face ()
  (progn
    ;; Ｃ言語における define や変数名など
    (make-face           'keyword-face)
    (set-face-foreground 'keyword-face "purple")
    (set-face-bold-p     'keyword-face t)

    ;; コメント
    (make-face           'comment-face)
    (set-face-foreground 'comment-face "firebrick")

    ;; 文字列
    (make-face            'string-face)
    (set-face-foreground  'string-face "grey40")
    (set-face-underline-p 'string-face t)

    ;; 関数名
    (make-face           'function-face)
    (set-face-foreground 'function-face "blue")
    (set-face-bold-p     'function-face t)

    ;; 変数型
    (make-face           'c-type-face)
    (set-face-foreground 'c-type-face "RoyalBlue")

    (add-hook 'font-lock-mode-hook
	      '(lambda ()
		 (setq font-lock-keyword-face 'keyword-face)
		 (setq font-lock-comment-face 'comment-face)
		 (setq font-lock-string-face 'string-face)
		 (setq font-lock-function-name-face 'function-face)
		 (setq font-lock-type-face 'c-type-face)
		 ))))

(defun color-mate:face:font-lock:emacs-face ()
  (progn
    ;; フォント作成
    ;; Ｃ言語における define や変数名など
    (make-face            'keyword-face)
    (set-face-foreground  'keyword-face "purple")
    (make-face-bold       'keyword-face)

    ;; コメント
    (make-face            'comment-face)
    (set-face-foreground  'comment-face "firebrick")

    ;; 文字列
    (make-face            'string-face)
    (set-face-foreground  'string-face "grey40")
    (set-face-underline-p 'string-face t)

    ;; 関数名
    (make-face            'function-face)
    (set-face-foreground  'function-face "blue")
    (make-face-bold       'function-face)

    ;; 変数型
    (make-face            'c-type-face)
    (set-face-foreground  'c-type-face "RoyalBlue")

    ;; 設定
    (add-hook 'font-lock-mode-hook
	      '(lambda ()
		 (setq font-lock-keyword-face       'keyword-face)
		 (setq font-lock-comment-face       'comment-face)
		 (setq font-lock-string-face        'string-face)
		 (setq font-lock-function-name-face 'function-face)
		 (setq font-lock-type-face          'c-type-face)
		 ))))

;---------------------------------------------------------------------------;

;;--------------;;
;; paren の設定
;;--------------;;
(defun color-mate:face:paren ()
  "Set up \"paren.el\""
  (progn
    (require 'paren)
    (if (color-mate:is-xemacs)
	(if (< (color-mate:emacs-version) 20)
	    (setq paren-mode 'sexp) ; xemacs 19
	  (paren-set-mode 'sexp)))  ; xemacs 20
    (if (and (>= (color-mate:emacs-version) 20) ; emacs 20
	     (not (color-mate:is-xemacs)))
	(custom-set-variables
	 '(show-paren-style 'mixed)
	 '(show-paren-mode t nil (paren))))
    ))

;---------------------------------------------------------------------------;

;;------------------------;
;; リージョンを可視化する
;;------------------------;
(defun color-mate:face:region ()
  "Visualize region"
  (progn
    (setq transient-mark-mode t)))

;---------------------------------------------------------------------------;

;;------------------------;
;; 仮名漢字変換領域の着色
;;------------------------;
(defun color-mate:face:kanakan ()
  "Set up Kana-Kanji conversion region"
  (progn
    ;; face を用意
    (color-mate:face:kanakan:make-face)

    ; canna
    ;; canna の着色機能を有効にする。
    ;; Canna 版 mule では canna.el が既ににロードされているので
    ;; (featurep 'canna) では (canna) を実行したか分からない。
    ;; そこでこれで正しいかどうかは分からないが、 canna-empty-info
    ;; という変数が一度 Canna を起動すると t になる事を利用して
    ;; ユーザーが Canna を使っているか(既に起動しているか)を判定する。
    ;;
    ;; mule
    (if (and (boundp 'CANNA)
	     canna-empty-info)
	(progn
	  (setq canna-use-color t)
	  (cond
	   ((boundp 'egg-version)
	    (require 'can-n-egg)
	    (can-n-egg))
	   (t
	    (require 'canna)
	    (canna))
	   )))
    ;; emacs20 / xemacs20
    (if (>= (color-mate:emacs-version) 20)
	(setq canna-use-color t))

    ; skk
    (if (or (fboundp 'skk-mode)
	    (color-mate:is-xemacs))
	(color-mate:face:kanakan:skk))

    (if (and (not (color-mate:is-xemacs))
	     (>= (color-mate:emacs-version) 20))
	(color-mate:face:kanakan:skk-emacs20))

    ; Wnn
    (if (or (boundp 'WNN)
	    (>= (color-mate:emacs-version) 20))
	(color-mate:face:kanakan:wnn))

    ; Sj3
    (if (boundp 'SJ3)
	  (color-mate:face:kanakan:sj3))
    ))

(defun color-mate:face:kanakan:make-face ()
  (progn
    ;; 変換領域
    (make-face           'color-mate:firebrick1)
    (set-face-foreground 'color-mate:firebrick1 "firebrick1")
    ;; 注目する単語
    (make-face           'color-mate:RoyalBlue2-lavender)
    (set-face-foreground 'color-mate:RoyalBlue2-lavender "RoyalBlue2")
    (set-face-background 'color-mate:RoyalBlue2-lavender "lavender")))


;; skk の着色機能 (mule/xemacs)
;; 変換時の文字の色 canna と同じにする
(defun color-mate:face:kanakan:skk ()
  (progn
    (setq skk-use-face t)
    (setq skk-henkan-face 'color-mate:RoyalBlue2-lavender)))

;; skk 9.6 の場合はこちらの方が良い。
;    (if (fboundp 'skk-mode)
;	(progn
;	  (require 'skk-e19)
;	  (skk-make-face 'RoyalBlue2/lavender)
;	  (setq skk-henkan-face 'RoyalBlue2/lavender)))

;; emacs 20 の skk モード
(defun color-mate:face:kanakan:skk-emacs20 ()
  (progn
    (setq kkc-overlay-head (make-overlay 0 0 nil nil t))
    (overlay-put kkc-overlay-head 'face 'color-mate:RoyalBlue2-lavender)
    (delete-overlay kkc-overlay-head)
    (setq quail-conv-overlay (make-overlay 0 0 nil nil t))
    (overlay-put quail-conv-overlay  'face 'color-mate:firebrick1)
    (delete-overlay quail-conv-overlay)))


;; wnn の着色機能
;; canna の着色と同じようにする
(defun color-mate:face:kanakan:wnn ()
  (progn
    (setq egg:*fence-face*         'color-mate:firebrick1)
    (setq egg:*henkan-face*        'color-mate:firebrick1)
    (setq egg:*fence-face-in-cont* 'color-mate:RoyalBlue2-lavender)
    (setq egg:*dai-bunsetu-face*   'color-mate:RoyalBlue2-lavender)
    (setq egg:*sho-bunsetu-face*   'color-mate:RoyalBlue2-lavender)))

;; sj3 の着色機能
;; canna の着色と同じようにする
;; うまく色がつかない
(defun color-mate:face:kanakan:sj3 ()
  (progn
    (setq egg:*fence-face*         'color-mate:firebrick1)
    (setq egg:*henkan-face*        'color-mate:firebrick1)
    (setq egg:*fence-face-in-cont* 'color-mate:RoyalBlue2-lavender)))

(provide 'color-mate-face) ; feature として登録

;;; color-mate-face.el ends here
