Jos*_*ton 45 python readline osx-lion
在升级到lion之前,我通过终端在python shell中完成了tab.按照这些说明,可以使标签完成工作.
自升级到Lion以来,我现在无法在Python的终端会话中完成选项卡的完整工作.我按照上面的说明写了这封信,但它仍然不起作用.
Lion中的readline模块有什么不同吗?挂钩'tab:complete'选项似乎不再起作用.我想知道它是否是忽略readline的终端,或者它是否是python本身.
Python版本:2.7.1
编辑:
通过选项卡完成,我的意思是我可以执行以下操作:
# django
import MyModel
MyModel.objects.a[TAB] # will complete to all()
Run Code Online (Sandbox Code Playgroud)
Ned*_*ily 105
Apple不readline提供带有OS X的GNU .它提供了包含兼容性接口的BSD libeditreadline.Apple发布的Pythons系统和python.org安装程序的64位/ 32位Pythons都是用它构建的libedit.问题是所支持的命令libedit与那些命令完全不同readline(参见例如此处的讨论).传统的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不再包含gcc-4.0那些Pythons需要构建和安装带有C扩展模块的软件包的OS X 10.4u SDK.
将以下内容放在python启动文件中将为libedit接口和典型的readline模块启用选项卡完成.有关python启动文件的更多信息,请参阅此处
import readline
import rlcompleter
if 'libedit' in readline.__doc__:
readline.parse_and_bind("bind ^I rl_complete")
else:
readline.parse_and_bind("tab: complete")
Run Code Online (Sandbox Code Playgroud)
Cam*_*lle 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
Run Code Online (Sandbox Code Playgroud)