LoginSignup
4
2

More than 3 years have passed since last update.

poiとfzf(peco)でプロジェクトに爆速で移動できるっぽい〜

Last updated at Posted at 2020-01-14

ことのはじまり

普段のお仕事でも趣味でも、僕は頻繁にプロジェクトを cd コマンドで移動します。Androidのプロジェクトは ~/AndroidProjects に置いてますし、Goのプロジェクトは ~/go/src に置いてあります。
業務はWindowsで、パスの長さ回避のためにCドライブ直下に顧客ごとにディレクトリを切ったりしてその中にプロジェクトがたくさんあったりします。OSSコードを読んだりプルリクエストを送るために別の人のプロジェクトをcloneすることもたくさんあります。

そんなこんなでいろいろなディレクトリでソースコードを管理していると移動が大変面倒なわけです。

そこでghqと言うツールがあります。
ghqはGo製のコマンドツールで、リモートリポジトリを一元管理するためのツールです(ネーミングセンスやばくない?
ghqを使うことによって所定のディレクトリでプロジェクトを管理するようになり、またfzfやpecoなどのツールと連携することで爆速で移動もできるようになると言うものです。

僕もこれを最初使おうと思ったのですが。。。
ghqはあくまでリポジトリの管理が主目的のツール。僕はプロジェクトのディレクトリ配置は今のままが気に入っています。Androidは ~/AndroidProjects におきたいし、WindowsではCドライブ直下におきたいこともあります。そしてGoはやっぱり ~/go/src で管理したいです。

そうなると欲しいのはプロジェクトの一元管理ではなく、たくさんあるプロジェクトに一発で「ぽい」っと移動できるGo製のツール「poi」でした。

What is poi

poiは ghq list に着想を得たツールです。poiは poi.yml ファイルで指定されたディレクトリを探索して、Gitプロジェクトのフルパスを列挙します。ただそれだけです。

# projects - you can specify the directories had projects managed by git.
projects:
  - ~/AndroidStudioProjects
  - ~/IdeaProjects
  - ~/source
  - ~/go/src

このような感じのymlファイルを ~/.config/poi.yml として配置します。そして poi コマンドをどこでもいいので実行すると、こんな感じで指定ディレクトリ配下にあるGitプロジェクトが一瞬で全部出てきます。ファンタスティック!

poi.gif

しかしこれだけだと何にもできません。poiはぽいっとプロジェクトを出力してくれるだけです。そこで、fzfpecoなどのfuzzy-finderツールを使います。

fzfなどのfuzzy-finderツールは、標準出力で受け取ったリストを対話的に絞り込みできるツールです。これにpoiから取得したプロジェクトを渡してあげて、cdで移動すれば爆速で移動できるようになります。

cd "$(poi | fzf)"

poi-fzf.gif

もういっちょ。aliasにも登録してあげましょう!

alias po = 'cd "$(poi | fzf)"'

po.gif

はやい
もはやポイッとする間も無く「ぽ」でプロジェクトに移動できちゃいます。

poiを使ってみよう!

poiのインストールはとっても簡単。最新のGo言語をインストールしてgo getしたらもう使えます。

go get -u github.com/yasukotelin/poi

これでインストールは完了です。

poi と打つともう動くはずです。まだ設定ファイルがない場合は、見つからないよエラーが出ると思います。下の手順で設定ファイルを配置してください。
poi コマンドがないよエラーが発生した場合は、Go getしたバイナリへのパスが通ってないと思います。~/go/bin をパスに通して実行してみてください。

poiは poi.yml ファイルで指定されたディレクトリを対象にGitプロジェクトを探索します。まず、 ~/.config/poi/poi.yml を作成します。Windowsの場合も同じ場所です(%HOME%\.config\poi\poi.yml)。

記載の仕方はこんな感じ。とってもシンプル。

# projects
projects:
  - ~/AndroidStudioProjects
  - ~/IdeaProjects
  - ~/source
  - ~/go/src

# others
others:
  - ~/.config/nvim
  - ~/.config/poi

projects: に好きなだけディレクトリを指定してください。とは言え探索量が増えると困るけど。指定されたディレクトリをルートとしてGitプロジェクトを探索します。ちなみに、 .git ディレクトリを見つけてもさらに配下を見るので、サブプロジェクトも見つかる。はずです。

さらに、Gitのプロジェクトじゃないし、なんなら何のプロジェクトでもないんだけど、よく頻繁に移動するディレクトリにもpoiっと移動したいという場合むけに others: があります。
例えば、 ~/.config/nvim ディレクトリはNeoVimの設定ディレクトリでよくアクセスしますし、他にもブログ記事を管理しているディレクトリとか、直接飛びたいディレクトリって結構あります。そう言うものをここに指定してください。プロジェクトに混ぜてそれらもフルパスを返してくれます。なので、 poi+fzfでプロジェクト以外のところにも飛んで行けるようになりますよ🛩

Windowsでも動くよ!

poi自体はWindowsのコマンドプロンプトでもPowerShellでも、git bashでもしっかりと動きます。

肝心のfzfやpecoとの連携の部分ですが、powershellの場合は cd "$(poi | fzf)" もバッチリです。コマンドプロンプトの場合はfzfの結果をcdに渡すやり方が分からず。。あと、git bashでの連携のやり方もちょっと分からなかったので知っている方いましたら教えてください🙇‍♂️

また、Macだと高速に動作するのですが、Windowsだとかなり遅い感じになってしまいました。
それでは意味がないので色々調べてると、ghqへの速度改善のプルリクエストのツイートをたまたま発見しました。探索の関数をGo言語標準のものではなくライブラリを使用するように変更するもので、poiもこちらのsaracen/walkerを使用するように変更した結果、Macでは一瞬、Windowsでもなかなかに速くなりました。一瞬とは行かないまでも、快適だと思います。

poi.yml ファイルにフルパスで指定する場合は、バックスラッシュをエスケープして指定してください。
~から相対パスの場合は/指定でも大丈夫です。

# projects
projects:
  - ~/AndroidStudioProjects
  - ~/IdeaProjects
  - ~/source
  - ~/go/src
  # Cドライブから指定はこんな感じ
  - C:\\Work

# others
others:
  - ~/.config/nvim
  - ~/.config/poi

終わりに

poi自体は非常にシンプルなコマンドです。ただ標準出力するだけなので、移動だけじゃなくて直接エディタで開いたり、色々できるかもしれません。
また、僕は探索処理のど素人です。おそらく非常にあれな実装になっていると思います。より一瞬で移動できるように改善していきたいと思ってます😇

では、良きpoiライフを!

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2