Starship のリポジトリ表記を ghq get の引数の形式にする

2024/04/01に公開

TL;DR

starship.toml
format = """
${custom.git_repo}\
$directory\
# ...
"""

[custom.git_repo]
when = true
require_repo = true
command = 'git rev-parse --show-toplevel | sed -e "s,$(ghq root)/\(github\.com/\)\?,,"'
style = 'bold blue' # style はお好み

[directory]
repo_root_format = '[($path )]($style)'
repo_root_style = 'blue' # style はお好み
# ...

izumin5210/dotfiles のように <user>/<repo> の形式でプロンプト上に表示している

モチベーション

筆者は git リポジトリ上で生活している時間が長いため、正確なフルパスよりも「どの git リポジトリにいるか」のほうを知りたいケースが多い。
なので、それを Shell の prompt に出しておきたい。

StarshipDirectory module を使えば「git リポジトリのルートディレクトリ名」は取り出すことができる。
しかし、リポジトリ名はユニークとは限らない。
せめて「どの user(organization) のリポジトリか」がひと目でわかるようにしたい。

筆者はローカルでは ghq で git リポジトリを管理している。
ghq で GitHub のリポジトリを取得するとき、 URL の代わりに <user>/<repo> という形式まで短縮できる。これをプロンプトを出したい。

# こうしたい

# $(ghq root)/github.com/izumin5210/dotfiles にいるとき
izumin5210/dotfiles >

# $(ghq root)/gitlab.com/gitlab-org/gitlab にいるとき
gitlab.com/gitlab-org/gitlab >

# ~/Downloads にいるとき
~/Downloads >

Starship での設定

前述した通り、Starship の Directory module では「git リポジトリのルートディレクトリ名」しか取り出せず、親を取得することもできない。
なので代わりに Custom commands を利用する。

[custom.git_repo]
when = true
require_repo = true # git リポジトリでは常に有効化
command = 'git rev-parse --show-toplevel | sed -e "s,$(ghq root)/\(github\.com/\)\?,,"'
style = 'bold blue' # style はお好み

git rev-parse --show-toplevel でリポジトリのルートディレクトリのフルパスが取れる。ここから ghq root とそれに続く /github.comsed で落としている。

あとは git リポジトリ内のどこにいるかも知りたいところだけど、それは Directory module で取得することができる。

[directory]
repo_root_format = '[($path )]($style)' # $path がリポジトリ内でのパス
repo_root_style = 'blue' # style はお好み
# ...

最後はこの2つのモジュールをつなげて出せばいい

format = """
${custom.git_repo}\
$directory\
# ...
"""

できたもの


https://github.com/izumin5210/dotfiles/pull/300

Discussion