はじめに
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
が代わりに使われるのですが。)