2010-01-12 11 views
5

저는 Python에서 (Mercurial의 확장으로) 약간의 CLI를 작성 중이며 탭 완성을 지원하고자합니다. 특히, 나는 프롬프트에서 캐치 탭을 원하고 일치하는 옵션 목록을 보여줍니다 (bash처럼).Python 커맨드 라인 인터페이스의 탭 완성 - Tab 이벤트를 잡는 방법

예 :

ext*TAB* 
extensions 
extras 

문제는 내가 탭 이벤트를 잡는 방법을 잘 모르겠어요입니다 : 섹션 이름을 입력합니다. 나는 ui.prompt() API를 Mercurial에 사용하고 있는데, 이는 후드 아래 raw_input()을 호출하는 것입니다.

내가 아는 한 raw_input()은 '입력'만 반환하고 사용자가 탭을 입력하면 반환되는 문자열에 "\t"이 포함됩니다.

답변

15

이 경우 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가를 제공합니다 및 vi 모드 포함)

  • 역사 (위쪽 화살표 저장 및로드
+0

고마워요,이게 내가 바라는 바로 그거야! 단 하나의 문제가 있습니다. 제 주 시스템에서 작동하지 않습니다. 필자는 OSX 10.6에서 Python 2.6을 사용하고 있으며 정상적으로 '\ t'을 삽입합니다. 그래서 나는 우분투를 부팅했고 완벽하게 작동합니다 -이 라이브러리가 플랫폼 독립적 인 방식인지 알아? – Paulitex

+6

Apple 제공 Python은 GNU readline 라이브러리를 사용하지 않습니다. 대신에 BSD에서 파생 된 editline 라이브러리를 사용합니다. Python.org의 OS X 용 Python 설치 프로그램은 MacPorts와 함께 설치된 Python과 마찬가지로 GNU readline을 사용합니다. –

2

readline와 협력 탭 완성 기능을 수행하는 방법의 훌륭한 예는 같은 표준 라이브러리에 공급된다)

  • 역사 검색을 이전 값을 불러 rlcompleter 모듈 -이 모듈은있는 그대로 사용할 수 없습니다 (현재 파이썬의 주 및 내장 함수에 정의 된 이름을 기반으로 완성됩니다). 그러나 일반 작업을 수행하는 방법과 readline에 연결하는 방법을 보여줍니다.

  • 1

    거의 확실하게 탭 완성 등을 이미 구현 한 cmd module을 사용해야하며, 아마 readline 모듈을 사용하여 수행하려는 다른 부분 등을 사용해야합니다. 바퀴를 재발 명할 필요가 없습니다.