Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

tmux上のneovimでtrue colorを使ってundercurlを正しく表示する

neovimのカラースキームには、cui用とgui用があり、ターミナルからは本来なら前者しか使えず、256色しか表現することかできません。しかし、最近のターミナルでは、true colorと言って16進数カラーコードで指定可能な色を表現することができます。

この機能を使えば、ターミナルにいながら、gui用のカラースキームでneovimを使えてとても美しいのですが、ターミナルプレクサのtmux上で使用しようとするとある不具合が起こる可能性が高いのでその解決法を解説していきます。

不具合

gui用のカラースキームの中には、(一部cui用でも使っているものがありますが)下の画像のように特定のハイライトに下線や波線を使っているものがあります。

tmuxを使うときの不具合とはずばり、この下線や波線がうまく表示されないというものです。

f:id:Kotaro7750:20200411173125p:plain
本来なら波線が出る

前提

そもそもtrue color機能を有効化しなければgui用の色は出ないので、ついでにtrue colorの設定も解説していきます。

tmux

tmux.confに以下の設定を追記します。

set-option -g default-terminal "screen-256color"
set-option -ga terminal-overrides ',xterm-256color:Tc'

neovim

vimrcに

set termguicolors

と書くだけです。

確認

:checkhealth このコマンドをneovim内で打つ

以上のコマンドの結果に以下のようにエラーがなければ問題なくtrue colorが使えます。

f:id:Kotaro7750:20200411173128p:plain
checkhealthの結果

また、ターミナル上で以下のコマンドを打って、きちんとしたグラデーションになっていれば問題ありません。

awk 'BEGIN{
    s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
    for (colnum = 0; colnum<77; colnum++) {
        r = 255-(colnum*255/76);
        g = (colnum*510/76);
        b = (colnum*255/76);
        if (g>255) g = 510-g;
        printf "\033[48;2;%d;%d;%dm", r,g,b;
        printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
        printf "%s\033[0m", substr(s,colnum+1,1);
    }
    printf "\n";
}'

f:id:Kotaro7750:20200411173135p:plain
美しいグラデーションが表示されればok

原因

上で述べた現象の原因は、aptで入れられるtmuxのバージョンでは下線や波線に対応していないためです。そのため、ソースから直接ビルドして新しいtmuxを入れる必要があります。 aptでは、これを書いている現在tmux 2.6がインストールされますが、これらの機能は3.0以降で使うことができます。

対処

以下のコマンドで最新版のtmuxをインストールできます。

sudo apt update

sudo apt install libevent-dev libncurses-dev bison

git clone https://github.com/tmux/tmux.git

cd tmux

./autogen.sh

./configure

make

sudo make install

ただし、このままだと今まで使っていたtmuxが残ってしまい、PATHの設定によっては昔のtmuxのほうが参照されてしまうので、昔のtmuxをアンインストールします。

sudo apt remove tmux

tmux -V
tmux next-3.2

tmuxの設定

また、正しく下線や波線を使うにはtmux.confに以下のような設定を追記する必要があります。

set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm'
set -as terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m'

おまけ

新しくしたtmuxでは一部設定方法が昔と異なっているケースがあります。

例えば下の設定は下のように変更する必要があります。

bind \ split-window -h #これはだめ

bind \\ split-window -h #こうする