Panda Noir

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

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

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

対応できているか確認する

まず以下のコマンドを実行してみてください。

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

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

f:id:panda_noir:20191106185205p:plain

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

f:id:panda_noir:20191106185214p:plain

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

f:id:panda_noir:20191106185316p:plain
TrueColor非対応
f:id:panda_noir:20191106185323p:plain
TrueColor対応

TrueColor対応したくなりましたよね?

ターミナルに関わる色の種類

端末での色には2種類ある。

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

対応方法

対応の順は以下のとおり。

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

数字の小さいほうが対応できていないと、それ以降をいじってもtrue colorで表示できない。

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

ターミナルは基本的に設定は要らない。が、true colorに対応していない端末も在るので、true colorに対応しているか調べる必要がある。

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

ここを参考にして、自分のターミナルが対応しているか確認する。といっても、メジャーなターミナルは対応済みなので、よほど変な端末じゃなければ問題ないはず

bash/zsh

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

対応は基本的に必要ない。というより、TERMの値は勝手にzshが決めてくれるので、自分で設定してはいけない。bashも、一度ログインシェルにして確認してみたが、特別設定をせずともTrueColorで表示されたので恐らく対応は要らない。

ここで軽く\$TERMについて解説。

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

tmux

tmuxは結構ややこしい。

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

まず、terminal-overridesにはtmuxを起動していない状態のzshの\$TERMの値を設定する。ここを間違えるとTrueColorで表示できなくなる。ちなみに、SSHサーバー側のzshでの\$TERMは、SSHクライアント側の値となる。

default-terminalで設定した値がtmuxを起動した状態のzshの\$TERMの値となる。そして、この情報を元にitalicなどが適用される。基本的にはtmux-256color(推奨値)に設定しておけばいいが、/usr/share/terminfo以下にtmux-256colorがない場合は別の対応をする必要がある。

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

CentOS7ではncurses-tmuxを入れても対応できなかったので、ticを使って対応した。tic tmux-256color.terminfoは以下を参考にすると良い。コマンドで書くと以下の通り

$ 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

vim

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

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

参考