【发布时间】:2011-06-26 16:22:09
【问题描述】:
我正在尝试了解终端窗口中的彩色文本。 (如果我在 OS X 上使用 Terminal.app 很重要。)我想获取终端当前的前景色和背景色对。看起来我应该能够使用 Term::Cap 库在 perl 脚本中获取此信息,但解决方案却让我望而却步。
在 perl 脚本中如何查询终端当前的前景色和背景色对值?
【问题讨论】:
我正在尝试了解终端窗口中的彩色文本。 (如果我在 OS X 上使用 Terminal.app 很重要。)我想获取终端当前的前景色和背景色对。看起来我应该能够使用 Term::Cap 库在 perl 脚本中获取此信息,但解决方案却让我望而却步。
在 perl 脚本中如何查询终端当前的前景色和背景色对值?
【问题讨论】:
该功能超出了 terminfo 和 termcap 的范围,因为它处理终端响应,而 terminfo/termcap 描述了这些功能:
虽然原则上没有限制可以作为终端描述的一部分,但早在 1980 年代,终端之间的响应几乎没有共同点。一些终端可以报告特定功能,其中大部分是不变的(例如,版本信息)。在 terminfo/termcap 或多或少地在 X/Open 诅咒中固化之后,大多数可变响应出现了。 ncurses extends that,但同样,大多数扩展都是功能或特殊键。
Terminal.app 实现了 xterm 最常用的功能,但(与其他模仿者一样)省略了大部分终端响应。除此之外,xterm 提供终端响应,可以告诉应用程序当前窗口的颜色是什么。有几个命令行实用程序(xtermset 和xtermcontrol)是为了使用这些信息而编写的(同样,它们只涵盖了部分功能)。使用 xtermcontrol 表明 Terminal.app 在这方面缺乏——见截图:
【讨论】:
我认为大多数终端不支持报告这一点——而且它看起来不像 termcap 或 terminfo 有任何条目。您只需要根据需要设置颜色对,而不是询问终端现在设置的内容。在 ECMA-48 标准(在 ANSI X3.64 之后更广为人知的“ANSI”,它曾经存在的地方)中,唯一引用颜色的命令是 SGR“Set Graphic Rendition”,它纯粹是只写的。
【讨论】:
不知道 perl 或 Terminal.app,但如果您分别输出 "\033]10;?\07" 或 "\033]11;?\07",xterm 等会将前景/背景颜色控制序列写入标准输入。尤其是http://invisible-island.net/xterm/ctlseqs/ctlseqs.html,http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Controls。
【讨论】: