🐔

いつも byobu(tmux) が True Color にならないのでメモ

2025/01/16に公開

毎回ググる替わりに…

新しい環境で byobu(tmux) を使い始めると、いつも True Color にならなくて毎回ググっているので自分用にメモ。

なお、調査は byobu 6.11、tmux 3.4 で実施。

設定

以下の設定ファイルを作るだけ。

~/.config/byobu/.tmux.conf
set-option default-terminal tmux-256color
set-option -a terminal-overrides $TERM:RGB

ファイルの場所は環境によっては ~/.byobu/.tmux.conf かもしれない。

設定の確認

設定が有効になっていることは byobu を起動後 tmux show-options -s を実行すると確認できる。

$ tmux show-options -s
... 略 ...
default-terminal tmux-256color
... 略 ...
terminal-overrides[0] xterm*:smcup@:rmcup@
terminal-overrides[1] xterm-256color:RGB
... 略 ...

↓のシェルスクリプトで表示してみることもできる(ココに置いた)。

24-bit-color.sh
#!/bin/bash

color() {
        echo -en "\e[48;2;$1;$2;$3m "
}

reset() {
        echo -e "\e[m"
}

rainbow() {
        local t=$(( $1 % 43 * 255 / 43 ))
        local q=$(( 255 - t ))
        case $(( $1 / 43 )) in
                0) color 255  $t   0;;
                1) color  $q 255   0;;
                2) color   0 255  $t;;
                3) color   0  $q 255;;
                4) color  $t   0 255;;
                5) color 255   0  $q;;
        esac
}

for i in   {0..127}; do color $i 0 0; done; reset
for i in {255..128}; do color $i 0 0; done; reset

for i in   {0..127}; do color 0 $i 0; done; reset
for i in {255..128}; do color 0 $i 0; done; reset

for i in   {0..127}; do color 0 0 $i; done; reset
for i in {255..128}; do color 0 0 $i; done; reset

for i in   {0..127}; do rainbow $i; done; reset
for i in {255..128}; do rainbow $i; done; reset

表示で確認するとこんな感じ。

ちなみに見るとわかる通りコレのパクりだが、ちょと改善してある。

というのも元のスクリプトは seq の動きがおかしくてちゃんと表示されないのだ。具体的には降順のリストを seq 255 128 で作ってるのだが、オレの環境では seq 255 -1 128 じゃないと正しく生成されない。実は元の gist のコメントにも書いてあって、どうも seq の非互換っぽい。

てか元のまま使ってるみんなは表示がおかしいことに気づいてないのかな?[1]

各設定内容の意味

各設定内容も調べたのでメモ。

set-option コマンド

set-optiontmux のコマンド。機能は名前の通り。tmux のプションの名前とその値を指定する。set-option コマンド自体のオプション(ややこしい)もある。上記では 2 行目の -aset-option 自体のオプション。

default-terminal オプション

default-terminal オプションは、新しいシェル(て言うかウィンドウ/ペイン)を開始する際に使われる TERM 環境変数の値を指定する。

最近の tmux のデフォルトは tmux-256color っぽいんだが byobuscreen-256color に設定してしまうので仕方なく更に上書き。いや、screen-256color でもそれっぽく動くんだが折角なので。

ちなみに、screen-256colorBYOBU_COLOR_TERM なる変数のデフォルトで、byobu は端末が 256 色以上使えると判断するとこれを使う。従ってこれに tmux-256color を設定しても対応は可能なので、.profile とか .bashrc とかで環境変数として設定しても良い。がウザい[2]。また、byobu は起動時に ~/.byoburc なるファイルを読み込むので、ここで設定しても良い。が、どうせもう一つの設定のために ~/.config/byobu/.tmux.conf を作るのでわざわざこれだけのために ~/.byoburc 作るのもウザい[3]

なお、ググると -g オプションがついてることが多いがこれは不要。default-terminal はサーバオプションなのでそもそもグローバルな値しかない。

また、サーバオプションだからといって -s をつける必要もない。オプション名からサーバオプションだと判断できるのでどうせ無視される。

terminal-overrides オプション

terminal-overrides オプションは terminfo の設定を上書き(override)する。指定する値は配列で、複数指定する場合は , 区切りで記載する。ここでは set-option のオプション(ややこしい)-a を指定しているので、その前に設定してある terminal-overrides の内容を置き換えるのではなく、追加する内容となる。上の確認結果では配列の 0 番目の要素が予め byobu が設定している内容で 1 番目の要素が追加した内容。

それぞれの値は : 区切りで、最初だけ terminfo のエントリ名、それ以降は terminfo の設定を羅列する。今回の場合は terminfo のエントリ名は $TERM、設定する値は RGB である。これで $TERM は True Color 扱いとなる。ちなみに RGB の替わりに Tc でも OK。

ここで、$TERM と書いてあるのはそのままで OK。と言うのも .tmux.conf の中身は環境変数を展開してくれるのだ。もちろん、$TERM が True Color 対応じゃないのに勝手に True Color になるのはちょっと、と言う場合はちゃんと(?) xterm-256color:RGB とか指定すれば良い。

なお、ググると -g オプションがついてることが(以下略

また、ググると値が , で始まっていることも多いがこの , も不要。-a オプションを指定しているので指定した値が配列の追加要素とみなされるため。

脚注
  1. 割とどうでもよい。 ↩︎

  2. 個人の感想です。 ↩︎

  3. 個人の感想です。 ↩︎

Discussion