リポジトリ移動用の関数を改良した

以前,ソースコードを置いてあるディレクトリに移動するための関数を作成したが同じリポジトリ内で移動したいときにも他のリポジトリディレクトリを一緒に検索してしまい使い心地が悪い部分があった. そのため,次のように書き換えて使用することにした. 機能が若干変わっているため,名前もcrからfdとfrに変更した.

fdは find directories の短縮で,fd -d 3 -p $HOME のようにディレクトリを検索する深さと検索する際の起点となるディレクトリを指定することでディレクトリを検索できる. frは find repositories の短縮で,ソースコードを入れているディレクトリ (自分の環境ではghqを使用しているので ghq root で表示される場所 ) に入っているリポジトリのリストを検索できる.

実際に使う際のイメージとしては,次のようなものを想定している.

# リポジトリを検索
cd `fr`
# ディレクトリ構造が深い際に深さを指定して,移動
cd `fr -d 3 -p $HOME`

実際の関数の定義は次のようにした. オプションの扱いが甘いところ 1 があるが,実用上は問題ないと思われるのでエラー処理はあまりしていない.

#! /bin/sh -

# Usage:
#   fd depth base-directory
#
# Example:
#   cd `fd -d 3 -p $HOME`
#   cd `fd -d 3 -p \`ghq root\``

# fd - search directory
fd() {
    local OPTIND OPTARG OPT
    local depth
    local path
    while getopts ":d:p:" OPT ; do
        case $OPT in
            d)
                depth=$OPTARG
                ;;
            p)
                path=$OPTARG
                ;;
            \?)
                echo nothing option
                return 1
                ;;
        esac
    done

    local dir
    dir=$(find ${path:-.} -path '*/\.*' -prune -o -type d -print -maxdepth ${depth:-5} \
        2> /dev/null | fzf +m) &&
        echo $dir
    }

# fr - search repositories
alias fr='fd -d 3 -p `ghq root`'

関連記事

リポジトリ移動用のコマンドを作った - tomato3713’s blog


  1. 例えば,今の実装だと-dオプションに数値以外を渡すことが可能である.