Python cmd 自动完成:在单独的行上显示选项
Python cmd autocomplete: display options on separate lines
我正在使用 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
无论如何,这不会解决命令的自动完成问题,只能解决参数问题。
有什么建议吗?
感谢您的帮助!
您需要接管 readline 的显示功能才能执行此操作。为此,import readline
,将其添加到您的 __init__
:
readline.set_completion_display_matches_hook(self.match_display_hook)
并将此添加到您的 class:
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)
我正在使用 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
无论如何,这不会解决命令的自动完成问题,只能解决参数问题。
有什么建议吗?
感谢您的帮助!
您需要接管 readline 的显示功能才能执行此操作。为此,import readline
,将其添加到您的 __init__
:
readline.set_completion_display_matches_hook(self.match_display_hook)
并将此添加到您的 class:
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)