Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取xterm中的当前文本颜色_Python_Bash_Xterm - Fatal编程技术网

Python 读取xterm中的当前文本颜色

Python 读取xterm中的当前文本颜色,python,bash,xterm,Python,Bash,Xterm,我正在编写各种实用程序,我真的很喜欢彩色文本。没什么特别的,只是用转义序列。我创建了一个简单的类,它有一个pprint(msg,color)函数。在找到代码后,我很容易就能让它工作 我遇到的问题是,我应该能够在打印后关闭颜色。例如,假设一个用户运行我的程序,该程序几乎以默认的终端颜色打印所有内容,但有一个错误,我想以红色打印错误。我用“\033”作为错误消息的前缀[0;32m',并且消息是红色的。不幸的是,在我更改之前,所有文本都是红色的。在我的程序运行时,这通常没有问题,因为我知道消息应该是什

我正在编写各种实用程序,我真的很喜欢彩色文本。没什么特别的,只是用转义序列。我创建了一个简单的类,它有一个pprint(msg,color)函数。在找到代码后,我很容易就能让它工作

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

如何读取当前的转义序列

系统: 红帽5.x 猛击 Python 2.3


感谢您的帮助。

与其使用模糊转义序列,不如使用
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)
要重置颜色信息,以便后续文本采用正常的终端颜色,您可以在末尾附加
${normal}
,如下所示:

echo“${RED}这是红色${NORMAL}这是正常的”


此函数将返回一个字符串,该字符串将以彩色打印,之后终端将自动重置。

我认为这是不可能的,如果可能的话。您最好发送
sgr0
,将所有属性重置为默认值(而不是之前的值)。在xterms上,
sgr0
Esc[m
。如果要重置颜色且不影响其他属性,请发送
op
,它在xterms上是
Esc[39;49m


这些代码不应该硬编码。您应该使用termfo、termcap或[n]诅咒。

实际上,这是可能的-对于 ,和兼容的终端

例如,使用控制序列来检索默认的前景色/背景色。自2002年以来,xterm中就记录了这一点

对于其他终端:

  • 在RHEL 5中,“终端”程序是gnome终端2.16.0;该版本不识别OSC 10(使用等效的CentOS 5测试)
  • 这个问题是在2010年提出的,指的是红帽企业版,它的更新速度比Debian慢
  • 随着时间的推移,Debian 7上的gnome终端3.4.1.1(2012年初)也没有识别出控制序列
  • 最后,在Debian 8和3.14.1(2014年末)中,该功能得到认可
  • CentOS 7的gnome终端3.14.3识别控制序列
奇怪的是,当它被添加时,请记住VTE的开发人员并不编写文档

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
将让它用用SGR参数填充的字符串进行回复

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

\033P1$r0;33m\033\\
表示前景色编号3(编码为
33

您可以到此为止(因为您可以提取这些参数并在以后重用它们以将终端设置为相同的状态),但是使用OSC 4可以获得实际的RGB颜色。您可以使用颜色编号(来自SGR序列),并发送如下内容:

printf '\033]4;3;?\033\\'
因此,在xterm的下一次更新中,将有一个演示/测试脚本用于
DECRQSS

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

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

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


有用,但在我阅读时没有回答问题。用户在运行脚本之前不一定要将终端设置为“正常”颜色,可能不希望脚本设置为“正常”随后上色。谢谢你的回答,但是Karl是正确的。我需要在Python脚本中设置它,所以虽然BASH别名可以工作,但它们似乎不是最好的解决方案。并不是说转义序列更好…另一个依赖项..我最不需要的东西。它在Windows上并不普遍。我将
.sh
脚本与Gi结合使用有很多有用的Linux工具我都不方便使用。
tput
就是其中之一。当然,我可以运行cygwin,甚至可以在我的Git目录中删除一个tput可执行文件,但当转义序列工作得很好时,这似乎有些过分。TBH,
$(tput setaf 6)
更加混乱[00;36m'
对我来说。在初始化颜色常数时,他们也不会再进行15次另一个过程。@Dan我们会告诉你,你不能一直让所有人都满意,18个中有1个很好。转义序列有问题。当我打印时,我看到了文本和所有转义序列。谢谢你的回复。我查看了您提供的链接,但找不到任何与sgr0或颜色相关的内容。您能详细说明或提供该部分吗?重置sgr0似乎工作得很好,除非有令人信服的可移植性原因,否则我将在短期内坚持使用它。使用与terminfo/termcap或curses直接接口的东西将是计划前进,但要添加这些模块需要一段时间。@fandingo:林的重点是什么
\033P1$r0;33m\033\\
printf '\033]4;3;?\033\\'