Emacs:キーワードを強調表示する方法
Emacsで任意のテキストに強調して目立つようにしたい時がたまにある。色付けしたりフォントサイズを大きくしたいのだけど、どうするのが簡単なんだろうか?
調べたことを記録しておきます。
今だけ強調表示するには?
とりあえず今だけ強調表示したい場合は、hi-lock.elを使うのが便利です。
highlight-phrase
M-x highlight-phrase
を実行してキーワードを入力。どのfaceを使うか聞かれるので、とりあえずそのままリターンキー押下でOK。
入力したキーワードが強調表示されるはず。
あらかじめ、hi-greenやhi-redなどのfaceが用意されているので、たいていはこれで事足りるでしょう。
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
を使ってもいいかと思います。