Bashのプロンプトをカスタマイズする

やりたいこと

カレントディレクトリと時刻とgitのブランチとgcloudに設定されているプロジェクトを表示したいです

そもそもどこで設定されている?

環境変数のPS1に設定されています

echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

f:id:uhiaha888:20200228215406p:plain

意味がわからない

カスタマイズする前に、現状を把握しておきたいが意味がわからないです

Bash/プロンプトのカスタマイズ - ArchWiki を参考に読んで見ましょう

debian_chroot ???
${debian_chroot:+($debian_chroot)}

早速謎の debian_chroot なるなにかが現れました

Ubuntuのデフォルト設定から学ぶbashプロンプト - Qiita にある通り chroot でルートディレクトリを変えている場合にそれを表示してくれるらしいです

普段 chroot を使うことがないのでこの部分はとりあえず無視しておきます

ユーザー名@ホスト名
\[\033[01;32m\]\u@\h

\[ と \] はエスケープに使われる記号で、この間に書かれた文字は文字数をカウントしないとかそんな感じみたいです

\033[01;32m

\033 は \e と書いてもいいみたいです \033[ と m の間に書体や文字色等の設定ができるみたいです 複数同時に指定したい場合は ; で区切るようです

コード 意味
00 装飾なし
01 太字
02 細字
03 イタリック
04 下線
30 文字色 黒
31 文字色 赤
32 文字色 緑
33 文字色 黄色
34 文字色 青
35 文字色 マゼンタ
36 文字色 シアン
37 文字色 白
40 背景色 黒
41 背景色 赤
42 背景色 緑
43 背景色 黄色
44 背景色 青
45 背景色 マゼンタ
46 背景色 シアン
47 背景色 白

なので、 [\033[01;32m]\ は ここからは 太字 かつ 文字色 緑 で表示します という意味になるようです

\u はユーザー名, @はただの文字列で \h がホスト名になります

コロン
\[\033[00m\]:

装飾をすべてなしにして : を表示します

カレントディレクト
\[\033[01;34m\]\w

\w はカレントディレクトリ(フルパス) さきほどの表によると、01は太字、34は文字色 青 です

$
\[\033[00m\]\$

再度装飾をすべてなしにしています \$ は一般ユーザーのときは $, root のときは # を表示してくれるようです

読めたね!

ここからはやりたいことを実現していきます

日時を表示

\D を使えば良いみたいです

\D{%Y/%m/%d %T}

ちょっと表示してみましょう

export PS1="[\D{%Y/%m/%d %T}]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "

f:id:uhiaha888:20200228215731p:plain

日付が表示できましたね!!

git ブランチ

プロンプトをカスタマイズしてgitブランチを表示する - Qiita を参考に、以下でブランチ名が取得できるようです

git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'

ということでこれを.bashrcに記載していきましょう

function branch () {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

if [ "$color_prompt" = yes ]; then
    PS1='$(branch)${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='$(branch)${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

f:id:uhiaha888:20200228221317p:plain

表示できた!!

gcloud のプロジェクト名

zsh-gcloud-prompt/gcloud.zsh at master · ocadaruma/zsh-gcloud-prompt · GitHub を参考に、以下でプロジェクト名が取得できます

gcloud config get-value project 2>/dev/null

ということでこれも.bashrcに記載します

f:id:uhiaha888:20200228221822p:plain

f:id:uhiaha888:20200228221856p:plain

YES!!

レイアウト

欲しい情報は一通り取得できましたが、プロンプトが長くなりすぎて使いにくそうです 2行に分けたり右端に置いたりして整理しましょう

改行

\n でいけるみたいです

右寄せ

ややこしいんですが

Bash/プロンプトのカスタマイズ - ArchWiki を参考にしたらできました

f:id:uhiaha888:20200228225442p:plain

まとめ

意外とできましたね

.bashrc の関連しそうな部分は最終的に下記のような形になりました

function branch () {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function project () {
    gcloud config get-value project 2>/dev/null
}

function right () {
    printf "%*s" $COLUMNS "$(branch) $(project) "
}

if [ "$color_prompt" = yes ]; then
    PS1='\[$(tput sc; right; tput rc)\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\n\D{%Y/%m/%d %T}\[\033[00m\] \$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt