LoginSignup
13
3

More than 1 year has passed since last update.

zshのプロンプトにgitユーザー名を表示させてみた

Last updated at Posted at 2023-03-31

概要

会社のPCで個人開発をしているのですが、時々gitのユーザーを間違えて作業してしまうことがありました。
そこで、プロンプトにgitユーザー名を表示するようにして、ミスを未然に防ごうと思います。

※ディレクトリ移動時にgitユーザーが切り替わっても、それに対応したgitユーザー名がプロンプトに表示されます

やり方

.zshrc
# gitプロンプトを読み込む(今回のgitユーザー名とは関係ないです)
# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
source ~./path_to/git-prompt.sh

# gitのユーザー名を出力する
git_usr_name () {
	local repo_info git_usr_name
	repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
		--is-bare-repository --is-inside-work-tree \
		--short HEAD 2>/dev/null)"
	git_usr_name=`git config user.name`

	if [ -n "$repo_info" ]; then
		# gitディレクトリが存在する時
		echo "[$git_usr_name]"
	fi
}

PS1='%F{green}%n%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f %F{11}$(git_usr_name)%f'"
\$ "

# プロンプトの出力例
pc_usr_name: cuurent_directory (branch_name) [git_usr_name]

開発までの軌跡

ユーザー名が切り替わらない

異なるgitユーザーが設定されているディレクトリに移動しても、プロンプトに表示されているgitユーザー名が切り替わらなかったです。筆者は最初、変数にユーザー名を格納してそれをPS1内で展開してたので、ユーザー名が更新されなかったです。

ユーザー名を読み込むトリガーの発見

何をトリガーでユーザー名を取得すればいいかを探していました。その過程でfswatchなどの指定したファイル変更を監視するライブラリを使ったりもしましたが結局できなったです。git-prompt.shにもそのような記述は無く、どこで毎度実行されているかが見つけることができなかったです。結局はPS1内に書けば毎度実行されることがわかりました。

結局%sがどこから来ているかわからなかった

今回の開発でgit-prompt.shを読みまくってたのですが、ブランチ名を表示している%sがどこで定義されているのかが結局発見できなかったです。わかる方はコメントで教えてください。

PS1とは(GPT-4より)

ZshのPS1は、シェルのプロンプト文字列をカスタマイズする環境変数です。プロンプトは、コマンドを入力する前に表示されるテキストで、ユーザー名、ホスト名、カレントディレクトリなどの情報が含まれています。

参考

プロンプトカスタマイズ https://ryota2357.com/blog/2022/zsh-prompt-custom/
ディレクトリごとに GitHub アカウントを自動的に切り替える設定 https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts

13
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
3