tmux上のneovimでtrue colorを使ってundercurlを正しく表示する
neovimのカラースキームには、cui用とgui用があり、ターミナルからは本来なら前者しか使えず、256色しか表現することかできません。しかし、最近のターミナルでは、true colorと言って16進数カラーコードで指定可能な色を表現することができます。
この機能を使えば、ターミナルにいながら、gui用のカラースキームでneovimを使えてとても美しいのですが、ターミナルプレクサのtmux上で使用しようとするとある不具合が起こる可能性が高いのでその解決法を解説していきます。
不具合
gui用のカラースキームの中には、(一部cui用でも使っているものがありますが)下の画像のように特定のハイライトに下線や波線を使っているものがあります。
tmuxを使うときの不具合とはずばり、この下線や波線がうまく表示されないというものです。
前提
そもそも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が使えます。
また、ターミナル上で以下のコマンドを打って、きちんとしたグラデーションになっていれば問題ありません。
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"; }'
原因
上で述べた現象の原因は、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 #こうする