bash $PS1 中的颜色代码在 tmux 中不起作用

bash $PS1 中的颜色代码在 tmux 中不起作用

我在我的中设置了彩色提示.bash_profile

export PS1="\[\033[0:33m\]testprompt@\h\[\033[00m\] "

在 tmux 之外,我会看到彩色提示读数testprompt@hostname

在 tmux 会话内,文本已设置,但提示未着色。其他程序正常输出颜色。

我在以下位置设置了一个彩色终端.tmux.conf

set -g default-terminal "xterm-256color"

我使用的是 macOS 上的默认终端。Bash 和 tmux 是 Homebrew 包管理器的最新版本。tmux 内部和外部运行的是相同版本的 bash。

以下环境变量在 tmux 内部和外部完全相同:

$ echo $PS1
\[\033[0:33m\]testprompt@\h\[\033[00m\]`
$ echo $TERM
xterm-256color
$ echo $SHELL
/usr/local/bin/bash
$ echo $BASH_VERSION
4.4.23(1)-release

Color 非常适合 tmux 中的其他命令,例如ls -lagit log。 shellfish在 tmux 中有一个颜色提示。在 tmux 中再次打开一个新bash实例没有任何区别 - 仍然没有颜色。.bash_profile正在读取并$PS1正在设置。提示颜色可以在屏幕和 tmux 之外的“原始”bash 中使用,但不能在 tmux 中使用。我缺少什么?

答案1

虽然您必须始终设置TERM环境变量以匹配您的终端类型是正确的,而不是愉快地错误地假设您的终端类型是xterm-*,但这实际上与问题无关,因为TERM环境变量与文字无关嵌入在提示中的控制序列。

问题是您在控制序列中使用子参数,而不是参数。参数以分号分隔;,如 ECMA-48:1991 § 5.4.2 中指定。子参数用冒号分隔:,如 ITU-T T.416:1993 § 13.1.8 中所规定。

您的外部终端模拟器显然是使用将子参数视为参数的 bodge 来处理子参数的模拟器之一。因此CSI 0 : 3 3 m被视为 SGR 0 和 SGR 33。其他终端仿真器对于正确处理控制序列更为严格,或者尚未实现子参数支持。他们可以将其视为子参数为 33 的 SGR 0、普通 SGR 0(取第一个数字)或仅 SGR 33(取最后一个数字)。

几年前,终端仿真器根本不支持子参数,因此这一点正在发生变化;希望最终它们都能正确支持子参数。在这种情况下,您的提示将很简单普遍地错误的。 ☺

就我个人而言,我更喜欢 Z shell,在其中可以像%F{yellow}在提示中一样使用序列,而不必担心控制序列是什么、如何正确使用它们以及将它们标记为非空格。

答案2

tmux 常见问题解答指出

tmux 内部的 TERM 必须是“screen”、“tmux”或类似的(例如“tmux-256color”)。不要费心报告不存在的问题!

xterm-256color不同于tmux-256color.

相关内容