python tab 补全 Mac OSX 10.7 (Lion)

Posted

技术标签:

【中文标题】python tab 补全 Mac OSX 10.7 (Lion)【英文标题】:python tab completion Mac OSX 10.7 (Lion) 【发布时间】:2011-10-30 06:30:02 【问题描述】:

在升级到 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()

【问题讨论】:

你之前完成了什么样的工作? 您是否考虑过使用 ipython 或 bpython 之类的东西? 如果还是不行,请看my answer in another post。 【参考方案1】:

Apple 没有随 OS X 一起提供 GNU readline。它确实提供了 BSD libedit,其中包括一个 readline 兼容接口。 Apple 提供的系统 Python 和来自 python.org 安装程序的 64 位/32 位 Python 是使用 libedit 构建的。问题是libedit 支持的命令与readline 支持的命令完全不同(参见例如讨论here)。传统的仅 32 位 python.org 安装程序确实使用 GNU readline,就像 MacPorts 等 OS X 的其他一些 Python 的第 3 方分销商一样。很有可能您以前使用过这样的 Python,而不是最近的 Apple。除了修改 Django 之外,您确实有一些选择:您可以安装第三方替换 readline 模块;或者您可以使用 GNU readline 附带的另一个 Python。但是,您不应该在 10.7 上使用 python.org 仅 32 位 Python,因为不幸的是,10.7 上的 Xcode 4 不再包含 gcc-4.0 和 OS X 10.4u SDK,这些 Python 需要使用 C 构建和安装包扩展模块。

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

import readline
import rlcompleter
if 'libedit' in readline.__doc__:
    readline.parse_and_bind("bind ^I rl_complete")
else:
    readline.parse_and_bind("tab: complete")

【讨论】:

我曾经使用 python 2.7 和 osx 10.6,所以它不是系统 python。不过我相信你说的是对的。由于我正在为 django 使用一些 oracle 库,我必须使用系统 python。 我添加了解决方案,以使选项卡完成对您的答案起作用,而不是创建一个新的,因为您的答案中的信息要好得多。如果您愿意,请随时将其删除,我将创建一个新答案。干杯【参考方案2】:

由于它使用 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

【讨论】:

以上是关于python tab 补全 Mac OSX 10.7 (Lion)的主要内容,如果未能解决你的问题,请参考以下文章

Mac系统之Python命令行tab键补全

Win10(PowerShell)下Python命令行tab自动补全

Mac Tab自动补全键

mac osx vi 设置tab 四个空格

Python中的Tab补全功能添加

Shell终端快捷键总结(mac)