python选项卡完成Mac OSX 10.7(Lion)

时间:2011-08-19 01:30:43

标签: python readline osx-lion

在升级到lion之前,我已经通过终端在python shell中完成了tab。在these instructions之后,标签可以完整运行。

自升级到Lion以来,我现在无法在Python的终端会话中完成标签。我按照上面的说明写了这封信,但它仍然不起作用。

Lion中的readline模块有什么不同吗?挂钩'tab:complete'选项似乎不再起作用。我想知道它是否是忽略readline的终端,或者它是否是python本身。

Python版本:2.7.1

编辑:

通过标签完成,我的意思是我可以执行以下操作:

# django
import MyModel
MyModel.objects.a[TAB] # will complete to all()

2 个答案:

答案 0 :(得分:105)

Apple不会向操作系统X发送GNU readline。它会发送BSD libedit,其中包含readline兼容性界面。 Apple发布的Pythons系统和python.org安装程序的64位/ 32位Pythons使用libedit构建。问题是libedit支持的命令与readline支持的命令完全不同(请参阅例如讨论here)。传统的32位python.org安装程序确实使用GNU readline和其他一些Python for OS X的第三方分发服务器,如MacPorts。您可能以前使用过这样的Python,而不是最近的Apple。除了修改Django之外,您还有一些选择:您可以安装第三方替换readline模块;或者你可以使用GNU readline附带的另一个Python。但是,你不应该在10.7上使用python.org只支持32位的Pythons,因为不幸的是,10.7上的Xcode 4不再包含{1}以及那些Pythons需要构建和安装包的OS X 10.4u SDK使用C扩展模块。

将以下内容放在python启动文件中将为libedit接口和典型的readline模块启用选项卡完成。有关python启动文件的更多信息,请see here

gcc-4.0

答案 1 :(得分:13)

由于它使用libedit / editline,启用自动完成的语法有点不同。 您可以先输入:

来强制使用emacs绑定(如果我没有错,则使用readline)

readline.parse_and_bind("bind -e")

然后你可以添加链接到你的TAB按钮的自动完成(man editrc):

readline.parse_and_bind("bind '\t' rl_complete")

如果您想支持缩进并且有历史记录(在互联网上找到),它应该看起来像那样(除非我犯了错误):

import readline,rlcompleter

### Indenting
class TabCompleter(rlcompleter.Completer):
    """Completer that supports indenting"""
    def complete(self, text, state):
        if not text:
            return ('    ', None)[state]
        else:
            return rlcompleter.Completer.complete(self, text, state)

readline.set_completer(TabCompleter().complete)

### Add autocompletion
if 'libedit' in readline.__doc__:
    readline.parse_and_bind("bind -e")
    readline.parse_and_bind("bind '\t' rl_complete")
else:
    readline.parse_and_bind("tab: complete")

### Add history
import os
histfile = os.path.join(os.environ["HOME"], ".pyhist")
try:
    readline.read_history_file(histfile)
except IOError:
    pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile