Python 명령 줄 인터페이스의 탭 완료 - 탭 이벤트를 잡는 방법
-
20-09-2019 - |
문제
나는 파이썬으로 약간의 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 모듈 등을 사용하여 이미 탭 완료 등을 구현하는 것 및 아마도 당신이하려는 것의 다른 부분을 구현합니다. 바퀴를 재창조하는 점이 없습니다.
제휴하지 않습니다 StackOverflow