Python cmd自动完成:在单独的行上显示选项
我正在使用cmd模块用Python编写CLI,它使用readline模块提供自动完成功能。 Autocomplete在同一行上显示不同的选项,而我希望它们在不同的行上,我在cmd中没有找到允许我这样做的任何参数 这是一个示例程序:Python cmd自动完成:在单独的行上显示选项,python,command-line-interface,readline,python-cmd,Python,Command Line Interface,Readline,Python Cmd,我正在使用cmd模块用Python编写CLI,它使用readline模块提供自动完成功能。 Autocomplete在同一行上显示不同的选项,而我希望它们在不同的行上,我在cmd中没有找到允许我这样做的任何参数 这是一个示例程序: import cmd 类mycmd(cmd.cmd): 定义初始化(自): cmd.cmd.\uuuu init\uuuuu(自) def do_退出(自我): 返回真值 def do_添加(自身): 通过 def do_添加(自身): 通过 def complete
import cmd
类mycmd(cmd.cmd):
定义初始化(自):
cmd.cmd.\uuuu init\uuuuu(自)
def do_退出(自我):
返回真值
def do_添加(自身):
通过
def do_添加(自身):
通过
def complete_add(self、text、line、begidx、endidx):
参数=['asd','asdasd','lol']
如果s.startswith(text)则返回参数中s的[s]
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
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)
添加添加帮助退出您需要接管readline的显示功能来完成此操作。为此,import readline
,将其添加到您的\uuuu init\uuuu
:
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)
非常感谢,这很有效。我已经编辑了答案以添加Python2的解决方案,因为您的代码只适用于Python3。@Amedeo我不喜欢这样。Python2是EOL,因此使用它不再安全,我不想让人们更容易做错事。我明白你的意思。但是,在您没有选择的情况下,使用遗留系统可能会发生这种情况(不幸的是,这是我的情况)。无论如何,这是你的答案:)
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)