好きなフォントを設定したいんだけど?

フォントを見直す季節になりましたね。
見つけたばかりのフォントを Emacs でも表示したい…そんな人もおられるかと思います。
また、OS を股にかけて同じ設定ファイル群を使っているんだけど、Windows では MS Gothic、 Mac OS X ではヒラギノLinux では Ricty を使いたい…なんて人もいるんじゃないかと思います。

前振り考えるのとってもめんどい…。

ということで、私が使っているフォント設定用の関数を晒そうと思います:

(defun setting-font (font-name)
  (let* ((fontset-name font-name)
         (size 13)
         (ascii-font font-name)
         (multibyte-font font-name)
         (h (* size 10))
         (font (format "%s-%d:weight=normal:slant=normal" ascii-font size))
         (ascii-fontspec (font-spec :family ascii-font))
         (multibyte-fontspec (font-spec :family multibyte-font))
         (fontset (create-fontset-from-ascii-font font nil fontset-name)))
    (set-face-attribute 'default nil :family ascii-font)
    (set-fontset-font fontset 'japanese-jisx0213.2004-1 multibyte-fontspec)
    (set-fontset-font fontset 'japanese-jisx0213-2 multibyte-fontspec)
    (set-fontset-font fontset 'katakana-jisx0201 multibyte-fontspec) ; 半角カナ
    (set-fontset-font fontset '(#x0080 . #x024F) ascii-fontspec)     ; 分音符付きラテン
    (set-fontset-font fontset '(#x0370 . #x03FF) ascii-fontspec)     ; ギリシャ文字
    ))

どこかから拾ってきたのを適当に関数化しただけですが、引数の font-name にフォント名を渡して呼べばいいだけです。
簡単ですね。

違う OS で同じフォントを使いたいところですが、Ricty は Windows では使えませんし、Mac だとデフォルトのフォントじゃないと 行番号が変な感じになったりするので、同じフォントを使うというのはやっぱり無理があります。

そこで考えたのが、好きなフォントの中で存在したフォント設定しようぜという B 戦法です。

(dolist (font-name after-font-name-list '("Ricty" "TakaoGothic" "IPAGothic" "MS Gothic"))
  (if (find-font (font-spec :family font-name))
      (progn
        (setting-font font-name)
        (setq after-font-name-list nil))))

とやりたかったんですが、このようにすると、最初に見つかったフォントではなく、最後に見つかったフォントが設定されてしまうので、 どうにかして dolist のループを終了しなければいけません。

3 分経ったのがこちら:

(let ((font-name)
      (after-font-name-list '("Ricty" "TakaoGothic" "IPAGothic" "MS Gothic")))
  (while (not (null after-font-name-list))
    ;; x:xs を設定します。
    (setq font-name (car after-font-name-list)
          after-font-name-list (cdr after-font-name-list))
    ;; font-name が存在するかどうか調べます。
    (if (find-font (font-spec :family font-name))
      (progn
        (setting-font font-name)
        ;; 存在したら、after-font-name-list に nil を設定して終了するようにします。
        (setq after-font-name-list nil)))))