一時的にバッファのファイルのフォントを変更するには


文章を読むとき「一時的にフォントを変更したい」と感じることがよくありませんか？ 普通の技術文書を読むときはゴシック系のフォントでよいのですが、日本語で小説を読むときなどは明朝体で表示したくなります。

Emacsのフォント一時変更にはフェイス([Faces](https://www.gnu.org/software/emacs/manual/html_node/emacs/Faces.html))とオーバーレイ([Overlays](https://www.gnu.org/software/emacs/manual/html_node/elisp/Overlays.html#Overlays))といふ仕組みを利用するのがお手軽です。

きちんと理解しようとするとめんどくさいのですが、ただ利用するだけならば、あまりめんどくさいことはないです。といふか、「Emacs フォント」とかで検索した結果がめんどくさそうなの良くない。

## 準備

[ov.el](https://github.com/ShingoFukuyama/ov.el)を用意します。これはオーバーレイを異常に簡単に操作できるようにするライブラリです。 ~~これがないと生きていけないのでEmacs本体にマージされてほしい~~

既にパッケージリポジトリとしてMELPAが設定済みなら、`M-x package-install`で`ov`パッケージをインストールできます。

パッケージの設定をしたことがなければ、[package.el - Emacs JP](http://emacs-jp.github.io/packages/package-management/package-el.html)の説明を参考にMELPAの設定をしてみてください。 (よくわからなかったらこの記事のコメントで質問してください)

## 簡単な方法

`.emacs`とか`.emacs.d/init.el`とかにこんな感じの定義を書きます。以下は[IPAex明朝](http://ipafont.ipa.go.jp/old/ipaexfont/download.html)が入ってる場合です。

```init.el
(require 'ov)
(defun my/buffer-minchoize ()
  "Minchoize current buffer."
  (interactive)
  (ov (point-min) (point-max) 'face '(:family "IPAexMincho")))
```

これだけで、自作コマンド`my/buffer-minchoize`が定義できました。

僕は明朝体にしたかったので`minchoize`とかふざけた名前を付けましたが、用途ごとにもっとまともな名前を付けても良いです。この例では、ファイルを開いて`M-x my/buffer-minchoize`を実行すると設定したフォントで表示されるはずです。

この例ではIPAex明朝決め打ちですが、游明朝が良ければ`"YuMincho"`、ヒラギノが良ければ`"Hiragino Mincho ProN"`とか書きます。


### スクリーンショット

![スクリーンショット 2016-09-14 午前3.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/4121/1d4547af-c033-61a5-0d6f-c99a9251dbbc.png "スクリーンショット 2016-09-14 午前3.23.31.png")

Macで游明朝を設定すると、こんな感じに見えます。(例文は[縦書きWeb普及委員会](http://tategaki.github.io/)についての説明文が含まれたdocxファイルを[Emacsでお手軽にEPUBとかMarkdownの文書を読めるやつ](http://qiita.com/tadsan/items/ffb3d31b9f15ae9751b8)で開いたもの)

### 戻す方法

`M-x ov-clear`できれいさっぱり戻ります。

### フォントの大きさを変更したいとき

`C-x C-+`または`M-x text-scale-adjust`を利用します。`+`で拡大、`-`で縮小、`0`で元に戻せます。連打できます。

## 発展的な方法

### フェイスについて知る

フェイスの概念について知るには[(Emacs) Faceを使って部分的に見た目を変える (Weblog on mebius.tokaichiba.jp)](http://ynomura.dip.jp/archives/2011/01/emacs_face.html)が良い記事です。

### オーバーレイについて知る

今回のようにフェイスを設定することで「フォントを変更する」のはオーバーレイの機能の一側面に過ぎません。オーバーレイでできることについては[Overlay Properties](https://www.gnu.org/software/emacs/manual/html_node/elisp/Overlay-Properties.html)をお読みください。

るびきちさんの記事[【高機能オーバーレイライブラリ】読みづらいテキストに改行を入れる](http://rubikitch.com/2015/02/16/ov/)のように「ファイルを変更せずに見ため上でだけ改行を挿入する」ことも容易です。

### システムにインストールされてるフォントから自動選択したい場合


システムによってインストールされてるフォントが異なる場合(GNU/LinuxとMacで同じ設定ファイルを共有してる場合とかね)は、以下のように書きます。

```init.el
(require 'cl-lib)
(defun my/mincho-face ()
  "Return Mincho anonymous face."
  (list :family
        (cl-loop for font in '("YuMincho" "Hiragino Mincho ProN" "IPAexMincho")
                 if (member font (font-family-list)) return font)))

(require 'ov)
(defun my/buffer-minchoize ()
  "Minchoize current buffer."
  (interactive)
  (ov (point-min) (point-max) 'face (my/mincho-face)))
```

僕は短いコードの方が好きなので、[dash.el](https://github.com/magnars/dash.el)を使って書いた方が*気分がいいです*。

```init.el
(require 'dash)
(defun my/mincho-face ()
  "Return Mincho anonymous face."
  `(:family ,(--first (member it (font-family-list)) '("YuMincho" "Hiragino Mincho ProN" "IPAexMincho"))))
```

### キーバインドを設定したい場合

ここでは<kbd>C-c m</kbd>に割り当てる場合の例です。(例として紹介しましたが、こんな押しやすいキーをこんな機能に割り当てるのは正直もったいない気がします)

```init.el
(global-set-key (kbd "C-c m") 'my/buffer-minchoize)
```


[物覚えが悪いから同時に押す](http://qiita.com/tadsan/items/9cc262e1772edb630dd9)方式で、以下のようにするのもアリです。

```init.el
;; MinCho からの連想で覚える
(key-chord-define-global "mc" 'my/buffer-minchoize)
```

## まとめ

* [ov.el](https://github.com/ShingoFukuyama/ov.el)を入れる
* 自分の設定ファイルにいい感じのコマンドを定義するといいよ
* もとに戻したいときは`M-x ov-clear`コマンド
* サイズを変更したいときは`M-x text-scale-adjust`コマンド (`0`で元のサイズ)


## なぜこの記事を書いたか

<!-- https://www.amazon.co.jp/%E3%81%BE%E3%81%95%E3%82%8B%E4%B9%9D%E9%80%A3%E5%8B%9D/e/B01LKBM62M -->

友人であり10年前から私淑する<a>まさる九連勝</a>先生の書かれた小説を査読するときにdocx形式でデータをいただいたのですが、SkyDriveとかPagesで開き直すよりもEmacsで開いた方が綺麗で読みやすいことに気付いてしまったからです。…………ふう。