いまさらPowerLine始めてみた


え、今更ですか?

PowerLineとは

一言で言うと、なんかわからんがターミナルがカッコよくなるツール
ターミナルのプロンプト([email protected]: ~/work $みたいなやつ)の表示内容は、大抵シェルの環境変数で管理されています。bashやzshなら$PS1ですね。
これを管理して、見た目もカッコよくしつつgit等のブランチ表示など便利機能も追加してくれるツールがPowerLineです。

御本尊:https://github.com/powerline/powerline

導入理由

前々からPowerLineの存在自体は何となく知ってはいたものの、「なんか導入面倒そうだし...」と敬遠していました。
しかし最近gitを使っている際に間違えて別のbranchにcommit、そのまま気づかずpushしてしまうことが何度かあり、試しに使ってみようかと腰を上げた次第です。

導入

環境は以下の通りです

  • Linux Mint 19.1 MATE 64-bit
  • GNU bash v4.4.20
  • pip 9.0.1

インストール

Pythonで開発されており、pipでパッケージごとインストールできます。
pip3のパッケージはなさそうでした。Python2.7のサポート終わったけど大丈夫だろうかとも思いましたが、動いてるからヨシ!の精神で続行します

$ sudo pip install powerline-shell

フォント

何やらPowerLine用のフォントを利用しないと表示が気持ち悪いことになるとの話なので用意します。今回はmzyy94さんのRicty Diminished with Powerline patchedを使います。Ricty Diminishedという、日本語環境では有名なフォントのPowerLine対応版のようです。

フォントセットは~/.fonts/に置いておきます、なければ作っておいて、その中で

$ git clone https://github.com/mzyy94/RictyDiminished-for-Powerline.git

とすればレポジトリごと持ってこれます。
このままでシステムはフォントを認識してくれるはずですが、もしダメならfc-cacheで更新できます。

セッティング

Gnome端末なら等幅フォントについては

$ gsetting set org.gnome.desktop.interface monospace-font-name 'Ricty Diminished for Powerline Regular 12'
#最後の数字部分はお好みで

とすればシステム全体の設定を変更できます。しかしLinux Mint MATEの標準ターミナルはMATE端末というちょっと違ったもので、手を焼きました。
/usr/share/glib-2.0/schemas/org.mate.terminal.gschema.xmlを見たところ、関係のありそうな部分は

/org.mate.terminal.gschema.xml
<!-- 前略 -->
    <key name="font" type="s">
      <default>'Monospace 12'</default>
      <summary>Font</summary>
      <description>An Pango font name. Examples are "Sans 12" or "Monospace Bold 14".</description>
    </key>

というkeyがあるくらいでしたが、

$ gsetting get org.mate.termial font
No such key "font"

といった具合に、「そんなkeyねーよ!」とキレられてしまいました。
仕方ないのでウィンドウ上部の「編集」→「プロファイルの設定」から個別に設定しました。解決案募集中です。

bashrcに設定

今までの手順で導入すれば、PowerLineの実体は、~/.local/bin/powerline-shellにあります。この出力を$PS1に入れることでプロンプトが設定できるのですが、それだけではディレクトリのやbranchの状態の変化が表示されません。
そこで環境変数$PROMPT_COMMANDに、上記の処理を入れておきます。$PROMPT_COMMAND内に記述された処理はプロンプトを表示する度に実行されます。

具体的にはこのような内容をbashrcに追記しました。

~/.bashrc
_powerline_ps1() {
    PS1="$(~/.local/bin/powerline-shell $?)"
}

if [ "$TERM" != "linux" ]; then
    PROMPT_COMMAND="_powerline_ps1; $PROMPT_COMMAND"
fi

この辺の記述はこちらパクリ参考にしました。ありがとうございます。

この後新しくシェルを立ち上げるか、source ~/.bashrcとすれば設定が反映されます。

VimでもPowerLine

vim-airlineというプラグインを使えば、Vimもイイ感じにカッコよくできます。
僕はvim-plug派なので、こんな感じにvimrcに追記しました。

~/.vimrc
call plug#begin()
    "中略
    Plug 'vim-airline/vim-airline'
    Plug 'vim-airline/vim-airline-themes'
call plug#end()

set t_Co=256

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 = 'dark'
if !exists('g:airline_symbols')
    let g:airline_symbols = {}
endif

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 = 'Ξ'

この辺の記述は@park-jh様のPowerlineは難しくないよ!剽窃見ながら書きました。ありがとうございます。
let g:airline_theme ='<theme>'の部分を変えることで色々なテーマを使えます。vim-airlineのwikiに例があるので、好みのものを選びましょう。
注意すべき点は、Vimは標準では8色しか表示できないため一部のテーマは色が表示できません。
そのため、set t_Co=256とすることで256色まで表示できるようにしています。

最後にvimを開き直し、:PlugInstallと実行。問題なくインストールが完了すれば完成です。

その後

常時PowerLineつけっぱだと地味に重くてイライラするので、手動でon/offできるようにしました。

~/.bashrc
_powerline_ps1() {
    PS1="$(~/.local/bin/powerline-shell $?)"
}

_my_ps1(){
    PS1="\[\e[1;31m\]\u\[\e[1;32m\]@\H\[\e[1;37m\]:\[\e[1;34m\]\w \$\[\e[m\] "
}

plstart(){
    if [ "$TERM" != "linux" ]; then
        PROMPT_COMMAND=$(echo -n "_powerline_ps1;$PROMPT_COMMAND"|sed -e "s/_my_ps1;//g")
    fi  
}

plend(){
    if [ "$TERM" != "linux" ]; then
        PROMPT_COMMAND=$(echo -n "_my_ps1;$PROMPT_COMMAND"|sed -e "s/_powerline_ps1;//g")
    fi  
}

if [ "$TERM" != "linux" ]; then
    PROMPT_COMMAND="_my_ps1;$PROMPT_COMMAND"
fi

こう書いておくことでシェル起動時は普通のプロンプト、plstartを実行するとPowerLineプロンプトに切り替わり、plendで元のプロンプトに復帰できるようにしました。

参考一覧