とりあえず関数に(Cocoa Emacs のフォント)


Emacs Lisp の素人だからちゃんとしたものは書けないけど、とりあえず「こういう事ができます」のエントリー。日本語を必要としない場合は set-frame-font でインタラクティブにフォントを変更できる。日本語と英字フォントを設定するそういう関数を書いてみた。アルファベット表記のフォントファミリー名で設定する。もしこういう関数を用意しておけば、初期設定ファイルでのフォント設定は次の1行で終わり。

(when window-system
  (set-font-ascii_japanese "Menlo" "Hiragino Maru Gothic ProN" "14")
)

初期設定だけではなく、インタラクティブに M-x set-font-ascii_japanese と使う事もできる。

関数の定義は以下の通り。一応動作するけど未完成版。

(defun set-font-ascii_japanese (ascii-font-family jp-font-family size)
  "フレーム上の英字フォントと日本語フォントをASCII-FONT-FAMILY と JP-FONT-FAMILY に
設定する(フォントはファミリー名で指定)。英字フォントのサイズを SIZE に設定する。"
  (interactive
   (let* ((completion-ignore-case t)
	  (af (completing-read "ascii font: "
			       '("Menlo" 
				 "Monaco"
				 "Courier")))
	  (jf (completing-read "japanese font: "
			       '("Hiragino Maru Gothic ProN" 
				 "Hiragino Kaku Gothic ProN"
				 "Hiragino Mincho ProN"
				 "Osaka")))
	  (si (completing-read "size: " nil)))
     (list af jf si)))
  (let* ((h (* (string-to-number size) 10))
	 (fontspec (if (string= ascii-font-family "") nil
		     (font-spec :family ascii-font-family)))
	 (jp-fontspec (if (string= jp-font-family "") nil
			(font-spec :family jp-font-family))))
    (if (and fontspec jp-fontspec)
	(progn
	  (if (eq h 0) (setq h 140))
	  (set-face-attribute 'default nil :family ascii-font-family :height h)
	  (set-fontset-font nil 'japanese-jisx0213.2004-1 jp-fontspec)
	  (set-fontset-font nil 'japanese-jisx0213-2 jp-fontspec)
	  (set-fontset-font nil 'katakana-jisx0201 jp-fontspec) ; 半角カナ
	  (set-fontset-font nil '(#x0370 . #x03FF) fontspec) ; ギリシャ文字
	  (set-fontset-font nil '(#x0080 . #x024F) fontspec) ; 分音符付きラテン
        ))))

(dolist (elt '(("^-apple-hiragino.*" . 1.2)
		 (".*osaka-bold.*" . 1.2)
		 (".*osaka-medium.*" . 1.2)
		 (".*courier-bold-.*-mac-roman" . 1.0)
		 (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
		 (".*monaco-bold-.*-mac-roman" . 0.9)))
    (add-to-list 'face-font-rescale-alist elt))

まだ何か不備がありそうだけど、こういう感じの関数を完成させればいいかな。

途中でフォントを変えたい場合には、やはりターゲットを日本語に指定してappend を使わずに、set-fontset-fontする必要があった。