ターミナルのプロンプトをカスタマイズ

更新:2025-02-26
Shell
概要
Gitのブランチ名を表示したり色付けしたりして、ターミナルのプロンプトをカスタマイズする。ここでのシェルはzsh
を想定している。
基本
ホームディレクトリにある.zshrcファイルに設定を追記してカスタマイズする。具体的には%n
や%m
のようなパラメータを組み合わせる。
PROMPT='%n@%m %~ %# '
以下のように出力される。
username@hostname ~/path/from/home_directory % ここにコマンドを入力username@hostname ~/path/from/home_directory % ここにコマンドを入力...
.zshrcファイルを更新した後は、exec $SHELL -l
で新しいログインシェルを起動して反映を確認。
Gitのブランチ名を表示する
git-promptを使う。
ダウンロード
curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/refs/heads/master/contrib/completion/git-prompt.sh
実装
.zshrcファイルに追記。プロンプトを見やすくするために、ユーザー名やパスの表示部分をそれぞれ関数化しておく。
# git-promptを読み込む. ~/.git-prompt.sh
# gitの状態に応じて記号を表示するGIT_PS1_SHOWDIRTYSTATE=trueGIT_PS1_SHOWSTASHSTATE=trueGIT_PS1_SHOWUNTRACKEDFILES=true
# gitの情報を表示するcurrent_git_info() { if [[ -d .git ]]; then __git_ps1 "%s" fi}
username_and_hostname() { echo "%n@%m"}
path_from_home() { echo "%~"}
# プロンプトを表示するsetopt PROMPT_SUBST ; PS1='$(username_and_hostname)$(path_from_home) $(current_git_info) %# '
username@hostname~/path/from/home_directory main % ここにコマンドを入力
username@hostname~/path/from/home_directory main % ここにコマンドを入力
...
Gitのユーザー名を表示する
複数のgitユーザーを使い分ける場合に、自分が誰なのか?を調べる手間を省く。
...
current_git_user_name() { if [[ -d .git ]]; then echo "$(git config user.name)" fi}
...
$(path_from_home) $(current_git_info) %# '$(path_from_home) $(current_git_info) $(current_git_user_name) %# '
username@hostname~/path/from/home_directory main git_username % ここにコマンドを入力
username@hostname~/path/from/home_directory main git_username % ここにコマンドを入力
...
色をつける
文字色を変更する場合は%F{色番号}
と%f
で囲む。ハイライトする場合は%K{色番号}
と%k
で囲む。色番号について調べるとよく0〜7が出てくるが、それだと良い感じの色を指定できないこともあるので、256色で指定する。
ハイライトは余白が欲しくなるので、半角スペースを入れた。
...
adjusted_git_info() { if [[ -d .git ]]; then local result="$(current_git_info)"
echo "%K{025} %F{254}${result}%f %k" fi}
current_git_user_name() { if [[ -d .git ]]; then echo "$(git config user.name)" echo "%K{044} $(git config user.name) %k" fi}
username_and_hostname() { echo "%n@%m" echo "%F{244}%n@%m%f"}
path_from_home() { echo "%~" echo "%F{006}%~%f"}
...
$(path_from_home) $(current_git_info) $(current_git_user_name) %# '$(path_from_home) $(adjusted_git_info) $(current_git_user_name) %# '
gitの情報を微調整
- ステージング状態で色分け。
- gitの情報とユーザー名の間は半角スペースないほうが良い感じ。
...
adjusted_git_info() { if [[ -d .git ]]; then local result="$(current_git_info)"
echo "%K{025} %F{254}${result}%f %k" # 未ステージングあり if echo "$result" | grep -q "*"; then echo "%K{009} %F{254}${result}%f %k" # すべてステージング済み elif echo "$result" | grep -q "+"; then echo "%K{010} ${result} %k" # 通常時 else echo "%K{025} %F{254}${result}%f %k" fi fi}
...
$(path_from_home) $(adjusted_git_info) $(current_git_user_name) %# '$(path_from_home) $(adjusted_git_info)$(current_git_user_name) %# '
最終版
# ▼ プロンプトのカスタマイズ --------
# git-promptを読み込む. ~/.git-prompt.sh
# gitの状態に応じて記号を表示するGIT_PS1_SHOWDIRTYSTATE=trueGIT_PS1_SHOWSTASHSTATE=trueGIT_PS1_SHOWUNTRACKEDFILES=true
# gitの情報を表示するcurrent_git_info() { if [[ -d .git ]]; then __git_ps1 "%s" fi}
adjusted_git_info() { if [[ -d .git ]]; then local result="$(current_git_info)"
# 未ステージングあり if echo "$result" | grep -q "*"; then echo "%K{009} %F{254}${result}%f %k" # すべてステージング済み elif echo "$result" | grep -q "+"; then echo "%K{010} ${result} %k" # 通常時 else echo "%K{025} %F{254}${result}%f %k" fi fi}
current_git_user_name() { if [[ -d .git ]]; then echo "%K{044} $(git config user.name) %k" fi}
username_and_hostname() { echo "%F{244}%n@%m%f"}
path_from_home() { echo "%F{006}%~%f"}
# プロンプトを表示するsetopt PROMPT_SUBST ; PS1='$(username_and_hostname)$(path_from_home) $(adjusted_git_info)$(current_git_user_name) %# '
# ▲ プロンプトのカスタマイズ --------
余談
git-promptで未追跡が%
で表示されるのを?
に置換したかったが、その後の表示で%f
が溢れる?などうまくいかなかったので断念した。
# 未追跡は「%」ではなく「?」で表示result=${result/\%/\?}
続く...かもね