zleキーバインディングでfzfを使用する

zleキーバインディングでfzfを使用する

内部には次の機能があります。.zshrc

function foo() {
    filename="$(fzf)"
}
zle -N foo
bindkey '^X' foo

今すぐfoo入力して呼び出すと期待どおりに機能しますが、キーを使用してキーバインドして呼び出すと、バッファは空になり^Xますfzf

誰でもこれを再現できますか?この問題をどのように解決できますか?

ベストアンサー1

現在のカーソル位置に正しく引用された出力を挿入するには、fzf次のようにする必要があります。

insert-quoted-fzf-output() {
  local output
  output=$(fzf</dev/tty) && LBUFFER+=${(q-)output}
}

zle -N insert-quoted-fzf-output
bindkey '^X' insert-quoted-fzf-output

$LBUFFERつまり、その出力を末尾(カーソルの左側の編集バッファー部分)に挿入して引用符で囲む必要があります(q-ここでは、パラメータ拡張フラグを使用して引用量を最小化します)。fzfターミナルから始めてください。失敗した場合は、ウィジェットにゼロ以外の終了ステータスを返すことができますfzf

あなたの具体的な質問空のfzfバッファ</dev/ttyリダイレクトの欠落についてです。

fzfで実行すると、同じ動作を見ることができますfzf < /dev/null

実行すると(利用可能な形式の文書がinfo zsh widgetsあると仮定し、一部のシステムではパッケージをインストールする必要があるかもしれません)、次のことがわかります(強調表示)。zshinfozsh-doc

18.5 カスタムウィジェット

カスタムウィジェットはシェル関数として実装され、一般的なシェルコマンドを実行できます。次のコマンドを使用して別のウィジェット(組み込みまたはカスタマイズ)を実行することもできますzle機能の標準入力は/ dev / nullからリダイレクトされ、外部コマンドが端末から読み取られ、ZLEを誤ってブロックするのを防ぎます。、しかし、read -kまたはread -q文字を読むために使用することができます。

標準入力が端末でない場合は、fzfそれを読み取り、ユーザーに提供される選択リストを構成します。/dev/nullそれは特別なデバイスであり、何でも読もうとすると何も返されません。これは、空のバッファを取得する理由を説明します。端末を復元すると、選択リストへの標準入力を読み取るのではなく、コマンド(デフォルトで$FZF_DEFAULT_COMMANDは一部のコマンド)の出力を読み取るモードに戻ります。find

find別のオプションは、実際にコマンドを直接実行することです。 GNUシステムを使用している場合は、システムを改善して信頼性と効率を向上させることもできます。

output=$(
  LC_ALL=C find -L . -name . -o '(' \
    -name '.*' -o \
    -fstype sysfs -o \
    -fstype devfs -o \
    -fstype devtmpfs -o \
    -fstype proc ')' -prune -o -type f -printf '%P\0' 2> /dev/null |
    fzf --read0 --print0
) && output=${output%$'\0'}

おすすめ記事