为什么不需要转义序列以将样式应用于 tmux 内终端中的文本?

use*_*441 2 terminal tmux escape-characters

如果我希望ANSI颜色0为红色,在urxvt终端中,我需要将序列传递\e]4;0;red\a给后者:

printf '\e]4;0;red\a'
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一般语法:

OSC 4 ; c ; spec BEL
Run Code Online (Sandbox Code Playgroud)

inside tmux,它不起作用,可能是因为它tmux在终端之前被消耗了。因此,我需要通过此处找到的另一个序列来保护它:

printf '\ePtmux;\e\e]4;0;red\a\e\\'
Run Code Online (Sandbox Code Playgroud)

现在,如果我想对文本应用一种样式,例如给它加下划线,我是在里面还是在外面tmux都没有关系。同样的顺序似乎总是有效:

printf '\e[4m underline \e[0m'
Run Code Online (Sandbox Code Playgroud)

我想也许可以解释这种差异,因为我已经在~/.tmux.conf. 特别是,我设置了terminal-overrides添加和设置非官方 terminfo 扩展SsSe更改内部光标形状的选项,tmuxman tmux(部分TERMINFO EXTENSIONS)中所述:

set-option -as terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
Run Code Online (Sandbox Code Playgroud)

但是当我尝试对里面的文本应用样式时tmux,我在没有任何配置的情况下启动了后者:

tmux -Ltest -f/dev/null
Run Code Online (Sandbox Code Playgroud)

在里面tmux,为什么不需要\e[4m underline \e[0m像 for 那样保护序列\e]4;0;red\a

Fox*_*Fox 5

tmux不是 XTerm(即使您在 XTerm 中使用它)。它在您碰巧使用的任何终端之上充当自己的终端仿真器(当然还有多路复用器)。您链接的页面是 XTerm 控制序列,它(虽然非常有用)并不适用于现有的每个终端。对于screen,在线手册页screen(1)列出了它接受的控制序列。 tmux(1)不包含类似的部分,但在tools/ansicode.txt.

在任何情况下,用于设置文本属性的 SGR 序列比“操作系统命令”更受支持,例如用于更改调色板的命令。从同一个链接页面:

CSI Pm m 字符属性 (SGR)

  • Ps = 0 -> 正常(默认)。
  • Ps = 1 -> 粗体。
  • Ps = 2 -> 微弱,强度降低 (ISO 6429)。
  • Ps = 3 -> 斜体 (ISO 6429)。
  • Ps = 4 -> 下划线
  • Ps = 5 -> Blink(在 X11R6 xterm 中显示为粗体)。
  • Ps = 7 -> 逆。
  • Ps = 8 -> 不可见,即隐藏(VT300)。
  • Ps = 9 -> 划掉的字符 (ISO 6429)。
  • Ps = 2 1 -> 双下划线 (ISO 6429)。
  • Ps = 2 2 -> 正常(既不粗也不淡)。
  • Ps = 2 3 -> 非斜体 (ISO 6429)。
  • Ps = 2 4 -> 没有下划线。
  • Ps = 2 5 -> 稳定(不闪烁)。
  • Ps = 2 7 -> 正(非反)。
  • Ps = 2 8 -> 可见,即未隐藏(VT300)。
  • Ps = 2 9 -> 未划掉 (ISO 6429)。
  • Ps = 3 0 -> 将前景色设置为黑色。
  • Ps = 3 1 -> 将前景色设置为红色。
  • Ps = 3 2 -> 将前景色设置为绿色。
  • Ps = 3 3 -> 将前景色设置为黄色。
  • Ps = 3 4 -> 将前景色设置为蓝色。
  • Ps = 3 5 -> 将前景色设置为洋红色。
  • Ps = 3 6 -> 将前景色设置为青色。
  • Ps = 3 7 -> 将前景色设置为白色。
  • Ps = 3 9 -> 将前景色设置为默认(原始)。
  • Ps = 4 0 -> 将背景颜色设置为黑色。
  • Ps = 4 1 -> 将背景颜色设置为红色。
  • Ps = 4 2 -> 将背景颜色设置为绿色。
  • Ps = 4 3 -> 将背景颜色设置为黄色。
  • Ps = 4 4 -> 将背景颜色设置为蓝色。
  • Ps = 4 5 -> 将背景颜色设置为洋红色。
  • Ps = 4 6 -> 将背景颜色设置为青色。
  • Ps = 4 7 -> 将背景颜色设置为白色。
  • Ps = 4 9 -> 将背景颜色设置为默认(原始)。

(我有一种感觉Pm应该是Ps来匹配项目。)

这是有道理的 tmux直接支持这些,因为它们经常被应用程序使用,而用户可能会因缺乏支持而感到沮丧。

可能还值得注意的是,Linux 控制台使用不同的转义序列将调色板索引 0 设置为 red: \033]P0ff0000\033\\。通常它是OSC P n rr gg bb ST其中n是调色板指数(十六进制),并rr gg bb是颜色(也十六进制)。