ITエンジニアのための勉強会・イベントレポート情報メディア

それゆけ!ターミナル部 第9回絞り込みツールでストレスフリーなターミナルライフ!
skill

それゆけ!ターミナル部 第9回
絞り込みツールでストレスフリーなターミナルライフ!

2017.02.20

 
  • このエントリーをはてなブックマークに追加

みなさんこんにちは!ターミナル部部長のタナカトモフミです。

本連載では意外と見落としがちな基本的な事柄からちょっとマニアックなテクニックまで、ターミナルを使いこなすための方法を若手エンジニアのタミ夫くんとシェルスキー先生と一緒に学んでいきます。

今回はターミナルで様々なものを絞り込み検索するためのツールとしてfzfを紹介します。grepと違い検索結果を確認しながらインクリメンタルに絞り込みを行うことができるので直感的に使いやすく、あるコマンドの結果を絞り込んで別のコマンドに渡すことができるため、工夫次第でターミナル上での作業が非常に快適になります。

タナカトモフミ

前回findコマンドやgrepコマンドをマスターしたタミ夫くんですが、どうやら繰り返しgrepコマンドを入力することに疲れてきたようです。

grep grep grep って長すぎるわー。もう疲れたわー。

どうしたんじゃ?

ファイルを少しずつ条件足して絞り込んでいってるんスけど、「| grep」 って打ちすぎて腱鞘炎になりそうっス。

大げさすぎじゃろ。とはいえ確かに「| grep」打ちたくなる気持ちはわからんでもないのぅ。

それワシは別のやり方知ってるけど的な顔じゃないスかー。そのドヤ顔はいいから早く教えてくださいよー。

絞り込みでもっと便利に!

findやgrepで一覧を出した後にさらに絞り込みをしたいというのはタミ夫くんに限らず、よくある状況です。さらにgrepをパイプして絞り込んでいくというローテクもありますが、スマートに解決したいものです。

