fish
fzf
Ghq
Fisher

ローカルリポジトリの管理方法


Fishermanは名前を変更しFisherとなったため、それにともない内容を修正しました。


みなさんローカルリポジトリの管理ってどうしてますか?

僕は少し前まではホームディレクトリにRepositoriesなんてディレクトリを作ってそこにgitでcloneしていました。

最近fish + Ghq + fzfで管理し始めたんですけど、戻れなくなったので紹介してみたいと思います。

実はこの記事と似たような内容の記事を少し前に書いています。

fish shellが結構良かった話 - Qiita

こっちは完全にfish寄りの内容なんですけど、興味のある方は読んでみてください。

それでは先にfishとGhqとfzfそれぞれの大雑把な紹介だけしていきます。

その後で細かい環境構築を紹介していく感じでいきたいと思います。


fish shell

fish shell

fishは他のシェルに比べて補完がとても強力です。

デフォルトでいい感じなので特に難しい設定なども必要ありません

また、入力中のコマンドにもシンタックスハイライトが効くので、コマンドのタイプミスを心配せずに書けてしまいます。

Screenshot at 2018-05-25 10-59-34.png

存在しないコマンドだと赤色のハイライトで知らせてくれます。

もちろんコマンドのオプションの補完もできます。

Screenshot at 2018-05-25 11-09-31.png

また、Returnを押したときそこでコマンドが終わりなのか、まだ入力の途中で改行が必要なのか自動で判別してインデントまでしてくれます。

Screenshot at 2018-05-25 11-16-35.png

ただPOSIX互換ではないという弱点もあるので、そこは少し気を付ける必要がありますね。


Ghq

GitHub - motemen/ghq: Remote repository management made easy

今回の目玉となるツールで、簡単に言うとgit cloneを一箇所で管理するためのツールです。

ちなみにGo製です。

基本はghq getでリポジトリをcloneしてきて、ghq lookでそのリポジトリに移動する感じです。

Screenshot at 2018-05-25 14-42-38.png

fishで実行しているのでカラフルで補完もいい感じですね。


fzf

GitHub - junegunn/fzf: A command-line fuzzy finder

fzfはfuzzy finderといって、あいまい検索の機能を提供するツールです。

こちらもGo製です。

GoってCLIツールとか作るのに向いてるんでしょうか。

使い方は簡単で、入力に行データを取りあいまい検索を行って検索結果のデータを出力します。

行データというのは、たとえばls -lの結果とかのことです。


  • 行データを渡す

Screenshot at 2018-05-25 11-55-01.png


  • 検索中

Screenshot at 2018-05-25 11-51-15.png

あいまい検索なので、適当な入力でもヒットします。


  • 出力

Screenshot at 2018-05-25 11-56-29.png

余談ですけどコマンドの実行時間が赤色で表示されててfish賢い!という感じですね。

実行時間が1分を超えると赤くなるだけみたいですね。


環境構築

fishとGhqとfzfはそれぞれ強力なツールでしたけど、組み合わせることでさらに便利なものになります。

簡単に言うと、強力な補完の力を借りながらローカルリポジトリをあいまい検索で移動できる感じです。


fishのインストールと設定

まずはお使いのパッケージマネージャでfishをインストールします。


ArchLinuxの例

$ yaourt -S fish


次に、fishのプラグイン管理ツールであるFisherをインストールします。

Fisher、Fishermanから名前変わったみたいですね。

GitHub - jorgebucaran/fisher: A package manager for the fish shell

上記のGithubのページにインストール用のワンライナーがありますので、fishシェルを起動してから実行してみてください。

$ fish

$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

「パッケージマネージャを使わずにソフトウェアを入れるのは嫌だ」と思う人もいるかもしれませんけど、そこは大丈夫です。

fishは標準で~/.config/fish/functions以下のファイルにあるfishの関数を読み込んで実行できるんですけど、Fisherはその機能を使って作られています。

なのでパッケージマネージャ外からソフトウェアを入れたせいで管理ができなくなるみたいなことはありません。

閑話休題。

Fisherの使い方は詳しくは説明しませんけど、fisherのあとに続くサブコマンドがaddrmlsとかです。

fishをデフォルトシェルにしたい人は以下を実行してください。


shの例

$ chsh -s $(which fish)



fishの例

$ chsh -s (which fish)


POSIX準拠じゃないシェルをログインシェルにするのは怖いという人は、お使いのシェルの設定ファイルの最後に以下を記述してください。


.bashrcの例

exec fish


