【问题标题】:Howto do python command-line autocompletion but NOT only at the beginning of a string如何做 python 命令行自动完成,但不仅仅是在字符串的开头
【发布时间】:2010-09-17 14:12:56
【问题描述】:

Python,通过它的 readline 绑定允许很好的命令行自动完成(如here 中所述)。

但是,补全似乎只在字符串的开头起作用。如果要匹配字符串的中间或结尾,readline 是行不通的。

我想在命令行 python 程序中通过将我键入的内容与可用字符串列表中的任何字符串进行匹配来自动完成字符串。

  • 我想要的自动完成类型的一个很好的例子是当您在“收件人”字段中键入时在 GMail 中发生的类型。如果您输入其中一个联系人的姓氏,它就会出现,就像您输入她的名字一样。
  • 可能需要使用向上和向下箭头或其他方法从匹配的字符串中进行选择(在 readline 的情况下不需要),这在我的情况下很好。
  • 我的特定用例是一个发送电子邮件的命令行程序。
  • 具体的代码示例会很有帮助。

使用像 curses 这样的终端模拟器就可以了。它只需要在 linux 上运行,而不是 Mac 或 Windows。

这是一个例子: 假设我在列表中有以下三个字符串

['Paul Eden <paul@domain.com>', 
'Eden Jones <ejones@domain.com>', 
'Somebody Else <somebody@domain.com>']

我想要一些代码,在我键入“Eden”后自动完成列表中的前两项,然后让我选择其中一项(全部通过使用键盘的命令行)。

【问题讨论】:

    标签: python linux unix command-line autocomplete


    【解决方案1】:

    我不确定我是否理解问题所在。您可以使用 readline.clear_history 和 readline.add_history 来设置您想要的可完成字符串,然后使用 control-r 在历史记录中搜索 backword(就像您在 shell 提示符下一样)。例如:

    #!/usr/bin/env python
    
    import readline
    
    readline.clear_history()
    readline.add_history('foo')
    readline.add_history('bar')
    
    while 1:
        print raw_input('> ')
    

    或者,您可以编写自己的完成版本并将适当的密钥绑定到它。此版本使用缓存以防您的匹配列表很大:

    #!/usr/bin/env python
    
    import readline
    
    values = ['Paul Eden <paul@domain.com>', 
              'Eden Jones <ejones@domain.com>', 
              'Somebody Else <somebody@domain.com>']
    completions = {}
    
    def completer(text, state):
        try:
            matches = completions[text]
        except KeyError:
            matches = [value for value in values
                       if text.upper() in value.upper()]
            completions[text] = matches
        try:
            return matches[state]
        except IndexError:
            return None
    
    readline.set_completer(completer)
    readline.parse_and_bind('tab: menu-complete')
    
    while 1:
        a = raw_input('> ')
        print 'said:', a
    

    【讨论】:

    • 是的,我希望能够在字符串的中间或结尾进行搜索,而不仅仅是在开头。
    • 上面的例子就是这样工作的。如果我按“control-r o”,它会选择“foo”。
    • 新颖的想法。有没有办法自动执行(即不先按 control-r)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2023-04-10
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多