LinuxにおけるターミナルのTrueColorについて

2021年9月3日Linux,Tip’s,プログラミング

ターミナルでのTrueColor表示について

ターミナルでtruecolor表示するには、Vim、tmux、シェル、ターミナル全てで対応しなければならないらしい。
そこで、どのような設定、対応をすればよいか調べてみる。

現在の対応状況の確認

まずは、以下のコマンドで確認してみる。

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

表示色に継ぎ目がなければOKだが、色がブロック状になっていたら非対応。

NeoVimのカラースキーム表示でもTrueColor対応できているか確認することができる。

ターミナルカラー

端末のカラー表示には2種類ある。

TrueColor

  • RGBそれぞれ8ビットを用いて表現します。24ビットカラー(#000000)
  • RGBAさらに透明度8ビットを合わせた32ビットカラー。(#000000ff:最後の2bitで透明度)

8-bit color

  • 256色
  • 1~256までの数字表す。”RED”,”Yellow”,"WHITE"など、xtermやscreenなどはそれぞれで色の割り当てが異なる。

対応方法

それぞれの対応方法は以下の通り。

  1. ターミナル:
  • 対応したものを使用
  1. シェル(bash/zsh:)
  • 特に設定の必要はないが、使用ターミナルによっては環境変数の指定が必要かも。
  1. tmux:
  • terminal-overridesとdefault-terminalを適切に設定
  1. Vim:
  • termguicolorsを有効にする

上位(小さい数字)の対応ができていないと、それ以下はtrue colorで表示できない。

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

ターミナルはtrue colorに対応している端末を利用する。

  • rxvtは非対応なので、turucolor対応のパッチを充てるか、すでにパッチを充ててあるものをインストールする。

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

上記サイトにて、ターミナルの対応状況の確認ができる。

bash/zsh

TrueColorには環境変数TERMの値が関わってくるので、適宜設定する。
インストールする端末等で設定できる。

$TERMについての補足。

$TERMは、sshクライアント側の$TERMがそのままsshサーバーの$TERMになる。もしクライアントがtmuxを起動していた場合、tmuxのdefault-terminalの値がサーバー側の$TERMになる。

シェルの設定(bashrc,zshrc等)で

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の値です。

基本的にdefault-terminalはtmux-256color(推奨値)に設定しておけば良い。
もし、
/usr/share/terminfoにtmux-256color
がない場合は、以下の対応をする必要がある。

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

vim

Vimは以下の内容を起動ファイル(vimrc,initvim等)に記入。

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

参考サイト

“Italic fonts in iTerm2, tmux, and vim" by Alex Pearce
Unix & Linux by Stack Exchange
term – Vim日本語ドキュメント
tmux 上で Vim を True Color (24 bit color) で使う – Qiita
TrueColor対応のはなし(端末、シェル、tmux、vim)