try:
import readline
# remove some common file name delimiters
- readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
+ readline.set_completer_delims(' \t\n`@#%^&*()=+[{]}\\|;:\'",<>?')
except ImportError:
pass
self.allow_kbdint = False
# Generic completion functions. Individual complete_foo methods can be
# assigned below to one of these functions.
+ def completenames(self, text, line, begidx, endidx):
+ # Overwrite completenames() of cmd so for the command completion,
+ # if no current command matches, check for expressions as well
+ commands = super().completenames(text, line, begidx, endidx)
+ for alias in self.aliases:
+ if alias.startswith(text):
+ commands.append(alias)
+ if commands:
+ return commands
+ else:
+ return self._complete_expression(text, line, begidx, endidx)
+
def _complete_location(self, text, line, begidx, endidx):
# Complete a file/module/function location for break/tbreak/clear.
if line.strip().endswith((':', ',')):
# complete builtins, and they clutter the namespace quite heavily, so we
# leave them out.
ns = {**self.curframe.f_globals, **self.curframe_locals}
+ if text.startswith("$"):
+ # Complete convenience variables
+ conv_vars = self.curframe.f_globals.get('__pdb_convenience_variables', {})
+ return [f"${name}" for name in conv_vars if name.startswith(text[1:])]
if '.' in text:
# Walk an attribute chain up to the last part, similar to what
# rlcompleter does. This will bail if any of the parts are not
self.assertIn(b'continue', output)
self.assertIn(b'hello!', output)
+ def test_expression_completion(self):
+ script = textwrap.dedent("""
+ value = "speci"
+ import pdb; pdb.Pdb().set_trace()
+ """)
+
+ # Complete: value + 'al'
+ input = b"val\t + 'al'\n"
+ # Complete: p value + 'es'
+ input += b"p val\t + 'es'\n"
+ # Complete: $_frame
+ input += b"$_fra\t\n"
+ # Continue
+ input += b"c\n"
+
+ output = run_pty(script, input)
+
+ self.assertIn(b'special', output)
+ self.assertIn(b'species', output)
+ self.assertIn(b'$_frame', output)
+
def load_tests(loader, tests, pattern):
from test import test_pdb