頻繁にGitコマンドを使用しているなら、ブランチ名やコマンドのTab補完が利用できないことは、少々不便だと感じることでしょう。
特に、新しいブランチを切り替えるたびに、その名前を完全にタイプする必要があるのは面倒です。
この記事では、そのような不便を解消する方法を具体的に紹介します。
目次
必要なファイル群をダウンロード
初めに、必要なファイル群をダウンロードします。
mkdir ~/.zsh
cd ~/.zsh
curl -o git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
curl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
curl -o _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
.zshrcファイルに設定項目を追加
次に、.zshrc
ファイルに設定を追加します。
# ~/.zsh/git-prompt.sh をソースファイルとして読み込む
source ~/.zsh/git-prompt.sh
# fpathに~/.zshディレクトリを追加
fpath=(~/.zsh $fpath)
# Gitのコマンド補完スクリプトの場所を指定
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
# zshのコマンド補完を初期化
autoload -Uz compinit && compinit -u
# Gitのプロンプトに変更がある場合に表示する設定
GIT_PS1_SHOWDIRTYSTATE=true
# プロンプトの文字列が実行時に評価されるように設定
setopt PROMPT_SUBST
オリジナルのプロンプトデザインを作成
続いて、好みのプロンプトを設計します。ここでは、カレントディレクトリとGitブランチ名を表示する例を示します。
# git_prompt関数を定義。現在のGitブランチ名を取得して、それをプロンプトに表示するための文字列を返す。
git_prompt() {
# __git_ps1はGitのプロンプトスクリプトによって提供される関数。"%s"を渡すと現在のブランチ名のみを返す。
local branch_name="$(__git_ps1 "%s")"
# ブランチ名が空でない場合(Gitリポジトリ内である場合)、" on [ブランチ名]"という形式の文字列をechoする。
if [[ -n $branch_name ]]; then
echo " on $branch_name"
else
# Gitリポジトリ外である場合は、空の文字列をechoする。
echo " "
fi
}
# プロンプトの見た目を設定。カレントディレクトリをシアン色で、git_prompt関数の結果(ブランチ名)を赤色で表示する。
PS1='%F{cyan}%~%f%F{red}$(git_prompt)%f\$ '
結果はこんな感じ。
ちゃんとブランチの補完も効いてて使いやすい。
ハマったこと
プロンプトのカスタマイズ中に、ある問題が発生。
__git_ps1
というgit-prompt.sh
で定義されている関数を使用している時、これが過去に作成したエイリアスと競合してしまいました。具体的には以下のようなエイリアスが原因でした。
alias test="some process sample_test.out"
このエイリアスにより、以下のようなエラーメッセージが表示されていました。
dyld[58984]: Symbol not found: __ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13get_allocatorEv
Referenced from: <EE118444-4D57-3565-AE96-6323D4C54F0A> /usr/local/bin/sample_test.out
Expected in: <3F5CB4D5-26D1-3E43-B241-2688FF0A67BD> /usr/lib/libstdc++.6.dylib
dyld[58985