如何自动启动 tmux,并将状态栏设置为系统独特的颜色?

如何自动启动 tmux,并将状态栏设置为系统独特的颜色?

我希望设置我的机器,以便每次生成 shell 时都启动一个 tmux 会话。

另外,我通常登录到多个 SSH 服务器,并且我希望它们的设置相同。

最后,我希望为每台机器/服务器的状态栏设置不同的颜色,并且这个颜色是自动生成的并且是系统独有的,这样我就不必在每次部署新的本地或服务器安装时选择颜色(这对于docker实例特别有用),并且我也不必为此而配置用户的每个安装~/.bashrc

为每个安装设置不同的状态栏颜色在连接到其中一个服务器时特别有用;通常,这会将服务器的 tmux 状态栏“堆叠”在本地计算机的 tmux 状态栏之上(从技术上讲,这会给出某种线索,表明已连接到服务器);但是,这不是很明显,并且没有给出有关连接到哪个服务器的线索。

那么如何自动启动 tmux,并将状态栏设置为系统独特的颜色?

答案1

将其放入您的用户的~/.bashrc

if [ -z "$TMUX" ]; then
    tmux_default_session_name=Default

    tmux_bg_color=#
    tmux_fg_color=#000000

    tmux_bg_color_brightness=0

    for c in $(cut -c27- /etc/machine-id | fold -w2); do
        tmux_bg_color="${tmux_bg_color}${c}"
        tmux_bg_color_brightness=$((tmux_bg_color_brightness + 16#${c}))
    done

    tmux_bg_color_brightness=$((tmux_bg_color_brightness / 3))

    [ "$tmux_bg_color_brightness" -lt 128 ] && tmux_fg_color=#ffffff

    tmux new-session -d -s "$tmux_default_session_name"

    tmux set-option -t "$tmux_default_session_name" status-style "bg=${tmux_bg_color}"
    tmux set-option -at "$tmux_default_session_name" status-style "fg=${tmux_fg_color}"
    tmux set-option -at "$tmux_default_session_name" terminal-features ',*:RGB'

    tmux attach -t "$tmux_default_session_name"

    exit "$?"
fi

截屏


对于自动启动部分,我们需要做的就是检查我们是否已经处于 tmux 会话中,如果没有,则启动 tmux 会话。我选择将会话命名为“Default”。

$?一旦 tmux 会话不再以任何方式(停止/分离)附加到 shell,使用一个值退出将使 shell 自动返回,并将tmux命令生成的状态代码传播给调用者。

这通常是可取的,因为您通常不想在每次完成后关闭 shell 两次,但exit如果不是,可以简单地省略(或更改)该行。

if [ -z "$TMUX" ]; then
    tmux_default_session_name=Default

    [ ... ]

    tmux new-session -d -s "$tmux_default_session_name"

    [ ... ]

    tmux attach -t "$tmux_default_session_name"

    exit "$?"
fi

然后,我们需要为状态栏自动生成系统独特的1/etc/machine-id种颜色;利用,我们可以生成一种即使在硬件发生变化时也能持续存在的颜色。

完成此操作后,我们需要计算系统唯一颜色1的“亮度” ,以便我们可以为状态栏文本设置适当的亮/暗颜色(为简单起见,任何低于“亮度” 128 的颜色都会将相应的文本颜色设置为白色,任何等于或高于“亮度” 128 的颜色都会将相应的文本颜色设置为黑色2 - 请参阅下文以了解更详细的解决方案)。

可以通过以下方式实现:

  • 从中提取最后 6 位十六进制数字/etc/machine-id
  • 迭代每个 2 位数字对,将每对连接到一个变量,该变量将保存#rrggbb定义颜色的字符串,并将每对转换为十进制数,将其添加到累加器,该累加器将保存颜色的 R / G / B 分量的“亮度”总和
  • 将“亮度总和累加器”除以 3,计算 R / G / B 分量的平均“亮度”
  • 适当设置文本颜色
tmux_bg_color=#
tmux_fg_color=#000000

tmux_bg_color_brightness=0

for c in $(cut -c27- /etc/machine-id | fold -w2); do
    tmux_bg_color="${tmux_bg_color}${c}"
    tmux_bg_color_brightness=$((tmux_bg_color_brightness + 16#${c}))
done

tmux_bg_color_brightness=$((tmux_bg_color_brightness / 3))

[ "$tmux_bg_color_brightness" -lt 128 ] && tmux_fg_color=#ffffff

最后设置状态栏颜色和文字颜色:

tmux set-option -t "$tmux_default_session_name" status-style "bg=${tmux_bg_color}"
tmux set-option -at "$tmux_default_session_name" status-style "fg=${tmux_fg_color}"
tmux set-option -at "$tmux_default_session_name" terminal-features ',*:RGB'

1-所选颜色基于系统,但无法唯一标识;唯一性受限于某种#rrggbb格式( 接受tmux)中可显示颜色的数量,这实际上将可能的颜色池限制在约 1600 万种;颜色的种子是从 的最后 6 位十六进制数字中提取的/etc/machine-id,它是系统的唯一标识符;但考虑到最终目标,这种方法产生的颜色已经超过了“足够独特”的颜色(我敢说即使在“小”的约 1600 万种颜色池中,您也能分辨出彼此相邻的两种颜色……这可能已经太大了,在相对罕见的情况下有点违背了目的)。

2 - 要应用适当比例的亮/暗文本颜色,可以对状态栏颜色的可能“亮度”进行范围子集;这里我将其分成 8 个范围;此代码片段用于替换该[ "$tmux_bg_color_brightness" -lt 128 ] && tmux_fg_color=#ffffff行(如果使用此代码,则不妨删除该tmux_fg_color=#000000行):

if [[ $tmux_bg_color_brightness -ge 0 && $tmux_bg_color_brightness -lt 32 ]]; then
    tmux_fg_color="#ffffff"
elif [[ $tmux_bg_color_brightness -ge 32 && $tmux_bg_color_brightness -lt 64 ]]; then
    tmux_fg_color="#cccccc"
elif [[ $tmux_bg_color_brightness -ge 64 && $tmux_bg_color_brightness -lt 96 ]]; then
    tmux_fg_color="#aaaaaa"
elif [[ $tmux_bg_color_brightness -ge 96 && $tmux_bg_color_brightness -lt 128 ]]; then
    tmux_fg_color="#888888"
elif [[ $tmux_bg_color_brightness -ge 128 && $tmux_bg_color_brightness -lt 160 ]]; then
    tmux_fg_color="#666666"
elif [[ $tmux_bg_color_brightness -ge 160 && $tmux_bg_color_brightness -lt 192 ]]; then
    tmux_fg_color="#444444"
elif [[ $tmux_bg_color_brightness -ge 192 && $tmux_bg_color_brightness -lt 224 ]]; then
    tmux_fg_color="#222222"
elif [[ $tmux_bg_color_brightness -ge 224 && $tmux_bg_color_brightness -le 255 ]]; then
    tmux_fg_color="#000000"

相关内容