gitリポジトリの中にいるときに、トップレベルのディレクトリに移動したくなることがよくありますよね。前にそれを1回のコマンドでできるようにするzsh用のプラグインを作っていました。今回それをfishシェル用に移植したので紹介します。
このプラグインでできること
fish-cd-gitroot というプラグインを作りました。これをインストールすればcd-gitrootというコマンドが使えるようになります。fish-cd-gitrootという名前だけど入力するコマンド名はcd-gitrootであることに注意してください。
使っている様子はこんな感じです。
# /home/mollifier/git_repoがgitリポジトリとする
# その中に次のようにディレクトリがあったとする
# doc/
# src/
# |-scripts/
# `-web/
> cd /home/mollifier/git_repo
> cd src/web
> pwd
/home/mollifier/git_repo/src/web
# リポジトリの奥の方にいる時でも、すぐにトップに移動できる
> cd-gitroot
> pwd
/home/mollifier/git_repo
# 引数を指定するとリポジトリトップからの相対的なパスに移動できる
> cd /home/mollifier/git_repo/doc
> cd-gitroot src/scripts
> pwd
/home/mollifier/git_repo/src/scripts
# タブで相対的なパスが補完できる
> cd-gitroot [TAB]
doc/ src/
> cd-gitroot src/[TAB]
scripts/ web/
インストール
fisherというfishシェル用のパッケージマネージャーを使ってインストールしてください。
> fisher add mollifier/fish-cd-gitroot
これでcd-gitrootコマンドが使えるようになります。特に設定とかはありません。
コマンド名が長くて打ちにくいと思う人は、aliasを設定してください。たとえば、次のように設定するとcdu
というコマンド名で実行できるようになります。
# ~/.config/fish/config.fishにこれを書く
alias cdu='cd-gitroot'
本当は、aliasではなくfunctionとして定義するのがfishらしいやりかたです。というか、fishではaliasを設定すると内部ではfunctionが定義されます。
function cdu --wraps=cd-gitroot
cd-gitroot $argv;
end
このあたりは今回の件とは関係ないので一旦置いておきます。aliasでも問題はありません。
手動インストール
fisherを使っていない人でも、一応手動でもインストールできます。
まず準備として、もしまだなければ~/.config/fish/functions/
と~/.config/fish/completions/
という2つのディレクトリを作成します。
> mkdir -p ~/.config/fish/functions
> mkdir -p ~/.config/fish/completions
そのあと、fish-cd-gitrootリポジトリの内容をダウンロードして、その中のfunctionsディレクトリ内のファイルを~/.config/fish/functions
の中に、completionsディレクトリ内のファイルを~/.config/fish/completions
の中にコピーします。
この方法でもcd-gitrootコマンドが使えるようになります。
使い方
gitリポジトリの中に入って、cd-gitroot
と打てばリポジトリのトップに移動できます。引数を指定していたら、それをリポジトリトップからの相対的なパスと解釈して移動します。引数のディレクトリはタブで補完できるので、リポジトリの奥の方にいる時でも簡単に他の場所に移動できます。
また、-h
または--help
オプションでヘルプメッセージが見れます。
謝辞
このスクリプトを作成するにあたって、nil2さんのFish用の補完スクリプトの作り方という記事を参考にしました。みなさんもfishシェル用の補完ファイルを作るときは参考にしてください。
最後に
こういうディレクトリ移動系の処理は、外部コマンドでは実装できません。なのでシェルを乗り換えるとそのシェル用に再実装する必要があります。fishはbashやzshと少し文法が違っているので、fishのシェルスクリプトに慣れるための練習も兼ねて作成しました。便利なのでぜひ使ってみてください!