ghqとpecoを導入した話

Posted by jolantern on Tuesday, August 1, 2017

TOC

ghqとpeco

会社でghqとpecoというツールを教えてもらった。すごくかいつまんで言うとghqはgitのローカルリポジトリを管理しやすくするツールで、pecoはいろんなリストに対するインクリメンタルサーチと補完を提供する。

ghqは例えばgithub.comとgit.hoge.comとあった時に、リモートリポジトリに合わせて自動的に分類してくれたりする。go langの go get とか使ったことが有ると分かるかもしれないが、だいたいそんな感じ。 ghq get https://githu.com/hoge/foo.gitとすると~/.ghq/github.com/hoge/foo みたいなところに保存してくれる。

pecoは例えば history | peco とすると、 QUERY> と書かれたシェルのようなものが立ち上がり、履歴からインクリメンタルサーチしてくれる。カーソルキーで選んでEnterすればそのコマンドを実行できて便利、と言うもの。 (historyに使うならCtrl+Rでいいじゃん、というのはあるけど)

何より良いと思ったのはこれらはgo langで書かれている。Macしか使えない、Linux/Windowsでしか、みたいなのはできるだけ使いたくないから、これはありがたい。 Apacheとかそういうのはいいけど、自分の作業に直結しうるものはできるだけ避けている。

導入

Macだとおなじみbrewで入る。

<code>brew install ghq
brew install peco
</code>

Ubuntuだとgo getしてあれこれするんだけど、goのインストールのが大変かもしれない。古いとちょっとね。まぁそれは追々やる。

簡単な使い方

ghqのクローンしたリポジトリ保存先は ~/.ghq 以下である。まあ良いかと思ったけど、今までずっと ~/workspace にあらゆるリポジトリを保管していて、シェルを立ち上げたとき無条件に cd wo を押してTab補完する体なので、保存先を変える。設定は ~/.gitconfigらしい。 そして会社ではGHEのリポジトリを見るので、そのホスト名とかの設定も行う。

<code>[ghq]
  root = ~/workspace
</code>

試しにghqのリポジトリをclone(get)してみる。

<code>$ ghq get https://github.com/motemen/ghq.git
     clone https://github.com/motemen/ghq.git -> /Users/username/workspace/github.com/motemen/ghq
       git clone https://github.com/motemen/ghq.git /Users/username/workspace/github.com/motemen/ghq
Cloning into '/Users/username/workspace/github.com/motemen/ghq'...
remote: Counting objects: 928, done.
remote: Total 928 (delta 0), reused 0 (delta 0), pack-reused 928
Receiving objects: 100% (928/928), 193.13 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (558/558), done.
Checking connectivity... done.
</code>

やけに時間がかかったが、最初なんでなんか初期化のプロセスでも踏んでいたのかもしれない。 /Users/username/workspace/github.com/motemen/ghq に保存される。ちとパスが長くなるのが面倒では有るんだけど、そこをpecoでどうにかするみたいな話である。 パスも異常に長いわけではないし、この手の構成管理は例外なく同じように保存される、というところに価値がある。 ちなみにGHEのホストからcloneしたらこうなる。

<code>$ ghq get git@git.hoge.com:org/scripts.git
     clone ssh://git@git.hoge.com/org/scripts.git -> /Users/username/workspace/git.hoge.com/org/scripts
        hg identify ssh://git@git.hoge.com/org/scripts.git
       git ls-remote ssh://git@git.hoge.com/org/scripts.git
       git clone ssh://git@git.hoge.com/org/scripts.git /Users/username/workspace/git.hoge.com/org/scripts
Cloning into '/Users/username/workspace/git.hoge.com/org/scripts'...
remote: Counting objects: 3238, done.
remote: Total 3238 (delta 0), reused 0 (delta 0), pack-reused 3238
Receiving objects: 100% (3238/3238), 976.90 KiB | 0 bytes/s, done.
Resolving deltas: 100% (1555/1555), done.
Checking connectivity... done.
</code>

GHEはGHE用の設定を入れてあげる必要があると思ったんだけど、いらなかった。gitの方で設定してたりしたらいらないのかな。

移行

既にworkspace以下には色々なリポジトリがいて、移行が面倒。なので下記ブログで紹介されているツールを使わせてもらった。

雑にgit cloneして管理していたリポジトリ群をghq管理下に移行してスッキリさせる - 平常運転

雑にスクリプト書くかぐらいに思ってたのでちょうどよかった。ありがたや。

設定

この2つのツール、よく合わせで紹介されているようである。単体でも強力だが実際色々エイリアス組んだりしたほうが捗る。 なので色々設定する。

<code>#repoってするとpecoがリポジトリの一覧を出してくれて、選んだらそこに移動する
alias repo='cd $(ghq root)/$(ghq list | peco)'
# sshの設定ファイルを見てHost設定されてるところをpecoが出す
alias ssh='ssh $(grep "^Host" ~/.ssh/config|peco|awk "{print \$2}")'

# vimとだけうつとカレントディレクトリの一覧をインクリメンタルサーチしてくれる
# ESQすると普通にvimとしたときの挙動
function peco_vi(){
  if [ "$1" = "" ]
  then
    vim `ls -1 | peco`
  else
    vim ${1}
  fi
}

alias vim=peco_vi

# その他ショートカットしたいだけ

alias gg="ghq get"

# ローカルリポジトリのいらないブランチを消す(リモートに合わせる)
alias gf="git fetch origin --prune"

# history | peco
alias hist="history | peco"
</code>

おまけ

このツールを教えてもらったとき一緒にCtrl+Rもいいよと教えてもらい、便利〜と思って使っていたのだけど僕の癖としてたくさんウィンドウを開く。そういうことをするとhistoryが共有されないので微妙。 これって最後に閉じた端末の履歴しか保存されないので、それもそれで上手く使えない。なので共有する。

~/.bashrc

<code>function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999

</code>

を追記する。これ、早い話がコマンド打つたびに追記しては読み込んでを繰り返すのだ。1度にいろんな窓からコマンド打ちまくるなんてことしないだろうけど、多少重くなるかも。 色々やっていると、zshにしたほうが良いのではと思い始めた。でもbash使う。