2015-07-05 33 views
0

無論我做什麼,GNU/readline似乎都會對數據進行排序。我的代碼的代碼看起來就像文檔中:Python + 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']。我如何強制保留我的訂單?

回答

0

這裏有專門的選項:rl_sort_completion_matches。它按字典順序對選項進行排序,並刪除重複項 - 所以如果覆蓋它,則需要自己處理重複項。

但是,它不能從Python的綁定中訪問。

幸運的是,這並不意味着您無法使用它 - 您可以使用cdll或​​來更改它。因爲它是一個全局變量,而不是一個功能,我將使用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的.so。但是,重點在於​​的可移植性不在此答案的範圍內。