读取xterm中的当前文本颜色

fan*_*ngo 18 python bash xterm

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

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

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

系统:Red Hat 5.x Bash Python 2.3

谢谢您的帮助.

Sie*_*geX 95

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

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)
Run Code Online (Sandbox Code Playgroud)

要重置颜色信息,使后续文本处于正常的终端颜色,您将附加${NORMAL}到末尾,如下所示:

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

  • 有用,但在我阅读时却没有回答这个问题.在运行脚本之前,用户不一定将终端设置为"正常"颜色,并且可能不希望脚本在之后设置"正常"颜色. (3认同)
  • 它在Windows上无处不在.我将`.sh`脚本与Git Bash结合使用,并且有许多有用的Linux工具,在我方便时我没有.`tput`就是其中之一.当然,我可以运行cygwin甚至只是在我的Git目录中删除一个tput可执行文件,但是当转义序列工作得非常好时,这似乎有些过分.TBH,`$(tput setaf 6)`对我来说并不比'\ [00; 36m''更加模糊.在初始化颜色常数时,它们也不会将另一个进程分叉15次. (2认同)

Tho*_*key 6

实际上, xterm兼容终端可能是 \xe2\x80\x94 。

\n

例如,xtermcontrolOSC 10使用控制序列来检索默认的前景色/背景色。自 2002 年起,它就被记录在 xterm 中。

\n

对于其他终端:

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

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

\n
commit 1b8c6b1aac587b79476a60a5830385abc939430d \nAuthor: Egmont Koblinger <egmont@gmail.com> \nDate:   Wed Jan 22 00:13:51 2014 +0100\n\n    emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors)\n\n    https://bugzilla.gnome.org/show_bug.cgi?id=567444\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
printf \'\\033P$m\\033\\\\\'\n
Run Code Online (Sandbox Code Playgroud)\n

会得到它回复用 SGR 参数填写的字符串。

\n

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

\n
\\033P1$r0;33m\\033\\\\\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
printf \'\\033]4;3;?\\033\\\\\'\n
Run Code Online (Sandbox Code Playgroud)\n

所以用 xterm 肯定是可行的。DECRQSSxterm 的下一次更新中将有一个演示/测试脚本。

\n

对于其他项目,您需要更多时间:

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

    \n
  • \n
  • VTE 的开发人员复制 xterm 功能以响应错误报告;VTE 来源没有提及DECRQSS。它的 git logOSC 4在 2009 年提到过,但实现不完整(它只允许设置颜色,而不允许获取颜色)。

    \n
  • \n
\n


Pau*_*ce. 4

我不认为这是可能的,而且如果是的话,它也不太可能便携。您能做的最好的事情就是发送,sgr0它将所有属性重置为默认值(而不是以前的属性)。在 xterms 上,sgr0Esc[m. 如果您想重置颜色而不影响其他属性,请发送opxterms 上的Esc[39;49m

这些代码不应该被硬编码。您应该使用 terminfo、termcap 或 [n]curses。