はじめに
iTerm2など24bitカラーに対応している端末上では、Vimの termguicolors オプションをオンにすることで、True Colorでのシンタックスハイライトが可能になります。基本的にはGUIのVimと同様のハイライトになるのですが、ちょっとハマったことがあったので記録しておきます。
True Colorのシンタックスハイライトの導入自体については、以下の記事などを参考にしてください。
TL;DR
24bitカラー対応端末上において、termguicolors をオンにすると、使用されるのは guifg と guibg のみ。gui は使用されず、cterm の指定が有効になる。
環境
- iTerm2 (build 3.0 以上)
- MacVim-Kaoriya (Vim 7.4.1770 以上)
※ Mac標準のTerminal.appは24bitカラーに対応していない。対応している端末については以下のページを参照のこと。
True Colour (16 million colours) support in various terminal applications and terminals
※ Vimについては、termguicolors が有効になっていること。vim --version で確認できる。
問題
vim-colors-japanesqueというaerealさん制作の素晴らしいカラースキームがあるのですが、これをiTerm2上のVimで導入したところ、検索したワードのハイライトが意図した通りに表示されませんでした。これを理由に、この素晴らしいカラースキームを手放すのは惜しいので、原因を探ってみることにしました。
これは、tab というワードを検索した時の表示です。普段Vimをお使いの方ならお気づきかと思いますが、ハイライトに違和感があります。大抵のカラースキームでは、ヒットしたワードの背景が明るくハイライトされるからです。
ハイライトの確認を行います。
gui=reverse および guifg=#EFBB24 が指定されているので、ヒットしたワードの背景色が黄色くなり、文字自体は茶色くなっているはずです。しかし、実際にはそうなっていません。
実験
set termguicolors していれば gui が使用されると思いこんでいたので、一先ず以下のようにコマンドを実行しました。
:highlight Search gui=NONE
これで gui=reverse が外れるので、guifg と guibg が入れ替わるはずです。ところが、実際には変化がありませんでした。再度、ハイライトを確認してみます。
ちゃんと gui がなくなっていますが、これはどうもおかしいです。termguicolors の挙動を調べてみることにしました。
調査
Vim日本語ドキュメントの termguicolors オプションの項には、このようにありました。
'termguicolors' 'tgc'
オンのとき、highlight-guifg と highlight-guibg がターミナル内で使われる(24ビットカラー)。ISO-8613-3 互換なターミナルが必要。このオプションを設定しても機能しない (色が UI に付かない) 場合は、xterm-true-color を読むと助けになるかもしれない。
termguicolors をオンにして使用されるのは guifg と guibg だけで、特に書いてないですが、gui は使われません。したがって、reverse は cterm に指定する必要があります。
解決
cterm に指定すれば良いことがわかったので、以下のコマンドを実行します。
:highlight Search cterm=reverse
そして確認。
おお! うまくいきました。カラースキームの制作者様には、cterm にも gui と同じ値を入れるようPull Requestを送信しておきました。
なお、こちらの修正と、若干の色の変更を加えたカラースキームを以下に用意してあります。良ければお使いください。
foooomio/vim-colors-japanesque: The colorscheme featuring Japanese traditional colors.
感想
guifg と guibg のみが使用されるというのは、非常にトリッキーな仕様だと思うので、gui も使用されるよう改善を希望するのですが、実際問題どうなのでしょうね。undercurl のようにGUIでしか利用できない属性もあるので、難しいのでしょうか?(とはいえ undercurl が使用できないときは underline が代わりに使われるのですが。)




