문제

나는 파이썬으로 약간의 CLI를 쓰고 있으며 (Mercurial의 확장) 탭 완성을 지원하고 싶습니다. 구체적으로, 프롬프트에서 탭을 잡고 매칭 옵션 목록 (bash와 마찬가지로)을 표시합니다.

예 : 섹션 이름 입력 :

 ext*TAB*  
 extensions  
 extras

문제는 탭 이벤트를 잡는 방법을 잘 모르겠습니다. 나는 사용하고있다 ui.prompt() Mercurial의 API raw_input() 후드.

내가 아는 한, raw_input() 'enter'에서만 리턴하고 사용자가 탭을 입력하면 리턴 된 문자열은 단순히 "\t".

도움이 되었습니까?

해결책

그것을 위해 당신은 그것을 사용합니다 readline 기준 치수.

내가 생각할 수있는 가장 간단한 코드 :

import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
            'email', 'foobar', 'foo']

def complete(text, state):
    for cmd in COMMANDS:
        if cmd.startswith(text):
            if not state:
                return cmd
            else:
                state -= 1

readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')

예제 사용 :

Enter section name: <tab>
email      errors     extension  extra      foo        foobar    stuff
Enter section name: e<tab>
email      errors     extension  extra      
Enter section name: ext<tab>
extension  extra      

완성 외에 readline 제공합니다 :

  • 라인 편집
  • 키 바인딩 구성 (EMAC 및 VI 모드 포함)
  • 역사 (이전 가치를 기억하는 화살표)
  • 역사 검색, 저장 및 로딩

다른 팁

협력하여 탭 완성을 수행하는 방법에 대한 훌륭한 예 읽기 표준 라이브러리에서 rlcompleter 모듈-당신은 그것을 사용할 수 없지만 (현재 Python의 기본 및 내장에 정의 된 이름을 기반으로 완료) 일반 작업을 수행하는 방법과이를 연결하는 방법을 보여줍니다. readline.

당신은 거의 확실하게 사용해야합니다 CMD 모듈, Readline 모듈 등을 사용하여 이미 탭 완료 등을 구현하는 것 및 아마도 당신이하려는 것의 다른 부분을 구현합니다. 바퀴를 재창조하는 점이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top