https://github.com/python/cpython/commit/b6769e9404646e38d9c786984ef308c8e9747b91
commit: b6769e9404646e38d9c786984ef308c8e9747b91
branch: main
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-03-04T15:45:38-05:00
summary:
gh-125377: Improve tab indentation for pdb multi-line input (#130471)
files:
A Misc/NEWS.d/next/Library/2025-02-22-19-44-00.gh-issue-125377.LFTK0H.rst
M Doc/whatsnew/3.14.rst
M Lib/pdb.py
M Lib/test/test_pdb.py
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 8dfe25ad99abe3..b457ccf66571b0 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -785,6 +785,10 @@ pdb
(if any).
(Contributed by Tian Gao in :gh:`130493`.)
+* ``<tab>`` at the beginning of the line in :mod:`pdb` multi-line input will
+ fill in a 4-space indentation now, instead of inserting a ``\t`` character.
+ (Contributed by Tian Gao in :gh:`130471`.)
+
pickle
------
diff --git a/Lib/pdb.py b/Lib/pdb.py
index ea6a7890f8c2bc..75fc29068fa843 100644
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -652,10 +652,10 @@ def displayhook(self, obj):
self.message(repr(obj))
@contextmanager
- def _disable_command_completion(self):
+ def _enable_multiline_completion(self):
completenames = self.completenames
try:
- self.completenames = self.completedefault
+ self.completenames = self.complete_multiline_names
yield
finally:
self.completenames = completenames
@@ -753,7 +753,7 @@ def default(self, line):
buffer = line
if (code := codeop.compile_command(line + '\n', '<stdin>',
'single')) is None:
# Multi-line mode
- with self._disable_command_completion():
+ with self._enable_multiline_completion():
buffer = line
continue_prompt = "... "
while (code := codeop.compile_command(buffer, '<stdin>',
'single')) is None:
@@ -996,6 +996,21 @@ def _complete_expression(self, text, line, begidx, endidx):
# Complete a simple name.
return [n for n in ns.keys() if n.startswith(text)]
+ def _complete_indentation(self, text, line, begidx, endidx):
+ try:
+ import readline
+ except ImportError:
+ return []
+ # Fill in spaces to form a 4-space indent
+ return [' ' * (4 - readline.get_begidx() % 4)]
+
+ def complete_multiline_names(self, text, line, begidx, endidx):
+ # If text is space-only, the user entered <tab> before any text.
+ # That normally means they want to indent the current line.
+ if not text.strip():
+ return self._complete_indentation(text, line, begidx, endidx)
+ return self.completedefault(text, line, begidx, endidx)
+
def completedefault(self, text, line, begidx, endidx):
if text.startswith("$"):
# Complete convenience variables
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index a3246e4ec76b50..94332f1daee479 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -4513,6 +4513,32 @@ def test_multiline_completion(self):
self.assertIn(b'42', output)
+ def test_multiline_indent_completion(self):
+ script = textwrap.dedent("""
+ import pdb; pdb.Pdb().set_trace()
+ """)
+
+ # \t should always complete a 4-space indent
+ # This piece of code will raise an IndentationError or a SyntaxError
+ # if the completion is not working as expected
+ input = textwrap.dedent("""\
+ def func():
+ \ta = 1
+ \ta += 1
+ \ta += 1
+ \tif a > 0:
+ a += 1
+ \t\treturn a
+
+ func()
+ c
+ """).encode()
+
+ output = run_pty(script, input)
+
+ self.assertIn(b'4', output)
+ self.assertNotIn(b'Error', output)
+
def load_tests(loader, tests, pattern):
from test import test_pdb
diff --git
a/Misc/NEWS.d/next/Library/2025-02-22-19-44-00.gh-issue-125377.LFTK0H.rst
b/Misc/NEWS.d/next/Library/2025-02-22-19-44-00.gh-issue-125377.LFTK0H.rst
new file mode 100644
index 00000000000000..b3b5275b4e3389
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-02-22-19-44-00.gh-issue-125377.LFTK0H.rst
@@ -0,0 +1 @@
+``<tab>`` at the beginning of the line in :mod:`pdb` multi-line input will
fill in a 4-space indentation now, instead of inserting a ``\t`` character.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]