我正在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个元素的多列,每个元素之间有大的间隙。这迫使我向右滚动以查看所有结果。
有没有办法改变自动填充的行为?
答案 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()
这不是世界上最漂亮的东西,但却成功了。