fishの設定はこれぐらいです。

見た目をいじりたい人はfish_configを実行して表示されたURLを見に行くと幸せになれます。

Screenshot at 2018-05-25 12-15-50.png


fzfのインストールと設定

まずはお使いのパッケージマネージャでfzfをインストールします。


ArchLinuxの例

$ yaourt -S fzf


そしてFisherでfishのfzf用のプラグインを入れます。

GitHub - jethrokuan/fzf: Ef-🐟-ient fish keybindings for fzf


fish

$ fisher add jethrokuan/fzf


このfzfのプラグインですけど、少しだけ設定が必要になります。

このプラグインのデフォルトのキーバインドがfish 2.4.0のキーバインドと衝突してしまったからだそうです。

なので、fishの設定ファイルである~/.config/fish/config.fishに以下を書き込みます。

なかったら新しく作ってください。


config.fish

set -U FZF_LEGACY_KEYBINDINGS 0


これでNew Keybindingsの方のキーバインドが使えますね。

Screenshot at 2018-05-25 12-29-11.png

コマンド履歴をあいまい検索するキーバインドCtrl + rとかがデフォルトで用意されていますね。

Screenshot at 2018-05-25 12-35-55.png

とても便利ですね。


ghqのインストールと設定

fzfのときと同じような流れです。


ArchLinuxの例

$ yaourt -S ghq


GitHub - decors/fish-ghq: ghq completion and keybinding for fish shell


fish

$ fisher add decors/fish-ghq


ghq getはデフォルトで~/.ghqにリポジトリをcloneしてきます。

ghq rootで確認できます。

cloneするディレクトリを変更したいときは~/.gitconfigに以下の設定を書き込みます。


.gitconfig

[ghq]

root = ~/Repositories
root = ~/.go/src

ディレクトリはいくつか設定できて、ghq getでは一番上のところにcloneされます。

ちなみにですけど、ghq getgit cloneのエイリアスなので手動でcloneしてきても大丈夫です。

デフォルトで用意されているキーバインドはCtrl + gだけで、これはghq rootにあるローカルリポジトリをfzfを使ってあいまい検索します。

fzfを入れておくだけで勝手に利用してくれるみたいです。

便利ですね。

使い勝手が知りたい人は、ghq getでいっぱいリポジトリもってきてCtrl + gであいまい検索してみてください。



  • ghq get
    Screenshot at 2018-05-25 14-45-45.png

cloneしてきたリポジトリのパスは/path/to/ghq-root/github.com/username/repository.gitとなるみたいですね。

で、Ctrl + gであいまい検索します。


  • Ctrl + g

Screenshot at 2018-05-25 14-48-12.png

Returnするとそのリポジトリのディレクトリに飛べます。


  • 移動
    Screenshot at 2018-05-25 14-50-43.png

まずGhqを利用することでローカルリポジトリの位置が

/path/to/ghq-root/github.com/username/repository

と決められて、一括で管理できるのでいいですね。

github.comのところはgitlab.comだったりbitbucket.orgだったりします。

そしてfzfを利用していることでリポジトリへの移動を曖昧検索で素早く行うことができますね。

そして何よりfishを使っていることで、補完がとにかく強力なので作業効率が上がること間違いなしです。


まとめ

fish+Ghq+fzfすることでローカルリポジトリの移動、検索がとても簡単になりました。

fishの補完がすごいのでコマンドのミスタイプを目grepするようなストレスからも開放されましたね。

fishはこれ以外にも色々楽しいことがあるので、興味があれば以下の記事も読んでみてください。

fish shellが結構良かった話 - Qiita

あとfzfは紹介した用途以外でも結構使い勝手の良いコマンドです。

lsしたときとか、パッケージマネージャでパッケージを検索したときとか、出力が途方もない量になることってありますよね。

そういうときはパイプでlessやgrepに流すことが多いと思いますけど、そこにfzfも加えてみると少しだけ幸せになれるかもしれません。

脱線が主になってしまっていた感は否めませんでしたけど、一応ローカルリポジトリの管理方法の紹介でした。


参考文献

Public Domain Lisp Logo Set By Conrad Barski, M.D.

GitHub - jorgebucaran/fisher: A package manager for the fish shell

GitHub - junegunn/fzf: A command-line fuzzy finder

GitHub - motemen/ghq: Remote repository management made easy

GitHub - jethrokuan/fzf: Ef-🐟-ient fish keybindings for fzf

GitHub - decors/fish-ghq: ghq completion and keybinding for fish shell