Powerlineは難しくないよ！


## 始まる前に

格好いい開発環境を作るのは、仕事に集中するためにテーブルの上を綺麗に整理することと同様です。
私はshell、tmux、vimを主に使っていますが、これらを格好良くするため、Powerlineを使います。
Powerlineについてはあちこちに情報が多いし、多様なので、どんな方法を選べばいいのか躊躇してしまいます。
過去、私もそうでした。

ある程度、頭の中が整理されたので、記事を作成しました。

## 背景知識

Powerlineはpythonで作られたライブラリです。
Powerlineを使うためにはpythonとそのパッケージ管理ツールであるpipをインストールする必要があります。
そして、Powerline用のフォントをサーバーとそのサーバーに接続するターミナルにも適用しなければなりません。
Powerline用のフォントをインストールする方法はosごとに異なります。
そして、ターミナルごとにPowerline用のフォントの設定方法も異なります。

これだけではありません。
Powerlineは様々なshell、vim、tmux環境に使えますが、その設定方法が異なります。
女性が化粧することと同じく綺麗に見せるためには色々と時間が掛かります。

しかし、vimを使う人には他の道もあります。
vim-airlineというプラグインを使うことで、Powerlineと同じ効果を演出できます。
vim-airlineは、vim scriptで作成されたので、pythonやpipでPowerlineをインストールしなくても大丈夫です。
これは大きなメリットですね。
Powerlineの場合はPowerlineのdaemonをバックグラウンドで実行させる必要がありますが、vim-airlineの場合は要りません。
しかし、vim-airlineもPowerline用のフォントを使うため、フォントのインストールとターミナルへの適用は必要になります。

ここではvim-airlineを使う方法について説明します。

## vim-airlineをインストール

