更改自动完成列大型文本数组的方式

时间:2013-11-20 01:46:16

标签: python autocomplete readline

我正在python中编写一个CLI用于工作目的,我想改进tab自动完成列大型文本数组的方式。

以下是一个例子:

import cmd, os
class test(cmd.Cmd):
    # Fetch a large array of text entries by linting a directory
    files = os.listdir('C:/WINDOWS')

    # This returns what i'd expect from a columnized large list
    def do_list(self, text):
        print cmd.Cmd().columnize(self.files)

    # Same large list via autocomplete, result is columnized, but not in same way
    def complete_list(self, text, line, begidx, endidx):
        if text:
            return [x for x in self.files if x.lower().startswith(text.lower())]
        return self.files

if __name__ == '__main__':
    test().cmdloop()

do_list将生成很长的文件列。 complete_list将生成一个不那么漂亮的列化文件列表,其中包含4个元素的多列,每个元素之间有大的间隙。这迫使我向右滚动以查看所有结果。

有没有办法改变自动填充的行为?

1 个答案:

答案 0 :(得分:0)

这比一个aswer更妥协,但至少它给了我想要的结果。简而言之:我使用os.path.commonprefix来执行自动完成的工作并在点击选项卡时返回公共前缀,在我返回结果之前,我打印一个正确列的匹配列表。

import cmd, os

class test(cmd.Cmd):
    # Fetch a large array of text entries by linting a directory
    files = sorted(os.listdir('C:/WINDOWS'))

    def do_list(self, text):
        cmd.Cmd().columnize(self.files)

    def complete_list(self, text, line, begidx, endidx):
        if text:
            matches = [x for x in self.files if x.lower().startswith(text.lower())]

            print
            cmd.Cmd().columnize(matches)
            print
            return [os.path.commonprefix([x.lower() for x in matches])]

        print
        cmd.Cmd().columnize(self.files)
        print
        return []


if __name__ == '__main__':
    test().cmdloop()

这不是世界上最漂亮的东西,但却成功了。