読者です 読者をやめる 読者になる 読者になる

ghq/peco/hubを組み合わせてローカル・リモートリポジトリに即座にたどり着く

Go zsh GitHub dotfiles

はじめに

あまりにも有名な下記ツールを組み合わせて、ストレスなく、リポジトリにたどり着くような設定にしたのでまとめておきます。

あまりにも有名なので、ツールの説明は割愛します。が、ざっくりいうと、

Go製のリポジトリ管理ツール
github.com
同じくGo製の使い勝手のいいフィルタリングツール
github.com
GitHubCLIで操作するツール
github.com
ですw

ローカル編

ローカルにcloneしたリポジトリを一覧して選択したリポジトリに移動する 操作を素早く行えるようにしています。
zshだとこんな感じの設定になります。

function peco-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    # pecoで選択中, Enter を押した瞬間に実行する
    zle accept-line
  fi
  zle clear-screen
}
# 関数をウィジェットに登録
zle -N peco-src
bindkey '^]' peco-src

"ghq list -p" で、"ghq get"でローカルにクローンしたリポジトリ一覧を表示します。
パイプでつないだ'peco --query "$LBUFFER"'で、その一覧をpecoのコンソールに表示させます。
このようなやり方は、他のQiitaの記事でも紹介されている(というかほぼパクリ)ので、目新しいことはありません。

リモート編

リモートリポジトリを一覧し、選択したリポジトリをブラウザで表示します。
下記は、先程のローカル用の関数をカスタマイズして作成した関数です。

function peco-src-remote () {
  local selected_repo=$(ghq list -p | peco --query "$LBUFFER" | rev | cut -d "/" -f -2 | rev)
  echo $selected_repo
  if [ -n "$selected_repo" ]; then
    BUFFER="hub browse ${selected_repo}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-src-remote
bindkey '^^' peco-src-remote
解説

hubツールに"browse"というコマンドを使って、リモートのリポジトリページをブラウザで開くことができます。

$ hub browse [ユーザ名/リポジトリ名]

なので、下記のようなローカルリポジトリのパス文字列を分解して"hub browse"に渡すということをしたいとおもいます。

$ /Users/kitakitabauer/.ghq/github.com/ユーザ名/リポジトリ名

しかし、$GOPATHやghqのルートによって、パス階層がどのぐらいになるのかわからないので、渡す文字列を固定で切り出すことがめんどくさそうです。

  • /Users/kitakitabauer/.ghq/github.com/kitakitabauer/dotfiles
  • /Users/kitakitabauer/go/src/github.com/kitakitabauer/dotfiles
  • /Users/kitakitabauer/go/src/bitbucket.org/kitakitabauer/dotfiles

自分は以前の記事でご紹介しましたが、".ghq" や "go/src" のように、cloneするディレクトリを分けているので、単純に前者と後者で階層に1つ差が生まれます。

そこで、今回の記事のポイントなのですが、汎用的に"hub browse"に渡したい文字列を整形できるようにしました。
ポイントは下記の部分です。

rev | cut -d "/" -f -2 | rev

1. rev で文字列をひっくり返す

名リトジポリ/名ザーユ/moc.buhtig/qhg./reuabatikatik/sresU/

2. cut -d "/" -f -2 で、スラッシュ区切りで先頭から2フィールド目までを取り出す

名リトジポリ/名ザーユ

3. rev で再び逆にして、ユーザ名/リポジトリ名の順番に戻す

ユーザ名/リポジトリ名


最後に作成した関数を"bindkey"コマンドで、割当がないキーにあてることで一発呼び出しができます。

bindkey '^]' peco-src
bindkey '^^' peco-src-remote



今回のzshの設定を含めたdotfilesはこちらにコミットしています。
github.com

rev は使い道に迷いますが、cut と組み合わせることで他にも面白いことができそうです。


おしまい。