Ответ 1
(Я знаю, что это не совсем то, о чем вы просите, но) Если вы довольны автозавершением/предложениями, появляющимися на TAB (как используется во многих оболочках), вы можете быстро запускается и запускается с помощью модуля readline.
Вот быстрый пример, основанный на Doug Hellmann PyMOTW writeup на 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
При запуске script попробуйте ввести Ctrl + R, а затем a. Это вернет первое совпадение, содержащее "a". Введите Ctrl + R снова для следующего совпадения. Чтобы выбрать запись, нажмите ENTER.
Также попробуйте использовать клавиши UP/DOWN для прокрутки ключевых слов.