读取xterm中的当前文本颜色

时间:2010-12-02 06:59:39

标签: python bash xterm

我正在编写各种实用程序,我真的很喜欢彩色文本。没有什么好看的,只是使用转义序列。我创建了一个具有pprint(msg,color)函数的简单类。在找到代码here之后,我已经很容易地工作了。

我遇到的问题是我应该能够在打印后关闭颜色。例如,假设一个用户运行我的程序,它打印几乎所有的默认终端颜色,但有一个错误,我想以红色打印错误。我的错误消息前缀为'\ 033 [0; 32m',消息为红色。不幸的是,在我更改之前,所有文本都是红色的。在我的程序运行时,这通常很好,因为我知道消息应该是什么颜色。但是,程序结束后颜色仍然存在。基本上,我想在程序启动时读取当前颜色,并在完成后恢复它。与退出时脚本恢复pwd的方式相同。

如何读取当前的转义序列?

系统: 红帽5.x. 巴什 Python 2.3

感谢您的帮助。

4 个答案:

答案 0 :(得分:93)

而不是使用模糊转义序列,而是使用tput工具。以下是我用于PS1提示的~/.bashrc的摘录:

BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)

要重置颜色信息,以便后续文本采用正常的终端颜色,您可以将${NORMAL}添加到结尾,如下所示:

echo "${RED}this is red ${NORMAL}this is normal"

答案 1 :(得分:4)

RED = 31
GREEN = 32
ESCAPE = '%s[' % chr(27)
RESET = '%s0m' % ESCAPE
FORMAT = '1;%dm'

def colorize(text, color):
    return ESCAPE + (FORMAT % (color, )) + text + RESET

此函数将返回一个打印颜色的字符串,然后终端自动重置。

答案 2 :(得分:3)

我不相信这是可能的,如果是的话,那就是unlikely to be portable。您可以做的最好的事情是发送sgr0,将所有属性重置为默认值(不是之前的)。在xterms上,sgr0Esc[m。如果您想重置颜色而不影响其他属性,请发送xterms为op的{​​{1}}。

这些代码不应该是硬编码的。你应该使用terminfo,termcap或[n] curses。

答案 3 :(得分:1)

实际上,这是可能的 - 因为 xterm 兼容 终端。

例如,

xtermcontrol使用OSC 10控制序列来检索默认前景/背景颜色。自2002年以来,它一直在xterm中记录。

对于其他终端:

  • 在RHEL 5中,“终端”程序是gnome-terminal 2.16.0;该版本无法识别 OSC 10 (使用等效的CentOS 5进行测试)。
  • 2010年提出的问题涉及Red Hat enterprise 版本,如果有的话,它的更新速度比Debian慢。
  • 及时向前推进,Debian 7(2012年初)的gnome-terminal 3.4.1.1也无法识别控制序列。
  • 最后,在Debian 8和3.14.1(2014年末)中,该功能得到了认可。
  • CentOS 7的gnome-terminal 3.14.3识别控制序列。

添加它时很好奇,请记住VTE的开发人员不会编写文档。所以...研究git日志显示

commit 1b8c6b1aac587b79476a60a5830385abc939430d 
Author: Egmont Koblinger <egmont@gmail.com> 
Date:   Wed Jan 22 00:13:51 2014 +0100

    emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors)

    https://bugzilla.gnome.org/show_bug.cgi?id=567444

另一方面,默认颜色与当前颜色不同。用户可以使用 DECRQSS 控件序列patch #93 in 1999使用xterm执行此操作。也就是说,将终端置于原始模式并执行类似

的操作
printf '\033P$m\033\\'

将使用SGR参数填充字符串进行回复。

如果使用SGR设置了颜色,则这些代码将成为回复的一部分,例如

\033P1$r0;33m\033\\

表示前景色编号3(编码为33)。

你可以在那里停下来(因为你可以提取这些参数并重新使用它们以便稍后将终端设置为相同的状态),但是使用 OSC 4 。您将使用颜色编号(来自SGR序列),并发送以下内容:

printf '\033]4;3;?\033\\'

所以它对xterm来说肯定是可行的。在xterm的下一次更新中,将会有 DECRQSS 的演示/测试脚本。

对于其他程序,您需要更多时间:

  • xtermcontrol的开发人员忽略了 DECRQSS (它没有设置/获取SGR代码的功能)。

  • VTE的开发人员复制xterm功能以响应错误报告; VTE来源没有提到 DECRQSS 。它的git日志在2009年提到 OSC 4 ,但实施不完整(只允许一个设置一种颜色,而不是获取颜色)。