リポジトリ移動用のコマンドを作った

概要

だいぶ遅れてしまいましたが、UEC Advent Calender 2019 の1日めの記事です。 今日は、日常で使用しているリポジトリ移動用に作成したシェルスクリプト関数の紹介をします。

本文

ソースコードの管理は、Go言語のフォーマットに従って次のようなディレクトリ構造としています。 私は、ghq コマンドを使用して、リポジトリの管理をしているので、ghq のルートして、${gowork}を指定しています。

# 説明に不要なディレクトリは、省略しています。
${gowork}/
  +---  bin/         # 作成したバイナリファイル  
  +---  pkg/         # Go言語の依存パッケージ
  +---  src/         # すべての言語のソースコード
          +--- github.com/${github_user}/${repository}
          +--- golang.org/
          +--- ...

この方式は、ソースコードが1箇所にまとめられて管理が楽なのですが、リポジトリ間の移動が少々不便です。 ghq look で移動することも可能ですが、その場合新規にシェルのプロセスが起動してしまうので移動を繰り返すと自分がghq look して起動したプロセス内にいるのか、最初に起動したシェルのプロセス内にいるのか分からなくなってしまいSSH等でリモートから接続している際には誤って接続を切ってしまうことがあります。

これを防ぐため、シェルのプロンプトにghq look で起動されたシェルのプロセスのときのみ GHQ のような文字列を表示する方法もありますが、私は普段次のようなシェルスクリプト関数を定義して同一のプロセス内で移動するようにしています。

# Change Repository directory なので、cr としました。
cr() {
  local dir
  dir=$(find "${GOPATH}/src/" -name ${1:-.}  -prune \
                  -o -type d -print 2> /dev/null | fzf +m) &&
  cd "$dir"
}

関数の内容的には、findコマンドで${GOPATH}/src/以下のディレクトリのリストを作り、fzf コマンドに流し込んでいるだけの簡単なものです。

ターミナルで cr 関数を呼ぶと、fzf のファジー検索が始まるので、一致したディレクトリを選択して Enter を入力すればそのディレクトリに cdしてくれます。 本当なら、.gif ディレクトリを除いて検索をしたいのですが、うまくできなかったので今はこれで妥協しています。

cr 関数の実行中のgif
cr 関数実行の様子

その他

fzfghq コマンドは、はてなサマーインターンに行ってから使うようになりました。
gif 画像を作るために、ttyrec, ttygif, ttyplay コマンドを初めて使ったのですが便利ですね。