终端中的颜色层次

终端中的颜色层次

似乎有很多方法可以控制您在终端上看到的颜色。

可以通过您使用的终端仿真程序(例如 Terminator 或默认的 Gnome Terminal 首选项)、bash shell(使用$PS1 $LS_COLORS等)以及您在终端中使用的任何其他程序(例如 vim、git 等)来控制颜色。这里似乎存在某种层次结构,其中终端中运行的程序的颜色设置会覆盖终端仿真器设置中的颜色设置 - 例如,vim 中设置的颜色会覆盖 Terminator 首选项中设置的颜色。

是什么决定了你在终端上看到的颜色?有什么建议可以让你了解这种颜色的工作原理吗?主要概念或资源?

答案1

本质上不存在层次结构。相反,你只需要了解幕后真正发生的事情。

为此,了解终端仿真器的历史和功能非常重要。也就是说,它实际上是在模拟旧的硬件终端,例如VT100。例如,维基百科上关于GNOME 终端表示它正在模拟 Xterm 终端仿真器(更多是软件),而 Xterm 终端仿真器本身正在模拟VAXStation 100(这是一个物理的东西)这些旧航站楼串行设备--- 他们将世界视为输入流,它由当前在终端会话前台运行的任何程序生成。

因此,为了获得颜色,输出​​到终端的程序需要一种方法来发出信号,例如“下一个文本应该是红色”。这可以通过向终端输入一个转义码,它告诉终端接下来的几个字符将被解释为命令,而不是回显给用户看。具体来说,为了获得颜色,该命令的含义类似于“切换到以某种颜色显示文本”,稍后又“返回以正常颜色显示文本”。

如果你读了我链接的文章,你会看到最早的终端支持在前景和背景中选择 8 种颜色。组合的 16 种颜色正是你在颜色GNOME 终端首选项中的对话框。这只有意义,因为您正在处理软件模拟器,因此您可以控制应为转义序列可以选择的 16 种颜色选择哪些实际颜色。另一个例子是,要配置乌尔克西特以同样的方式,你可以修改你的X 资源文件。

后来,终端增加了从 256 种颜色和后来的 24 位颜色中进行选择的支持。这些颜色被实现为新类型的转义序列。终端仿真器通常不允许您自定义这些颜色,因为它们应该是“真实”颜色,而不仅仅是您喜欢的 16 种颜色的特定列表。

一些现代软件,如 Vim,会让您决定要使用哪种颜色协议。通常,当您使用 16 种颜色时,您会对颜色获得最精确的控制,因为您可以在模拟器的首选项中设置它们,但代价是您的软件只为您提供 16 种颜色(例如,这是博客文章)。有时软件会尝试确定终端仿真器的颜色支持级别,然后您必须摆弄环境变量以将此信息传达给该软件。例如,这个 vim 页面提到如果您希望 Vim 使用 256 色方法,您可能需要将 envar 设置TERM为该值。xterm-256color

(编辑:这就是为什么您可能认为 Vim 正在“覆盖”您的终端设置。事实并非如此。它可能只是使用了不同类型的颜色协议,而不是您设置的 16 种颜色。)

您引用的环境变量用于特定目的。例如,PS1是您的 shell 提示符。当您在 中看到像 "[\033[01;32m]\u@\h[\033[00m]" 这样的乱码文本时PS1,您正在查看要使用的精确转义序列(的文本表示),其中一些是切换颜色的命令。变量的LS_COLORS用法类似,但这些设置特定于程序ls

最终,颜色由您的终端仿真器的设置以及您的用户程序正在使用的转义序列(以及哪种颜色协议)决定。

相关内容