はじめに
自分は Windows での Git の操作はシンプルに Git for Windows を使っているのですが、付属の Git Bash のデフォルトの見た目を自分好みにしたいと思い、やってみました。powerline-shell を導入しても良いのですが、シンプルに .bashrc だけで自分好みにしたいなと思い、試行錯誤してみた内容の紹介になります。
見た目
ユーザー名、現在のディレクトリ、Git の状態を表示できるようにしました。
基本
テーマの導入
Git Bash はデフォルトのインストールでは MinTTY の上で動きます。テーマはオプションウィンドウから設定できますが、自分で ~/.mintty/themes/
以下にファイルを配置するとそれも適用できるようになります。
自分は暗い 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 を使わせていただいています。
オプションで保存したテーマなどの設定は ~/.minttyrc
に書き出されますので、複数の PC で共有したい場合はシンボリックリンクを作っておくと良いと思います。
色の確認
設定したテーマの色は次のエントリのスクリプトをお借りするとかんたんに確認できます。
フォントの導入
powerline-shell 風に▶な表示をしたいので、これに対応したフォントが必要です。自分は Ricty が好きなので自分でパッチを当てたものを使っていますが、配布されている対応フォントを使用すると良いかと思います。
プロンプトの変更
Bash では PS1
という変数を書き換えることでプロンプトの表示を制御することができます。
例えば .bashrc に次のような行を書くと、表示が変わります。
export PS1='\[\e[0;37;42m\]凹\[\e[0;39;49m\] '
謎の記号 \[\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 を使うと現在のブランチ名や状態を記号で表示できます。
変数で表示内容のカスタマイズもできます。これも追加してみましょう。
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
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'
のように記述してあげる必要があります。
これで次のようになりました:
改行をはさむ
自分は出力結果と次のプロンプトの間に改行が欲しかったので、次のように書いています。こうすると最初の行以外で 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 を使うと簡単にテーマ変更ができます。
Windows Terminal で Git Bash を使う
おわりに
色々テーマ整えるのが好きなのでシンプルに書けて満足です。