Posted at

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

More than 3 years have passed since last update.

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

Emacsのフォント一時変更にはフェイス(Faces)とオーバーレイ(Overlays)といふ仕組みを利用するのがお手軽です。

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


準備

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

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

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


簡単な方法

.emacsとか.emacs.d/init.elとかにこんな感じの定義を書きます。以下はIPAex明朝が入ってる場合です。


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

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


戻す方法

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


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

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


発展的な方法


フェイスについて知る

フェイスの概念について知るには(Emacs) Faceを使って部分的に見た目を変える (Weblog on mebius.tokaichiba.jp)が良い記事です。


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

今回のようにフェイスを設定することで「フォントを変更する」のはオーバーレイの機能の一側面に過ぎません。オーバーレイでできることについてはOverlay Propertiesをお読みください。

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


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

システムによってインストールされてるフォントが異なる場合(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を使って書いた方が気分がいいです


init.el

(require 'dash)

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


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

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


init.el

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


物覚えが悪いから同時に押す方式で、以下のようにするのもアリです。


init.el

;; MinCho からの連想で覚える

(key-chord-define-global "mc" 'my/buffer-minchoize)


まとめ



  • ov.elを入れる

  • 自分の設定ファイルにいい感じのコマンドを定義するといいよ

  • もとに戻したいときはM-x ov-clearコマンド

  • サイズを変更したいときはM-x text-scale-adjustコマンド (0で元のサイズ)


なぜこの記事を書いたか

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