内部には次の機能があります。.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
あると仮定し、一部のシステムではパッケージをインストールする必要があるかもしれません)、次のことがわかります(強調表示)。zsh
info
zsh-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'}