2013-07-24 2 views
0

저는 파이썬의 readline 모듈을 가지고 놀았습니다. 필자가 알아챈 점 중 하나는 Python 함수에 키를 직접 바인딩하는 지원이 부족하다는 것입니다. 즉, readline의 바인딩은 rl_bind_key()입니다.파이썬의 다중 완성 스타일

제 의도는 누른 키에 따라 다른 완성 논리를 사용하는 것입니다. 예를 들어 전통적인 탭 완성과는 별도로 C-<space> 같은 것을 바인딩하고 다른 기능을 사용하여 완성을 수행하고자합니다. 또는 시스코 셸을 모방하고 설명이있는 명령 목록에 ? 키를 바인딩하는 또 다른 예입니다.

완료 자 경계가 하나만있는 경우 완료 이벤트를 트리거 한 키를 검색 할 수 있습니까?

감사합니다.

+1

약간 다른 대답은 : 나는 충분히 readline에 모르겠지만, 필요한 경우 조정할 수있는, 비슷한 동작을 제공하는 순수한 파이썬 라이브러리가 : https://bitbucket.org/pypy/pyrepl은 –

+0

재미있을 것 같아서 고맙습니다 .--) – C2H5OH

답변

0

readline 6.2.4.1을 기반으로, 변수 rl_completion_invoking_key의 값을 readline.c의 파이썬에 전달하고 새로운 readline.so를 생성하는 새로운 함수를 추가했습니다. 그런 다음 complete() 함수에서 호출하는 키에 따라 다른 동작을 결정할 수 있습니다.

readline.c: 
static PyObject * 
get_completion_invoking_key(PyObject *self, PyObject *noarg) 
{ 
    return PyInt_FromLong(rl_completion_invoking_key); 
} 

PyDoc_STRVAR(doc_get_completion_invoking_key, 
"get_completion_invoking_key() -> int\n\ 
Get the invoking key of completion being attempted."); 

static struct PyMethodDef readline_methods[] = 
{ 
... 
{"get_completion_invoking_key", get_completion_invoking_key, 
METH_NOARGS, doc_get_completion_invoking_key}, 
... 
} 

in your own code: 
readline.parse_and_bind("tab: complete") # invoking_key = 9 
readline.parse_and_bind("space: complete") # invoking_key = 32 
readline.parse_and_bind("?: complete")  # invoking_key = 63 

def complete(self, text, state): 
    invoking_key = readline.get_completion_invoking_key()