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で表示できないです。

tl; dr

それぞれの対応は以下のようになります。

  1. ターミナル: 対応したものを使用
  2. bash/zsh: 設定の必要なし
  3. tmux: terminal-overridesとdefault-terminalを適切に設定
  4. Vim: termguicolorsを有効にする

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

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

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

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

bash/zsh

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

対応は基本的に必要ないです。TrueColorにはTERMという変数の値が関わってくるのですが、これは勝手にzshが決めてくれます。自分で設定してはいけません。bashも、一度ログインシェルにして確認してみましたが、設定をせずともTrueColorで表示されました。

ここで軽く$TERMについて解説します。

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

結構ややこしいのでSSH先の設定をする場合は注意してください。

tmux

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の値を指定

軽く解説します。

まず、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

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かと思います。

参考