]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-112105: Make completer delims work on libedit (gh-112106)
authorTian Gao <gaogaotiantian@hotmail.com>
Tue, 28 Nov 2023 06:23:23 +0000 (21:23 -0900)
committerGitHub <noreply@github.com>
Tue, 28 Nov 2023 06:23:23 +0000 (06:23 +0000)
Lib/test/test_readline.py
Misc/NEWS.d/next/Library/2023-11-15-04-53-37.gh-issue-112105.I3RcVN.rst [new file with mode: 0644]
Modules/readline.c

index 835280f2281cde69f848b9800a04ae5c1db2cf03..6c2726d3209ecf049373bd47a959dab177db33ea 100644 (file)
@@ -5,6 +5,7 @@ import locale
 import os
 import sys
 import tempfile
+import textwrap
 import unittest
 from test.support import verbose
 from test.support.import_helper import import_module
@@ -163,6 +164,25 @@ print("History length:", readline.get_current_history_length())
         # end, so don't expect it in the output.
         self.assertIn(b"History length: 0", output)
 
+    def test_set_complete_delims(self):
+        script = textwrap.dedent("""
+            import readline
+            def complete(text, state):
+                if state == 0 and text == "$":
+                    return "$complete"
+                return None
+            if "libedit" in getattr(readline, "__doc__", ""):
+                readline.parse_and_bind(r'bind "\\t" rl_complete')
+            else:
+                readline.parse_and_bind(r'"\\t": complete')
+            readline.set_completer_delims(" \\t\\n")
+            readline.set_completer(complete)
+            print(input())
+        """)
+
+        output = run_pty(script, input=b"$\t\n")
+        self.assertIn(b"$complete", output)
+
     def test_nonascii(self):
         loc = locale.setlocale(locale.LC_CTYPE, None)
         if loc in ('C', 'POSIX'):
diff --git a/Misc/NEWS.d/next/Library/2023-11-15-04-53-37.gh-issue-112105.I3RcVN.rst b/Misc/NEWS.d/next/Library/2023-11-15-04-53-37.gh-issue-112105.I3RcVN.rst
new file mode 100644 (file)
index 0000000..4243dcb
--- /dev/null
@@ -0,0 +1 @@
+Make :func:`readline.set_completer_delims` work with libedit
index 209ac8bbcfbe7841f89b329a77d094486e15209f..eb9a3d4693ee90b8d99ac78be71244110314e02e 100644 (file)
@@ -592,6 +592,13 @@ readline_set_completer_delims(PyObject *module, PyObject *string)
     if (break_chars) {
         free(completer_word_break_characters);
         completer_word_break_characters = break_chars;
+#ifdef WITH_EDITLINE
+        rl_basic_word_break_characters = break_chars;
+#else
+        if (using_libedit_emulation) {
+            rl_basic_word_break_characters = break_chars;
+        }
+#endif
         rl_completer_word_break_characters = break_chars;
         Py_RETURN_NONE;
     }
@@ -1309,6 +1316,15 @@ setup_readline(readlinestate *mod_state)
     completer_word_break_characters =
         strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
         /* All nonalphanums except '.' */
+#ifdef WITH_EDITLINE
+    // libedit uses rl_basic_word_break_characters instead of
+    // rl_completer_word_break_characters as complete delimiter
+    rl_basic_word_break_characters = completer_word_break_characters;
+#else
+    if (using_libedit_emulation) {
+        rl_basic_word_break_characters = completer_word_break_characters;
+    }
+#endif
     rl_completer_word_break_characters = completer_word_break_characters;
 
     mod_state->begidx = PyLong_FromLong(0L);