Source Han Code JP + Powerline
エンジニアでフォントにこだわりがあるって人は多いと思います.(たぶんだけど)
例えばRictyとかMenloとかね...
自分は個人的にSource Han Code JP(Source Code Proの和文フォント組み込み)が好きなので全部それ使ってます.
そして何となく思い立ってZshでPowerlineのテーマを使いたいと思って入れたんですが、Powerlineをフォントに組み込むのに結構手間取ったのでシェアしようかなと思います.
Python2とFontForge使って色々こねくり回してます.(FontForgeはbrewとかで入れてください)
1. Source Han Code JPを手に入れる
Githubで配布されているのでダウンロードして来るだけ...ここからダウンロードできます.
解凍するとTTCとOTFの両方が入っていると思います.どっち使ってもいける思うけどただしTTCの場合は一回TTFにバラす作業がいります.こんな感じでいける.
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import sys
import fontforge
def main(font_collection):
for font in fontforge.fontsInFile(font_collection):
f = fontforge.open("%s(%s)" % (font_collection, font))
f.cidFlatten()
f.generate("%s.ttf" % font)
if __name__ == "__main__":
main(sys.argv[1])
2. PowerlineをSource Han Code JPに組み込む
これはfontpatcherという便利なものがあるのでそれを使えば一発です.使い方はクローンしてきて下のコマンドを打てばok.
fontforge -lang=py -script ./fontpatcher/scripts/powerline-fontpatcher {Font Name}.{Font Type}
3. Powerlineのフォント調整
上の段階で終わるとPowerlineのフォントがずれてめちゃかっこ悪いので直します.GUIで直す方法もあるっぽいけど面倒くさいのでスクリプトで書きました.
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import sys
import fontforge
import psMat
GLYPH_UNICODES = [
0xE0A0,
0xE0A1,
0xE0A2,
0xE0B0,
0xE0B1,
0xE0B2,
0xE0B3
]
def main(font):
f = fontforge.open(font)
x_ratio = 1.0
y_ratio = 1.0
x_diff = 0
y_diff = 0
scale = psMat.scale(x_ratio, y_ratio)
translate = psMat.translate(x_diff, y_diff)
transform = psMat.compose(scale, translate)
for code in GLYPH_UNICODES:
f[code].transform(transform)
f.generate()
if __name__ == "__main__":
main(sys.argv[1])
これを生成されたSource Han Code JP + Powelineのフォントに適用すれば完璧.(ただ,これでも多少ずれるので好みでx_diffとかy_diffを修正してください)
これでいけると思います.詳しくはGihubにコード置いてあるので参考にして下さい👍
Github: https://github.com/ty-edelweiss/source-han-code-jp-powerline