macOS の Terminal は標準のままだと、プロンプトにユーザー名とホスト名が出るだけで、 今どのディレクトリにいるのか、Git のどのブランチで作業しているのかが画面から分からない。 ディレクトリを深く潜ったときや、ブランチを切り替えながら直していると、 うっかり別の場所でコマンドを打ってしまう事故が起きやすい。

そこで ~/.zshrc を書き換えて、カレントディレクトリと Git ブランチ、日時を プロンプトに常時出すようにした。テーマフレームワークや外部ツールは入れず、 zsh が元から持っている機能だけで完結させている。Oh My Zsh のような仕組みを足さず、 できるだけ素の状態を保ちたい人向けの設定。

この設定で変わるところ

  • コマンド入力の前に1行空けて、直前の出力と入力行の境目を見やすくする
  • 左側にカレントディレクトリを表示する
  • 右側に Git ブランチ名を表示する。Git 管理下のディレクトリだけで出る
  • 入力プロンプトを好きな文字列に変える
  • 右端に日時を表示して、1秒ごとに更新する

手順

設定を間違えるとシェルの起動時にエラーが出ることがあるので、先に ~/.zshrc を バックアップしてから編集する。おかしくなってもバックアップを戻せば元の状態に戻せる。

# 1) まずバックアップ
cp ~/.zshrc ~/.zshrc.bak

# 2) 編集
nano ~/.zshrc
# (または) code ~/.zshrc

# 3) 反映
source ~/.zshrc

設定例(そのまま貼り付け可)

次の内容を ~/.zshrc の末尾に貼り付けて source ~/.zshrc すれば反映される。

autoload -Uz vcs_info
zstyle ':vcs_info:*' formats '[%b]'
zstyle ':vcs_info:*' actionformats '[%b|%a]'

precmd () {
  # 1行あける
  print

  # 左: カレントディレクトリ
  local left=' %{e[38;5;2m%}(%~)%{e[m%}'

  # 右: Gitブランチ
  vcs_info
  local right="%{e[38;5;32m%}${vcs_info_msg_0_}%{e[m%}"

  # 左右の間をスペースで埋める
  local invisible='%([BSUbfksu]|([FK]|){*})'
  local leftwidth=${#${(S%%)left//$~invisible/}}
  local rightwidth=${#${(S%%)right//$~invisible/}}
  local padwidth=$(($COLUMNS - ($leftwidth + $rightwidth) % $COLUMNS))

  print -P $left${(r:$padwidth:: :)}$right
}

# 入力プロンプト
PROMPT="(⁎'~') < "

# 右側に日時を表示
RPROMPT=$'%{e[38;5;251m%}%D{%b/%d} %*%{e[m%}'

# 1秒ごとにプロンプト再描画(RPROMPT更新)
TMOUT=1
TRAPALRM() {
  zle reset-prompt
}

何をしているか

要になるのは precmd という関数で、これはプロンプトを表示する直前に zsh が毎回呼ぶ。 この中で左側の文字列と右側の文字列を組み立てて、間をスペースで埋めて1行に並べている。 ターミナルの横幅 $COLUMNS から左右の表示幅を引いた分だけスペースを入れているので、 ウインドウ幅を変えても左寄せと右寄せの見た目を保てる。

  • vcs_info は zsh 標準のバージョン管理情報を取る仕組みで、Git のブランチ名はこれで取得している。先に autoload -Uz vcs_info で読み込んでおく必要がある。
  • PROMPT は入力行の先頭に出る文字列、RPROMPT は同じ行の右端に出る文字列で、ここに日時を入れている。
  • TMOUT=1TRAPALRM を組み合わせて、1秒ごとにプロンプトを描き直し、右端の時計を更新している。

どこをいじると見た目が変わるか

  • left の中身 … 左側の表示。今はカレントディレクトリ
  • right の中身 … 右側の表示。今は Git ブランチ
  • PROMPT … 入力行の先頭文字列。先頭の顔文字を別のものに変えてもいい
  • RPROMPT … 右端の表示。今は日時

文字色は ANSI エスケープシーケンスの 256 色番号で決まる。設定例の中の 38;5; に続く 数字を変えれば色が変わる。0 から 255 のどの番号がどの色になるかは、次のコマンドを打つと 番号と実際の色を並べて確認できる。

# 256色の番号と実際の色を並べて確認する
for i in {0..255}; do
  print -Pn "%F{$i}$i %f"
done
print

補足

  • Git ブランチ表示は autoload -Uz vcs_infovcs_info がポイント。
  • 色は ANSI エスケープ(\\e[38;5;...m)で指定している。
  • もし表示が崩れたら、~/.zshrc.bak を戻せば復旧できる。

つまずきやすいところ

  • 右端の時計は TMOUT での再描画で更新している。入力せず放置するとシェルを自動で閉じる設定を別に入れていると衝突することがあるので、併用するなら設定の順序に注意する。
  • この設定は zsh 前提で、bash では precmdvcs_info はそのまま使えない。macOS は Catalina 以降の標準シェルが zsh なので、自分で切り替えていなければそのまま動く。
  • 色や桁の表示が崩れたときは、エスケープシーケンスの開始と終了の対応がずれていることが多い。設定例から該当行をコピーし直すと直りやすい。