21

几个月前,我写了一篇博文,详细介绍了如何在标准 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 键输出的内容。

4

7 回答 7

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
于 2009-06-12T15:43:41.730 回答
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

于 2009-08-11T01:52:21.400 回答
8

为了避免使用更多的 GPL 代码,Apple 没有包含真正的 readline。相反,它使用 BSD 许可的libedit,它只与大多数 readline 兼容。如果您想完成,请构建您自己的 Python(或使用 Fink 或 MacPorts)。

于 2009-03-26T11:47:57.620 回答
1

这在 Linux bash 和 OS X 10.4 上都适用于我

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
于 2009-03-23T23:11:58.017 回答
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")

感谢Steven Bamford提供的 easy_install 提示,以及Nicolas提供的文件内容。

于 2014-05-28T10:17:56.927 回答
0

将 libedit(Mac OS 半读行)与真实行分开的记录方法是:如果读行中的“libedit”。doc : pass # Mac case else: pass # GNU readline case

于 2016-05-16T19:25:27.473 回答
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 上对它进行了相当彻底的测试——结果发布在自述文件中。与 Python 中的 readline.c 模块不同,c 代码非常干净,几乎没有平台相关位。

注意:它适用于 Python3 > 3.2。它不是其他脚本中“import readline”的直接替代品,但可以轻松调整这些脚本。它可以与 readline.so 共存——有用于启用选择的 sitecustomize.py 文件的代码。它可以使用发行版“libedit.so”、自定义构建的发行版或扩展本身内置的 libedit。

于 2017-06-01T16:35:13.463 回答