fuzzy finderの便利な使い方
...だと思う定型をメモしますが、イディオムというほどのものじゃない(本来用途なだけ)気はします。
同一コマンドのリスト出力を入力引数に転用するパターン、と言えるかなと。
例
getignore
getignore-select.sh
#!/bin/sh
# need backslash escape? ... currently not use backslash
if which fzf >/dev/null 2>&1; then
getignore list | fzf -m --prompt="gitignore\\> " | xargs -r getignore get
elif which peco >/dev/null 2>&1; then
getignore list | peco --prompt="gitignore\\> " | xargs -r getignore get
else
echo "selector not found"
fi
getignore
はオンラインの定義を呼んできてリスト出力でき、それを指定するとgitignoreファイルの定義を出力してくれます。
gopass
gopass-select.sh
#!/bin/sh
if which fzf >/dev/null 2>&1; then
# # use null sep
# gopass ls --flat | fzf --prompt="password-store > " --print0 | xargs -0 -n 1 -r gopass --clip --yes show
# use sed escape backslash
gopass ls --flat | fzf --prompt="password-store\\> " | sed -e 's/\\/\\\\/' | xargs -n 1 -r gopass show -c
elif which peco >/dev/null 2>&1; then
# use sed escape backslash
gopass ls --flat | peco --prompt="password-store\\> " | sed -e 's/\\/\\\\/' | xargs -n 1 -r gopass show -c
else
echo "selector not found"
fi
gopass
は Pass: The Standard Unix Password Manager のgo実装で、Windowsでも動くもので、秘密鍵をサブフォルダに格納できるためバックスラッシュ対策しています。
要点
- フラットなリストを出力する
- サブコマンドリストも可
- pecoやfzfに食わせる
- ファイルなどなら複数選択できる場合もあるが、逆にサブコマンドは不可なのでmulti選択はoffにするand/or
xargs -n 1
で抑制
- ファイルなどなら複数選択できる場合もあるが、逆にサブコマンドは不可なのでmulti選択はoffにするand/or
- 必要な途中処理をしてから、コマンドの引数として与える
- キャンセル時動作として 「
xargs -r
で引数0個で実行しない」にして、例外的な挙動を抑制 - ファイルパスごと渡すものは、Windowsでのバックスラッシュに注意する、できればnullターミネートを
xargs -0
で処理するのがいいが、fzf --print0
やfindとxargsコマンドで-print0オプションを使う理由(改) - Qiitaにあるようにfindコマンドとくらいしか連携できる例はしらないのがツラい所...