compgen -o nospace オプションは効果がありません。

compgen -o nospace オプションは効果がありません。

コマンド完成機能を作成しようとしています。このガイド。おおよそ次のようになります。

function __my_completion ()
{
    local cur prev opts opts_log opts_import
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
    opts_log="trace debug info warn err critical off"

    if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
        COMPREPLY=( $(compgen -o nospace -d -W "${opts}" -- ${cur}) )
        return 0
    fi
    case "${prev}" in
        -d|--directory)
            COMPREPLY=( $(compgen -o nospace -d ${cur}) )
        ;;
        -l|--log-level)
            COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
        ;;
    esac
}

complete -F __my_completion myProg

私の問題は、単語が完成するたびに末尾にスペースが追加されることです。これは通常のオプションには適していますが、-o nospace -dオプションの組み合わせがあってもディレクトリにも機能します。ナビゲーション速度が遅く、非常に直感的ではないので、これは非常に迷惑です。

なぜそんなことですか?この問題をどのように修正できますか?

?そして、私がここにいる間、リンクされたガイドの例の1つは何ですか?キューにあります。

COMPREPLY=( $(compgen -f ? ${cur}) )

ベストアンサー1

少なくとも部分的な解決策:オプションをcompgen無視しながらこれを尊重してください。残念ながら、これは次のいずれかを意味します。-o nospacecompleteみんなオプションの後にスペースが追加されます。まったく。コードは次のとおりです。

#/usr/bin/env bash

function __my_completion ()
{
    local cur prev opts opts_log
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
    opts_log="trace debug info warn err critical off"
    local opts_dir=( $(compgen -d -S "/" -- ${cur}) )

    if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ${opts_dir[@]} )
        return 0
    fi
    case "${prev}" in
        -d|--directory)
            COMPREPLY=( ${opts_dir[@]} )
        ;;
        -l|--log-level)
            COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
        ;;
    esac
}

complete -o nospace -F __my_completion myProg

他のオプションを追加しても-S " "スペースは再追加されません。

おすすめ記事