ファイルを検索するときにディレクトリにスラッシュを含めるように compgen を設定する 質問する

ファイルを検索するときにディレクトリにスラッシュを含めるように compgen を設定する 質問する

カスタム補完から次の動作を実現したい

与えられた

$ mkdir foo
$ touch foo faz/bar faz/baz

これを手に入れたい

$ foo -u <tab><tab> =>
foo faz/

$ foo -u fa<tab><tab> =>
foo -u faz/

$ foo -u faz/<tab><tab> =>
bar baz

compgen -f fが出力されると想定していましたfoo faz/が、実際には が出力されfoo faz、あまり役に立ちません。

出力を後処理する必要がありますか、それとも compgen に機能するオプションの魔法の組み合わせがありますか?

ベストアンサー1

私も同じ問題に遭遇しました。私が使用している回避策は次のとおりです。

  1. 補完関数を-o default、例えばで登録しますcomplete -o default -F _my_completion
  2. ファイル名を補完したい場合は、 を設定しCOMPREPLY=()て Readline に処理を任せるだけです (これが の機能です-o default)。

これには潜在的な問題があります。不適切な場所で補完を拒否するために を使用している可能性がありますが、これは機能しなくなります。Bash 4.0 以降では、次のようにCOMPREPLY=()使用してこれを回避できます。compopt

  1. 補完関数の先頭では、常に を実行しますcompopt +o default。 が空の場合に、Readline ファイル名補完が無効になりますCOMPREPLY
  2. ファイル名を補完したい場合は、 を使用しますcompopt -o default; COMPREPLY=()。つまり、必要なときだけ Readline ファイル名補完を有効にします。

4.0 より前の Bash に対する完全な回避策はまだ見つけていませんが、私にとっては十分に機能するものが見つかりました。もし本当に興味がある方がいらっしゃれば、これについて説明できますが、いずれにしても、これらの古い Bash バージョンはすぐに一般に使用されなくなることを願っています。

おすすめ記事