PDB 中的自动完成和 Tab 键

Posted

技术标签:

【中文标题】PDB 中的自动完成和 Tab 键【英文标题】:Autocomplete and tab key in PDB 【发布时间】:2013-04-04 23:18:53 【问题描述】:

我一直试图让 TAB 在 (pdb) 提示符下插入选项卡之外的其他操作。

我想到的是触发自动完成,例如在 here 或 here 中,但 tab 键除了向 pdb 添加选项卡之外没有其他任何作用。

所以:

(pdb)var + tabKeyPressed

我想得到:

(pdb) 变量

代替:

(pdb)var[]

【问题讨论】:

这似乎与我的 Python 安装有关,在另一台计算机上,两个封闭的链接都像一个魅力。 【参考方案1】:

ipdb 来救援。

ipdb 导出函数以访问 IPython 调试器,该调试器具有 制表符补全,语法高亮,更好的回溯,更好 与 pdb 模块具有相同接口的内省。

【讨论】:

我确实试了一段时间,确实发货了。我只是不太喜欢它。 @RodrigoLopez:你改用/做什么? PDB 自动完成功能最终正常工作(我的安装中出现了问题)。 PDB 完成了这项工作(今天我可能会使用 VSC,tbh) 大约一半的时间 ipdb 不适用于我的用例(它崩溃并出现不返回任何谷歌结果的无意义错误,而且我没有时间调试我的调试器正在尝试调试代码) @vlsd,我已经使用 ipdb 多年,没有崩溃过。【参考方案2】:

iPython 是这个问题的第三方解决方案。有时你只能依赖普通的 Python。我找到了 2 个解决方案。

Per-shell 解决方案 - 使用模块“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
>>>

系统范围的解决方案 - 使用文件 ~/.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
>>> 

注意事项:

    仅在 Python 3.4 上测试

    操作系统 - Linux Mint

    基于https://reminiscential.wordpress.com/2009/06/12/python-enable-auto-complete-in-a-pdb-session/

【讨论】:

要使用带有python -m pdb script.py的invoke pdb,您还应该在.pdbrc中使用import pdb 我正在使用 .pdbrc。我的 python3.7 安装缺少 gnureadline。因此,如果这种方法不起作用,请尝试pip install gnureadline jupyter 笔记本呢?考虑到tabKeyPressed 实际上将焦点移动到下一个单元格,这是否有意义? (例如,如果我使用 %%debug)——谢谢!【参考方案3】:

官方文件说:

在 3.3 版中更改:通过 readline 模块的制表符补全可用于命令和命令参数,例如当前的全局和局部名称作为 p 命令的参数提供。

https://docs.python.org/3/library/pdb.html

所以你只需使用p 命令:

(Pdb) p var[TAB] # complete global and local names
var1 var2
(Pdb) [TAB] # complete commands
EOF        b          cl         cont       disable    exit       interact   list       next       quit       retval     source     unalias    up         
a          break      clear      continue   display    h          j          ll         p          r          run        step       undisplay  w          
alias      bt         commands   d          down       help       jump       longlist   pp         restart    rv         tbreak     unt        whatis     
args       c          condition  debug      enable     ignore     l          n          q          return     s          u          until      where 

【讨论】:

这很好!可以验证在 python 3.7.1 中工作

以上是关于PDB 中的自动完成和 Tab 键的主要内容,如果未能解决你的问题,请参考以下文章

如何移出 IntelliJ IDEA 中的自动完成括号(不使用箭头键)?

Chrome Devtools 控制台自动完成键快捷键更改

自动完成命令行参数

MySQL 命令行客户端中的自动完成

在 Sublime Text 上 SASS 缺少分号的自动完成?

Ajax 自动完成(或自动建议)与 TAB 完成/自动填充类似于 shell 命令行完成?