この記事でやること
新しいフレームを作成する際のフックに、フォントを再設定する関数を登録する。
きっかけ
Ubuntu GNOME上でEmacsを使っている際に、C-x 5 2 (make-frame-command)
で新たなフレームを生成すると、新しいフレームではフォントの設定が反映されないという現象が起きた。この原因は謎(フォントの設定方法がマズイのかもしれない。ご存じの方はコメントで教えてほしい)だが、とりあえずは本記事の手法でごまかすことができたので、メモを残しておく。
フォントの設定
init.el
から呼ばれるスクリプトの中に設定をベタ書きしていたのを、とりあえず関数にまとめる。例として私の場合を示すと、以下のようになった。
conf-font.el
(defun reload-font ()
(interactive)
;;OSX
(when (eq system-type 'darwin)
(set-face-attribute 'default nil :family "Monaco" :height 140)
(set-fontset-font (frame-parameter nil 'font)
'japanese-jisx0208
(font-spec :family "Hiragino Kaku Gothic ProN"))
(add-to-list 'face-font-rescale-alist
'(".*Hiragino Kaku Gothic ProN.*" . 1.2))
)
;;Windows
(when (eq system-type 'windows-nt)
(set-face-attribute 'default nil :family "Monaco" :height 120)
(set-fontset-font (frame-parameter nil 'font)
'japanese-jisx0208
(font-spec :family "Meiryo"))
(add-to-list 'face-font-rescale-alist
'("Meiryo" . 1.2))
)
;;GNU/Linux
(when (and (eq system-type 'gnu/linux) window-system)
(set-face-attribute 'default nil :family "Monaco" :height 120)
(set-fontset-font (frame-parameter nil 'font)
'japanese-jisx0208
(font-spec :family "Noto Sans Mono CJK JP"))
(add-to-list 'face-font-rescale-alist
'("Noto Sans Mono CJK JP" . 1.0))
)
)
(reload-font)
(provide 'conf-font)
フックに登録
新しいフレームを作成したあとのフックはafter-make-frame-functions
だが、このフックは引数として新しいフレームが渡される(28.1 Creating Frames)。今回はフレームを渡されたところで使わないので、引数の数合わせのために新しい関数でラップすることにした。
conf-hook.el
(defun reload-frame-font (frame)
(reload-font)
)
(add-hook 'after-make-frame-functions 'reload-frame-font)
(provide 'conf-hook)
まとめ
- 新しいフレームを作成した時のフックは
after-make-frame-functions
- 引数には作成したフレームがひとつ渡される