Posted at

Vimでtermguicolorsをオンにしたらちょっとハマった話

More than 1 year has passed since last update.


はじめに

 iTerm2など24bitカラーに対応している端末上では、Vimの termguicolors オプションをオンにすることで、True Colorでのシンタックスハイライトが可能になります。基本的にはGUIのVimと同様のハイライトになるのですが、ちょっとハマったことがあったので記録しておきます。

 True Colorのシンタックスハイライトの導入自体については、以下の記事などを参考にしてください。


TL;DR

 24bitカラー対応端末上において、termguicolors をオンにすると、使用されるのは guifgguibg のみ。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をお使いの方ならお気づきかと思いますが、ハイライトに違和感があります。大抵のカラースキームでは、ヒットしたワードの背景が明るくハイライトされるからです。

スクリーンショット 2017-06-02 21.26.18.png

 ハイライトの確認を行います。

スクリーンショット 2017-06-02 21.25.14.png

 gui=reverse および guifg=#EFBB24 が指定されているので、ヒットしたワードの背景色が黄色くなり、文字自体は茶色くなっているはずです。しかし、実際にはそうなっていません。


実験

 set termguicolors していれば gui が使用されると思いこんでいたので、一先ず以下のようにコマンドを実行しました。

:highlight Search gui=NONE

 これで gui=reverse が外れるので、guifgguibg が入れ替わるはずです。ところが、実際には変化がありませんでした。再度、ハイライトを確認してみます。

スクリーンショット 2017-06-02 21.27.33.png

 ちゃんと gui がなくなっていますが、これはどうもおかしいです。termguicolors の挙動を調べてみることにしました。


調査

 Vim日本語ドキュメントの termguicolors オプションの項には、このようにありました。


'termguicolors' 'tgc'

オンのとき、highlight-guifg と highlight-guibg がターミナル内で使われる(24ビットカラー)。ISO-8613-3 互換なターミナルが必要。このオプションを設定しても機能しない (色が UI に付かない) 場合は、xterm-true-color を読むと助けになるかもしれない。

引用: options - Vim日本語ドキュメント#'termguicolors'


 termguicolors をオンにして使用されるのは guifgguibg だけで、特に書いてないですが、gui は使われません。したがって、reversecterm に指定する必要があります。


解決

 cterm に指定すれば良いことがわかったので、以下のコマンドを実行します。

:highlight Search cterm=reverse

スクリーンショット 2017-06-02 21.28.52.png

 そして確認。

スクリーンショット 2017-06-02 21.29.23.png

 おお! うまくいきました。カラースキームの制作者様には、cterm にも gui と同じ値を入れるようPull Requestを送信しておきました。

 なお、こちらの修正と、若干の色の変更を加えたカラースキームを以下に用意してあります。良ければお使いください。

foooomio/vim-colors-japanesque: The colorscheme featuring Japanese traditional colors.


感想

 guifgguibg のみが使用されるというのは、非常にトリッキーな仕様だと思うので、gui も使用されるよう改善を希望するのですが、実際問題どうなのでしょうね。undercurl のようにGUIでしか利用できない属性もあるので、難しいのでしょうか?(とはいえ undercurl が使用できないときは underline が代わりに使われるのですが。)