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

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

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

- [tmux on iTerm2 で斜体 & True Color を使う](http://qiita.com/delphinus/items/b8c1a8d3af9bbacb85b8)
- [tmux 上で Vim を True Color (24 bit color) で使う](http://qiita.com/yami_beta/items/ef535d3458addd2e8fbb)

# 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](https://gist.github.com/XVilka/8346728)
※ Vimについては、`termguicolors` が有効になっていること。`vim --version` で確認できる。

# 問題
　[vim-colors-japanesque](https://github.com/aereal/vim-colors-japanesque)という[aereal](https://aereal.org/)さん制作の素晴らしいカラースキームがあるのですが、これをiTerm2上のVimで導入したところ、検索したワードのハイライトが意図した通りに表示されませんでした。これを理由に、この素晴らしいカラースキームを手放すのは惜しいので、原因を探ってみることにしました。


　これは、`tab` というワードを検索した時の表示です。普段Vimをお使いの方ならお気づきかと思いますが、ハイライトに違和感があります。大抵のカラースキームでは、ヒットしたワードの背景が明るくハイライトされるからです。

![スクリーンショット 2017-06-02 21.26.18.png](https://qiita-image-store.s3.amazonaws.com/0/2690/8cb98993-60ff-e323-cb9b-6fcb61311a1b.png)

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

![スクリーンショット 2017-06-02 21.25.14.png](https://qiita-image-store.s3.amazonaws.com/0/2690/abbe8eff-1bfd-78d8-cc2b-f0c21a8cd1d1.png)

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

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

```vim
:highlight Search gui=NONE
```

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

![スクリーンショット 2017-06-02 21.27.33.png](https://qiita-image-store.s3.amazonaws.com/0/2690/add0e0ac-8f10-2e4f-4f04-5f4ca556d2d2.png)

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

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

> 'termguicolors' 'tgc'
> 
> オンのとき、highlight-guifg と highlight-guibg がターミナル内で使われる(24ビットカラー)。ISO-8613-3 互換なターミナルが必要。このオプションを設定しても機能しない (色が UI に付かない) 場合は、xterm-true-color を読むと助けになるかもしれない。
> 
> 引用: [options - Vim日本語ドキュメント#'termguicolors'](http://vim-jp.org/vimdoc-ja/options.html#'termguicolors')

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

# 解決

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

```vim
:highlight Search cterm=reverse
```

![スクリーンショット 2017-06-02 21.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/2690/57e1c3c1-8870-888e-ee4d-54293cfcb117.png)

　そして確認。

![スクリーンショット 2017-06-02 21.29.23.png](https://qiita-image-store.s3.amazonaws.com/0/2690/fa7b23d4-10aa-e4de-48ad-7861ba6f103c.png)

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

　なお、こちらの修正と、若干の色の変更を加えたカラースキームを以下に用意してあります。良ければお使いください。
[foooomio/vim-colors-japanesque: The colorscheme featuring Japanese traditional colors.](https://github.com/foooomio/vim-colors-japanesque)

# 感想

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