Neovim 0.10がリリースされましたが 導入したところシンタックスハイライトがまともに効かない状態になっていたので 取り敢えずの対応について。
Neovim 0.10
結構いろいろな変更が入っていて、 BREAKING CHANGES の項目にもいろいろな変更が含まれています。
termguicolorsのデフォルト値の変更
この中で個人的に問題になったのが
‘termguicolors’ is enabled by default when Nvim is able to determine that the host terminal emulator supports 24-bit color.
これまではこの設定を明に
1
|
|
と設定していなければターミナル上では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に対応しています。
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15awk -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";
}'
こんな感じのスクリプトでなだらかに色が表示されてればOK。 対応していなければ色が飛び飛びの状態になります。
True color
Non-true color
また、
iTerm2上でNeovim 0.10を使うとたしかにtermguicolors
が有効になっていました。
コマンドモードで
1
|
|
で確認出来ます。
0.9でやってみるとnotermguicolors
になっているのに対して
0.10ではtermguicolors
になっていました。
実際シンタックスハイライトもtrue colorで表示されているようで これまでの表示よりも繊細な色が出ています。
が、問題はGNU Screenです。
GNU Screenは現在の4.9.1でもtrue colorに対応していないので true colorは無効な状態で使う必要があります。
使えない状態なのでこれまで通りtermguicolors
を無効のまま使っていれば
問題ないわけですが、
0.10にアップデートしたところシンタックスハイライトがまともに効かない状態になってしまいました。
1
|
|
で確認すると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
|
|
という環境変数が設定されていることでした。
hyperでは設定されてません。
この環境変数がGNU Screenの中でも引き継がれてNeovimが勘違いしていたようです。
実際、
1
|
|
として変更して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
bug#62237: 28.1 or higher: 24-bit true color breaks colours in Emacsen b
version 5では有効になる?といった話もあり、
masterブランチの最新版を使えば有効になっているとの話もあったのですが、
以下からmasterブランチをとってきてビルドしてみたところ、
trulecolor on
のオプションを設定して
neovimを立ち上げたところ、COLORTERM
を設定していない状態では
notermguicolors
になっていました。
また、上の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を空にして見てみるとこの表示が一番上に残った状態で始まります。
ただし、これが書き込まれているわけではなく画面を動かすと消えるようなもの。
どうもこれは
ここで問題にされている問題のようで、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
|
|
を明示して立ち上げるようなスクリプトにしておきました。
追記ここまで
追記: 2024/06/05
fix(tui): move $COLORTERM check to _defaults.lua by gpanders · Pull Request #29197 · neovim/neovim
やはりCOLORTERMに24bit
もしくはtruecolor
がセットされている場合にはそれを使い、
それ以外の値がセットされているか値がない場合にはtruecolorが使えるかどうかチェックしに行くようになっっているみたいです。
追記ここまで