几个月前,我写了一篇博客文章,详细介绍了如何在标准的Python交互式解释器中实现制表符补全- 我曾经认为该功能仅在IPython中可用。考虑到由于IPython unicode问题有时不得不切换到标准解释器,所以我发现它非常方便。
最近,我在OS X中做了一些工作。不满的是,该脚本似乎不适用于OS X的Terminal应用程序。我希望一些在OS X方面有经验的人能够帮助我解决它,以便它也可以在Terminal中使用。
我正在复制下面的代码
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使用真正的制表符对进行初始化,这似乎是Terminal中Tab键输出的结果。
IrlCompleter
为了避免不得不使用更多的GPL代码,Apple不提供真正的读取线。取而代之的是,它使用BSD许可的libedit,它仅在大多数情况下与readline兼容。如果要完成,请构建自己的Python(或使用Fink或MacPorts)。