凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

.bashrc だけで powerline-shell みたいな見た目を作ってみた

はじめに

自分は Windows での Git の操作はシンプルに Git for Windows を使っているのですが、付属の Git Bash のデフォルトの見た目を自分好みにしたいと思い、やってみました。powerline-shell を導入しても良いのですが、シンプルに .bashrc だけで自分好みにしたいなと思い、試行錯誤してみた内容の紹介になります。

見た目

f:id:hecomi:20210530160754p:plain

ユーザー名、現在のディレクトリ、Git の状態を表示できるようにしました。

基本

テーマの導入

Git Bash はデフォルトのインストールでは MinTTY の上で動きます。テーマはオプションウィンドウから設定できますが、自分で ~/.mintty/themes/ 以下にファイルを配置するとそれも適用できるようになります。

f:id:hecomi:20210530163200p:plain

自分は暗い solarized の背景色を黒にしたものを使うので、次のように設定しました。

~/.mintty/themes/solarized-dark
# https://github.com/mavnn/mintty-colors-solarized
ForegroundColour=131, 148, 150
BackgroundColour=  0,   0,   0
CursorColour=    220,  50,  47
Black=             7,  54,  66
BoldBlack=         0,  43,  54
Red=             220,  50,  47
BoldRed=         203,  75,  22
Green=           133, 153,   0
BoldGreen=        88, 110, 117
Yellow=          181, 137,   0
BoldYellow=      101, 123, 131
Blue=             38, 139, 210
BoldBlue=        131, 148, 150
Magenta=         211,  54, 130
BoldMagenta=     108, 113, 196
Cyan=             42, 161, 152
BoldCyan=        147, 161, 161
White=           238, 232, 213
BoldWhite=       253, 246, 227

テーマはこちらの .minttyrc.dark を使わせていただいています。

github.com

オプションで保存したテーマなどの設定は ~/.minttyrc に書き出されますので、複数の PC で共有したい場合はシンボリックリンクを作っておくと良いと思います。

色の確認

設定したテーマの色は次のエントリのスクリプトをお借りするとかんたんに確認できます。

qiita.com

f:id:hecomi:20210530163814p:plain

フォントの導入

powerline-shell 風に▶な表示をしたいので、これに対応したフォントが必要です。自分は Ricty が好きなので自分でパッチを当てたものを使っていますが、配布されている対応フォントを使用すると良いかと思います。

github.com

github.com

プロンプトの変更

Bash では PS1 という変数を書き換えることでプロンプトの表示を制御することができます。

qiita.com

例えば .bashrc に次のような行を書くと、表示が変わります。

export PS1='\[\e[0;37;42m\]凹\[\e[0;39;49m\] '

f:id:hecomi:20210530164827p:plain

