几个月前,我写了一篇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键输出的内容。
答案 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")
答案 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内置到扩展本身。