読者です 読者をやめる 読者になる 読者になる

ichiroc subset

書きながら考える・考えをまとめる場所

Emacsでシンプルなメジャーモードを作成する

Emacs

背景

ログファイル等を確認する際にキーワード等をハイライトさせたい。 Emacsでは、メジャーモードを定義する必要が有る。

define-derived-mode を使ったメジャーモード定義

メジャーモードの定義には define-derived-mode マクロが便利。

メジャーモードの作成には、本来ならモード名で関数を定義して、キーマップ、 mode-namemajor-mode 変数等を設定する必要が有る。他にも多分色々ある。

define-derived-mode を利用すれば、それらを一括してくれる。

font-lock-defautls の設定

キーワードをハイライトさせるには define-derived-mode の中で font-lock-defautls の変数を設定する。 font-lock-defautls はリストとなっている。

;; font-lock-defautls に渡すべきリスト
'((KEYWORD-REGEXP1 . FACE1)
  (KEYWORD-REGEXP2 . FACE2)...)

face の作成

face は文字色や背景色などの定義の名前。 defface を使って定義する。

;;; 文字色、背景色だけを設定する
(defface FACE-NAME
  '((t (:foreground "green" :background "dark"))))

コード

;; face の準備
(defface hoge-log-error
  '((t (:foreground "red" :background "dark"))))
(defface hoge-log-warning
  '((t (:foreground "yellow" :background "dark"))))

;; ここが定義本体
(define-derived-mode hoge-log-mode text-mode "Hoge Log" "View mode for hoge.log"
  (setq hoge-font-lock-keywords '(("^.*\\(Error\\).*"   . hoge-log-error)      ;Error line
                                  ("^.*\\(Warning\\).*" . hoge-log-warning)))  ;Warning line
  (setq font-lock-defaults '(my-hoge-lock-keywords))
  ;;  もしくはこう
  ;;  (setq font-lock-defaults '((("^.*\\(Error\\).*"   . hoge-log-error)        ;Error line
  ;;                             ("^.*\\(Warning\\).*" . hoge-log-warning)))     ;Warning line
  )

雑感

定義自体は至極簡単。 インデントとかやりだすと大変そう。 それといつまでたってもfont-lock-mode がよく分かりません・・・。 メジャーモードあたりの解説書が欲しい。