<p>(我知道这并不完全是您所要求的,但是)如果您对<kbd>选项卡上出现的自动完成/建议(如许多shell中所使用的那样)感到满意,那么您可以使用<a href="http://docs.python.org/library/readline.html" rel="noreferrer">readline</a>模块快速启动并运行。</p>
<p>下面是一个基于<a href="https://doughellmann.com/blog/2008/11/30/pymotw-readline/" rel="noreferrer">Doug Hellmann's PyMOTW writeup on readline</a>的快速示例。</p>
<pre><code>import readline
class MyCompleter(object): # Custom completer
def __init__(self, options):
self.options = sorted(options)
def complete(self, text, state):
if state == 0: # on first trigger, build possible matches
if text: # cache matches (entries that start with entered text)
self.matches = [s for s in self.options
if s and s.startswith(text)]
else: # no text entered, all matches possible
self.matches = self.options[:]
# return match indexed by state
try:
return self.matches[state]
except IndexError:
return None
completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
input = raw_input("Input: ")
print "You entered", input
</code></pre>
<p>这将导致以下行为(<code><TAB></code>表示按下的tab键):</p>
<pre><code>Input: <TAB><TAB>
goodbye great hello hi how are you
Input: h<TAB><TAB>
hello hi how are you
Input: ho<TAB>ow are you
</code></pre>
<p>在最后一行(<kbd>H</kbd><kbd>O</kbd><kbd>TAB</kbd>输入)中,只有一个可能的匹配,整个“你好”语句将自动完成。</p>
<p>有关<code>readline</code>的详细信息,请查看链接的文章。</p>
<hr/>
<blockquote>
<p>"And better yet would be if it would complete words not only from the beginning ... completion from arbitrary part of the string."</p>
</blockquote>
<p>这可以通过简单地修改completer函数中的匹配条件来实现,即从:</p>
<pre><code>self.matches = [s for s in self.options
if s and s.startswith(text)]
</code></pre>
<p>类似于:</p>
<pre><code>self.matches = [s for s in self.options
if text in s]
</code></pre>
<p>这将给您以下行为:</p>
<pre><code>Input: <TAB><TAB>
goodbye great hello hi how are you
Input: o<TAB><TAB>
goodbye hello how are you
</code></pre>
<hr/>
<h3>更新:使用历史缓冲区(如注释中所述)</h3>
<p>创建用于滚动/搜索的伪菜单的一个简单方法是将关键字加载到历史缓冲区中。然后,您将能够使用向上/向下箭头键滚动条目,并使用<kbd>Ctrl</kbd>+<kbd>R</kbd>执行反向搜索。</p>
<p>要尝试此操作,请进行以下更改:</p>
<pre><code>keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
readline.add_history(kw)
input = raw_input("Input: ")
print "You entered", input
</code></pre>
<p>运行脚本时,请尝试键入<kbd>Ctrl</kbd>+<kbd>r</kbd>,然后键入<kbd>a</kbd>。这将返回包含“a”的第一个匹配项。再次输入<kbd>Ctrl</kbd>+<kbd>r</kbd>进行下一个匹配。要选择条目,请按回车键。</p>
<p>也可以尝试使用向上/向下键滚动关键字。</p>