Python Command-Line Autocompletion을 수행하는 방법은 아니지만 문자열의 시작 부분은 아닙니다.

StackOverflow https://stackoverflow.com/questions/209484

문제

Python, Readline 바인딩을 통해 큰 명령 줄 자동 완성을 허용합니다 ( 여기).

그러나 완성은 현의 시작 부분에서만 작동하는 것 같습니다. 문자열 읽기의 중간 또는 끝과 일치하려면 작동하지 않습니다.

사용 가능한 문자열 목록의 문자열과 함께 입력 한 내용을 일치시켜 명령 줄 Python 프로그램에서 자동 완성 문자열을 원합니다.

  • 내가 갖고 싶은 자동 완성 유형의 좋은 예는 To Field를 입력 할 때 Gmail에서 발생하는 유형입니다. 연락처의 성 중 하나를 입력하면 이름을 입력 한 것처럼 마찬가지로 나타납니다.
  • 일치하는 문자열에서 선택하기 위해 위와 아래쪽 화살표 또는 다른 방법을 일부 사용하는 것이 필요할 수 있으며 (읽기 라인의 경우에는 필요하지 않음) 내 경우에는 괜찮습니다.
  • 내 특정 유스 케이스는 이메일을 보내는 명령 줄 프로그램입니다.
  • 특정 코드 예제는 매우 유용합니다.

Curses와 같은 터미널 에뮬레이터를 사용하는 것은 괜찮습니다. Mac이나 Windows가 아닌 Linux에서만 실행하면됩니다.

예는 다음과 같습니다. 목록에 다음 세 줄이 있다고 가정 해 봅니다.

['Paul Eden <paul@domain.com>', 
'Eden Jones <ejones@domain.com>', 
'Somebody Else <somebody@domain.com>']

나는 'Eden'을 입력 한 후 목록의 첫 두 항목을 자동으로 완성 한 다음 (키보드를 사용하여 명령 줄을 통해) 하나를 선택할 수있는 코드를 원합니다.

도움이 되었습니까?

해결책

문제를 이해하는지 잘 모르겠습니다. readline.clear_history 및 readline.add_history를 사용하여 원하는 완성 된 문자열을 설정 한 다음 Control-R을 사용하여 역사상 Backword를 검색 할 수 있습니다 (쉘 프롬프트에있는 것처럼). 예를 들어:

#!/usr/bin/env python

import readline

readline.clear_history()
readline.add_history('foo')
readline.add_history('bar')

while 1:
    print raw_input('> ')

또는 자신의 불신자 버전을 작성하고 적절한 키를 바인딩 할 수 있습니다. 이 버전은 매치 목록이 큰 경우 캐싱을 사용합니다.

#!/usr/bin/env python

import readline

values = ['Paul Eden <paul@domain.com>', 
          'Eden Jones <ejones@domain.com>', 
          'Somebody Else <somebody@domain.com>']
completions = {}

def completer(text, state):
    try:
        matches = completions[text]
    except KeyError:
        matches = [value for value in values
                   if text.upper() in value.upper()]
        completions[text] = matches
    try:
        return matches[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind('tab: menu-complete')

while 1:
    a = raw_input('> ')
    print 'said:', a
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top