最近新しいMacBookを買った。これまでシェルとしてzshを使ってきたがohmyzshでPluginを入れてプロンプトのカスタマイズをしてきたので、中で何が行われているのか理解できていないし、更に自分好みにカスタマイズする方法も当然わかっていない。
今回よい機会なので、理解のためにあえて自分でプロンプトをカスタマイズすることにした。
手始めに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 -Uz vcs_info
vcs_infoというzshの組み込み関数を遅延読み込みする設定。
autoloadに指定した関数は初めて呼び出されるタイミングで、fpath変数を参照して関数定義を検索して実行する。
zshの起動時にすべての関数定義を読み込むことによる起動速度の低下を防ぐために使用される。
-Uzオプション
-U
-z
上記のオプションはautoloadする場合のお作法としてよく使われる。
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 prompt_subst
setoptでprompt_substを有効にしている。
prompt_substを有効にすると、プロンプト内でパラメータ展開/算術展開/シェル置換などを可能にできる。
つまり、変数展開や計算式、コマンドの実行結果の利用が可能になる。
https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html
RPROMPT=\$vcs_info_msg_0_
# PROMPT=\$vcs_info_msg_0_'%# '
それぞれ、プロンプトの表示を定義するための変数。
PROMPT: 左端に表示されるメインの表示領域RPROMPT: 右端に表示される補助情報の表示領域設定例だと、右端にvcs_infoから参照した値をプロンプトの表示としている。
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モジュールだけではなく、他のモジュールを使用してシェルやプロンプトのカスタマイズをする時にも、このあたりの基本に立ち返ると設定が捗りそう。