Fishermanは名前を変更しFisherとなったため、それにともない内容を修正しました。
みなさんローカルリポジトリの管理ってどうしてますか?
僕は少し前まではホームディレクトリにRepositories
なんてディレクトリを作ってそこにgitでcloneしていました。
最近fish + Ghq + fzfで管理し始めたんですけど、戻れなくなったので紹介してみたいと思います。
実はこの記事と似たような内容の記事を少し前に書いています。
こっちは完全にfish寄りの内容なんですけど、興味のある方は読んでみてください。
それでは先にfishとGhqとfzfそれぞれの大雑把な紹介だけしていきます。
その後で細かい環境構築を紹介していく感じでいきたいと思います。
fish shell
fishは他のシェルに比べて補完がとても強力です。
デフォルトでいい感じなので特に難しい設定なども必要ありません。
また、入力中のコマンドにもシンタックスハイライトが効くので、コマンドのタイプミスを心配せずに書けてしまいます。
存在しないコマンドだと赤色のハイライトで知らせてくれます。
もちろんコマンドのオプションの補完もできます。
また、Returnを押したときそこでコマンドが終わりなのか、まだ入力の途中で改行が必要なのかを自動で判別してインデントまでしてくれます。
ただPOSIX互換ではないという弱点もあるので、そこは少し気を付ける必要がありますね。
Ghq
GitHub - motemen/ghq: Remote repository management made easy
今回の目玉となるツールで、簡単に言うとgit cloneを一箇所で管理するためのツールです。
ちなみにGo製です。
基本はghq get
でリポジトリをcloneしてきて、ghq look
でそのリポジトリに移動する感じです。
fishで実行しているのでカラフルで補完もいい感じですね。
fzf
GitHub - junegunn/fzf: A command-line fuzzy finder
fzfはfuzzy finderといって、あいまい検索の機能を提供するツールです。
こちらもGo製です。
GoってCLIツールとか作るのに向いてるんでしょうか。
使い方は簡単で、入力に行データを取り、あいまい検索を行って検索結果のデータを出力します。
行データというのは、たとえばls -l
の結果とかのことです。
- 行データを渡す
- 検索中
あいまい検索なので、適当な入力でもヒットします。
- 出力
余談ですけどコマンドの実行時間が赤色で表示されててfish賢い!という感じですね。
実行時間が1分を超えると赤くなるだけみたいですね。
環境構築
fishとGhqとfzfはそれぞれ強力なツールでしたけど、組み合わせることでさらに便利なものになります。
簡単に言うと、強力な補完の力を借りながらローカルリポジトリをあいまい検索で移動できる感じです。
fishのインストールと設定
まずはお使いのパッケージマネージャでfishをインストールします。
$ 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
のあとに続くサブコマンドがadd
、rm
、ls
とかです。
fishをデフォルトシェルにしたい人は以下を実行してください。
$ chsh -s $(which fish)
$ chsh -s (which fish)
POSIX準拠じゃないシェルをログインシェルにするのは怖いという人は、お使いのシェルの設定ファイルの最後に以下を記述してください。
exec fish
fishの設定はこれぐらいです。
見た目をいじりたい人はfish_config
を実行して表示されたURLを見に行くと幸せになれます。
fzfのインストールと設定
まずはお使いのパッケージマネージャでfzfをインストールします。
$ yaourt -S fzf
そしてFisherでfishのfzf用のプラグインを入れます。
GitHub - jethrokuan/fzf: Ef-🐟-ient fish keybindings for fzf
$ fisher add jethrokuan/fzf
このfzfのプラグインですけど、少しだけ設定が必要になります。
このプラグインのデフォルトのキーバインドがfish 2.4.0のキーバインドと衝突してしまったからだそうです。
なので、fishの設定ファイルである~/.config/fish/config.fish
に以下を書き込みます。
なかったら新しく作ってください。
set -U FZF_LEGACY_KEYBINDINGS 0
これでNew Keybindingsの方のキーバインドが使えますね。
コマンド履歴をあいまい検索するキーバインドCtrl + r
とかがデフォルトで用意されていますね。
とても便利ですね。
ghqのインストールと設定
fzfのときと同じような流れです。
$ yaourt -S ghq
GitHub - decors/fish-ghq: ghq completion and keybinding for fish shell
$ fisher add decors/fish-ghq
ghq get
はデフォルトで~/.ghq
にリポジトリをcloneしてきます。
ghq root
で確認できます。
cloneするディレクトリを変更したいときは~/.gitconfig
に以下の設定を書き込みます。
[ghq]
root = ~/Repositories
root = ~/.go/src
ディレクトリはいくつか設定できて、ghq get
では一番上のところにcloneされます。
ちなみにですけど、ghq get
はgit clone
のエイリアスなので手動でcloneしてきても大丈夫です。
デフォルトで用意されているキーバインドはCtrl + g
だけで、これはghq root
にあるローカルリポジトリをfzfを使ってあいまい検索します。
fzfを入れておくだけで勝手に利用してくれるみたいです。
便利ですね。
使い勝手が知りたい人は、ghq get
でいっぱいリポジトリもってきてCtrl + g
であいまい検索してみてください。
cloneしてきたリポジトリのパスは/path/to/ghq-root/github.com/username/repository.git
となるみたいですね。
で、Ctrl + g
であいまい検索します。
Ctrl + g
Returnするとそのリポジトリのディレクトリに飛べます。
まずGhqを利用することでローカルリポジトリの位置が
/path/to/ghq-root/github.com/username/repository
と決められて、一括で管理できるのでいいですね。
github.com
のところはgitlab.com
だったりbitbucket.org
だったりします。
そしてfzfを利用していることでリポジトリへの移動を曖昧検索で素早く行うことができますね。
そして何よりfishを使っていることで、補完がとにかく強力なので作業効率が上がること間違いなしです。
まとめ
fish+Ghq+fzfすることでローカルリポジトリの移動、検索がとても簡単になりました。
fishの補完がすごいのでコマンドのミスタイプを目grepするようなストレスからも開放されましたね。
fishはこれ以外にも色々楽しいことがあるので、興味があれば以下の記事も読んでみてください。
あと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