vimのパッケージ管理ツールとしてvim-plugを使っています。
vim-plugについての詳細は「[NeoBundleからvim-plugへ](https://qiita.com/park-jh/items/226fdc6c6ea7a7598616)」をご参照ください。
vim-plugでvim-airlineとvim-airline-themesをインストールします。
.vimrcファイルを次のように修正して.vimrcをリロードした後、「:PlugInstall!」を実行してください。

```vim:.vimrc
call plug#begin('~/.vim/plugged')
...snip...
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
call plug#end()
```

次は、vim-airlineのオススメの設定です。

```vim:.vimrc
" Powerline系フォントを利用する
set laststatus=2
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_idx_mode = 1
let g:airline#extensions#whitespace#mixed_indent_algo = 1
let g:airline_theme = 'tomorrow'
if !exists('g:airline_symbols')
  let g:airline_symbols = {}
endif

" unicode symbols
let g:airline_left_sep = '»'
let g:airline_left_sep = '▶'
let g:airline_right_sep = '«'
let g:airline_right_sep = '◀'
let g:airline_symbols.crypt = '🔒'
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.linenr = '␊'
let g:airline_symbols.linenr = '␤'
let g:airline_symbols.linenr = '¶'
let g:airline_symbols.maxlinenr = ''
let g:airline_symbols.maxlinenr = '㏑'
let g:airline_symbols.branch = '⎇'
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.paste = 'Þ'
let g:airline_symbols.paste = '∥'
let g:airline_symbols.spell = 'Ꞩ'
let g:airline_symbols.notexists = '∄'
let g:airline_symbols.whitespace = 'Ξ'

" powerline symbols
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.maxlinenr = ''
```

vim-airlineは色んなthemeを提供しています。
スクリーンショットがありますから好みのthemeを探してみましょう。

https://github.com/vim-airline/vim-airline/wiki/Screenshots

私はmacOSの環境でtomorrowのthemeを使っています。

```vim:.vimrc
let g:airline_theme = 'tomorrow'
```

## Powerline fontsをインストール

https://github.com/powerline/fonts

ここでQuick installationのところを確認してください。
インストール手順が詳細に書かれています。

```sh
# clone
git clone https://github.com/powerline/fonts.git --depth=1
# install
cd fonts
./install.sh
# clean-up a bit
cd ..
rm -rf fonts
```

要は、install.shを実行することです。
install.shの中身を確認してみましょう。

```sh:install.sh
#!/bin/bash

# Set source and target directories
powerline_fonts_dir=$( cd "$( dirname "$0" )" && pwd )

# if an argument is given it is used to select which fonts to install
prefix="$1"

find_command="find \"$powerline_fonts_dir\" \( -name '$prefix*.[o,t]tf' -or -name '$prefix*.pcf.gz' \) -type f -print0"

if [[ `uname` == 'Darwin' ]]; then
  # MacOS
  font_dir="$HOME/Library/Fonts"
else
  # Linux
  font_dir="$HOME/.local/share/fonts"
  mkdir -p $font_dir
fi

# Copy all fonts to user fonts directory
echo "Copying fonts..."
eval $find_command | xargs -0 -n1 -I % cp "%" "$font_dir/"

# Reset font cache on Linux
if command -v fc-cache @>/dev/null ; then
    echo "Resetting font cache, this may take a moment..."
    fc-cache -f $font_dir
fi

echo "Powerline fonts installed to $font_dir"<F29>
```

unameでosを判別してホームディレクトリの配下にPowerline用のフォントをコピーします。
そして、macOSやLinuxシステムではfc-cacheを実行してcacheをリセットすることでコピーしたフォントを使えます。

私の場合、macOSは一人で使うため、ホームディレクトリの配下にコピーしても良いですが、Linuxは開発サーバーとして複数人が使うことを想定しています。
Powerline用のフォントファイルは意外とファイルサイズが大きいので、人々が共通的に使える場所にコピーした方がいいと思います。
Linuxの場合はinstall.shを使わずに、下記のコマンドを使います。
install.shを参考にして作りました。
root権限で実行してください。
（Linuxでも一人で使うことであれば、Quick installationの手順通りinstall.shを実行してください。）

```sh
cd /tmp
git clone https://github.com/powerline/fonts.git --depth=1
mkdir -p /usr/share/fonts/powerline
find /tmp/fonts \( -name '*.[o,t]tf' -or -name '*.pcf.gz' \) -type f -exec cp {} /usr/share/fonts/powerline \;
fc-cache -vf
```

fc-cacheやfc-listなど、フォンド関連コマンドを使うためにはfontconfigが必要です。
インストールされていない場合は、インストールしてください。

* Linux

```sh
% sudo yum install -y fontconfig
```

* macOS

```sh
% brew install fontconfig
```

## Rictyを使いたい場合

macOSの場合は、次の記事を参照してください。

[Macでプログラミング用のフォントRictyを設置した話](https://qiita.com/park-jh/items/3c5b9b4aa5619a3631b3)

Linuxの場合だと少し面倒です。
まずRictyフォントを作ってPowerline用のフォントに変換しなければなりません。
しかし、心優しいエンジニアさんがすでに作っておいたものがありました。

https://github.com/mzyy94/RictyDiminished-for-Powerline

これを使えばフォントを作りPowerline用のフォントに変換する面倒な作業を省けます。
vim-powerline-fontpatchedの配下にあるフォントを/usr/share/fonts/powerlineの配下にコピーしてfc-cacheを実行すれば完了です。

## ターミナルでPowerline用のフォントを設定

* iterm2

Preferences ＞ Profiles ＞ Text 順に選択します。
FontとNon-ASCII Fontにて「Change Font」ボタンをクリックして〜for Powerlineというフォントを選択します。
ここではRictyをPowerlineに対応したフォントを選びました。

![スクリーンショット 2017-11-29 12.44.17のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/93752/60b8716b-9fb3-6168-b446-59720bd28e55.png "スクリーンショット 2017-11-29 12.44.17のコピー.png")

* macOSのターミナル

プロファイル ＞ テキスト 順に選択します。
フォントにて「変更」ボタンをクリックして〜for Powerlineというフォントを選択します。
ここではRoboto Mono for Powerlineを選びました。
powerline/fontsの中に含まれているフォントです。

![スクリーンショット 2017-11-29 12.44.41.png](https://qiita-image-store.s3.amazonaws.com/0/93752/d187031b-17b2-9df6-c368-7b979c366d97.png "スクリーンショット 2017-11-29 12.44.41.png")

* rlogin

設定 ＞ フォント 順に選択します。
フォントセットからUNICODEを選択し「編集」ボタンをクリックしてください。

![rlogin_powerline_font_01.png](https://qiita-image-store.s3.amazonaws.com/0/93752/aa3ae4d6-bc3c-18d0-f632-6b7957b4f8d5.png "rlogin_powerline_font_01.png")

IConv Character Setには「UTF-16」を、フォント設定のWindows Character Setには「ANSI」を選択します。
そして、「Font」ボタンをクリックします。

![rlogin_powerline_font_02.png](https://qiita-image-store.s3.amazonaws.com/0/93752/ebd68e34-f5ec-744f-9af8-163bedb5dc82.png "rlogin_powerline_font_02.png")

〜for Powerlineというフォントを選択し「OK」ボタンをクリックします。
ここではRoboto Mono for Powerlineを選びました。

![rlogin_powerline_font_03.png](https://qiita-image-store.s3.amazonaws.com/0/93752/ac9d7a8e-30be-08c2-992d-ce70f3685063.png "rlogin_powerline_font_03.png")

因みに、WindowsではFontのインストールの手順がmacOSやLinuxと異なります。
Windows 7ですと、ダウンロードしたフォントからマウス右クリックして「インストール」をクリックすれば完了です。

![rlogin_windows_font.png](https://qiita-image-store.s3.amazonaws.com/0/93752/998f46bb-eb5f-3948-c1ca-6a3b1d52efa8.png "rlogin_windows_font.png")

詳細は下記のリンクをご参照ください。

[フォントのインストール（Windows 10/8/7/Vista）](https://helpx.adobe.com/jp/x-productkb/global/233291.html)

## tmuxがステータスラインの情報を更新するたびにステータスラインが増えて行く場合

Ambiguous charactersはダメ！
半角文字は半角で、全角文字は全角で処理しなさいと言うことですが、ターミナルでこの設定が有効になっているとPowerlineのステータスラインが更新するたびに増加してしまいます。
私が使っているターミナルの設定方法をご紹介します。

* iterm2

「Treat ambiguous-width characters as double-width」のチェックを外してください。

![スクリーンショット 2017-11-29 12.44.17.png](https://qiita-image-store.s3.amazonaws.com/0/93752/10b78bdf-815e-984d-ca00-6597eaabf453.png "スクリーンショット 2017-11-29 12.44.17.png")

* macOSのターミナル

「詳細」タブにて「Unicode 東アジアA（曖昧）の文字幅をW（広）にする」のチェックを外してください。

![スクリーンショット 2017-11-29 12.44.54.png](https://qiita-image-store.s3.amazonaws.com/0/93752/dc1c3e7b-4eaf-b088-6543-00b121edb57d.png "スクリーンショット 2017-11-29 12.44.54.png")

* rlogin

設定 ＞ スクリーン ＞ ターミナル 順に選択します。
エスケープシーケンスにて「?8428」にチェックを入れて「適用」ボタンをクリックしてください。

![setting-up_rlogin.png](https://qiita-image-store.s3.amazonaws.com/0/93752/f76b9c54-934c-df4c-4767-60d03c90dfcf.png "setting-up_rlogin.png")

## tmuxの設定について

今まで行った作業でvimでは綺麗なPowerlineのステータスラインが表示されるはずです。
tmuxを使っている場合、vimと同じくステータスラインを表示させることが可能です。
tmuxでもvim pluginを使うことでPowerlineのステータスラインを生成することが可能です。
詳細は次の記事をご参照ください。

[tmuxのステータスバー](https://qiita.com/park-jh/items/ad8535b11196b58177a4)

vimとtmuxの設定が終わった画面です。
macOSのターミナルを使っていてVagrant上のCentOSからtmuxとvimを実行しました。
そして、tmux-mem-cpu-loadというtmuxのpluginを使ってメモリとCPUの使用状態を表示させています。

https://github.com/thewtex/tmux-mem-cpu-load

![スクリーンショット 2017-11-29 21.10.16.png](https://qiita-image-store.s3.amazonaws.com/0/93752/c2bfedab-3086-e9a8-ce67-23085cf8e51a.png "スクリーンショット 2017-11-29 21.10.16.png")

ここで使っているvim-airlineのthemeはpapercolorです。
tmux-mem-cpu-loadの表示内容はこうなります。

* 現在使用中のメモリ
* 使用可能なメモリ
* CPUの使用率（バーグラフ）
* CPUの使用率
* １分間のCPUの負荷平均
* ５分間のCPUの負荷平均
* 15分間のCPUの負荷平均