君はまだVimの真の美しさを知らない

# Hello Geek!
やあ、パソコンカタカタオタクの諸君！

今日もクールなTerminalでエキゾチックなVimをさわっているかい？

ところで君はどんなVimのcolorschemeを使っているだろう。

安定のGruvbox？

伝統のMolokai？

流行りのHybrid？

柔軟なBase16シリーズもいいよね。

それとも僕と同じ古き良きjellybeansかな？

しかし、君はまだ知らないだろう。

そのVimのcolorschemeがまだ輝けるということを

# VimのSyntax Highlightingは不完全

VimのSyntax HighlightingはもともとIDEと比べると完璧とは言い難い。

文法が複雑な言語で複雑な処理を書くと、その差ははっきり現れてくる。

[Photon](https://github.com/s0md3v/Photon?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more)のPythonのコードをVimとVSCodeで見比べてみよう。

![スクリーンショット 2020-12-17 7.35.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/a2960cf1-c58a-6320-167f-2e3a915c72ac.png)


![スクリーンショット 2020-12-17 7.38.48（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/bc3ddf62-a583-3ebc-7d63-75045c478e8c.png)



1枚目がVim、2枚目がVSCodeで開いたファイルだ。

colorschemeはどちらも同じjellybeans。

VSCodeは引数やネスト内の関数がハイライトされているのに、Vimでは白い文字のままだ。

これはjellybeansに限らず、どのcolorschemeでも同じようにハイライトされない処理が存在する。

このようにVimのSyntaxの解析には限界がある。

しかし、だからと言ってその程度の理由でIDEに戻るわけにはいかない。

でも綺麗なThemeで開発したい...

今日はそんな君の悩みを解決しよう！


# nvim-treesitter
![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/a2ec62c2-71de-98af-5d19-34e22f3f4ad4.png)
https://github.com/nvim-treesitter/nvim-treesitter

[nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter)はtree-sitterという構文解析ツールを導入したNeovimのプラグインだ。

このプラグインを導入することで、defaultのVimではできなかった複雑なSyntaxも判別できるようになる。

以下がプラグイン適用前と適用後の違いだ。

![スクリーンショット 2020-12-17 7.49.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/19f79869-add5-bdc2-488e-75f310cd993f.png)

左が素のVimで右がtreesitterを適用したNeovimだ。


先ほどはハイライトされなかった引数やネストされた関数たちがちゃんとハイライトされている。

もう少しわかりやすい例で見てみよう。

次はOpenCVのC++のコードだ。

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/44f1f352-d063-45f0-9d4a-6cc4b32d2b6c.png)




引数、モジュール名、関数、標準ライブラリ、enum...、全てがハイライトされている。

これこそが僕らが本当に見たかったcolorschemeではないだろうか。

# Installation
## Neovim-nightly

`nvim-treesitter`を使うにはNeovimのdeveloper versionの[Neovim-nightly](https://github.com/neovim/neovim/releases/tag/nightly)が必要になる。

macOSであればbrewでinstallできる
(公式のインストール方法にしたがって、実行ファイルをダウンロードするもよし)

```bash
$ brew upgrade neovim
$ brew install --HEAD neovim
```

Linuxであればリリースページから実行ファイルをダウンロードして、任意のパスに設定する。

```bash
$ curl -L https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -o /tmp/nvim-nightly;
$ chmod +x /tmp/nvim-nightly;
$ sudo mv /tmp/nvim-nightly /usr/local/bin;
```

インストールできたらdeveloper versionか確認。

```bash
$ nvim -v
NVIM v0.5.0-dev+919-g08ec36efa
Build type: Release
```

## nvim-treesitter

`nvim-treesitter`はお好みのプラグインマネージャーなりでインストール
↓Plugの場合

```
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
```

`init.vim`にtreesitterの設定をluaのコードで書く。

```lua
" treesitter
lua <<EOF
require'nvim-treesitter.configs'.setup {
  ensure_installed = "maintained", -- one of "all", "maintained" (parsers with maintainers), or a list of languages
  highlight = {
    enable = true,              -- false will disable the whole extension
    disable = { "vue", "ruby" },  -- list of language that will be disabled
  },
}
EOF
```

これであとは `init.vim`を更新すれば美しいcolorschemeを拝めることができる。

よいVimライフを！


# 補足
`nvim-treesitter`の完全適応には、colorscheme側も`treesitter`へのサポートが必要だとコメントいただいた。
非サポートな普通の`colorscheme`でも今まで以上にハイライトされるが、完全な解析に則ったものではないらしい。
https://github.com/rockerBOO/awesome-neovim#treesitter-support

> Treesitter is a new system coming in Neovim 0.5 that incrementally parses your code into a tree that works, even with errors in your syntax. These colorschemes have specifically set colors for treesitter highlight groups. Vim colorschemes will work with the new groups out of the box.