Kubernetesのクラスター選択が面倒で、何かツール的なものがないかなぁと探していたら、pecoというツールを使っているのを見ました。
pecoはKubernetesとは全く関係のない、独立したツールなのですが、使ってみるとメチャメチャ便利でした!
ただ残念なことに、WSLでpecoを使うと、シェルの色がおかしくなったり、リモートデスクトップ越しだとキー操作ができなかったりするので、 下記の記事を参考に、pecoと同等のツール、fzfを使うことにしました。
peco・fzfとは
peco・fzfとは極端に言うと、
「標準入力から入力された画面を、インタラクティブに選択して、選択した行を出力するツール」
です。う~ん。これだけだとよく分からないですね…。
例えば「ls」の実行結果画面をパイプで「fzf」に入力にすると、ファイル選択UIが簡単に作れてしまいます。
ls -lFa | fzf
「-m」オプションで、複数選択も可能です。
ls -lFa | fzf -m
選択した行は、1行まるまる出力されるのですが、実際に欲しいのはファイル名のところだけだったりします。
fzfもpecoもそうなのですが、カラム解析機能はなく、ファイル名だけを取り出すといったことをするには、awkなどにパイプでつないで行います。
例えば、ファイル名は9番目のカラムなので、それを「awk '{print $9}'」で取り出します。
ls -lFa | fzf -m | awk '{print $9}'
これで、ファイルをインタラクティブに選択して削除するUIが簡単に作れてしまいます。
ls -lFa | fzf -m | awk '{print $9}' | xargs rm
しかも、途中文字入力すると、入力した文字で絞り込み表示してくれます!
メチャメチャ便利です!
インストール
公式サイトのReadMeの「Using git」でインストールしました。
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install
いくつか質問されるので、適当にyesにしてると、「~/.fzf.bash」ファイルが作られて、「.bashrc」で読み込むようにしてくれます。
実行ファイルはgitからダウンロードしたフォルダ「fzf」に入っていて、「~/.fzf.bash」がパスを通してくれます。
キーバインド
KEY | ACTION |
---|---|
Ctrl-p | 上移動 |
Ctrl-n | 下移動 |
Ctrl-i | 選択トグル |
Enter | 選択確定 |
Ctrl-c | キャンセル |
カスタマイズ
man fzf
でマニュアルが表示されます。
環境変数FZF_DEFAULT_OPTS
にカスタマイズオプションをセットしておくと、デフォルトオプションとしてセットされます。
pecoのデフォルトの設定の方が好みだったので、それ風に下記にカスタマイズしました。
- 「-m」:複数選択
- 「--reverse」:表示逆順
- 「--ansi」:入力の色を反映する
- 「--color=bg+:#666666」:カーソル行の背景をより白く
.bashrc
export FZF_DEFAULT_OPTS="-m --reverse --ansi --color=bg+:#666666"
ショートカット
毎回コマンドを書くのは面倒なので、functionを作成して、.bashrcなどに登録するのが一般的な使い方ようです。
また、fzfで選択キャンセルしても、パイプラインは最後まで実行されてしまうので、選択結果を確認するようにした方がいいですね。
例えば、dockerイメージを選択して削除するコマンド
.bashrc
function docker-rmi(){ selection=$(docker images | fzf | awk '{print $3}') [ -n "$selection" ] && docker rmi $selection }
感想
シェルでの作業において、
- 一覧表示
- IDを選択してコピー
- IDを別のコマンドに貼り付けて実行
という作業がよく発生するのですが、毎回これが億劫で…。
peco・fzfのおかげで、作業効率が一気に上がりました!感謝です!
オプションで「~番目のカラムを出力する」というのがあれば、awkを使わなくて済むので更によかったのですが。また、選択したら実行されるコマンドが指定できれば、fzfだけで完結してよかったのですが。
でも、このシンプルさがいいのかも知れませんね。
参考記事
- https://qiita.com/sonots/items/f82912367693d717ff06
- https://qiita.com/b4b4r07/items/9e1bbffb1be70b6ce033
- https://qiita.com/xtetsuji/items/05f6f4c1b17854cdd75b
- https://github.com/peco/peco
- https://github.com/junegunn/fzf