mirror of
https://github.com/python/cpython.git
synced 2026-01-26 21:03:34 +00:00
[3.11] gh-112105: Make completer delims work on libedit (gh-112106) (gh-112488)
gh-112105: Make completer delims work on libedit (gh-112106) (cherry picked from commit 2df26d83486b8f9ac6b7df2a9a4669508aa61983) Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
This commit is contained in:
parent
b85070ceaf
commit
42dd2613fe
@ -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'):
|
||||
|
||||
@ -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) {
|
||||
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;
|
||||
}
|
||||
@ -1260,6 +1267,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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user