LoginSignup
4
2

More than 5 years have passed since last update.

新しいフレームにフォント設定が反映されない現象を回避する

Posted at

この記事でやること

新しいフレームを作成する際のフックに、フォントを再設定する関数を登録する。

きっかけ

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
    • 引数には作成したフレームがひとつ渡される
4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2