2015-07-05 3 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 или 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, а не . Однако сосредоточенность на переносимости ctypes выходит за рамки этого ответа.

Смежные вопросы