I have kind of a completer class with an autocompletion function. Simple version:
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
And execute something like this to get auto-completion with readline:
import readline
readline.parse_and_bind("tab: complete")
completer = Completer()
readline.set_completer(completer.complete)
user_input =raw_input("> ")
So, there are 3 words for auto-completion ["help", "mkdir","mktbl"] in the example.
if a user executes:
> he<tab>
the user gets:
> help
but if the user executes
> mk<tab>
nothing is happening because there are not a single match (mkdir and mktbl)
How to display options in case there are several matches? Like the Bash do with a file names autocompletion?
Thus user whold get something like:
> mk<tab>
mktbl mkdir
> mk<cursor>
P.S. I have tried to put
_readline.insert_text(...)_
and
print ...
into completer function but it brakes the insertion, so a user gets something like this:
> mk<tab>
> mkmktbl mkdir <cursor>
P.P.S I need a linux solution.