オートコンプリートがどのように機能するかを見てみましょう。私は読んだこれcomplete
そしてcompgen
、、、およびへの完全なbash参照がありますが、compopt
実際にどのように一緒に動作するかについては多くを教えてくれません。
(かなり小さいコレクションの)動詞の後に既存のファイル名を使用するコマンドのオートコンプリートを作成しようとしています。これまで私はこれを持っています:
verbs=(upload download delete)
function ac_complete {
printf "COMP_WORDS[%d/%d]: " ${COMP_CWORD} ${#COMP_WORDS[@]}
printf "[%s] " "${COMP_WORDS[@]}"
printf "\n"
if [[ COMP_CWORD -eq 1 ]]
then
COMPREPLY=( "${verbs[@]}" )
else
compopt -o default
fi
}
complete -F ac_complete testit
しかし、これはうまくいきません。私はbashが動詞を完成するのを見たことがありません。
- 可能な完了を返す方法は?
- 何を返すべきですか?その時点でまだ有効な項目のみ(つまり、「d」以降の設定は「アップロード」/「ダウンロード」/「削除」または単に「ダウンロード」/「削除」でなければなりません(もしそうなら、速い方法はありますか?)制限が適用されますか? ?
ファイルの完成はうまくいきますが、いくつかのファイル形式に制限したいです。
ベストアンサー1
それを見てください(これbash_completeパッケージを例に挙げましょう。
完成を生成する最も一般的な方法は、compgen
ビルドCOMPREPLY
配列を呼び出すことです。この特定のコンテキストでどのパラメータが有効であるかを確認し、compgen
呼び出しを変換します。組み込みフィルタパラメータは、compgen
指定されたプレフィックスに完成しません。たとえば、
COMPREPLY=( $(compgen -W "${verbs[*]}" -- "${COMP_WORDS[COMP_CWORD]}") )
compgen
完了するために計算されたステップでd
有効download
ですdelete
。
ファイルの場合は、compgen -G "*.ext"
拡張子に制限を使用してください.ext
。この単純なイディオムは、スペース(またはワイルドカード)のためにファイル名を破損します。これ_filedir
機能は以下に由来します。bash_completion
より強力な方法でファイル名を処理します(改行とワイルドカードはまだ中断されます)_filedir '*.ext'
。