謎の記号 \[\e[...m\] は中に書いた数字で色を指定することができ、0 や 1 でボールドなどのスタイル、30 番台で文字の色、40 番台で背景色が指定できます。39 や 49 でリセットできるといった感じです。この文字列を色々加工して、いい感じにしていきます。

いい感じにしていく

powerline-shell 風な表示

前述の PS1 書き換えと色変更を使えば powerline 風の表示ができます。

PS1_THEME_ARW='' #フォントの都合で表示できないがこれが▶
PS1_THEME_USR='\[\e[0;37;42m\] \u '
PS1_THEME_SP1='\[\e[0;32;40m\]'$PS1_THEME_ARW
PS1_THEME_DIR='\[\e[0;37;40m\] \w '
PS1_THEME_SP2='\[\e[0;30;49m\]'$PS1_THEME_ARW
PS1_THEME_CMD='\[\e[0;36;49m\] $ '
PS1_THEME_RST='\[\e[0;39;49m\]'
export PS1=$PS1_THEME_USR$PS1_THEME_SP1$PS1_THEME_DIR$PS1_THEME_SP2$PS1_THEME_CMD$PS1_THEME_RST

▶の文字色を直前の背景色、背景色を次の背景色と同じにすることで▶で区切られた表示にできます。

Git の状態の表示

公式の git-prompt.sh を使うと現在のブランチ名や状態を記号で表示できます。

github.com

qiita.com

変数で表示内容のカスタマイズもできます。これも追加してみましょう。

source ~/.bash/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto
GIT_PS1_SHOWCOLORHINTS=true
GIT_PS1_DESCRIBE_STYLE=default

PS1_THEME_ARW=''
PS1_THEME_USR='\[\e[0;37;42m\] \u '
PS1_THEME_SP1='\[\e[0;32;40m\]'$PS1_THEME_ARW
PS1_THEME_DIR='\[\e[0;37;40m\] \w '
PS1_THEME_SP2='\[\e[0;30;44m\]'$PS1_THEME_ARW
PS1_THEME_GIT='\[\e[0;37;44m\] $(__git_ps1 "%s") '
PS1_THEME_SP3='\[\e[0;34;49m\]'$PS1_THEME_ARW
PS1_THEME_CMD='\[\e[0;36;49m\] $ '
PS1_THEME_RST='\[\e[0;39;49m\]'
export PS1=$PS1_THEME_USR$PS1_THEME_SP1$PS1_THEME_DIR$PS1_THEME_SP2$PS1_THEME_GIT$PS1_THEME_SP3$PS1_THEME_CMD$PS1_THEME_RST

f:id:hecomi:20210530171529p:plain

source で git-prompt.sh を読み込み、$(__git_ps1 "%s") で埋め込むと実行するたびにこの関数が評価され、git の情報が文字列として出力されるようになります。配色はあれですがいい感じになってきました。

1行を埋める

毎回改行してコマンドの開始位置を揃えたい派なのですが、このまま改行すると少し味気ないなと思い、行を別の色で埋めたくなりました。色々試行錯誤した結果、次のように tput cols コマンドで紹介できる列の幅を使ってまず一行を埋めておき、キャリッジリターンで改行せずにプロンプトの文字列を開始する方法です。

PS1_THEME_ARW=''
PS1_THEME_USR='\[\e[0;37;42m\] \u '
PS1_THEME_SP1='\[\e[0;32;40m\]'$PS1_THEME_ARW
PS1_THEME_DIR='\[\e[0;37;40m\] \w '
PS1_THEME_SP2='\[\e[0;30;44m\]'$PS1_THEME_ARW
PS1_THEME_GIT='\[\e[0;37;44m\] $(__git_ps1 "%s") '
PS1_THEME_SP3='\[\e[0;34;47m\]'$PS1_THEME_ARW
PS1_THEME_CMD='\[\e[0;36;49m\] $ '
PS1_THEME_RST='\[\e[0;39;49m\]'
PS1_THEME_BAR=$(printf "\[\e[0;39;47m\]%-$(tput cols)s\r")
export PS1=$PS1_THEME_BAR$PS1_THEME_USR$PS1_THEME_SP1$PS1_THEME_DIR$PS1_THEME_SP2$PS1_THEME_GIT$PS1_THEME_SP3$PS1_THEME_RST$'\n'$PS1_THEME_CMD$PS1_THEME_RST

なお、改行するさいは \n と書くと次のようなエラーが表示されます。

bash: command substitution: line 1: syntax error near unexpected token `)'
bash: command substitution: line 1: `__git_ps1 "%s")'

そのため、$'\n' のように記述してあげる必要があります。

qiita.com

これで次のようになりました:

f:id:hecomi:20210530220635p:plain

改行をはさむ

自分は出力結果と次のプロンプトの間に改行が欲しかったので、次のように書いています。こうすると最初の行以外で echo が実行されることで所望の見た目になります。

export PROMPT_COMMAND="export PROMPT_COMMAND=echo"

最終設定

あとは配色などを色々調整しやすいようにして自分は以下のようにしました。これで冒頭の画像のようになります。

# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
source ~/.bash/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto
GIT_PS1_SHOWCOLORHINTS=true
GIT_PS1_DESCRIBE_STYLE=default

