awscliのコマンドをfzfで選択する

awscliのコマンドはとにかく多い。 到底覚えられないのでドキュメントを頼りに目当てのコマンドを探すことになるのだが、 いちいちリンクをクリックしてドキュメントをたどるのはたいへん面倒。

aws — AWS CLI 1.16.190 Command Reference

これを解消するために以前Alfredでawscliのリファレンスを開くWorkflowを作った。

AWS CLIのリファレンスを開くAlfred Workflowを作った · blog.handlena.me

Alfred Workflowだけでも十分便利なのだが、 最近zshからfishに、pecoからfzfに乗り換えたので、 練習がてらfish+fzfで同様のことをやってみることにした。

config-fish/config_aws.fish at master · handlename/config-fish

fish上で C-x a h を入力するとfzfでawscliのコマンドリストを選択できる。

example

コマンドを選んで Enter を入力すればコマンドラインに挿入する。 実際にawscliでコマンドを実行する場合は、 コマンドラインに aws と入力してから C-x a h でコマンド選択して Enter すればOK。

fzfでリストを表示しているときに C-e を入力するとブラウザでawscliのリファレンスを開く。 fzfの --bind オプションにリファレンスのURLを開くコマンドを設定している。 aws <command> <subcommand> help を実行、でも良かったが、 Alfred Workflowではブラウザを開いていたのでそれを継承した。 たいていリファレンスを見ながらコマンドラインにオプションを入力していくことになるので、 別ウィンドウであるブラウザで開いたほうが都合がいい。

リファレンスを開きつつコマンドをコピーするために、ほぼ同じ操作をAlfred上で2回行っていた。 Alfredは前回の入力を覚えてくれるのでそんなに困らなかったが、 fzfは(おそらく)そういうことはやってくれないので、 リファレンスを開く際に選択したコマンドをクリップボードにコピーするようにした。

fzfに --preview オプションで aws <command> <subcommand> help を表示するようにしている。 DESCRIPTIONの確認をするのには使える、はず。

コマンドリストはawscliのリポジトリのexamplesディレクトリから生成するようにした。

[2019-07-04 追記]

examplesディレクトリには全てのコマンドを網羅しているわけではなかった。 boto/botocoreがコマンドの本体のようだったのでそちらを参照するように修正した(8c24e5b)。

[追記ここまで]

キャッシュディレクトリにコマンドリストファイルがなければ、 リポジトリをtempディレクトリにshallow cloneしてファイル生成している。 Alfred Workflowではわざわざレファレンスをビルドしてsitemap.xmlをパースしていたが、 わざわざそんなことをする必要はなかった。

いまのところ便利に使っている。 fzfの --bind--preview は他にも遊べそうなのでいろいろ試してみたい。

ちなみにoh-my-fishにplugin-awsというのがあるが、 これはcompletions(とprfileの切り替え)を追加するものなので目当てのものとはちょっと違う。

https://github.com/oh-my-fish/plugin-aws