2010-01-12 31 views
5

我正在Python中编写一个小CLI(作为Mercurial的扩展),并且希望支持Tab完成。具体来说,我想在提示符中捕捉选项卡,并显示匹配选项列表(就像bash)。Python命令行界面中的Tab完成 - 如何捕捉Tab事件

例子:输入部分名称:

ext*TAB* 
extensions 
extras 

的问题是我不知道如何捕捉到标签事件。我正在使用Mercurial的ui.prompt() API,它只是在底层调用raw_input()

据我所知,raw_input()只返回'输入',如果用户输入一个标签,返回的字符串只包括一个"\t"

回答

15

为此,您使用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模式)
  • 历史(向上箭头回忆以前的值)
  • 历史记录检索,保存和载入
+0

谢谢,这正是我所希望的!只有一个问题 - 我无法在我的主系统上运行。我使用Python 2.6在OSX 10.6上,它只是插入'\ t'。所以我启动了Ubuntu,它在那里工作得很好 - 你知道是否有一个图书馆是一个更独立于平台的方式吗? – Paulitex 2010-01-12 02:37:20

+6

Apple提供的Pythons不使用GNU readline库;他们使用BSD派生的编辑线库。来自python.org的OS X的Python安装程序使用GNU readline,就像使用MacPorts安装的最近的Pythons一样。 – 2010-01-12 03:34:37

2

如何做制表完成在合作与readline一个很好的例子在标准库作为供应rlcompleter模块 - 你不能按原样使用它(它根据当前在Python主内置库中定义的名称完成),但是它显示了如何完成一般任务以及如何将它连接到readline

1

你应该几乎可以肯定地使用cmd module,它已经实现了制表符完成等等,也可能是你想要做的其他部分,使用readline模块等等。重新发明轮子没有意义。