tmux 上の Emacs で 24-bit color を表示する方法


![truecolor-emacs-on-tmux.png](https://qiita-image-store.s3.amazonaws.com/0/5459/8f33f2f6-865e-df27-489e-556953b495bf.png "truecolor-emacs-on-tmux.png")

## TL; DR
Emacs 26.1 と iTerm2 v3 以上が前提になります。

以下のファイルを作ります;

```plaintext:terminfo-24bit.src
# Use colon separators.
xterm-24bit|xterm with 24-bit direct color mode,
  use=xterm-256color,
  setb24=\E[48:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
  setf24=\E[38:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
# Use semicolon separators.
xterm-24bits|xterm with 24-bit direct color mode,
  use=xterm-256color,
  setb24=\E[48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
  setf24=\E[38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
```

terminfo データベースに登録します;

```cosole:
$ tic -x -o ~/.terminfo terminfo-24bit.src
```

~/.tmux.conf に以下のように 2 行付け加えます;

```console:
$ cat << EOF >> ~/.tmux.conf
set -g default-terminal "xterm-24bits"
set-option -ga terminal-overrides ",xterm-24bits:Tc"
EOF
```

`~/.bashrc` あるいは `~/.zshrc` に以下の行を付け加えます。

```shell:
eval `tset -s xterm-24bits`
```

一旦シェルから抜けて入り直し tmux を起動した上で Emacs を起動します。`M-x list-colors-display` に色名が増えていたら成功です。


## Emacs 26.1 supports 24-bit colors
Emacs 26.1 がリリースされました。[Change Log](https://www.gnu.org/software/emacs/news/NEWS.26.1) には正式にターミナルでの 24bit color が使えるようになった旨記載がされています。

以下その記述の引用です

> ** Emacs now supports 24-bit colors on capable text terminals.
Terminal is automatically initialized to use 24-bit colors if the
required capabilities are found in terminfo.  See the FAQ node
"(efaq) Colors on a TTY" for more information.

[efaq の Colors on a TTY](https://fossies.org/linux/emacs/doc/misc/efaq.texi#Colors-on-a-TTY) を見ろとか言っているので見てみます。

なんか terminfo データベースに `xterm-24bits?` エントリを追加して、TERM 環境変数にそれを指定して Emacs を起動しろってことみたいです。

## tmux なしにやってみる

efaq に書いてあるとおりに tic で terminfo データベースにエントリを追加して起動してみます。

```console:
$ TERM=xterm-24bit emacs -nw
```

そこで `M-x list-colors-display` をやってみるとたしかに 256 色の時以上に色名が出てきてどうやら 24bit-color で表示できているらしいことが確認できます。

## tmux の上でやってみる
まあうまくいかないんですねこれが。Emacs で色が一切つかなくなります。`M-x list-colors-display` には色がつかない色名がずらっと並びます。ですが、TERM 環境変数に指定する値を `xterm-24bits` (値の末尾に s を付加する) にするとうまくいくんですね (これを見つけるのにかなり試行錯誤したのでこのエントリを起こすことにしました)。

```console:
$ TERM=xterm-24bits tmux
$ TERM=xterm-24bits emacs -nw
```

terminfo データベースには一度付け加えれば後は恒久的なので、あとは TERM 環境変数をどうにかすれば完成です。あといろいろ見てると `.tmux.conf` に `set-option -ga terminal-overrides ",xterm-24bits:Tc"` の記述が必要そうなので一応追加しておきます。

## まとめ

* efaq に従い terminfo データベースにエントリを追加
* `~/.(zsh|bash)rc` (あるいはそれに相当するファイル)に `eval ``tset -s xterm-24bits``` と記述 (TERM 環境変数を設定している行があればコメントアウト or 削除)
* `~/.tmux.conf` に以下の二つを記述
  * `set -g default-terminal "xterm-24bits"`
  * `set-option -ga terminal-overrides ",xterm-24bits:Tc"`
* tmux の上で Emacs を起動し `M-x list-colors-display` を見てみる

一応 tmux 的には tmux の外 (tmux 起動前) の TERM 環境変数には rxvt 系を指定して、tmux の内側では screen 系を指定してくれと [tmux FAQ](https://github.com/tmux/tmux/wiki/FAQ) に記述があるのでなにか不具合が起きるかもしれませんが、当然のことながら私は関知しません :smiley: 

## 20180608 追記
tmux の外において TERM 環境変数が xterm-24bits でないとき偽りの 24-bit color でした (`M-x list-colors-display` は色名を報告してくるけど実際には 256 色しか出ていない)。なのでその旨加筆しました。

## 参考文献

* [Emac 26.1 Change Log](https://www.gnu.org/software/emacs/news/NEWS.26.1)
* [(efaq) Colors on a TTY](https://fossies.org/linux/emacs/doc/misc/efaq.texi#Colors-on-a-TTY) 
* [tmux FAQ](https://github.com/tmux/tmux/wiki/FAQ)
* [tmux 上で Vim を True Color (24 bit color) で使う](https://qiita.com/yami_beta/items/ef535d3458addd2e8fbb)