bash 全機能で COMPREPLY ソートを無効にする

bash 全機能で COMPREPLY ソートを無効にする

特定のキーに従って完成順に表示する必要がある単語のリストがありますが、bashはCOMPREPLY配列に割り当てられた内容を内部的に並べ替えるようです。この状況を避ける方法は?

例:

_comm() {
    _init_completion -s -n : || return
    case $prev in
        -a) COMPREPLY=(zxy abcdef tyuu fgsfds)
            ;;
    esac
}
complete -F _comm comm

このコードを実行すると、bashが完了します。

$ comm -a 

そして

abcdef fgsfds tyuu zxy

つまり、アルファベット順に並べ替えます。

答え1

Bash 4.4以降、nosortオプションが利用可能です。あなたの例では、最後の行を次に変更します。

complete -o nosort -F _comm comm

そして、アルファベット順に並べ替えなくてもできるはずです。

重要:オプション(指定された使用-o関数の前に来る必要があります。-F)。これがcoderofsalvationのコードが機能しない理由です。

答え2

これしなければならないこれはコマンド全体を変更することで達成できます。

complete -F _comm comm

入力する:

complete -F _comm comm -o nosort 

で述べたように文書:

しかし、bash 4では動作しませんでした/

これは文書化されていますが、まだreadline変数を制御する機能が実装されていないようですrl_sort_completion_matches

追加情報

関連情報