mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[3.12] gh-112105: Make completer delims work on libedit (gh-112106) (gh-112487)
gh-112105: Make completer delims work on libedit (gh-112106)
(cherry picked from commit 2df26d8348
)
Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
This commit is contained in:
parent
f7251e2af3
commit
7225a014de
3 changed files with 37 additions and 0 deletions
|
@ -5,6 +5,7 @@ import locale
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import textwrap
|
||||||
import unittest
|
import unittest
|
||||||
from test.support import verbose
|
from test.support import verbose
|
||||||
from test.support.import_helper import import_module
|
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.
|
# end, so don't expect it in the output.
|
||||||
self.assertIn(b"History length: 0", 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):
|
def test_nonascii(self):
|
||||||
loc = locale.setlocale(locale.LC_CTYPE, None)
|
loc = locale.setlocale(locale.LC_CTYPE, None)
|
||||||
if loc in ('C', 'POSIX'):
|
if loc in ('C', 'POSIX'):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Make :func:`readline.set_completer_delims` work with libedit
|
|
@ -572,6 +572,13 @@ readline_set_completer_delims(PyObject *module, PyObject *string)
|
||||||
if (break_chars) {
|
if (break_chars) {
|
||||||
free(completer_word_break_characters);
|
free(completer_word_break_characters);
|
||||||
completer_word_break_characters = break_chars;
|
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;
|
rl_completer_word_break_characters = break_chars;
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
@ -1259,6 +1266,15 @@ setup_readline(readlinestate *mod_state)
|
||||||
completer_word_break_characters =
|
completer_word_break_characters =
|
||||||
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
|
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
|
||||||
/* All nonalphanums except '.' */
|
/* 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;
|
rl_completer_word_break_characters = completer_word_break_characters;
|
||||||
|
|
||||||
mod_state->begidx = PyLong_FromLong(0L);
|
mod_state->begidx = PyLong_FromLong(0L);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue