Bash Completeには現在の単語が含まれています。

Bash Completeには現在の単語が含まれています。

私のコマンドのbashコンプリートスクリプトを作成しようとしています。ls私が望む行動があります。私のコマンドでも同じ動作が必要です。

これは私が得たものです。ls

$ ls /home/tux/<Tab><Tab>
Downloads  Documents  Pictures
$ ls /home/tux/Do<Tab><Tab>
Downloads  Documents

つまり、bashは絶対パスではなく相対パスのみを表示します(つまり、Downloads完成リストに追加されますが、そうではありません/home/tux/Downloads)。

同じように動作する完成スクリプトを作成したいと思います。私が試したことは次のとおりです。

_testcommand ()
{
    local IFS=$'\n'
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -o bashdefault -d -- "$cur") )
    if [ "${#COMPREPLY[@]}" -ne 1 ]
    then
        # remove prefix "$cur", so the preview of paths gets shorter
        local cur_len=$(echo $cur | sed 's|/[^/]*$||' | wc -c)
        for i in ${!COMPREPLY[@]}
        do
            COMPREPLY[$i]="${COMPREPLY[i]:$cur_len}"
        done
    fi
    return 0
}

complete -o nospace -F _testcommand testcommand

ところで結果はこうです。

$ testcommand /home/tux/<Tab><Tab>
Downloads  Documents  Pictures
$ testcommand /home/tux/Do<Tab>
Downloads  Documents
$ testcommand Do

私の仕事をどのように終了できますか?いいえ/home/tux/コマンドラインから削除しますか?

complete注:下の呼び出しに「-f」や「-d」などを追加することはできないようです。実際、いくつかのケースでは、完成が道ではなく単語を完成する必要がある場合もあります。

答え1

"ls":を使用して、どの完成機能が使用されているかを確認できますcomplete -p | grep ls。次のコマンドを使用してこの機能を確認できます。 (type _longopt前のコマンドの結果)関数で関数_longoptを見つけることができます_filedir

最後に仕上げに関する興味深い記事です。https://spin.atomicobject.com/2016/02/14/bash-programmable-completion/

答え2

bash Completeディレクトリ()pkg-config --variable=completionsdir bash-completionのほとんどのプログラムは、_filedirbash-completion自体が提供する機能を使用します。再利用は合法的なようです_filedir。独自の実装について心配する必要はありません!

追跡要素:

_testcommand()
{
    # init bash-completion's stuff
    _init_completion || return

    # fill COMPREPLY using bash-completion's routine
    # in this case, accept only MarkDown and C files
    _filedir '@(md|c)'
}
complete -F _testcommand testcommand

もちろん、ファイルではなくアイテムを完了するときにも使用できます。

if ...
then
    # any custom extensions, e.g. words, numbers etc
    COMPREPLY=( $(compgen ...) )
else
    # fill COMPREPLY using bash-completion's routine
    _filedir '@(md|c)'
fi

どうやって見つけましたか?

ありがとう@csm:答えを使用してtype _longoptどちらが呼び出されるかを確認してください_filedir

関連情報