Bash Complete - サブオプションのファイル名補完を取得する方法

Bash Complete - サブオプションのファイル名補完を取得する方法

注パラメータとサブパラメータを受け入れる関数があります。サブパラメーターの一部はファイル名です。現在完成したコードは次のとおりです。

_scm() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(mpv -input cmdlist | awk '{print $1}')

    case "${prev}" in
        sub_add)
            COMPREPLY=( $(compgen -f ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    COMPREPLY=( $(compgen -W "${opts}" -- ${cur} ) )
}
complete -o plusdirs -F _scm scm

私はsub_addargにファイル名をsubargにしたいと思いますが、現在のコードはそうすることができます。しかし、sub_addaubargsが完了したら、argsのオートコンプリート機能も再び取得したいと思います。ただし、ファイルの完成は引き続き発生します。

たとえば、「次へ」をクリックします。

scm sub_add <TAB>

ファイル名を完成させてください。また、私が望むのは、ファイル名を完成した後に元の引数の完成を開始する必要があることです。

scm sub_add ~/filename.txt <TAB>

sub_add sub_load seek....待たなければならない

ファイル名の完成が引き続き発生する理由はcomplete -o plusdirs。目的を達成するためにコードをどのように修正しますか?

答え1

私は、ファイル名だけを完成できる組み込みまたはbash完成標準機能がないと思います。ディレクトリにはファイルを含めることができるため、ファイル名を完成させる標準的な動作は、ファイルとディレクトリの両方を完成させることです(bash-completionが実行するのと同じです。ファイルでのみ機能_filedirするのではなく、ディレクトリでのみ機能するオプションがあります)。

completions=( "$word"* )たとえば、繰り返しや[[ -f "$i" ]]ビルドチェックなどのファイル名の一致のみを返すカスタム関数を作成できますCOMPREPLY

あなたのコードをもっと注意深く読みました。完了を生成する場合ユーティリティ車両、現在のディレクトリのデフォルトのファイル名にのみ適用されるように制限しないでください。これは私が知っている他のカスタム補完機能が機能する方法ではありません。

関連情報