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)的主要内容,如果未能解决你的问题,请参考以下文章