Emacsで任意のテキストに強調して目立つようにしたい時がたまにある。色付けしたりフォントサイズを大きくしたいのだけど、どうするのが簡単なんだろうか?

調べたことを記録しておきます。

スポンサーリンク

今だけ強調表示するには?

とりあえず今だけ強調表示したい場合は、hi-lock.elを使うのが便利です。

highlight-phrase

M-x highlight-phrase を実行してキーワードを入力。どのfaceを使うか聞かれるので、とりあえずそのままリターンキー押下でOK。

入力したキーワードが強調表示されるはず。

あらかじめ、hi-greenやhi-redなどのfaceが用意されているので、たいていはこれで事足りるでしょう。

highlight-face-list.png

M-x list-faces-display を実行すればたくさんのfaceがあることがわかります。

わざわざhi-lockを使わずともisearchすれば、一時的に強調表示されますが、hi-lockは常に強調されるところが違います。ただしバッファを閉じてしまうと再設定が必要ですが。

hi-lock.elには他にもいろいろコマンドが定義されています。

highlight-regexp

正規表現でキーワードを指定します。

highlight-lines-matching-regexp

マッチした行全体を強調表示します。

適宜、 M-x highlight- してから選べばいいでしょう。

ハイライトをやめたければ、 M-x unhighlight-regexp を実行します。

いつも強調表示するには?

hi-lock.elはインタラクティブに強調表示を使える点がいいけれど、常に強調したい場合はhookを使って

(add-hook 'org-mode-hook
   (lambda ()
     (highlight-phrase "KEYWORD"))

のようにするのが、手っ取り早くていいでしょう。

font-lockを使って、実現することもできます。(実際、hi-lockもfont-lockを使っているだけです)

次の関数を使って任意のキーワードとfaceの設定をします。

(font-lock-add-keywords モード
  '(("正規表現" . face名)))

設定例はこんな感じ。

(font-lock-add-keywords 'org-mode
    '(("\\<MyCompany\\>" . 'my-keyword-face)
     ("FIXME:.*" . 'my-keyword-face)
     ("TODO:.*" . 'my-keyword-face)))

最初にモードを指定していますが、ここをnilにすれば現在のバッファーが対象になります。 キーワードには正規表現が使えます。\\<は単語の先頭にマッチ、\\>は単語の末尾にマッチします。正規表現は M-x regexp-builder で設定すると楽です。あとはバックスラッシュは2個必要なのはEmacsのお約束ですね。

あとはこの設定をinit.el等で設定するようにしておけばいいでしょう。

自分専用のFaceを定義する方法

Emacsにはあらかじめfaceがたくさん用意されているので、わざわざ作らないといけない訳ではないけれど、そこはEmacsユーザー、自分でつくってみたいと思うものではないでしょうか。

新しいfaceを定義するには、マクロ defface を使って次のような感じで行います。

(defface my-keyword-face '((t :background "green" :height 400)) "自分専用のface")

my-keywordというfaceを新しく定義し、背景色をgreen、文字を大きくする指定をしている。このコードをとりあえずevalすればmy-keywordというfaceが作成される。

ただし試すときは、deffaceを一度実行すると再度evalしても同じfaceを上書きしない仕様なので、変更する場合は次のような set-face- 系の関数で

(set-face-foreground 'my-keyword-face "#000000") ;前景色を変更
(set-face-background 'my-keyword-face "#00FFFF") ;背景色を変更
(set-face-underline 'my-keyword-face t) ;アンダーラインを表示
(set-face-attribute 'my-keyword-face  nil :foreground "#FF0000" :height 300 :inherit 'hi-green) ;まとめて設定

などをevalしてあげれば変更するか、 M-x customize-face を使ってもいいかと思います。