Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Autocomplete and tab key in PDB

Tags:

I have been trying to get TAB to do something else than inserting a tab while at the (pdb) prompt.

What I have in mind is triggering autocomplete such as in here or here, but the tab key doesn't do anything else than adding tabs to pdb.

So with:

 (pdb)var + tabKeyPressed 

I'd want to get:

 (pdb)variable 

instead of:

 (pdb)var[          ] 
like image 972
Rodrigo Lopez Avatar asked Apr 12 '13 12:04

Rodrigo Lopez


1 Answers

The iPython is third-party solution for this problem. Sometimes you can only rely on vanilla Python. I found 2 solutions for it.

Per-shell solution - usage module 'rlcompleter':

$ python3  Python 3.4.3 (default, Sep 14 2016, 12:36:27)  [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information.  >>> import pdb >>> pdb.set_trace() --Return-- > <stdin>(1)<module>()->None  # press tab - but nothing (Pdb) str. *** SyntaxError: invalid syntax (Pdb) --KeyboardInterrupt-- (Pdb) c >>> import rlcompleter >>> pdb.Pdb.complete=rlcompleter.Completer(locals()).complete >>> pdb.set_trace() --Return-- > <stdin>(1)<module>()->None (Pdb) str. str.__add__(            str.__getattribute__(   str.__name__            str.__text_signature__  str.isdigit(            str.rfind( str.__base__(           str.__getitem__(        str.__ne__(             str.__weakrefoffset__   str.isidentifier(       str.rindex( str.__bases__           str.__getnewargs__(     str.__new__(            str.capitalize(         str.islower(            str.rjust( str.__basicsize__       str.__gt__(             str.__prepare__(        str.casefold(           str.isnumeric(          str.rpartition( str.__call__(           str.__hash__(           str.__qualname__        str.center(             str.isprintable(        str.rsplit( str.__class__(          str.__init__(           str.__reduce__(         str.count(              str.isspace(            str.rstrip( str.__contains__(       str.__instancecheck__(  str.__reduce_ex__(      str.encode(             str.istitle(            str.split( str.__delattr__(        str.__itemsize__        str.__repr__(           str.endswith(           str.isupper(            str.splitlines( str.__dict__            str.__iter__(           str.__rmod__(           str.expandtabs(         str.join(               str.startswith( str.__dictoffset__      str.__le__(             str.__rmul__(           str.find(               str.ljust(              str.strip( str.__dir__(            str.__len__(            str.__setattr__(        str.format(             str.lower(              str.swapcase( str.__doc__             str.__lt__(             str.__sizeof__(         str.format_map(         str.lstrip(             str.title( str.__eq__(             str.__mod__(            str.__str__(            str.index(              str.maketrans(          str.translate( str.__flags__           str.__module__          str.__subclasscheck__(  str.isalnum(            str.mro(                str.upper( str.__format__(         str.__mro__             str.__subclasses__(     str.isalpha(            str.partition(          str.zfill( str.__ge__(             str.__mul__(            str.__subclasshook__(   str.isdecimal(          str.replace(             (Pdb) c >>> 

System-wide solution - usage file ~/.pdbrc

$ cat ~/.pdbrc import rlcompleter pdb.Pdb.complete=rlcompleter.Completer(locals()).complete $ python3 Python 3.4.3 (default, Sep 14 2016, 12:36:27)  [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pdb >>> pdb.set_trace() --Return-- > <stdin>(1)<module>()->None (Pdb) str. str.__add__(            str.__getattribute__(   str.__name__            str.__text_signature__  str.isdigit(            str.rfind( str.__base__(           str.__getitem__(        str.__ne__(             str.__weakrefoffset__   str.isidentifier(       str.rindex( str.__bases__           str.__getnewargs__(     str.__new__(            str.capitalize(         str.islower(            str.rjust( str.__basicsize__       str.__gt__(             str.__prepare__(        str.casefold(           str.isnumeric(          str.rpartition( str.__call__(           str.__hash__(           str.__qualname__        str.center(             str.isprintable(        str.rsplit( str.__class__(          str.__init__(           str.__reduce__(         str.count(              str.isspace(            str.rstrip( str.__contains__(       str.__instancecheck__(  str.__reduce_ex__(      str.encode(             str.istitle(            str.split( str.__delattr__(        str.__itemsize__        str.__repr__(           str.endswith(           str.isupper(            str.splitlines( str.__dict__            str.__iter__(           str.__rmod__(           str.expandtabs(         str.join(               str.startswith( str.__dictoffset__      str.__le__(             str.__rmul__(           str.find(               str.ljust(              str.strip( str.__dir__(            str.__len__(            str.__setattr__(        str.format(             str.lower(              str.swapcase( str.__doc__             str.__lt__(             str.__sizeof__(         str.format_map(         str.lstrip(             str.title( str.__eq__(             str.__mod__(            str.__str__(            str.index(              str.maketrans(          str.translate( str.__flags__           str.__module__          str.__subclasscheck__(  str.isalnum(            str.mro(                str.upper( str.__format__(         str.__mro__             str.__subclasses__(     str.isalpha(            str.partition(          str.zfill( str.__ge__(             str.__mul__(            str.__subclasshook__(   str.isdecimal(          str.replace(             (Pdb) c >>>  

Notes:

  1. Tested only on the Python 3.4

  2. OS - Linux Mint

  3. Based on https://reminiscential.wordpress.com/2009/06/12/python-enable-auto-complete-in-a-pdb-session/

like image 184
PADYMKO Avatar answered Sep 28 '22 08:09

PADYMKO