PS1_THEME_SYMBOL_SEPARATOR=''
PS1_THEME_SYMBOL_COMMAND='>>'

if [ $TERM = "xterm" ]; then
    PS1_THEME_BAR_COLOR_BG='5;40'
else
    PS1_THEME_BAR_COLOR_BG='49'
fi
PS1_THEME_USR_COLOR_FG='1;37'
PS1_THEME_USR_COLOR_BG='46'
PS1_THEME_USR_COLOR_ARW_FG='0;36'
PS1_THEME_DIR_COLOR_FG='0;37'
PS1_THEME_DIR_COLOR_BG='5;42'
PS1_THEME_DIR_COLOR_ARW_FG='1;32'
PS1_THEME_GIT_COLOR_FG='0;30'
PS1_THEME_GIT_COLOR_BG='5;47'
PS1_THEME_GIT_COLOR_ARW_FG='1;37'
PS1_THEME_CMD_COLOR_FG='0;32'

PS1_THEME_BAR_COLOR='\[\e['$PS1_THEME_BAR_COLOR_BG'm\]'
PS1_THEME_USR_COLOR='\[\e['$PS1_THEME_USR_COLOR_FG';'$PS1_THEME_USR_COLOR_BG'm\]'
PS1_THEME_USR_ARW_COLOR='\[\e['$PS1_THEME_USR_COLOR_ARW_FG';'$PS1_THEME_DIR_COLOR_BG'm\]'
PS1_THEME_DIR_COLOR='\[\e['$PS1_THEME_DIR_COLOR_FG';'$PS1_THEME_DIR_COLOR_BG'm\]'
PS1_THEME_DIR_ARW_COLOR='\[\e['$PS1_THEME_DIR_COLOR_ARW_FG';'$PS1_THEME_GIT_COLOR_BG'm\]'
PS1_THEME_GIT_COLOR='\[\e['$PS1_THEME_GIT_COLOR_FG';'$PS1_THEME_GIT_COLOR_BG'm\]'
PS1_THEME_GIT_ARW_COLOR='\[\e['$PS1_THEME_GIT_COLOR_ARW_FG';'$PS1_THEME_BAR_COLOR_BG'm\]'
PS1_THEME_CMD_COLOR='\[\e['$PS1_THEME_CMD_COLOR_FG'm\]'
PS1_THEME_RESET='\[\e[0;39;49m\]'

if [ $TERM = "xterm" ]; then
    PS1_THEME_BAR=$(printf $PS1_THEME_BAR_COLOR"%-$(tput cols)s\r"$PS1_THEME_RESET)
else
    PS1_THEME_BAR=
fi
PS1_THEME_USR=$PS1_THEME_USR_COLOR' \u '$PS1_THEME_USR_ARW_COLOR$PS1_THEME_SYMBOL_SEPARATOR
PS1_THEME_DIR=$PS1_THEME_DIR_COLOR' \w '$PS1_THEME_DIR_ARW_COLOR$PS1_THEME_SYMBOL_SEPARATOR
PS1_THEME_GIT=$PS1_THEME_GIT_COLOR' $(__git_ps1 "%s") '$PS1_THEME_GIT_ARW_COLOR$PS1_THEME_SYMBOL_SEPARATOR
PS1_THEME_CMD=$PS1_THEME_CMD_COLOR$PS1_THEME_SYMBOL_COMMAND$PS1_THEME_RESET' '

export PS1=$PS1_THEME_BAR$PS1_THEME_USR$PS1_THEME_DIR$PS1_THEME_GIT$PS1_THEME_RESET$'\n'$PS1_THEME_CMD$PS1_THEME_RESET

なお、Windows Terminal やコマンドプロンプトではキャリッジリターンが通常の改行として扱われてしまうようなので泣く泣くバーを非表示にしています。

その他

コマンドプロンプトのテーマ

コマンドプロンプトは公式の ColorTools を使うと簡単にテーマ変更ができます。

qiita.com

Windows Terminal で Git Bash を使う

qiita.com

おわりに

色々テーマ整えるのが好きなのでシンプルに書けて満足です。