]> granicus.if.org Git - python/commitdiff
Patches by Kannan Vijayan:
authorGuido van Rossum <guido@python.org>
Thu, 18 Nov 1999 17:51:02 +0000 (17:51 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 18 Nov 1999 17:51:02 +0000 (17:51 +0000)
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

Modules/readline.c

index b2b56a2279cdaaf035ea2b57129fa1dcb38966b9..68f3cf6f0d672f97fd162024b7935524c75cca1e 100644 (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