Python: Домашняя вкладка - PullRequest
       6

Python: Домашняя вкладка

1 голос
/ 19 августа 2011

Мне нужна помощь. Я полностью в тупике. Я пытаюсь написать свой собственный модуль завершения табуляции для пользовательской программы в стиле оболочки (также выполняю аргументы). Я могу завершить команды табуляции, но аргументы доставляют мне проблемы. Может кто-нибудь написать пример модуля заполнения вкладок для примера?
Доступные команды: ['show', 'exit', 'clear', 'ship'] для команды show, первый аргумент: [ 'Ф', 'макинтош', 'варианты'] и для субарг IP: [ 'Внешний' внутренний», 'местный']

В конце концов я хочу быть в состоянии:

My Prompt > sh<tab>
show ship
My Prompt > sho<tab>
My Prompt > show <tab>
ip mac options
My Prompt > show ip <tab>
external local internal
My Prompt > show ip e<tab>
My Prompt > show ip external

и т. Д. Если бы у меня был только один хороший рабочий пример, думаю, я бы мог это понять. Я полностью переписывал свой код завершения вкладки 5 раз, но все равно не могу его получить. Может кто-нибудь, пожалуйста, помогите?

Ответы [ 3 ]

1 голос
/ 20 августа 2011

В итоге я разобрался после 7-го переписывания.Немного грязнее, чем хотелось бы, но выполнимо, скорее всего, я уберу это позже.В любом случае, вот код:

"""defined earlier in the script:"""
COMMANDS=['show', 'exit', 'ship']
def complete(text, state, list = COMMANDS):
    for option in list:
        if option.startswith(text):
            if not state:
                return option
            else:
                state -= 1
def precomplete(text, state):
    BUFFER=readline.get_line_buffer()
    args=[None,None,None,None,None,None,None,None,None,None]
    argtemp=[]
    if BUFFER != "":
        i=-1
        while i != BUFFER.count(" "):
            if BUFFER.count(" ") >= 0:
                if BUFFER.count(" ") == 0: #1 because len() starts couting at 1
                    return complete(text, state)
                else:
                    print "Else triggered"
                    o=0
                    verb=[]
                    while complete(BUFFER.split()[0],o):
                        verb.append(complete(BUFFER.split()[0],o))
                        o=o+1
                    if len(verb) == 1:
                        verb=verb[0]
                        print verb
            if BUFFER.count(" ") >= 1:
                if  BUFFER.count(" ") == 1:
                    if verb == 'show':
                        return complete(text, state, ['mac', 'ip', 'arp'])
                else:
                    o=0
                    while complete(BUFFER[1],o,['mac', 'ip', 'arp']):
                        argtemp.append(complete(BUFFER[1],o,['mac', 'ip', 'arp']))
                        o=o+1
                    if len(argtemp) == 1:
                       argtemp==argtemp[0]
            i=i+1
    else:
        return complete(text,state)
readline.parse_and_bind("tab: complete")
readline.set_completer(precomplete)

РЕДАКТИРОВАТЬ: Полный код: http://codepad.org/W3VHURUx

0 голосов
/ 20 августа 2011

Возможно, вас заинтересует существующая реализация, которая делает это в общем виде.

Инструментарий CLI выполняет команды и некоторые завершения параметров.Тем не менее, делать это хорошо из Python оказывается не совсем возможным.Это происходит главным образом из-за того, что библиотека readline (работающая в скомпилированном коде) контролирует пользовательский ввод в это время, поэтому вы должны иметь все известные завершения до того, как вызывать метод ввода.

0 голосов
/ 19 августа 2011

Посмотрите на readline и rlcompleter .

...