1

GNU/readline は、何をしてもデータをソートしているようです。私のコードコードはドキュメントのようになります:

tags = [tag.lower() for tag in tags]
def completer(text, state):
    text = text.lower()
    options = [tag for tag in tags if tag.startswith(text)]
    try:
        return options[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind('tab: menu-complete')

タグが['jarre', 'abba', 'beatles']の場合、取得し続け['abba', 'beatles', 'jarre']ます。どうすれば注文を強制的に守らせることができますか?

4

1 に答える 1

1

これには専用のオプションがあります: rl_sort_completion_matches。オプションを辞書順で並べ替え、重複を削除します。そのため、オーバーライドする場合は、自分で重複を処理する必要があります。

ただし、Python のバインディングからはアクセスできません。

幸いなことに、それが機能しないという意味ではありません。cdllまたはを使用して変更できますctypes。これは関数ではなくグローバル変数であるため、in_dllメソッドを使用します。

import ctypes
rl = ctypes.cdll.LoadLibrary('libreadline.so')
sort = ctypes.c_ulong.in_dll(rl, 'rl_sort_completion_matches')
sort.value = 0

この後、一致を正しい順序で取得する必要があります。

残念ながら、これは移植性の高い方法ではありません。たとえば、Windows.dllでは、Linux ではなく suffixを使用する必要があります.so。ただし、移植性に焦点を当てるctypesことは、この回答の範囲外です。

于 2015-07-05T11:03:59.440 に答える