emacsをiterm2で利用する場合(注意! GUIではない!)のフォントやアイコンの設定について.

emacsのフォント

ターミナルアプリでemacsを利用する場合,基本的にemacsはターミナルと同じフォントを利用する.(変更できない?) 例えば

M: (font-family-list)

はGUIで実行すると利用可能なフォントを返すが,ターミナル上で実行するとnilが返ってきて設定できない.初心者の頃GUI emacsの記述を参考にターミナルでも同様の設定ができるのかと悪戦苦闘したので似たような被害者が出ないように(?)記述を残しておく.

もしかするとまた別な方法でターミナルとemacsで別々のフォントを設定する方法があるのかもしれないが自分は諦めている.まあターミナルをみやすいフォントにしておけばそこまで困ることはないだろうし...

アイコンの利用(icons-in-terminal)

こちらが本題.GUI emacsではall-the-iconsというパッケージを使ってアイコンを利用することができるが,ターミナルでは上記のようにフォントがターミナルのものになるのでこのパッケージを使えない.これを代替する手法として,icons-in-terminalがあるのでここで導入方法を紹介する.

# download from github
$ git clone https://github.com/sebastiencs/icons-in-terminal.git
$ cd icons-in-terminal

# install 
$ ./install.sh  

install後に出力されるように,~/.config/fontconfig/conf.d/30-icons.confファイルを編集して自分がターミナルで使うフォントだけを残しておく.

ここまでやったら,ちゃんとインストールできたかを確認する.

# check if correctly installed
$ ./print_icons.sh

綺麗に全てのフォントが出力されて入れば大成功.

Macにフォントが認識されているかを知りたければfc-listコマンドを利用して

$ fc-list | grep -i icons-in-terminal
/Users/hoge/Library/Fonts/icons-in-terminal.ttf: icons\-in\-terminal:style=in-terminal
/Users/hoge/.fonts/icons-in-terminal.ttf: icons\-in\-terminal:style=in-terminal

のようになれば成功.

install.sh~/.local/share/icons-in-terminalディレクトリに内容をコピーするので,外部から参照するときはこれを使うと(どこでgit cloneしたかによらずに設定できるので)良い.ただファイルをコピーしているだけなので自分で好きなところに置いても良い.自分は設定用のファイルがあちこちに散らばると嫌なのでdotfileを置いてある場所にコピーしている.

うまくいかない場合(非ASCIIを含むフォントを利用している?)

自分の場合は非ASCII文字を含むmenlo for powerlineを利用していた1.このような場合,icons-in-terminalと競合してしまって./print_icons.shで一部フォントがうまく表示されない場合がある(原因は間違っているかも)2.さらに自分の環境だと,itermを再起動すると表示されなくなるなどどうも挙動が不安定なことがある.そこでとりあえずの対策としてnon-ASCII文字に別のフォントを利用する作戦を使う.icons-in-terminalはそれ自体が特殊文字を大量に含んだフォントなので,これをnon-ASCII文字用のフォントとして設定すればうまく動いてくれるという仕組み.(この場合はおそらくinstall.shすら実行する必要がなくicons-in-terminal.ttfだけあれば良いと思う.)

  • まずicons-in-terminalが悪さをしないように~/.config/fontconfig/conf.d/30-icons.confで全てのフォントの行をコメントアウト.
  • itermのpreferences>profiles>textのfontのところでuse a different font for non-ASCII textにチェックを入れる.
  • そうするとnon-ASCII用のフォントを設定する項目が現れるのでicons-in-terminalを選択.表れない場合はFinderでicons-in-terminal.ttfをダブルクリックしてMacにフォントをインストールしよう.

以上で./print_icons.shを実行すると自分の場合は全てのアイコンが綺麗に出力された.iterm2ではこのようにnon-ASCIIに別のフォントを割り当てられるので,仮に上のステップでインストールがうまくいく場合でも,こちらの方が元のフォントをいじらずに安全だと思う.

シェルでアイコンを表示させる(bash,zsh)

各アイコンには\ue0b3のような命令が指定されていて,これを使って表示のカスタマイズをおこなっている.シェル上でグリフを見たければ

# 対応するグリフがあればグリフが表示される
echo -e "\ue0a0"
# 対応するグリフがないと四角の中にはてなマークが表示される
echo -e "\uf059"

とすればグリフを確認できる.しかしこれだとどのアイコンがどのコマンドなのか非常に分かりにくい.そこで各アイコンにわかりやすい名前を対応させるスクリプトbuild/icons_bash.shがデフォルトで用意されている.これを使うためには単にsourceでファイルを読めばよい.恒常的に使う場合は.zshrcに書き込むとよい.

# ファイルを読み込み
$ source build/icons_bash.sh
# うまくいっているかテスト(この例だとファイルアイコンを表示)
$ echo $oct_file_media

emacsでicons-in-terminalを使う.

icons-in-terminalにはemacs用のパッケージファイルbuild/icons-in-terminal.elが付属してくる.中身を見ればわかるようにフォント名と対応するグリフがずらりと並ぶ設定ファイルになっている.

% 一例
( powerline_branch . "\xe0a0" )

実際にグリフを出力するにはLispで

(insert (icons-in-terminal 'oct_flame))

とすればよい.従って,既存のパッケージでグリフを使いたい奴があったら,ちょっと面倒だが上のコマンドで書き換えることで利用可能.その際

(require 'icons-in-termial)

を忘れずに! 自分は今の所,all-the-iconsの書き換えしか行ったことがないが,これなら面倒なだけであまり技術はなくてもできる.やはりアイコン表示だと分かりやすいのでやる価値はある.そのうち書き直したelファイルをgitに上げられると良いのだが...

余談:icons-in-terminalの仕組みについて

  1. powerlineライクなプロンプトを自作するために導入した記憶がある.powerlineでは特殊文字を利用するため,それが入っているフォントが必要だった. 

  2. そのほかに公式のgithubに元のフォントを編集してあるとうまくいかない場合があるとあるので,フォント自体をクリーンインストールしてみるのも手かも.