You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Comrad/comrad/cli/tab_completer.py

73 lines
2.0 KiB
Python

from __future__ import absolute_import
from __future__ import print_function
## SOURCE = https://gist.github.com/iamatypeofwalrus/5637895
import os
import sys
import readline
import glob
from six.moves import input
class tabCompleter(object):
"""
A tab completer that can either complete from
the filesystem or from a list.
Partially taken from:
http://stackoverflow.com/questions/5637124/tab-completion-in-pythons-raw-input
"""
def pathCompleter(self, text, state):
"""
This is the tab completer for systems paths.
Only tested on *nix systems
"""
line = readline.get_line_buffer().split()
# replace ~ with the user's home dir. See https://docs.python.org/2/library/os.path.html
if '~' in text:
text = os.path.expanduser('~')
# autocomplete directories with having a trailing slash
if os.path.isdir(text):
text += '/'
return [x for x in glob.glob(text + '*')][state]
def createListCompleter(self,ll):
"""
This is a closure that creates a method that autocompletes from
the given list.
Since the autocomplete function can't be given a list to complete from
a closure is used to create the listCompleter function with a list to complete
from.
"""
def listCompleter(text,state):
line = readline.get_line_buffer()
if not line:
return [c + " " for c in ll][state]
else:
return [c + " " for c in ll if c.startswith(line)][state]
self.listCompleter = listCompleter
if __name__=="__main__":
t = tabCompleter()
t.createListCompleter(["ab","aa","bcd","bdf"])
readline.set_completer_delims('\t')
readline.parse_and_bind("tab: complete")
readline.set_completer(t.listCompleter)
ans = input("Complete from list ")
print(ans)
readline.set_completer(t.pathCompleter)
ans = input("What file do you want? ")
print(ans)