我正在用 Python 编写一个小 CLI(作为 Mercurial 的扩展),并且希望支持制表符补全。具体来说,我想在提示符中捕获选项卡并显示匹配选项的列表(就像 bash 一样)。

例子:输入部分名称:

 ext*TAB*  
 extensions  
 extras

问题是我不确定如何捕获 Tab 事件。我正在使用 ui.prompt() Mercurial的API,只是调用 raw_input() 在引擎盖下。

据我所知, raw_input() 仅在“输入”时返回,如果用户输入选项卡,则返回的字符串仅包含 "\t".

有帮助吗?

解决方案

为此,您使用 readline 模块。

我能想到的最简单的代码:

import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
            'email', 'foobar', 'foo']

def complete(text, state):
    for cmd in COMMANDS:
        if cmd.startswith(text):
            if not state:
                return cmd
            else:
                state -= 1

readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')

用法示例:

Enter section name: <tab>
email      errors     extension  extra      foo        foobar    stuff
Enter section name: e<tab>
email      errors     extension  extra      
Enter section name: ext<tab>
extension  extra      

除了完成, readline 为您提供:

  • 行编辑
  • 键绑定配置(包括 emacs 和 vi 模式)
  • 历史记录(向上箭头可调用以前的值)
  • 历史搜索、保存和加载

其他提示

如何执行标签完成与 readline的<合作一个极好的例子/ A>在标准库作为 rlcompleter 模块被供给 - 你不能用它作为-IS(它完成基于目前在Python的主要和内置定义名称),但它显示了怎么办总任务,以及如何把它挂到readline

您应该几乎肯定要使用的 CMD模块,该已经实现tab完成等等,你正在试图做什么,使用readline的模块等等,可能其他地方。没有点重新发明轮子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top