バッシュ自動完成

バッシュ自動完成

オートコンプリートがどのように機能するかを見てみましょう。私は読んだこれ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'

おすすめ記事