rcmdnk's blog
Last update

20240519_truecolor_200_200

Neovim 0.10がリリースされましたが 導入したところシンタックスハイライトがまともに効かない状態になっていたので 取り敢えずの対応について。

Neovim 0.10

News-0.10 - Neovim docs

結構いろいろな変更が入っていて、 BREAKING CHANGES の項目にもいろいろな変更が含まれています。

termguicolorsのデフォルト値の変更

この中で個人的に問題になったのが

‘termguicolors’ is enabled by default when Nvim is able to determine that the host terminal emulator supports 24-bit color.

これまではこの設定を明に

1
set termguicolors

と設定していなければターミナル上では24-bitのtrue colorは無効になっていましたが 0.10からは環境を見てTrue colorがサポートされているとみなされるとこれが自動的に有効になるようになりました。

現在多くの端末エミュレータはtrue colorに対応しているので これまで上記の設定をしてなかった人は0.10にアップデートした時点で シンタックスハイライトが少し変わった表示になっているかもしれません。

デフォルトのカラースキーマ自体が変わったので そちらの影響で変わっている部分もあるかもしれません。

とはいえ、true colorが使えるのであれば使った方がより繊細な表示で 最近のカラースキーマはGUIを中心としてtrule color前提で作られているものが多いので 使えるなら使ったほうが良いとは思います。

iTerm2 + GNU Screenでのtrue color対応

macOSのもともと入っているターミナルアプリはtrue colorに対応していませんが iTerm2ではtrue colorに対応しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
awk -v term_cols="${width:-$(tput cols || echo 80)}" -v term_lines="${height:-1}" 'BEGIN{
s="/\\";
total_cols=term_cols*term_lines;
for (colnum = 0; colnum<total_cols; colnum++) {
r = 255-(colnum*255/total_cols);
g = (colnum*510/total_cols);
b = (colnum*255/total_cols);
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%2+1,1);
if (colnum%term_cols==term_cols) printf "\n";
}
printf "\n";
}'
bash

こんな感じのスクリプトでなだらかに色が表示されてればOK。 対応していなければ色が飛び飛びの状態になります。

True color 20240519_truecolor.png

Non-true color 20240519_nontruecolor.png

また、 iTerm2上でNeovim 0.10を使うとたしかにtermguicolorsが有効になっていました。

コマンドモードで

1
: set termguicolors?

で確認出来ます。

0.9でやってみるとnotermguicolorsになっているのに対して 0.10ではtermguicolorsになっていました。

実際シンタックスハイライトもtrue colorで表示されているようで これまでの表示よりも繊細な色が出ています。

が、問題はGNU Screenです。

GNU Screenは現在の4.9.1でもtrue colorに対応していないので true colorは無効な状態で使う必要があります。

使えない状態なのでこれまで通りtermguicolorsを無効のまま使っていれば 問題ないわけですが、 0.10にアップデートしたところシンタックスハイライトがまともに効かない状態になってしまいました。

1
: set termguicolors?

で確認するとtermguicolorsになっています。

GNU screenにはtruecolor onという設定がありますが、 このオプションは少なくとも現状のステーブルバージョンでは意味がない設定になっています。

ですが、このオプションをonにしてもoffにしても上の状況は変わらず。

Windowsでは Hyper を使っていますが、こちらもtrue color対応で、そのままだとNeovimで0.10ではtrue colorが使われていますが、 Gnu Screenを使っているとtrue colorが使われていない状態になっています。

実際notermguicolorsになっていました。

ということでGNU Screenの設定など以外で何かiTermの場合だけscreen内でもtrue colorが有効だと勘違いする設定があるみたいです。

問題なのは

1
COLORTERM=truecolor

という環境変数が設定されていることでした。

hyperでは設定されてません。

この環境変数がGNU Screenの中でも引き継がれてNeovimが勘違いしていたようです。

実際、

1
unset COLORTERM

として変更してNeovimを起動するとtermguicolorsが無効になりました。

他のターミナル上でCOLORTERMが設定されていなくてもこれまで特に不満はなかったので 取り敢えずはこれで対応しておきます。

GNU Screenでのtrue color対応

GNU Screenでtrue colorが有効にできればよいわけですが、ちょっとやった感じうまくいってません。

上にも書いたようにtruecolor onという設定があるのですが、それは現状バージョンでは意味がない設定になっています。

GNU Screen : True color (24bit) support / Applications & Desktop Environments / Arch Linux Forums

truecolor support in screen? (on ubuntu) Ars OpenForum

bug#62237: 28.1 or higher: 24-bit true color breaks colours in Emacsen b

