zoxideとghqを組み合わせて、よく使うディレクトリとクローンしたてで使ったことないGitリポジトリへの移動を便利にしましょう。
zoxideはシェルでのディレクトリ移動の傾向を学習して、よく使うディレクトリへの移動を楽にするツールです。
シェルの設定ファイル内でzoxide init fish
などを実行しておくと、z
関数やzi
関数を使えるようになります。
z
:z foo
などすると、foo
にマッチする最もよく使うディレクトリに移動zi
: よく使う順に並んだディレクトリ一覧の検索画面から移動先を選択(内部的にfzfを利用)
個人的にはzi
をよく使います。
z
はどこに移動するか予想しづらいところが難しいですね。
GoogleのI’m Feeling Luckyみたいな感じです。
よく使うディレクトリにすぐ移動できるzoxideは便利ですね。ただし、移動したことないディレクトリが候補に現れない弱点があります。
検索候補にまだ移動したことないけど、今後よく使いそうなディレクトリを追加するともっと便利にできそうです。
たとえばghqとの組み合わせて、Gitリポジトリのクローン先にも簡単に移動できるようにしてみましょう。
ghqはGitリポジトリを管理するツールです。
たとえばghq get https://github.com/atusy/blog
などすると、$HOME/ghq/github.com/atusy/blog
にリポジトリがクローンされます。このように、リポジトリの名前に合わせてクローン先を決定するので、もう置き場所に悩む必要がありません。しかし、リポジトラリのURLに依存するため、ディレクトリが深く移動が手間になります。
そこでzoxideとghqを組み合わせると、ghqで管理しているリポジトリの一覧をzoxideに登録して、簡単に検索・移動できるようになります。
やることとしては以下のイメージ。
- zoxideに未登録なリポジトリを
zoxide query --list
とghq list -p
の差分から取得 zoxide add
で未登録なリポジトリをzoxideに登録zi
関数に相当する__zoxide_zi
関数を実行して、検索・移動を実施
以下にFishとZshでのzi
実装を示します。ちなみに私はzi
しか使わないので、いっそz
という名前にしてます。
Fishでの実装
# zoxideの初期化
# zi関数を自前で実装するため、`zoxide`が定義しないよう`--no-cmd`オプションをつける
zoxide init fish --no-cmd
# zoxideとghqを組み合わせたzi関数の定義
function __zoxide_list_missing
diff \
( zoxide query --list | sort | psub ) \
( ghq list -p | sort | psub ) \
| grep '^> ' | string replace -r '^> ' ''
end
function __zoxide_add_missing
set -l missing ( __zoxide_list_missing )
if test ( count $missing ) -gt 0
zoxide add $missing
end
end
function zi --description 'zoxide wwith ghq'
__zoxide_add_missing
__zoxide_zi $argv || true
end
Zshでの実装
たぶんこんな感じのはず。
# zoxideの初期化
# zi関数を自前で実装するため、`zoxide`が定義しないよう`--no-cmd`オプションをつける
source <( zoxide init zsh --no-cmd )
# zoxideとghqを組み合わせたzi関数の定義
__zoxide_list_missing() {
diff \
<( zoxide query --list | sort ) \
<( ghq list -p | sort) \
| grep '^> ' | string replace -r '^> ' ''
}
__zoxide_add_missing() {
local missing
missing=( $( __zoxide_list_missing ) )
if [[ ${#missing[@]} -gt 0 ]]; then
zoxide add $missing
fi
}
zi() {
__zoxide_add_missing
__zoxide_zi "$@" || true
}
ENJOY