Emacsで絵文字と他の字の幅を合わせる


自分用メモ。

Emacsで文書を作成する時のフォントに、IPA明朝を使っている。
特に気に入っているわけではないが、

  • JIS X 0213:2004の難しい漢字が全部入っていること
  • 等幅であること
  • 明朝体なのでとめはねが分かること

が理由で、消極的に選択していた。

しかし、絵文字でSymbolaというフォントを理由すると、幅がずれるので気になっていた。
以下のように設定した。

init.el

(実際にはorg-modeで運用しています)

emacs.d/init.el
#+BEGIN_SRC emacs-lisp 
  (defun koko-font ()
    (interactive)
    (princ (font-xlfd-name (font-at (point)))))
  (global-set-key (kbd "C-c f") 'koko-font)

  ;;; ずれ確認用 半角40字、全角20字
  ;;; AIfUEaiueoAIUEOaiueoAIUEOaiueoAIUEOaiueo ASCII英字
  ;;; 0123456789012345678901234567890123456789 ASCII数字
  ;;; アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ JIS X 0201カナ
  ;;; あいうえおあいうえおあいうえおあいうえお JIS X 0208ひらがな
  ;;; アイウエオアイウエオアイウエオアイウエオ 同カタカナ
  ;;; ABCDEABCDEABCDEABCDE 同英字
  ;;; 亜唖娃阿哀亜唖娃阿哀亜唖娃阿哀亜唖娃阿哀 同漢字
  ;;; 𠀋𡈽𡌛𡑮𡢽𠀋𡈽𡌛𡑮𡢽𠀋𡈽𡌛𡑮𡢽𠀋𡈽𡌛𡑮𡢽 JIS X 0213漢字
  ;;; 🀄🀅🀆🀇🀈🀄🀅🀆🀇🀈🀄🀅🀆🀇🀈🀄🀅🀆🀇🀈 絵文字

  ;;; デフォルト
    (set-face-attribute 'default nil :family "msmincho" :height 210)
    (set-fontset-font (frame-parameter nil 'font) 'katakana-jisx0201 (font-spec :family "IPA明朝" :size 28))
    (set-fontset-font (frame-parameter nil 'font) 'japanese-jisx0208 (font-spec :family "IPA明朝" :size 28))
  ;;; 絵文字の設定 🀄🀅🀆🀇🀈 1f004~1FFFD
    (set-fontset-font (frame-parameter nil 'font) '(#x1F004 . #x1FFFD) (font-spec :family "Symbola" :size 35))
#+END_SRC

(font-xlfd-name (font-at (point))という関数を評価すると、カーソル位置のフォントの名前、サイズなどの情報が返る。
上ではkoko-fontという関数を作り、C-c fにバインドした。

次にフォントの設定。
デフォルトはすべてIPA明朝で、heightを210にした。
set-face-attribute関数では、heightで指定する。

絵文字はSymbolaフォント(Emacs用の、フリーの白黒フォント)を設定した。
sizeを35にした。
これで他の文字種と幅が揃う。(高さが変わるんだけど。。
絵文字はUnicode 12がサポートするU+1F004~1FFFDということにした。

フォントのダウンロード元

IPA明朝:「IPAフォントのダウンロード」

ダウンロードしたIPA明朝のTTF(ipam.ttf)を~/.fonts/に置く。

Symbolaフォント:「Unicode Fonts for Ancient Scripts」(※絵文字は古代文字ではないが。。

2019-12-28追記:現状では下の場所でダウンロードできた。

ダウンロードしたSymbola.ttfを同じ場所に置く。

2019-12-18追記:上では~/.fonts/において、Linuxの自分のユーザーだけで使う方法を説明しているが、Windowsにフォントをインストールして、それを見に行ったほうが手軽な場合もある。このことについては以下の記事を参照。

フォントキャッシュの更新

置いたら以下のコマンドを実行してフォントキャッシュを更新する。

$ sudo fc-cache -fv

これで以下の画面のように表示される。

たったこれだけのことをするのに、数時間も掛かってしまった。。
人間シンボーラ

(10/7 追記)

昨日公開した版のinit.elでは、絵文字以外は全部IPA明朝にしていた。

;;; デフォルト
    (set-face-attribute 'default nil :family "IPA明朝" :height 210)

でもIPA明朝の半角英数字だと半角英数字が私の環境(Windows10+WSL+Ubuntu+Emacs26)では見えなくなるので、MS明朝にした。
MS明朝はmsmincho.ttcをC:/Windows/fontsからコピーしてWSLの~/.fonts/に格納した。

    (set-face-attribute 'default nil :family "msmincho" :height 210)
    (set-fontset-font (frame-parameter nil 'font) 'katakana-jisx0201 (font-spec :family "IPA明朝" :size 28))
    (set-fontset-font (frame-parameter nil 'font) 'japanese-jisx0208 (font-spec :family "IPA明朝" :size 28))

サイズを調整すれば他のフォントと調和すると分かったので英数字の等幅フリーフォントでカッコイイのを探すつもり。
本記事の中のinit.elはしれっと直しました。スミマセン