Клавиша TAB не работает в python автозаполнение - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать интерактивную программу командной строки, используя строку чтения в python.

Файл run.py содержит следующий код:

import readline

class SimpleCompleter(object):
    
    def __init__(self, options):
        self.options = sorted(options)
        return

    def complete(self, text, state):
        response = None
        if state == 0:
            # This is the first time for this text, so build a match list.
            if text:
                self.matches = [s for s in self.options if s and s.startswith(text)]
            else:
                self.matches = self.options[:]
                
        try:
            response = self.matches[state]
        except IndexError:
            response = None
        
        return response

def input_loop():
    line = ''
    while line != 'stop':
        line = input('Prompt ("stop" to quit): ')
        print(f'Dispatch {line}')

# Register our completer function
completer = SimpleCompleter(['start', 'stop', 'list', 'print'])
readline.set_completer(completer.complete)

# Use the tab key for completion
readline.parse_and_bind('tab: complete')

# Prompt the user for text
input_loop()

Проблема в том, когда Я пытаюсь запустить файл прямо с терминала (например, python run.py ), клавиша TAB не считается клавишей автозаполнения, вместо этого она считается 4 пробелами, поэтому я не получил предложений, когда Я дважды нажимаю клавишу TAB; Однако, если я импортировал файл из консоли python (например, import run.py ), клавиша TAB считается клавишей автозаполнения, и я получил ожидаемые предложения.

Кажется, что проблема находится в строке

readline.parse_and_bind('tab: complete')

, поэтому я попытался поместить ее в отдельный файл конфигурации, как указано здесь , но проблема осталась той же.

Итак вопрос в том, почему это происходит? и как это исправить.

1 Ответ

0 голосов
/ 27 августа 2020

Наконец-то нашел ответ, и проблема заключалась в том, что я использую Ma c, поэтому вместо

readline.parse_and_bind('tab: complete')

я должен использовать

readline.parse_and_bind('bind ^I rl_complete')

Теперь, запустив код напрямую, используя python run.py , я получаю предложения, как и ожидалось.

...