macOSの標準ターミナルであるzshの初期セットアップを備忘録として記載しておく。

設定後のイメージ

【Git管理外フォルダ】

【Git管理フォルダ】(下記はリモート差分3コミット分あり)

前提

この設定は以下の環境で設定した。

  • Apple M3 Pro
  • Sonoma 14.2.1
  • zsh 5.9 (x86_64-apple-darwin23.0)

結論

Homebrewzsh-completionszsh-git-promptをインストールする。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install zsh-completions
brew install zsh-git-prompt

~/.zshrcを編集する。

zstyle ":completion:*:commands" rehash 1

if (( $+commands[arch] )); then
  alias x64='exec arch -arch x86_64 "$SHELL"'
  alias a64='exec arch -arch arm64e "$SHELL"'
fi

if type brew &>/dev/null; then
  FPATH=$(brew --prefix)/share/zsh-completions:$FPATH
  autoload -Uz compinit && compinit

  source $(brew --prefix)/opt/zsh-git-prompt/zshrc.sh
fi

alias python="python3"
alias pip="pip3"

git_prompt() {
  PROMPT="%F{040}%n%f%F{009}[$(arch)]%f ➜ %F{033}%~%f"
  if [ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = true ]; then
    PROMPT="$PROMPT $(git_super_status)"
  fi
  PROMPT="$PROMPT"$'\n'"%# "
}
precmd() {
  git_prompt
}

各手順の解説

Homebrewのインストール

Homebrewとは、macOS用のパッケージマネージャーである。開発に使用するパッケージなどはこれを使用してインストールすることが多いためとりあえず入れておく。
ちなみにLinuxでも使用できるらしい。 (使ったことはない...)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

zsh-completionsのインストール

zsh上でコード補完を強化する。

brew install zsh-completions

~/.zshrcに次の内容を追加する

if type brew &>/dev/null; then
  FPATH=$(brew --prefix)/share/zsh-completions:$FPATH
  autoload -Uz compinit && compinit
fi

zsh-git-promptのインストール

ターミナル上に現在のディレクトリのgitの状態を表示する方法は色々あるが、比較的簡単に状態を表示できるzsh-git-promptをインストールする。

brew install zsh-git-prompt

インストール後、zsh-git-promptのスクリプトの読み込み及び、pythonのエリアスを設定する必要がある。
~/.zshrcに次の内容を追加する。

if type brew &>/dev/null; then
  source $(brew --prefix)/opt/zsh-git-prompt/zshrc.sh
fi

alias python="python3"
alias pip="pip3"

実際にターミナル上に表示するにはPROMPT内でgit_super_statusを展開する必要があるが、これは後で説明する。

新しくインストールしたコマンドを即時認識させる

~/.zshrcの先頭に次のコマンドを追記する。

zstyle ":completion:*:commands" rehash 1

arm環境とx64環境の切り替えコマンドの設定

Apple Siliconを搭載したMacで、Intel系プロセッサ向けツールを使用する必要がある場合はRosetta 2をする。 コマンドのエリアスを登録しておくと実行環境の切り替えが容易になる。

~/.zshrcの先頭に次のコマンドを追記する。

if (( $+commands[arch] )); then
  alias x64='exec arch -arch x86_64 "$SHELL"'
  alias a64='exec arch -arch arm64e "$SHELL"'
fi

これで、x64Rosetta 2の環境、a64Apple Siliconの環境に切り替えれる。

プロンプトの変更

ここでいうプロンプトとは、ターミナル上で現在のユーザ名やディレクトリなどの情報を表示する文字列のことである。
PROMPT環境変数に文字列を設定することで自由にカスタマイズできる。

PROMPT用の特殊文字列がいくつかある。以下は一例。

PROMPTDescription
%nユーザー名
%hホスト名
%~カレントディレクトリ
%#一般ユーザーのときは %、root になったときは # を表示

参考:
公式doc
【zsh】いろいろなプロンプト表記 まとめ

色の設定については、%F{色名または色番号}~%fで囲んだ箇所に色をつける事ができる。 使用可能な色番号は次のスクリプトで確認できる。
(bash/zshで16色(ANSI カラーコード)と256色のカラーパレットを表示)

#!/bin/sh
#
# 256色のカラーパレットを表示する
#  bash と zsh にて実行可能
#

target_shell=$1

if [ -z "$1" ]; then
    target_shell=$(basename "$SHELL")
fi

if [ "$target_shell" = "bash" ]; then
    bash <<< 'for code in {0..255}; do echo -n "[38;05;${code}m $(printf %03d $code)"; [ $((${code} % 16)) -eq 15 ] && echo; done'
elif [ "$target_shell" = "zsh" ]; then
    zsh  <<< 'for code in {000..255}; do print -nP -- "%F{$code}$code %f"; [ $((${code} % 16)) -eq 15 ] && echo; done'
else
    echo "error: Invalid argument ($target)"
    echo "Usage: $0 [bash|zsh]"
fi

ユーザ名、実行環境、カレントディレクトリ、gitの状態を表示させるために~/.zshrcに次のように設定した。

git_prompt() {
  PROMPT="%F{040}%n%f%F{009}[$(arch)]%f ➜ %F{033}%~%f"
  if [ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = true ]; then
    PROMPT="$PROMPT $(git_super_status)"
  fi
  PROMPT="$PROMPT"$'\n'"%# "
}
precmd() {
  git_prompt
}

PROMPTに設定した、実行環境の情報やgitの状態は、プロンプトそのものの機能ではないため、プロンプトが表示される前に毎回実行しないと現在の状態が表示されない。そのため、zshprecmdという、プロンプトを表示する直前に実行されるhook関数に登録しておくことで、最新の情報がプロンプト上に表示されるようにしている。
(zshでhook関数を登録する)