kakudooo docs

ZshでGitブランチを表示する設定の各行を深掘り

最近新しいMacBookを買った。これまでシェルとしてzshを使ってきたがohmyzshでPluginを入れてプロンプトのカスタマイズをしてきたので、中で何が行われているのか理解できていないし、更に自分好みにカスタマイズする方法も当然わかっていない。

今回よい機会なので、理解のためにあえて自分でプロンプトをカスタマイズすることにした。

手始めにGitのカレントブランチをプロンプトに表示する方法と、プロンプトにブランチが表示されるまでにシェルで何が起きているかを深堀ってみたい。

Gitのカレントブランチをプロンプトに表示する

ZshでGitを使うを参考にして、Gitのカレントブランチをプロンプトに表示してみる。

autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
RPROMPT=\$vcs_info_msg_0_
# PROMPT=\$vcs_info_msg_0_'%# '
zstyle ':vcs_info:git:*' formats '%b'

出力の例、左端にGitのカレントブランチが表示される。

kakudooo@macBook-Air kakudou3.github.io %                      main

それぞれの構文が何をしているのか?

autoload と vcs_info

autoload -Uz vcs_info

vcs_infoというzshの組み込み関数を遅延読み込みする設定。 autoloadに指定した関数は初めて呼び出されるタイミングで、fpath変数を参照して関数定義を検索して実行する。 zshの起動時にすべての関数定義を読み込むことによる起動速度の低下を防ぐために使用される。

-Uzオプション

上記のオプションはautoloadする場合のお作法としてよく使われる。

precmd_functions

precmd_vcs_info() { vcs_info }

vcs_infoを呼び出すためだけのzsh関数を定義する。

precmd_functions+=( precmd_vcs_info )

定義したprecmd_vcs_info関数をprecmd_functions配列に入れる。

zshにはhook関数という仕組みがあり、precmdはプロンプト表示の直前で呼び出されるhook。 precmd_functionsは、プロンプトが表示される直前のタイミングで配列に追加した関数がまとめて実行される。

https://github.com/rothgar/mastering-zsh/blob/master/docs/config/hooks.md

setopt

setopt prompt_subst

setoptprompt_substを有効にしている。 prompt_substを有効にすると、プロンプト内でパラメータ展開/算術展開/シェル置換などを可能にできる。 つまり、変数展開や計算式、コマンドの実行結果の利用が可能になる。

https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html

RPROMPT

RPROMPT=\$vcs_info_msg_0_
# PROMPT=\$vcs_info_msg_0_'%# '

それぞれ、プロンプトの表示を定義するための変数。

設定例だと、右端にvcs_infoから参照した値をプロンプトの表示としている。

zstyle

zstyle ':vcs_info:git:*' formats '%b'

zstyleはプロンプトの見た目や挙動を制御する機能。vcs_infoモジュールもzstyleを使い「どのVCSを対象にどのようなフォーマットでプロンプトに情報を表示するのか」を定義する仕組みになっている。

https://unix.stackexchange.com/questions/214657/what-does-zstyle-do

現在のGitブランチをzshのプロンプトに表示するだけの定義ではあるが、深堀ってみることで理解が深まった。 vcs_infoモジュールだけではなく、他のモジュールを使用してシェルやプロンプトのカスタマイズをする時にも、このあたりの基本に立ち返ると設定が捗りそう。