zshのプロンプトカスタマイズを理解したい

こちらはフィヨルドブートキャンプアドベントカレンダー23日目の記事です。 昨日の担当はhondaさんでReactを最低限理解するまでの過程について書かれています!

フィヨルドブートキャンプアドベントカレンダーPart2もあるため毎日楽しみながら投稿を追っています。

本日は「zshのプロンプトカスタマイズを理解したい」という内容で書いていきたいと思います。

プロンプトカスタマイズを理解したいと思ったきっかけ

秋頃からLinuxの学習に取り組み始め、その中でPS1という環境変数の存在を知りました。 PS1コマンドプロンプトを定義するbash環境変数です。 この環境変数の内容を編集することでプロンプトの表示内容をカスタマイズす事が可能です。

自分はこのプロンプトカスタマイズについて何も理解せず設定していたため、今回調べてみたことを記事にまとめたいと思います。

プロンプトカスタマイズとは?

私は普段zshを使っているため、これ以降はzshを前提に話が進みます。

こちらが自分が普段使用しているzshの表示になります。 ユーザー名とホスト名が赤で太字、現在のディレクトリが緑、VCSの情報がシアン、そしてコマンドプロンプトが黄色で表示されるように設定してあります。

プロンプトカスタマイズとは、このように現在のディレクトリや作業ブランチを表示を設定することを指します。

前職で開発自体はほぼしていなかったもののターミナルは分からないなりに触る機会があり、エンジニアチームの方からディレクトリとブランチは表示させたほうがいいよと教えていただいて以来、この形式で設定しています。

当時教えてもらったものを自分のパソコンにも設定し、そのまま使っていて設定内容の大元?がどこから出たものかは分からずなのですが、ZSH Documentationがドキュメントになるため、ここに書かれている内容とqiitaなどで解説されている日本語の記事を参考にしながら設定内容の詳細を見ていきたいと思います。

まだ設定していなかった、設定しているけど内容はよく分からないという方の参考に少しでもなれば幸いです。

.zshrcの内容

プロンプトカスタマイズの設定は.zshrcに書きます。 先ほどの画像にあるプロンプトは以下の設定によって表示されています。

# Git関連
autoload -Uz vcs_info
 setopt prompt_subst
 zstyle ':vcs_info:git:*' check-for-changes true
 zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"
 zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"
 zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"
 zstyle ':vcs_info:*' actionformats '[%b|%a]'
 precmd () { vcs_info }

# プロンプトカスタマイズ
PROMPT='
[%B%F{red}%n@%m%f%b:%F{green}%~%f]%F{cyan}$vcs_info_msg_0_%f
%F{yellow}$%f '

まず、Git関連の詳細を見ていきたいと思います。

autoload -Uz vcs_info
 setopt prompt_subst
 zstyle ':vcs_info:git:*' check-for-changes true
 zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"
 zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"
 zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"
 zstyle ':vcs_info:*' actionformats '[%b|%a]'
 precmd () { vcs_info }

順番に見ていくと、

autoload -Uz vcs_infoの部分はGitの情報を取得するためのvcs_info関数ををロードしています。-Uオプションは関数がエイリアス展開されることを防ぎ、zオプションは関数がzsh関数であることを示しています。

setopt prompt_substの部分はプロンプトカスタマイズの箇所でセットするPROMPT変数内でvcs_info_msg_0_変数の内容を展開するために記載します。

zstyle ':vcs_info:git:*' check-for-changes trueの部分はGitリポジトリで変更があったかどうかを確認しています。

zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"の部分はステージングエリアに変更がある場合にマゼンタ色で「!」が表示されるように設定しています。

zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"の部分はステージングされていない変更がある場合に黄色で「+」が表示されるように設定しています。

zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"の部分はプロンプトに表示されるVCS情報(今回の場合はGit)のフォーマットを設定しています。ここでの%cはステージングされた変更、%uはステージングされていない変更、%bは現在のブランチ名を意味しています。 つまり、zstyle ':vcs_info:gitの部分で設定した「!」や「+」の記号をブランチ名の左側に表示されるようにしてくれています。

画像で見ていただくと分かりやすいですね!

zstyle ':vcs_info:*' actionformats '[%b|%a]'の部分は 特定のVCSアクション(例えば、リベースやマージ中)が発生している場合のフォーマットを設定します。 一つ上の説明と同様、ブランチ名の右側にVCSアクション名が表示されるようになっています。

precmd () { vcs_info }の部分はプロンプトを表示する度に実行する関数になります。この部分でvcs_infoを実行することでGitの情報が取得され、プロンプトを表示する度にvcs_info_msg_0_変数の内容を最新状態にしています。

ふう・・・ここまで理解するのに私はだいぶ時間を溶かしましたw

ですが、まだ続きがあります! 続いてはプロンプトカスタマイズの部分を見ていきます。

PROMPT='
[%B%F{red}%n@%m%f%b:%F{green}%~%f]%F{cyan}$vcs_info_msg_0_%f
%F{yellow}$%f '

この部分でzshコマンドプロンプトを定義しているPROMPT変数の内容を編集しています。

%B%bはテキストを太字にするためのフラグです。

%F{color}%fはテキストの色を設定しています。

%n@%mの部分はユーザー名とマシン名を表示を設定しています。

%~は現在のディレクトリのパスを表示する設定をしていて、ホームディレクトリについては~に短縮されて表示されるようになっています。

$vcs_info_msg_0_はGit関連の設定で確認したvcs_infoによって設定された内容を表示する設定をしています。

%F{yellow}$%fはプロンプトの終わりを示す$記号を黄色で表示する設定をしています。

改めて画像を見てみると設定した内容になっています。

こちらの設定は比較的分かりやすかった気がします。

まとめ

内容を理解せず設定していたzshのプロンプトカスタマイズの詳細について設定内容を一つずつ見ていきました。 今回調べるにあたって自分の既存設定を書き換えて表示がおかしくなっては戻してをしたりしながら、各設定が何をしていてどんなときに必要なのかを理解していきました。

インターネットで調べると他にも様々なカスタマイズ方法が紹介されているため、たまに設定内容を見直すのも面白そうだなと思いました。

上記に記載した内容について、万が一おかしな部分がありましたらコメント等でお知らせいただけると幸いです。

参考資料

13.2 Simple Prompt Escapesと26.5 Gathering information from version control systemsあたりで解説されています。