🌈

git-promptのステータスでプロンプトの色を変える

2023/05/03に公開

gitのステータスでプロンプトの色を変えたい

↓こんな感じにしたい。(zshを前提とします)

alt

git-promptの設定をする

まずはgit-promptを設定します。

git-prompt.shをインストール

mkdir ~/.zsh
curl -o ~/.zsh/git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh

zshrc設定

.zshrc

source ~/.zsh/git-prompt.sh

git-promptの必要なオプションを確認する

git-promptのオプションを確認。

設定項目 設定値 説明
GIT_PS1_SHOWDIRTYSTATE true addされていない変更を「*」で示す
commitされていない変更を「+」で示す
GIT_PS1_SHOWUNTRACKEDFILES true addされていない新規ファイルの存在を「%」で示す
GIT_PS1_SHOWSTASHSTATE true stashがある場合は「$」で示す
GIT_PS1_SHOWUPSTREAM auto upstream と同期している場合は「=」で示す
upstream より進んでいる場合は「>」で示す
upstream より遅れている場合は「<」で示す

必要な項目を設定します。
私の場合stashのステータスは不要なのでunsetしておきます。

# addされていない変更を「*」commitされていない変更を「+」で示す
GIT_PS1_SHOWDIRTYSTATE=true
# addされていない新規ファイルの存在を「%」で示す
GIT_PS1_SHOWUNTRACKEDFILES=true
# stashがある場合は「$」で示す
unset GIT_PS1_SHOWSTASHSTATE
# upstreamと同期「=」進んでいる「>」遅れている「<」で示す
GIT_PS1_SHOWUPSTREAM=auto

setopt PROMPT_SUBST

プロンプトの設定をする

色分けするプロンプトを作成します。

__git_ps1 "%s"でgitのステータスを取り出せるので、これで場合分けするgit_color()を作成します。

function git_color() {
  local git_info="$(__git_ps1 "%s")"
  if [[ $git_info == *"%"* ]] || [[ $git_info == *"*"* ]]; then
    echo '%F{red}'
  elif [[ $git_info == *"+"* ]]; then
    echo '%F{green}'
  else
    echo '%F{cyan}'
  fi
}

色を変えたい部分を$(git_color)%fで囲みます。

PS1='%~ $(git_color)$(__git_ps1 "%s")%f\$ '

好みの設定を追加

あとは好みの設定を追加していきます。
参考までに私の設定を載せておきます。

  • カレントディレクトリの色を紫に変更
    • %F{magenta}%~%f
  • gitのステータスを黄色の[]で囲む
    • %F{yellow}$(__git_ps1 "[")%f$(git_color)$(__git_ps1 "%s")%f%F{yellow}$(__git_ps1 "]")%f
    • ※git initされてないディレクトでは表示したくなかったので、少し不格好ですがこうしています。
  • プロンプトを2行にする
  • 直前のプロンプトと一行空ける
  • プロンプトの記号は>に変更
PS1='
%F{magenta}%~%f %F{yellow}$(__git_ps1 "[")%f$(git_color)$(__git_ps1 "%s")%f%F{yellow}$(__git_ps1 "]")%f
> '

これで冒頭の画像のようなプロンプトが作成できました!

zshrc全体

.zshrc

# prompt setting

## curl -o ~/.zsh/git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
source ~/.zsh/git-prompt.sh

# addされていない変更を「*」commitされていない変更を「+」で示す
GIT_PS1_SHOWDIRTYSTATE=true
# addされていない新規ファイルの存在を「%」で示す
GIT_PS1_SHOWUNTRACKEDFILES=true
# stashがある場合は「$」で示す
unset GIT_PS1_SHOWSTASHSTATE
# upstreamと同期「=」進んでいる「>」遅れている「<」で示す
GIT_PS1_SHOWUPSTREAM=auto

setopt PROMPT_SUBST

function git_color() {
  local git_info="$(__git_ps1 "%s")"
  if [[ $git_info == *"%"* ]] || [[ $git_info == *"*"* ]]; then
    echo '%F{red}'
  elif [[ $git_info == *"+"* ]]; then
    echo '%F{green}'
  else
    echo '%F{cyan}'
  fi
}

PS1='
%F{magenta}%~%f %F{yellow}$(__git_ps1 "[")%f$(git_color)$(__git_ps1 "%s")%f%F{yellow}$(__git_ps1 "]")%f
\$ '

GitHubで編集を提案

Discussion