Python提示的彩色TAB补全
项目描述
fancycompleter: 彩色Python TAB补全
这是什么?
fancycompleter
是一个模块,通过添加TAB补全功能来提高Python交互式提示符的使用体验。它是stdlib的rlcompleter模块的扩展。
它的最佳特性是补全项会以不同的颜色显示,具体取决于它们的类型
在上面的图像中,字符串以绿色显示,函数以蓝色显示,整数和布尔值以黄色显示,None
以灰色显示,类型和类以品红色显示。其他所有内容都是纯白色。
fancycompleter
与Python 3兼容。然而,默认情况下,Python 3中颜色可能不起作用,请参阅如何获取颜色?部分以获取详细信息。
其他特性
- 为了节省屏幕空间,
fancycompleter
只显示 "点号" 之后的字符。相比之下,在上述示例中,rlcompleter
显示了由"sys."
预先添加的所有内容。 - 如果我们在行的开头按下
<TAB>
,将插入一个真正的制表符字符,而不是尝试完成。这在输入函数体或提示符中的多行语句时很有用。 - 与
rlcompleter
不同,fancycompleter
确实 可以完成包含字典或列表索引的表达式。例如,mydict['foo'].<TAB>
可以正常工作(假设mydict
是一个字典,并且它包含键'foo'
,当然 :-))。 - 从 Python 2.6 开始,如果完成的名字是一个可调用的,
rlcompleter
会自动添加一个开括号(
。如果我们不打算真正调用它,这会让人感到厌烦,所以fancycompleter
禁用了这种行为。
安装
首先,使用 pip
或 easy_install
安装模块。
$ pip install fancycompleter
然后,在 Python 交互式提示符中
>>> import fancycompleter
>>> fancycompleter.interact(persist_history=True)
>>>
如果您希望在启动时自动启用 fancycompleter
,可以将这两行添加到您的 PYTHONSTARTUP 脚本的末尾。
如果您没有 PYTHONSTARTUP
脚本,以下命令将在 ~/python_startup.py
中为您创建一个
$ python -m fancycompleter install
在 Windows 上,install
自动设置 PYTHONSTARTUP
环境变量。在其他系统上,您需要在 ~/.bashrc
或等效文件中添加适当的命令。
注意:根据您的特定系统,interact
可能需要采取一些非常规手段才能显示颜色,尽管一切应该“正常工作”。特别是,interact
的调用应该是启动文件中的最后一行,否则下一行可能不会执行。有关详细信息,请参阅实际发生的情况部分。
如何获取颜色?
如果您使用的是 PyPy,现在可以停止阅读了,因为 fancycompleter
会自动工作。
如果您使用的是 CPython on Linux/OSX 并且您使用 pip
或 easy_install
安装了 fancycompleter
,它们会自动安装 pyrepl
作为依赖项,并且您也应该获得颜色。如果出于某种原因您不想使用 pyrepl
,您应该继续阅读。
默认情况下,在 CPython 中,行输入和 TAB
完成由 GNU readline(至少在 Linux 上)处理。然而,readline
明确从完成项中删除转义序列,因此带有颜色的完成项无法正确显示。
有两种方法可以解决这个问题
- (建议)完全不要使用
readline
并依赖 pyrepl- 使用允许颜色的
readline
的修补版本
默认情况下,fancycompleter
会尝试使用 pyrepl
,如果找到它的话。要获取颜色,您需要一个最新版本,>= 0.8.2。
从版本 0.6.1 开始,fancycompleter
也支持在 Windows 上工作,它依赖于 pyreadline。在撰写本文时,pyreadline
的最新版本是 2.1,它不支持带有颜色的完成项;这里是添加了对它们的支持的请求。要启用颜色,您可以使用以下命令从这个分支安装 pyreadline
pip install --upgrade https://github.com/antocuni/pyreadline/tarball/master
如果您使用的是 Python 3,pyrepl
不会工作,因此没有安装。您获取颜色的唯一选项是使用下面解释的修补 readline
。
我真的很想使用 readline
此方法并不真正建议,但如果您真的想,您可以使用修补的 readline:您可以在 misc/
目录中找到补丁
- 用于 readline-5.2
- 用于 readline-6.0
您还可以尝试以下预编译版本,这些版本已在Ubuntu 10.10上测试过:请记住将它们放在链接器可以找到的位置,例如通过设置LD_LIBRARY_PATH
一旦安装完成,您应该双检查您是否可以找到它,例如通过在Python的readline.so
模块上运行ldd
$ ldd /usr/lib/python2.6/lib-dynload/readline.so | grep readline
libreadline.so.6 => /home/antocuni/local/32/lib/libreadline.so.6 (0x00ee7000)
最后,您需要强制fancycompleter
使用颜色,因为默认情况下,它只在pyrepl
中使用颜色:您可以通过在~/.fancycompleterrc.py
中放置自定义配置文件来实现。一个示例配置文件在这里(请记住在文件名前放置一个点!)
自定义
要自定义fancycompleter的配置,您需要在您的家目录中放置一个名为.fancycompleterrc.py
的文件。该文件必须包含一个名为Config
的类,它继承自DefaultConfig
并覆盖所需的值。
实际上发生了什么?
获取颜色的默认和首选方法是使用pyrepl
。然而,没有方法可以告诉CPython在交互式提示符中使用pyrepl
而不是内置的readline:这意味着即使我们在pyrepl的readline库中安装我们的补全器,交互式提示符也不会看到它。
通过避免使用内置提示符,简单地解决了这个问题:相反,我们使用一个基于code.InteractiveConsole的纯Python替换。这还带给我们一些便利,例如能够进行历史记录的多行编辑。
控制台由fancycompleter.interact()
自动运行,随后是sys.exit()
:这样,如果我们从PYTHONSTARTUP
中的脚本执行它,解释器就会在完成使用提示符(例如,通过按CTRL-D或调用quit()
)后立即退出。这样,我们就避免了进入内置提示符,并获得了与默认行为相似的行为。这就是为什么在这个配置中,在fancycompleter.interact()
之后可能会运行不行的原因。
请注意,如果我们使用readline
而不是pyrepl
,则不需要这种技巧,因此interact()
将简单地返回,让内置提示符出现。同样,如果我们在运行PyPy,这也是正确的,因为其内置提示符基于pyrepl。