いつも byobu(tmux) が True Color にならないのでメモ
毎回ググる替わりに…
新しい環境で byobu
(tmux
) を使い始めると、いつも True Color にならなくて毎回ググっているので自分用にメモ。
なお、調査は byobu 6.11、tmux 3.4 で実施。
設定
以下の設定ファイルを作るだけ。
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
... 略 ...
↓のシェルスクリプトで表示してみることもできる(ココに置いた)。
#!/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-option
は tmux
のコマンド。機能は名前の通り。tmux
のプションの名前とその値を指定する。set-option
コマンド自体のオプション(ややこしい)もある。上記では 2 行目の -a
が set-option
自体のオプション。
default-terminal
オプション
default-terminal
オプションは、新しいシェル(て言うかウィンドウ/ペイン)を開始する際に使われる TERM
環境変数の値を指定する。
最近の tmux
のデフォルトは tmux-256color
っぽいんだが byobu
が screen-256color
に設定してしまうので仕方なく更に上書き。いや、screen-256color
でもそれっぽく動くんだが折角なので。
ちなみに、screen-256color
は BYOBU_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
オプションを指定しているので指定した値が配列の追加要素とみなされるため。
Discussion