Как сделать дисплей на 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 7

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.