2

我正在使用 cmd 模块在 Python 中编写 CLI,该模块使用 readline 模块提供自动完成功能。自动完成在同一行显示不同的选项,而我希望它们在不同的行上,我在 cmd 中没有找到任何允许我这样做的参数。

这是一个示例程序:

import cmd

class mycmd(cmd.Cmd):
    def __init__(self):
        cmd.Cmd.__init__(self)

    def do_quit(self, s):
        return True

    def do_add(self, s):
        pass

    def do_addition(self, s):
        pass

    def complete_add(self, text, line, begidx, endidx):
        params = ['asd', 'asdasd', 'lol']
        return [s for s in params if s.startswith(text)]

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

这是结果:

(Cmd) <tab> <tab>
add       addition  help      quit   <-- I want these on different lines
(Cmd) add<tab> <tab>
add       addition                   <-- 
(Cmd) add <tab> <tab>
asd     asdasd  lol                  <-- 
(Cmd) add asd<tab> <tab>
asd     asdasd                       <-- 

如果我在每个自动完成选项的末尾添加一个行分隔符,我会得到:

(Cmd) add <tab> <tab>
asd^J     asdasd^J  lol^J    

无论如何,这不会解决命令的自动完成,只有参数。

有什么建议么?

谢谢您的帮助!

4

1 回答 1

1

您需要接管 readline 的显示功能才能做到这一点。为此import readline,请将其添加到您的__init__

        readline.set_completion_display_matches_hook(self.match_display_hook)

并将其添加到您的课程中:

    def match_display_hook(self, substitution, matches, longest_match_length):
        print()
        for match in matches:
            print(match)
        print(self.prompt, readline.get_line_buffer(), sep='', end='', flush=True)
于 2020-01-04T04:36:32.297 回答