Как сделать дисплей на Python автодополнение матчи?
У меня есть своего рода более полный класс с функцией автозаполнения. Простая версия:
class Completer:
def __init__(self):
self.words = ["mkdir","mktbl", "help"]
self.prefix = None
def complete(self, prefix, index):
if prefix != self.prefix:
self.matching_words = [w for w in self.words if w.startswith(prefix)]
self.prefix = prefix
else:
pass
try:
return self.matching_words[index]
except IndexError:
return None
И выполните что-то вроде этого, чтобы получить автозавершение с помощью readline:
import readline
readline.parse_and_bind("tab: complete")
completer = Completer()
readline.set_completer(completer.complete)
user_input =raw_input("> ")
Итак, есть 3 слова для автоматического завершения ["справка", "мкдир","mktbl "] в Примере.
Если пользователь выполняет:> he<tab>
пользователь получает:> help
Но если пользователь выполняет> mk<tab>
ничего не происходит, потому что их нет. один матч (mkdir и mktbl)
Как отобразить параметры, если совпадений несколько? Как Баш делает с автозавершением имен файлов?
Таким образом пользователь whold получает что-то вроде:> mk<tab>
mktbl mkdir
> mk<cursor>
P.S. я попытался поставить
_readline.вставить текст(...) _
и еще
печать ...
в более полную функцию, но она тормозит вставку, поэтому пользователь получает что-то вроде этого:> mk<tab>
> mkmktbl mkdir <cursor>
P. P. S мне нужно решение linux.
2 ответа:
Установите параметр readline
set show-all-if-ambiguous on
Если вы хотите завершения после первого
<tab>
. В противном случае просто нажмите<tab>
дважды.Ссылка: http://caliban.org/bash/, раздел readline советы и рекомендации
ПС. Протестировал свой код на OS X и Linux, он хорошо работает (на моих машинах ;)
Мне предложили решение, которое завершит ответ. Это позволяет организовать вывод завершения опций автозавершения.
Для Linux readline есть функция readline.set_completion_display_matches_hook
http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_hookИтак, для примера, приведенного выше, этот код
def print_suggestions(self, substitution, matches, longest_match_length) : print "useless text to be displayed" print substitution print " ".join[match for match in matches] print longest_match_length readline.set_completion_display_matches_hook(print_suggestions)
Это будет produse:
> mk<tab>
useless text to be displayed mk mkdir mktbl 5
> mk<cursor>
Для windows readline есть ответ при переполнении стека:
Как сделать так, чтобы IPython организовывал возможности завершения табуляции по классам?Не знаю, как это работает для mac.