Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

TrueColor対応のはなし(端末、シェル、tmux、vim)

TrueColorで表示するのは、わりかし対応がめんどうです。なぜなら、Vim、tmux、zsh、ターミナル全てで対応しなければならないからです。今回はそれぞれどういった対応をすればいいのか紹介します。

まず: TrueColor に対応できているか確認する

TrueColor 対応をする前に、そもそも今対応できているかチェックしましょう。以下のコマンドを実行してください。

$ curl -s https://gist.githubusercontent.com/lifepillar/09a44b8cf0f9397465614e622979107f/raw/24-bit-color.sh | bash

このように継ぎ目がなければOKです。↓

下のように階段状になっていたら対応できていません。↓

上でもかなり明白に違いますが、NeoVimでTrueColor対応できていないと更に明らかになります。

TrueColor非対応
TrueColor対応

TrueColor対応をしたあと、ちゃんと反映できているか上のコマンドで確認してください。

余談: ターミナルの色の種類

まず、ターミナルの色には2種類あります。

TrueColor
いわゆる#ffffff。RGBそれぞれ8ビットを用いて表現します。24ビットカラー(RGB)と、さらに透明度8ビットを合わせた32ビットカラー(RGBA)が存在します。
8-bit color
256色まで表せる方式。256までの数字のみを用います。xtermやscreenなど、それぞれで色の割り当てが異なっています。

TrueColor に対応できていない場合、8-bit color で表示されます。8-bit color は256色しか表示できないので、当然表現力はガクッと落ちます。

TrueColor 対応には順番がある

TrueColor 対応には順番があります。

  1. ターミナル(ターミナルエミュレータ)
  2. シェル(今回はbash・zsh)
  3. tmux
  4. vim

数字の小さいものが対応できていないと、それ以降をいじっても TrueColor で表示できません。そのため、ターミナル → シェル → tmux → vim の順に設定していきます。

ターミナル(ターミナルエミュレータ)

ターミナルは基本的に設定は要りません。 TrueColor に対応しているターミナルを使っていればそれで OK です。逆にいうと、TrueColor 非対応のターミナルを使っていたら乗り換える必要があります。

True Colour (16 million colours) support in various terminal applications and terminals · GitHub

ここを参考に、自分のターミナルが対応しているか確認してください。といっても、大体のメジャーなターミナルは対応してます。よほど変なターミナルを使っていなければ問題ないはずです。

bash/zsh

(bashは軽く確認した程度なので、以下はzshのつもりで見てください)

対応は基本的に必要ないです。あえていうと、自分で TERM を設定してはいけません。 TrueColor には TERM という変数が関わってきますが、これは zsh が勝手に決めてくれます。そのため、こちらで設定してはいけません。

ssh が絡んだ時の $TERM について

sshクライアント側の $TERM がそのまま ssh サーバーでの $TERM になります。もしクライアントが tmux を起動していた場合、tmux の default-terminal の値がサーバー側の $TERM になります。また、alias ssh="env TERM=xterm-256color ssh"のように env を使って設定すると、指定した値がサーバー側の $TERM になります。

tmux

基本的に以下をそのまま tmux.conf へ加えればOKです。

set-option -g default-terminal "tmux-256color" # 基本的にはscreen-256colorかtmux-256colorを設定
set-option -ga terminal-overrides ",$TERM:Tc" # tmuxを起動していない時のzshでの$TERMの値を指定

tmuxはややこしいので軽く解説します。

まず、terminal-overridesについて。これには tmux を起動していない状態の zsh の $TERM の値を設定してください。ここを間違えていると TrueColor 表示できなくなります

次に default-terminal です。これに設定した値が tmux を起動した状態の zsh の $TERM の値になります。この情報を元に italic などが適用されるので、設定がうまくできていないと斜体表示が効かなくなります。

基本的に default-terminaltmux-256color (推奨値)に設定しておけば良いですが、/usr/share/terminfo に tmux-256color がない場合、別の対応をする必要があります。以下を上から試してみてください。

  • ncurses-tmux をインストール
  • tic tmux-256color.terminfo を実行して tmux-256color の設定を生成(後述)
  • default-terminal を screen-256color あるいは xterm-256color に設定

CentOS7 では ncurses-tmux を入れても対応できなかったので、tic を使って対応しました。ticを使う場合は以下を参考にしてください。コマンドで書くと以下の通りです。

$ curl -sL https://raw.githubusercontent.com/jez/dotfiles/master/tmux-256color.terminfo | tic -

How to actually get italics and true colour to work in iTerm + tmux + vim | by Jake Barnes | Medium

vim

Vim の設定は比較的カンタンです。

set termguicolors
" $TERMがxterm以外のときは以下を設定する必要がある。
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum" " 文字色
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum" " 背景色

これを貼ればOKかと思います。

まとめ:

  • ターミナル: TrueColor 非対応だったら乗り換える。対応していたら特に作業なし
  • bash: 作業なし
  • tmux: terminal-overrides と default-terminal を設定する
  • vim: set termguicolors を設定する

参考