そこで便利なのが、fzf (https://github.com/junegunn/fzf) です。

fzf はコマンドライン向けのファジーファインダーです。(日本語ではあいまい検索でおなじみのfuzzyの意)様々なコマンドや、関数と組み合わせてターミナル上でのQOL(Quality Of Life)をぐっと向上させてくれます。

同様のツールとして、percol(https://github.com/mooz/percol)や peco(https://github.com/peco/peco)もありますが、今回はGitHub上でもっともスター数が多かった fzf を紹介します。振る舞いの違いや対応するプラットフォームなど細かいところが違いますので、percolやpecoも調べてみて気に入ったものを使うと良いでしょう。

まずは fzf をインストールしましょう。fzf も homebrew でインストールすることができます。

$ brew install fzf
==> Downloading https://homebrew.bintray.com/bottles/
fzf-0.15.9.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring fzf-0.15.9.el_capitan.bottle.tar.gz
==> Caveats
To install useful keybindings and fuzzy completion:
/usr/local/opt/fzf/install

To use fzf in Vim, add the following line to your .vimrc:
set rtp+=/usr/local/opt/fzf
==> Summary
/usr/local/Cellar/fzf/0.15.9: 17 files, 3.5M

これで fzf コマンドが使えるようになりました。早速使ってみましょう。今回は Bash-itのディレクトリに移動して、lsした結果を fzf で絞り込んでみます。

$ cd ~/.bash_it
$ ls
CONTRIBUTING.md custom      	test
README.md   	install.sh  	themes
aliases     	lib         	uninstall.sh
bash_it.sh  	plugins
completion  	template
$ ls | fzf
install.sh
図1: lsした結果をfzfで取り込む

画像をみるとわかるように、インタラクティブに候補を絞り込むことができています。この絞り込みの結果を他のコマンドと組み合せれば様々なことを実現できます。

絞り込みの画面では、絞り込み用のキーワード文字列の入力のほか、候補選択用のカーソルの上下の移動に「C-j、C-k」と「C-n、C-p」のショートカットキーを使用できます。また、Enterキーで選択を確定、ESCや「C-g、C-c」でキャンセル終了となっています。

fzfの簡単な使い方をいくつか紹介します。

# カレントディレクトリ以下のファイルを vim で開く
$ vim $(find . -type f | fzf)

# ソースコードのディレクトリでは .git などのディレクトリも対象になってしまうので
# ag コマンドを使って一覧を出すのをおすすめします
$ vim $(ag -g "" | fzf)

# カレントディレクトリ以下のディレクトリをファインダーで開く
$ open $(find . -type d | fzf)

クエリについて

絞り込みをする際に入力する文字列は、複数の文字列をスペース区切りで指定できます。さらに、特別なシンタックスも用意されており、先頭の文字や末尾の文字などを指定した絞り込みを行うこともできます。

例: 「^themes .md$ readmemd !.git」

クエリ例種別説明
readmemd fuzzyマッチ 入力された文字列でのあいまい検索
^themes 先頭の完全一致 「^」の後ろの文字列からはじまるアイテムに一致
.md$ 末尾の完全一致 「$」の前の文字列で終わるアイテムに一致
'power 完全一致 「'」の後ろの文字列を含むアイテムに一致。あいまい一致では困るキーワードに使用する
!.git 完全一致 「!」の後ろの文字列にマッチするアイテムを含まない

絞り込み時の候補が多い場合は、先頭や末尾の一致や完全一致を使うことでぐっと候補を絞り込みすることができます。非常に便利な機能なので、覚えておきましょう。

さらに便利に使う

fzfを使った補完(auto-completion)やショートカット(key bindings)の設定が用意されていますので、こちらを有効にしてみましょう。

インストールスクリプトを実行すると、いくつか質問されますが、bash-it を使って有効化するので、「Do you want to update your shell configuration files? ([y]/n) 」は 「n」にしましょう。それ以外の質問は「y」で大丈夫です。

$ /usr/local/opt/fzf/install
Downloading bin/fzf ...
  - Already exists
  - Checking fzf executable ... 0.15.9
Do you want to enable fuzzy auto-completion? ([y]/n) y
Do you want to enable key bindings? ([y]/n) y

Generate ~/.fzf.bash ... OK
Generate ~/.fzf.zsh ... OK
Update fish_user_paths ... Failed
Symlink /Users/tanacasino/.config/fish/functions/fzf_key_bindings.fish ... OK

Do you want to update your shell configuration files? ([y]/n) n

Update /Users/tanacasino/.bashrc:
  - [ -f ~/.fzf.bash ] && source ~/.fzf.bash
	~ Skipped

Update /Users/tanacasino/.zshrc:
  - [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
	~ Skipped

Update /Users/tanacasino/.config/fish/functions/fish_user_key_bindings.fish:
  - fzf_key_bindings
	~ Skipped

For more information, see: https://github.com/junegunn/fzf

インストールスクリプトを実行したらbash-itでfzfプラグインを有効化します。bash-itを使わない場合、zshなどの他のシェルを使う場合は、sourceコマンドで「~/.fzf.bash」や「~/.fzf.zsh」といったファイルを読み込みましょう。

$ bash-it enable plugin fzf
$ reload

これで準備完了です。まずは補完から見ていきましょう。

「**」をトリガーにfzfを使った補完機能を使うことができます。「コマンド名 パス/**」を入力した状態でTABキーを押すと発動します。

# **を入力後にTABキーを押す
$ vim themes/**
図2: **をトリガーに補完する

簡単にfzfが使えるように統合されていて非常に便利です。ファイル名の補完だけでなく、「kill」コマンドでは、プロセスの絞り込みができたり、「ssh」コマンドではホスト名が絞り込み選択できるなどコマンドに合わせて、fzfを活用した補完が提供されています。

続いて、ショートカットキーを3つ紹介します。

まずは、ファイル補完のショートカットキーです。先ほどの「**」相当の内容を「C-t」のショートカットで実現できます。

$ vim # ここで C-t を入力
図3: C-tで補完

非常に便利です。また複数のアイテムを選択することも出来ます。複数選択したい場合は、候補にカーソルがある状態で、TABキーを押すとマークされます。複数のアイテムをマークした状態で確定すれば、複数ファイルを選択できます。

図4: TABキーで複数選択

次は、「M-c」(Alt-c)です。このショートカットキーではカレンディレクトリ以下のディレクトリへの移動をfzfで楽にしてくれます。

図5: M-cでディレクトリ移動

最後にコマンド履歴です。第2回で、「C-r」でコマンド履歴を検索できるショートカットを紹介しましたが、その絞り込みにfzfを使うようになっています。

図6: C-rでコマンド履歴を検索

このようにfzfがインストールスクリプトを用意してくれているので、簡単に絞り込みツールがいかに便利か?を体験することができました。

公式のWiki(https://github.com/junegunn/fzf/wiki/examples)には、その他のたくさんの実例が載っているので、参考にして自分なりのカスタマイズをしていきましょう!

まとめ

あーこれはヤバイっス。快適っスわ。

そうじゃろ。組み合わせやすいツールじゃからいろいろ試してみるといいんじゃないかのう。

Gitは組み合わせて使うケースが多そうなんで、Wikiを参考に関数作ってるっスよ。

それは素晴らしいのう。ところで、ファイルの整理整頓はちゃんとしたかのう?

あ、ちょっと今耳が遠いみたいです。お疲れしたー。

何度も言うけど、ファイルはディレクトリが綺麗に整理整頓された構成から探すのが一番早いってことを忘れぬようにな。

fzfやpercol、pecoといったファジーファインダーは汎用性が高く、工夫次第で様々なコマンドと組み合わせて利用することができます。自分の用途にあった活用法を考えてみるとよいでしょう。

次回はターミナルでの作業をより快適にするためのツールとして、1つのターミナルで複数のウィンドウで作業することのできるtmuxを紹介したいと思います。

原稿: 株式会社ビズリーチ ターミナル部部長 タナカトモフミ

株式会社ビズリーチ所属。ScalaコードをVimで書く日々をおくる。たまにうっかりIntellij IDEAに浮気してしまう。社内のVim部とEmacs部を和解させ、ターミナル部に統合することに成功したが、社内はEclipse, Intellij IDEA, Sublime Text, Atomが主流のため、戦いは続く。

https://twitter.com/tanacasino

それゆけ!ターミナル部 第9回絞り込みツールでストレスフリーなターミナルライフ!

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW