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
diff --git a/Modules/readline.c b/Modules/readline.c
index b2b56a2..68f3cf6 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -99,6 +99,84 @@
 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 @@
 	PyObject *self;
         PyObject *args;
 {
-	if (PyArg_NoArgs(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	return PyString_FromString(rl_line_buffer);
 }
@@ -180,10 +258,17 @@
 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 @@
 }
 
 
+/* 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 @@
 	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