やっぱり良かったpeco + ghq
やっぱり良かったpeco + ghq
2ヶ月前にzshからfishに乗り換えたんですよ。その時に手引き系の記事を漁っていたらghqっていうツールをちらほら見かけたんです。その時は「は?んなもん要らん!」って思ってスルーしたんですね。あの時の俺、青かったよ。蒙古斑モノ。というわけで、ghqのお陰で作業が幾ばくか効率化したのでオススメしたい、という記事です。
蛇足。fishに乗り換えて2ヶ月経つけど、すごくいいですよ。特に補完。過去に打ったコマンドを前方一致で出してくれんの。「ああ、それそれ。」ってなったら、右キーを押せば入力される仕組みです。それと、シンタックスハイライト。存在しないコマンドをエンター打つ前に色で教えてくれたりするから、ターミナルの履歴を汚さなくていい。ただbashとかと一部構文が大きく違ったりする点があまり好きじゃないです。
閑話休題。
ghqはgitリポジトリのクローンを楽にしつつ、クローン先を統一するツールです。例えば以下のように実行します:
<span id="353c" class="pz om io pk b gz qa qb m qc qd">ghq get <a class="ag hb" href="https://github.com/motemen/ghq" rel="noopener ugc nofollow" target="_blank">https://github.com/motemen/ghq</a></span>
そうすると、~/.ghq/github.com/motemen/ghq にクローンされます。勝手にディレクトリを分けて管理してくれる訳です。デフォルトのクローン先はもちろん設定で変えられます。
で、これだけなら別にイラネェじゃんって思ってたんですよ。ただ最近、これ無いと辛いなと思うことがちょくちょくあったんです。ライブラリを改造したりコントリビュートするためにクローンしたリポジトリが、色んな所に散在して収集がつかなくなりつつあったためです。
ghqを使えば、どこにクローンするか・したか迷う必要がありません。そこが良いなと気づきました。しかしghqはqwertyで打ちにくいよ。エイリアス張れってか。
んで、ghqで整理できるようになったものの、問題があります。大量にクローンしたリポジトリを探すのがめんどいじゃないですか。pecoさんはそれを解決してくれるツールです。とりあえず騙されたと思ってインストールしてください:
<span id="7c23" class="pz om io pk b gz qa qb m qc qd">brew install peco # on macOS<br></br>choco install peco # on Windows</span>
pecoはリストをフィルタする汎用的なツールです。なので色々なことに使えます。例えばコマンド履歴を部分一致で探したりとか、超便利な使い方ですね。fishでは以下のように設定します。.config/fish/functions/peco_select_history.fish:
<span id="6cdf" class="pz om io pk b gz qa qb m qc qd">function peco_select_history<br></br> if test (count $argv) = 0<br></br> set peco_flags --layout=bottom-up<br></br> else<br></br> set peco_flags --layout=bottom-up --query "$argv"<br></br> end</span><span id="4b66" class="pz om io pk b gz qf qb m qc qd">history|peco $peco_flags|read foo</span><span id="8a1c" class="pz om io pk b gz qf qb m qc qd">if [ $foo ]<br></br> commandline $foo<br></br> else<br></br> commandline ''<br></br> end<br></br>end</span>
.config/fish/config.fish:
<span id="9be6" class="pz om io pk b gz qa qb m qc qd">function fish_user_key_bindings<br></br> bind \cr peco_select_history # Bind for peco select history to Ctrl+R<br></br>end</span>
これで Ctrl+Rでhistory コマンドの履歴をpecoでフィルタできるようになりました。
じゃあghqでクローンしたリポジトリ群もpecoで探せるようにしましょう。.config/fish/functions/peco_change_directory.fish:
<span id="d909" class="pz om io pk b gz qa qb m qc qd">function _peco_change_directory<br></br> if [ (count $argv) ]<br></br> peco --layout=bottom-up --query "$argv "|perl -pe 's/([ ()])/\\\\$1/g'|read foo<br></br> else<br></br> peco --layout=bottom-up |perl -pe 's/([ ()])/\\\\$1/g'|read foo<br></br> end<br></br> if [ $foo ]<br></br> builtin cd $foo<br></br> else<br></br> commandline ''<br></br> end<br></br>end</span><span id="8654" class="pz om io pk b gz qf qb m qc qd">function peco_change_directory<br></br> begin<br></br> echo $HOME/.config<br></br> ls -ad */|perl -pe "s#^#$PWD/#"|egrep -v "^$PWD/\."|head -n 5<br></br> sort -r -t '|' -k 3 ~/.z|sed -e 's/\|.*//'<br></br> ghq list -p<br></br> ls -ad */|perl -pe "s#^#$PWD/#"|grep -v \.git<br></br> end | sed -e 's/\/$//' | awk '!a[$0]++' | _peco_change_directory $argv<br></br>end</span>
.dotfiles/.config/fish/config.fish:
<span id="281b" class="pz om io pk b gz qa qb m qc qd"># peco<br></br>function fish_user_key_bindings<br></br> bind \cr peco_select_history # Bind for peco select history to Ctrl+R<br></br> bind \cf peco_change_directory # Bind for peco change directory to Ctrl+F<br></br>end</span>
Ctrl+F でディレクトリの移動履歴とghqのリストがpecoに流れます。確定と同時にchdirされます。とても・・便利です。これで「あれ〜?あれどこにクローンしたっけ」とディレクトリを彷徨うことが無くなりました。
ちなみにどちらも作者は日本人です。凄いですね。尊敬します。