カスタム補完から次の動作を実現したい
与えられた
$ 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
私も同じ問題に遭遇しました。私が使用している回避策は次のとおりです。
- 補完関数を
-o default
、例えばで登録しますcomplete -o default -F _my_completion
。 - ファイル名を補完したい場合は、 を設定し
COMPREPLY=()
て Readline に処理を任せるだけです (これが の機能です-o default
)。
これには潜在的な問題があります。不適切な場所で補完を拒否するために を使用している可能性がありますが、これは機能しなくなります。Bash 4.0 以降では、次のようにCOMPREPLY=()
使用してこれを回避できます。compopt
- 補完関数の先頭では、常に を実行します
compopt +o default
。 が空の場合に、Readline ファイル名補完が無効になりますCOMPREPLY
。 - ファイル名を補完したい場合は、 を使用します
compopt -o default; COMPREPLY=()
。つまり、必要なときだけ Readline ファイル名補完を有効にします。
4.0 より前の Bash に対する完全な回避策はまだ見つけていませんが、私にとっては十分に機能するものが見つかりました。もし本当に興味がある方がいらっしゃれば、これについて説明できますが、いずれにしても、これらの古い Bash バージョンはすぐに一般に使用されなくなることを願っています。