TrueColorで表示しようとすると、わりかし対応がめんどうです。なぜなら、Vim、tmux、zsh、ターミナル全てで対応しなければならないからです。今回はそれぞれどういった対応をすればいいのか紹介します。
対応できているか確認する
まず以下のコマンドを実行してみてください。
$ 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など、それぞれで色の割り当てが異なっています。
対応方法
対応の順は以下のとおり。
- ターミナル(ターミナルエミュレータ)
- シェル(今回はbash・zsh)
- tmux
- vim
数字の小さいほうが対応できていないと、それ以降をいじってもtrue colorで表示できないです。
tl; dr
それぞれの対応は以下のようになります。
- ターミナル: 対応したものを使用
- bash/zsh: 設定の必要なし
- tmux: terminal-overridesとdefault-terminalを適切に設定
- 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-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
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かと思います。