OS X终端中Python解释器的Tab-completion

时间:2009-03-23 21:48:29

标签: python macos configuration interpreter tab-completion

几个月前,我写了一篇blog post详细说明了如何在标准的Python交互式解释器中实现制表符完成 - 这个功能我曾经认为只在IPython中可用。鉴于我有时因为IPython unicode问题而不得不切换到标准解释器,我发现它非常方便。

最近我在OS X中做了一些工作。令我不满的是,该脚本似乎不适用于OS X的终端应用程序。我希望你们中的一些有OS X经验的人可以帮助我解决问题,这样它也可以在终端中工作。

我正在复制以下代码

import atexit
import os.path

try:
    import readline
except ImportError:
    pass
else:
    import rlcompleter

    class IrlCompleter(rlcompleter.Completer):
        """
        This class enables a "tab" insertion if there's no text for
        completion.

        The default "tab" is four spaces. You can initialize with '\t' as
        the tab if you wish to use a genuine tab.

        """

        def __init__(self, tab='    '):
            self.tab = tab
            rlcompleter.Completer.__init__(self)


        def complete(self, text, state):
            if text == '':
                readline.insert_text(self.tab)
                return None
            else:
                return rlcompleter.Completer.complete(self,text,state)


    #you could change this line to bind another key instead tab.
    readline.parse_and_bind('tab: complete')
    readline.set_completer(IrlCompleter('\t').complete)


# Restore our command-line history, and save it when Python exits.
history_path = os.path.expanduser('~/.pyhistory')
if os.path.isfile(history_path):
    readline.read_history_file(history_path)
atexit.register(lambda x=history_path: readline.write_history_file(x))

请注意,我已经从博客文章中的版本对其进行了轻微编辑,以便使用真正的标签初始化IrlCompleter,这似乎是终端中Tab键输出的内容。

7 个答案:

答案 0 :(得分:56)

这应该在Leopard的python下运行:

import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")

而这个不是:

import readline, rlcompleter
readline.parse_and_bind("tab: complete")

将其保存在〜/ .pythonrc.py中并执行.bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

答案 1 :(得分:11)

这是一个完整的跨平台版本的Windows / OS X / Linux加载选项卡完成:

#Code  UUID = '9301d536-860d-11de-81c8-0023dfaa9e40'
import sys
try:
        import readline
except ImportError:
        try:
                import pyreadline as readline
        # throw open a browser if we fail both readline and pyreadline
        except ImportError:
                import webbrowser
                webbrowser.open("http://ipython.scipy.org/moin/PyReadline/Intro#line-36")
                # throw open a browser
        #pass
else:
        import rlcompleter
        if(sys.platform == 'darwin'):
                readline.parse_and_bind ("bind ^I rl_complete")
        else:
                readline.parse_and_bind("tab: complete")

来自http://www.farmckon.net/?p=181

答案 2 :(得分:8)

为避免使用更多GPL代码,Apple不包含真正的readline。相反,它使用BSD许可的libedit,它只与读取线兼容。如果要完成,请构建自己的Python(或使用Fink或MacPorts)。

答案 3 :(得分:1)

这适用于Linux bash和OS X 10.4

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')

答案 4 :(得分:1)

如果在尝试上述操作后,仍然无法正常工作,那么请尝试在shell中执行:

sudo easy_install readline

然后,使用内容

创建〜/ .profile 文件
export PYTHONSTARTUP=$HOME/.pythonrc.py

〜/ .pythonrc.py 文件,内容为:

try:
    import readline
except:
    print ("Module readline is not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

感谢easy {install提示Steven Bamford和文件内容Nicolas

答案 5 :(得分:0)

从真实的方式告诉libedit(Mac OS半读取线)的文档记录方式是:   如果" libedit"在readline。 doc :      传#Mac案例   其他:      传递#GNU readline案例

答案 6 :(得分:0)

在FreeBSD上遇到许多处理Python(2和3)的问题之后,我终于得到了一个适当的扩展,可以直接使用libedit作为Python的完成者。

libedit / readline的基本问题是Python的完成和输入很大程度上倾向于GNU readline ......可悲的是,这实际上并不是一个特别好的接口。它需要C中的大量全局变量,并且在"实例上不能很好地工作。基础。

解决方案:

https://github.com/mark-nicholson/python-editline

这是一个真正独立的python扩展,使用实际的" libedit"直接链接到libedit。界面 - 不是侧面的readline粘合剂。

我在Ubuntu,FreeBSD,OpenBSD,NetBSD和MacOS上进行了相当全面的测试 - 结果发布在自述文件中。 c代码非常干净,几乎没有平台相关的位 - 与Python中的readline.c模块不同。

注意:     它适用于Python3> 3.2。     它不是“导入标准”的直接替代品。在其他脚本中,但这些脚本可以轻松调整。     它可以与readline共存。因此 - 有一个sitecustomize.py文件的代码可以进行选择。     它可以使用分发&#lib; libedit.so',自定义构建的一个或libedit内置到扩展本身。