自分だけのPowerline

# はじめに

[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)というスクリプトを書いたのでその宣伝です。

皆さんはpowerlineを使っていますか？

![powerline](https://camo.githubusercontent.com/3c3a1717e42f17651f688ecc19f87e7433275098/68747470733a2f2f7261772e6769746875622e636f6d2f706f7765726c696e652f706f7765726c696e652f646576656c6f702f646f63732f736f757263652f5f7374617469632f696d672f706c2d6d6f64652d6e6f726d616c2e706e67)
（画像は[powerline/powerline](https://github.com/powerline/powerline)より）

こういうやつですね。よく知らない人は入れてみると良いと思います。ターミナルがなんかかっこいい感じになります。
[Powerline導入例](https://qiita.com/tkhr/items/8cc17c02dea1803be9c6)

この記事は、**powerlineの普通の見た目が気に食わなくなってしまった**人向けの記事です。

# 自分だけのpowerline

![statusline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215516/3d60df86-33ec-a019-0bef-d761885b666d.png)

[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)を使うことでトンガリ三角形のpowerlineの呪縛から解放され、より自由な、自分好みのpowerlineを作ることができるようになります。

もう他人と同じ見た目のpowerlineに悩む必要はありません。

上の画像は実際に[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)を使って作成したpowerline（のようなもの[^1]）です。

[^1]: powerlineは本来は[powerline/powerline](https://github.com/powerline/powerline)のようにshellやらvimやらtmuxやらのステータスラインを強力にする機能のごった煮みたいなものなのですが、ここでは機能の面は置いておいて見た目のみに言及しています。要は、あるグリフをステータスラインの区切りとして用いる手法のことをpowerlineとここでは呼んでいます。

## 類似事例

[Powerline Extra Symbols](https://github.com/ryanoasis/powerline-extra-symbols)が似たようなことをやっています。
こちらはかなり大きなアイコンフォントの集合体たる[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts)の一部に組み込まれているので、そっちで良いやという人はこれを使うと良いと思います。

しかしそちらを使うには私の環境では色々問題があったので自分でスクリプトを書くに至りました。

ここに至るまでの苦難：
[Nerd fontとpowerlineとambiguous width](https://qiita.com/s417-lama/items/b38089a42fe7d4a061da)

あとは、[Powerline Extra Symbols](https://github.com/ryanoasis/powerline-extra-symbols)では自分でグリフを作るというより、既に作者が作ったプリセットの中からpowerlineの区切り文字を選んで使う、という感じなので、自分で作りたい人はこの記事の方法を試してみると良いかもしれません。

## カスタマイズの流れ

[Terminal Glyph PatcherのGitHub](https://github.com/s417-lama/terminal-glyph-patcher)にも書いてありますが簡単に説明します。

- **SVG**でグリフを書く
- [Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)のスクリプトを使って作成したグリフ（`.svg`）を既存のターミナルフォントに組み込む
- パッチを当てたフォントをインストール、ターミナルに適用
- 追加したグリフに対応する文字コードを用いていい感じにステータスラインを書く

SVGでグリフが書けるというのがミソです。簡単。

[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)がやっていることは大雑把にはあるUnicodeのコードポイントにSVGで書かれたグリフをマッピングすることなのですが、powerlineのようなステータスラインを構成するためのグリフに特化しています。

## 試してみる

### 1. リポジトリをcloneする

```
git clone https://github.com/s417-lama/terminal-glyph-patcher.git
```

### 2. プリセットのグリフでフォントを生成してみる

`python-fontforge`が必要。インストール方法: [Installing FontForge](http://designwithfontforge.com/en-US/Installing_Fontforge.html)

```
cd terminal-glyph-patcher
fontforge -script terminal-glyph-patcher.py /path/to/your/font.ttf
```

これでパッチの当たったフォントが生成されるので、これをシステムにインストールしてターミナルに適用する。

### 3. exampleのステータスラインを表示してみる

```
./statusline_test.sh
```

環境によっては多少ズレているかもしれないがだいたい以下のように表示されるはず。
![statusline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215516/3d60df86-33ec-a019-0bef-d761885b666d.png)
ここまでくればひとまずはOK。

次は自分好みにカスタマイズする話です。

### 4. 自分のグリフを区切り文字にしてみる

inkscapeか何かでSVGを描くだけで大丈夫です。
`svg/`ディレクトリ以下にプリセットのsvgがあるのでそれを編集してみるのが楽だと思います。

ほんとは少しパラメータを設定しなくてはいけないので、本当にカスタマイズしてみようと思ったら[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)のREADMEを参照してください。

### 5. ズレを補正する

[Nerd fontとpowerlineとambiguous width](https://qiita.com/s417-lama/items/b38089a42fe7d4a061da)でも書きましたが、環境とフォントによってズレが発生したり発生しなかったりします。

そもそもpowerlineは隣り合う文字について「文字の部分」と「背景」を同じ色にして少し重ねることでラインが繋がっているように見せるというちょっと強引なことをやっているので、多少の齟齬が生じてしまうのは仕方ないかなと思います。

ただ、環境に応じてパラメータを調整することで気にならないくらいのズレにすることができます。ズレの原因はフォントサイズ、画面の解像度、使っているターミナルエミュレータの種類の複合的な要因で決まっている気がするので、これといってちゃんとした解決があるわけではなさそうです。
パラメータ調整については同様に[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)のREADMEを参照してください。

# おわりに

powerlineを好きな見た目にするためのフォントを自分で生成するスクリプト[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)を紹介しました。

自分の環境でしか試せていないので、動かなかったりしたらissueを飛ばしてくれたりすると喜びます。

最後に[Terminal Glyph Patcher](https://github.com/s417-lama/terminal-glyph-patcher)を使ってカスタマイズした自分のターミナルのスクショを貼って終わりにしようと思います。

![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215516/92f0327f-467e-ed2e-49cd-3c1ca60496d2.png)
ミュウかわいいね。