(я знаю, что это не совсем то, что вы просите, но) Если вас устраивает автозаполнение / предложения, появляющиеся на TAB (как используется во многих оболочках), затем вы можете быстро приступить к работе, используя модуль readline .
Вот краткий пример, основанный на написании Дуга Хеллмана PyMOTW для readline .
import readline
class MyCompleter(object): # Custom completer
def __init__(self, options):
self.options = sorted(options)
def complete(self, text, state):
if state == 0: # on first trigger, build possible matches
if text: # cache matches (entries that start with entered text)
self.matches = [s for s in self.options
if s and s.startswith(text)]
else: # no text entered, all matches possible
self.matches = self.options[:]
# return match indexed by state
try:
return self.matches[state]
except IndexError:
return None
completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
input = raw_input("Input: ")
print "You entered", input
Это приводит к следующему поведению (<TAB>
, представляющему нажатие клавиши табуляции):
Input: <TAB><TAB>
goodbye great hello hi how are you
Input: h<TAB><TAB>
hello hi how are you
Input: ho<TAB>ow are you
В последней строке ( H O TAB введено), есть только одно возможное совпадение, и целое предложение "как дела" автоматически завершено.
Ознакомьтесь со ссылками на статьи для получения дополнительной информации по readline
.
"И еще лучше, если бы он заканчивал слова не только с самого начала ... завершение из произвольной части строки."
Это можетбыть достигнуто простым изменением критериев соответствия в завершающей функции, т.е.от:
self.matches = [s for s in self.options
if s and s.startswith(text)]
до чего-то вроде:
self.matches = [s for s in self.options
if text in s]
Это даст вам следующее поведение:
Input: <TAB><TAB>
goodbye great hello hi how are you
Input: o<TAB><TAB>
goodbye hello how are you
Обновления: использование буфера истории(как уже упоминалось в комментариях)
Простой способ создать псевдо-меню для прокрутки / поиска - загрузить ключевые слова в буфер истории.После этого вы сможете прокручивать записи с помощью клавиш со стрелками вверх / вниз, а также использовать Ctrl + R для выполнения обратного поиска.
Дляпопробуйте, внесите следующие изменения:
keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
readline.add_history(kw)
input = raw_input("Input: ")
print "You entered", input
Когда вы запустите скрипт, попробуйте набрать Ctrl + r , а затем a ,Это вернет первое совпадение, которое содержит «а».Введите Ctrl + r еще раз для следующего матча.Чтобы выбрать запись, нажмите ENTER .
Также попробуйте использовать клавиши ВВЕРХ / ВНИЗ для прокрутки ключевых слов.