一些字符贴在我的Python cmd中的彩色提示符上

时间:2017-04-09 07:25:02

标签: python colors command-line-interface python-2.x readline

我正在使用Python 2's cmd module为程序创建命令行。只要我没有为我的提示添加颜色,一切都很好。

工作代码:

from cmd import Cmd

class App(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = "PG ["+ (str('username'), 'green') +"@"+ str('hostname') +"]: "

    def do_exit(self, line):
        '''
        '''
        return True

App().cmdloop()

当我更改我的代码时,如果我输入一个长命令或尝试搜索命令历史记录,一些字符会坚持我的提示。

问题代码:

from cmd import Cmd

class App(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = "PG ["+ self.colorize(str('username'), 'green') +"@"+ str('hostname') +"]: "

    colorcodes =    {'green':{True:'\x1b[32m',False:'\x1b[39m'}}


    def colorize(self, val, color):
        return self.colorcodes[color][True] + val + self.colorcodes[color][False]

    def do_exit(self, line):
        '''
        '''
        return True

App().cmdloop()

您可以在asciicasts中看到此问题。问题也存在于cmd2 module

1 个答案:

答案 0 :(得分:7)

只需在您的颜色代码中添加标记:

    colorcodes =    {'green':{True:'\x01\x1b[32m\x02',False:'\x01\x1b[39m\x02'}}
                                  # ^^^^        ^^^^         ^^^^        ^^^^

在您的asciicast中,当您离开i-search模式并重新打印提示时,您会遇到问题。这是因为Python并不知道转义字符实际上不占用屏幕上的空间。在每个转义序列之前放置\x01,在每个转义序列之后放置\x02,告诉Python假设这些字符不占用空间,因此提示将被正确地重新打印。

这与this answer中的解决方案相同,后者在不同的上下文中存在相应的问题。在Python readline文档中有一个open issue可以提及这一点,但我还没有看到它已经完成。

我在Cygwin上用Python 2.7.12测试了上面的colorcodes值,运行时很少。在提示中,username打印绿色,其他所有内容都打印为默认值(浅灰色)。我使用的是标准系统cmd模块,不是 cmd2(您链接了)。