Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
50
Help us understand the problem. What is going on with this article?
@tomoyamachi

6歳娘「パパ、プロジェクトフォルダを見つけるのに何時間かけるの?」【ghq+fzf+zsh】

More than 1 year has passed since last update.

はじめに

娘(6歳)「パパ、いま私のためのブログつくってるんでしょ?」
娘「ブログってどういうふうにつくるの?」

ワイ「コードっていうのを元に動くんや」
ワイ「ちょっと待ってな。いまホームディレクトリやから…」
ワイ「たしか projects/myproject01 みたいな名前やったかな…」
ワイ「cd projects/myproject01...あれ、ないな」
ワイ「lsしてみよ。」 (ポチッ

$ ls
. .. myproj
myproj1 myproj001 myproject1
myproj2 myproject2 myproject3
yabai-proj sugoi-project

ワイ(…クソみたいな構造してるやん)
ワイ「ごめん。娘ちゃん、もうちょい待ってな」

娘「部屋も汚い上に、ディレクトリも整理されてないんだね」

どうするか

ghq と fzf(Fuzzy Finder)を利用すると、必要なプロジェクトに一瞬で移動できるようになります。自分の環境だとこのように動作します。

s_3896E6C037CE9ED82D9670B9936234A086B7E6CFC631FF6046D68838AB31DB88_1573759326033_ghq-fzf.gif

ghqとは

GitHubなどでホストされているレポジトリをクローンする際に、ディレクトリを指定してリポジトリを管理をシンプルにするためのツールです。

$ ghq get https://github.com/motemen/ghq
 clone https://github.com/motemen/ghq -> /Users/amachi/src/github.com/motemen/ghq
 git clone https://github.com/motemen/ghq /Users/amachi/src/github.com/motemen/ghq

git cloneの代わりにghq getで実行すると、カレントディレクトリに関係なく、指定されたルールでgit cloneできるのが分かります。

fzfとは

fzf(Fuzzy Finder)は、インタラクティブでインクリメンタルな検索フィルターツールです。
コマンドラインでfzfコマンドを渡して検索をかけると、それに対応する結果をインタラクティブに返します。簡単に言うと、Googleの検索機能と似たような動きをコマンドライン上で出来ます。

導入の準備

macであれば、homebrew経由でインストールできます。

$ brew install ghq fzf

インストール後、ghqでどこを起点のディレクトリとするかを、gitの設定ファイルを追加します。

$ git config --global ghq.root $HOME/src
$ less ~/.gitconfig
--- 追加された部分  ---
[ghq]
    root = /Users/amachi/src
--------------------

ghq, fzfを組み合わせる

まず ghq listghq root 以下に存在するプロジェクトの一覧を取得することができます。ここからfzfでインクリメンタルに検索をかけることができます。

またfzfでは、--previewオプションで、右半分の画面をプレビューに利用できるので、ここにプロジェクトを選択するのに便利な情報を表示していきます。

これまで試したのは以下の3パターンですが、自分は 3. プロジェクトルートのファイルリスト が好きです。

preview : README ファイル

ghq list | fzf --preview "bat --color=always --style=header,grid --line-range :80 $(ghq root)/{}/README.*"

preview : git log情報

ghq list | fzf --preview "git --git-dir $(ghq root)/{}/.git log --date=short --pretty=format:'-%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --color"

preview : プロジェクトルートのファイルリスト

ghq list | fzf --preview "ls -laTp $(ghq root)/{} | tail -n+4 | awk '{print \$9\"/\"\$6\"/\"\$7 \" \" \$10}'"

さらに使いやすく : zshのキーバインディング

さらにzshのキーバインディングに登録することで、プロジェクトを選択後にプロジェクト直下に移動できます。
以下の場合、 Ctrl+] を押すと、プロジェクト選択画面が開きます。

function ghq-fzf() {
  local src=$(ghq list | fzf --preview "ls -laTp $(ghq root)/{} | tail -n+4 | awk '{print \$9\"/\"\$6\"/\"\$7 \" \" \$10}'")
  if [ -n "$src" ]; then
    BUFFER="cd $(ghq root)/$src"
    zle accept-line
  fi
  zle -R -c
}
zle -N ghq-fzf
bindkey '^]' ghq-fzf

まとめ

娘「パパ、 @Yametaro さんみたいな記事にするの早めに諦めたね」
ワイ「あの形式でまとめるって大変なんやな」

娘「あと、ノリでつくってたtomoyamachiで埋めるアドベントカレンダー…」
娘「初日から休んだよね…」
ワイ「初日が日曜日なのはつらかったな」

娘「…」

50
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
tomoyamachi
Go / JavaScript / Docker / Python / K8s コンテナの導入〜セキュリティに関するコンサルティングをお受けしています。 コンテナのセキュリティツールDockle作者です。脆弱性スキャンツールのVuls, Trivyのコミッタです。 https://twitter.com/tomoyamachi
goodwith
技術支援や技術コンサルティングを行っています。Container Image LinterのDockleなどのOSS開発も行っています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
50
Help us understand the problem. What is going on with this article?