bash の PS1 の /W の挙動で git のリポジトリのみ「ユーザー名/リポジトリ名」の形式で表示

bashPS1/W は現在の作業ディレクトリのベース名を表示してくれてシンプルで素晴らしいです(man の bash の「プロンプト」の項に詳細が記載されています)。 ただ、現在の作業ディレクトリが gitリポジトリのとき、リポジトリ名だけでなく、 リポジトリのユーザー名も表示してくれると、フォークしたリポジトリの場合などには見分けがついて便利です。

それを実現するために .bashrc に以下の関数を書きました。

repo_name_or_short_pwd() {
  if [ ${PWD} = ${HOME} ]; then
    echo "~"
  elif [ -e ${PWD}/.git ]; then
    echo $(awk -F / '{ print $(NF-1)"/"$(NF) }' <<< ${PWD})
  else
    echo $(basename ${PWD})
  fi
}

それを PS1 の要素として組み込みます。私は現在下記のように .bashrc に書いています。

GIT_PS1_SHOWDIRTYSTATE=true
PS1_USER='\[\033[32m\]\u'
PS1_SEPARATOR='\[\033[37m\]:'
PS1_DIR='\[\033[34m\]$(repo_name_or_short_pwd)'
PS1_BRANCH='\[\033[31m\]$(__git_ps1)\[\033[00m\]'
PS1_DOLLAR='\n\$ '
PS1="${PS1_USER}${PS1_SEPARATOR}${PS1_DIR}${PS1_BRANCH}${PS1_DOLLAR}"

結果、ホームディレクトリのときは

f:id:blp1526:20170629215039p:plain

git リポジトリのときは

f:id:blp1526:20170629214908p:plain

その他のときは

f:id:blp1526:20170629214931p:plain

の形式となり、希望する表示になりました。