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

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

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

printf '\e]4;0;red\a'

我找到了一般语法这里:

OSC 4 ; c ; spec BEL

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

printf '\ePtmux;\e\e]4;0;red\a\e\\'

现在,如果我想对文本应用某种样式,例如在其下划线,无论我在内部还是外部tmux并不重要。相同的顺序似乎总是有效:

printf '\e[4m underline \e[0m'

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

set-option -as terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'

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

tmux -Ltest -f/dev/null

在内部tmux,为什么不需要\e[4m underline \e[0m像您需要的那样保护序列\e]4;0;red\a

答案1

tmux不是 XTerm(即使您在 XTerm 中使用它)。它充当自己的终端模拟器(当然还有多路复用器),位于您正在使用的任何终端之上。您链接的页面是 XTerm 控制序列,它(虽然非常有用)并不适用于现有的每个终端。对于screen,在线手册页screen(1)列出了它接受的控制序列。 tmux(1)不包含类似的部分,但有一个 1984 年终端各种控制序列的旧描述,至少反映了其作者几年前的目标,尽管没有严格记录其当前行为,在tools/ansicode.txt.

无论如何,用于设置文本属性的 SGR 序列比“操作系统命令”(例如用于更改调色板的命令)更受普遍支持。来自同一链接页面:

CSI下午m 角色属性 (SGR)

  • Ps = 0 -> 正常(默认)。
  • Ps = 1 -> 粗体。
  • Ps = 2 -> 微弱、强度降低 (ISO 6429)。
  • Ps = 3 -> 斜体 (ISO 6429)。
  • Ps = 4 -> 下划线
  • Ps = 5 -> 闪烁(在 X11R6 xterm 中显示为粗体)。
  • Ps = 7 -> 逆。
  • Ps = 8 -> Invisible,即隐藏(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 -> 将背景颜色设置为默认(原始)。

(我有种预感下午本来是PS以匹配项目。)

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

还值得注意的是,Linux 控制台使用不同的转义序列将调色板索引 0 设置为 red: \033]P0ff0000\033\\。一般来说,其中是调色板索引(以十六进制表示),OSC P n rr gg bb ST是颜色(也是以十六进制表示)。nrr gg bb

相关内容