TrueColorで表示するのは、わりかし対応がめんどうです。なぜなら、Vim、tmux、zsh、ターミナル全てで対応しなければならないからです。今回はそれぞれどういった対応をすればいいのか紹介します。
まず: TrueColor に対応できているか確認する
TrueColor 対応をする前に、そもそも今対応できているかチェックしましょう。以下のコマンドを実行してください。
$ curl -s https://gist.githubusercontent.com/lifepillar/09a44b8cf0f9397465614e622979107f/raw/24-bit-color.sh | bash
このように継ぎ目がなければOKです。↓
下のように階段状になっていたら対応できていません。↓
上でもかなり明白に違いますが、NeoVimで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 対応には順番があります。
- ターミナル(ターミナルエミュレータ)
- シェル(今回はbash・zsh)
- tmux
- 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-terminal
は tmux-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 を設定する