よく使うディレクトリ+αへの移動を便利にするzoxideとghqの組み合わせ

by
カテゴリ:
タグ:

zoxideghqを組み合わせて、よく使うディレクトリとクローンしたてで使ったことないGitリポジトリへの移動を便利にしましょう。

zoxideはシェルでのディレクトリ移動の傾向を学習して、よく使うディレクトリへの移動を楽にするツールです。

シェルの設定ファイル内でzoxide init fishなどを実行しておくと、z関数やzi関数を使えるようになります。

個人的には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に依存するため、ディレクトリが深く移動が手間になります。

そこでzoxideghqを組み合わせると、ghqで管理しているリポジトリの一覧をzoxideに登録して、簡単に検索・移動できるようになります。

やることとしては以下のイメージ。

以下に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