Patches by Kannan Vijayan:

new:
readline.get_begidx() -> int
	gets the beginning index in the command line string
	delimiting the tab-completion scope.  This would
	probably be used from within a tab-completion
	handler

readline.get_endidx() -> int
	gets the ending index in the command line string
	delimiting the tab-completion scope.  This would
	probably be used from within a tab-compeltion
	handler

readline.set_completer_delims(string) -> None
	sets the delimiters used by readline as word breakpoints
	for tab-completion

readline.get_completer_delims() -> string
	gets the delimiters used by readline as word breakpoints
	for tab-completion

fixed:
readline.get_line_buffer() -> string
	doesnt cause a debug message every other call
This commit is contained in:
Guido van Rossum 1999-11-18 17:51:02 +00:00
parent 7424242c1c
commit b960e7a797
1 changed files with 108 additions and 4 deletions

View File

@ -99,6 +99,84 @@ The default filename is the last filename used.\
static PyObject *completer = NULL;
static PyThreadState *tstate = NULL;
static PyObject *begidx = NULL;
static PyObject *endidx = NULL;
/* get the beginning index for the scope of the tab-completion */
static PyObject *
get_begidx(self, args)
PyObject *self;
PyObject *args;
{
if(!PyArg_NoArgs(args)) {
return NULL;
}
Py_INCREF(begidx);
return begidx;
}
static char doc_get_begidx[] = "\
get_begidx() -> int\n\
get the beginning index of the readline tab-completion scope";
/* get the ending index for the scope of the tab-completion */
static PyObject *
get_endidx(self, args)
PyObject *self;
PyObject *args;
{
if(!PyArg_NoArgs(args)) {
return NULL;
}
Py_INCREF(endidx);
return endidx;
}
static char doc_get_endidx[] = "\
get_endidx() -> int\n\
get the ending index of the readline tab-completion scope";
/* set the tab-completion word-delimiters that readline uses */
static PyObject *
set_completer_delims(self, args)
PyObject *self;
PyObject *args;
{
char *break_chars;
if(!PyArg_ParseTuple(args, "s", &break_chars)) {
return NULL;
}
free(rl_completer_word_break_characters);
rl_completer_word_break_characters = strdup(break_chars);
Py_INCREF(Py_None);
return Py_None;
}
static char doc_set_completer_delims[] = "\
set_completer_delims(string) -> None\n\
set the readline word delimiters for tab-completion";
/* get the tab-completion word-delimiters that readline uses */
static PyObject *
get_completer_delims(self, args)
PyObject *self;
PyObject *args;
{
if(!PyArg_NoArgs(args)) {
return NULL;
}
return PyString_FromString(rl_completer_word_break_characters);
}
static char doc_get_completer_delims[] = "\
get_completer_delims() -> string\n\
get the readline word delimiters for tab-completion";
static PyObject *
set_completer(self, args)
PyObject *self;
@ -143,7 +221,7 @@ get_line_buffer(self, args)
PyObject *self;
PyObject *args;
{
if (PyArg_NoArgs(args))
if (!PyArg_NoArgs(args))
return NULL;
return PyString_FromString(rl_line_buffer);
}
@ -180,10 +258,17 @@ Insert text into the command line.\
static struct PyMethodDef readline_methods[] =
{
{"parse_and_bind", parse_and_bind, 1, doc_parse_and_bind},
{"get_line_buffer", get_line_buffer, 1, doc_get_line_buffer},
{"get_line_buffer", get_line_buffer, 0, doc_get_line_buffer},
{"insert_text", insert_text, 1, doc_insert_text},
{"read_init_file", read_init_file, 1, doc_read_init_file},
{"set_completer", set_completer, 1, doc_set_completer},
{"get_begidx", get_begidx, 0, doc_get_begidx},
{"get_endidx", get_endidx, 0, doc_get_endidx},
{"set_completer_delims", set_completer_delims, METH_VARARGS,
doc_set_completer_delims},
{"get_completer_delims", get_completer_delims, 0,
doc_get_completer_delims},
{0, 0}
};
@ -227,6 +312,22 @@ on_completion(text, state)
}
/* a more flexible constructor that saves the "begidx" and "endidx"
* before calling the normal completer */
char **
flex_complete(text, start, end)
char *text;
int start;
int end;
{
Py_XDECREF(begidx);
Py_XDECREF(endidx);
begidx = PyInt_FromLong((long) start);
endidx = PyInt_FromLong((long) end);
return completion_matches(text, *on_completion);
}
/* Helper to initialize GNU readline properly. */
static void
@ -239,11 +340,14 @@ setup_readline()
rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
/* Set our completion function */
rl_completion_entry_function = (Function *) on_completion;
rl_attempted_completion_function = (CPPFunction *)flex_complete;
/* Set Python word break characters */
rl_completer_word_break_characters =
" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?";
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
/* All nonalphanums except '.' */
begidx = PyInt_FromLong(0L);
endidx = PyInt_FromLong(0L);
/* Initialize (allows .inputrc to override)
*
* XXX: A bug in the readline-2.2 library causes a memory leak