version 5では有効になる?といった話もあり、 masterブランチの最新版を使えば有効になっているとの話もあったのですが、 以下からmasterブランチをとってきてビルドしてみたところ、 trulecolor onのオプションを設定して neovimを立ち上げたところ、COLORTERMを設定していない状態では notermguicolorsになっていました。

screen.git - screen

また、上のawkコマンドを実行してみると、薄緑一色が表示される状態で明らかになにかおかしな状態。

さらにNeovimを立ち上げてset termguicolorsを設定すると なにもないところでも変な色が表示されるようになりました。

どうもまともに色付けが働いてない状態です。

現在のmasterは2024/03/27のコミットが最終コミットで、 どこかの状態だとうまく動いているのもあるのかもしれませんが。

もしくは何かしらビルド時のオプションや、設定のほうでなにかあるのかも。

ぱっとではうまくいかなかったので、またそのうち調べてみます。

ChatGPTに聞いてみたら、truecolorオプションなど教えてくれましたが、 うまくいかないというとtmux使え、と言い出してしまい。。。

上のリンクの中でもそういった話の流れもあるのでまあそういうのを学んでいるのだと思いますが、 ちょっと悲しい。

追記: 2024/05/24

unset COLORTERMで対応していたところ、GNU screen内からNeovimを立ち上げると一瞬、

+q5463;524742;73657472676266;73657472676262$qm

みたいな何か文字化けのような変なものが見えるようになりました。

init.vimで色々設定しているとその作業でこれが消えた状態に最終的になりますが、 .init.vimを空にして見てみるとこの表示が一番上に残った状態で始まります。

ただし、これが書き込まれているわけではなく画面を動かすと消えるようなもの。

どうもこれは

DECRQSS +q5463;524742;73657472676266;73657472676262$qm appears in terminal · Issue #28776 · neovim/neovim

ここで問題にされている問題のようで、GNU Screenで対応できていない(?)エスケープシーケンスを使って truecolorをチェックしていることによりそれがそのまま表示されてしまうといった問題の模様(きちんとは理解していない)。

概要としては0.10.0からtruecolorかどうかを動的にチェックするようになって、 その過程で行う作業で出てくるものとのこと。

set notermguicolorsとして明示的にtruecolorをoffにしておけばこのチェックを行わないので これが出ません。

ということで、init.vimの中でnotermguicolorsをセットしておくことにしました。

COLORTERMに関しては特にどっちでも変わらない状況ではありますが、 setしてあっても困らないので一旦GNU screenに入るときでもunsetせずにそのままにしておくように。

これによってGNU screenを使わないときでもtruecolorを使えない状態にはなりますが、 基本的にGNU screen内で作業するので、きれいな表示だとしても下手に違う表示になる方が気持ち悪いので 全てでnotermguicolorsでやるほうが良いだろう、という言い訳をしてそうしておきます。

追記ここまで

追記: 2024/05/29

Windows上で Hyper™ を使ってWSL2上のNeovimを使っているのですが、 この際、COLORTERMはあらかじめセットされていない状態で、 この状態だとGNU screen内でset notermguicolorsをしていても上のエスケープシーケンスが表示されるようになってしまいました。

COLORTERMがセットされていない状態だと最初にチェックを行うようになっているのか、 そのチェックの過程でエスケープシーケンスが表示されるようです。

COLORTERMの値ですが、truecolorもしくは24bitが取れるようですが、

export COLORTERM=truecolor (#5294) · イシュー · George Nachman / iterm2 · GitLab

このどちらにしてもnotermguicolorsになっていなければNeovim上ではtruecolorが有効になりました。

COLORTERMをunsetするか、0や1といった意味のない(ターミナルによっては意味がある?)値にすると notermguicolorsをセットしなくてもtruecolorは無効になりますが エスケープシーケンスが表示される状態になります。

Hyperではtruecolorをサポートしていますが、直接立ち上げた状態ではCOLORTERMはセットされていませんが notermguicolorsをセットしなければtruecolorが有効になり、かつきちんと表示されます。

ということで、GNU screenを立ち上げる際、逆に

1
export COLORTERM=24bit

を明示して立ち上げるようなスクリプトにしておきました。

追記ここまで

追記: 2024/06/05

fix(tui): move $COLORTERM check to _defaults.lua by gpanders · Pull Request #29197 · neovim/neovim

やはりCOLORTERMに24bitもしくはtruecolorがセットされている場合にはそれを使い、 それ以外の値がセットされているか値がない場合にはtruecolorが使えるかどうかチェックしに行くようになっっているみたいです。

追記ここまで

Sponsored Links
Sponsored Links

« HHKBを使った分割キーボードもどき体験 Neovim 0.10でcolorschemeを以前のように戻す »

}