nvim-treesitterを勧めたい

5 min read読了の目安(約5000字

この記事はIPFactory Advent Calender 2020の14日目の記事です。

前日の12月13日はPeD1yによる「Raspberry Pi 4で作る監視カメラ(検出・撮影)」でした。

https://ped1y.hatenablog.com/entry/2020/12/13/231224?_ga=2.96256031.2066065461.1607779804-1552381299.1607779804

はじめに

最近の推しのプラグインであるnvim-treesitterについて書いていきたいと思います。

こんな人におすすめ

これは先に書いといた方がいい気がするので書いておきます。

  • syntax highlightをいい感じにするためにいろいろなプラグインを使っており、設定がめんどくさいと感じたことのある方
  • 「まあまだ開発中のものだからバグがあっても仕方ないよね」と割り切れる人
  • いっぱい色がついて欲しい人

この記事で紹介すること

  • nvim-treesitterのインストール
  • nvim-treesitterの基本的な設定

tree-sitterとは

nvim-treesitterの話をする前にまずはtree-sitterについて一瞬だけ触れます。
公式に説明では以下のように記載されています(DeepLで翻訳)。

Tree-Sitterは、パーサ生成ツールであり、インクリメンタル・パーシング・ライブラリです。ソースファイルの具体的な構文ツリーを構築し、ソースファイルの編集に合わせて効率的に構文ツリーを更新することができます。Tree-Sitterの目的は以下の通りです。
・ あらゆるプログラミング言語を解析するのに十分な汎用性
・ テキストエディタのすべてのキーストロークを解析するのに十分な速さ
・ 構文エラーがあっても有用な結果を提供する十分なロバスト性
・ 依存性がないので、ランタイムライブラリ(純粋なC言語で書かれています)を任意のアプリケーションに組み込むことができます。

https://tree-sitter.github.io/tree-sitter/

詳しくは公式ドキュメントをみてください。

nvim-treesitterとは

nvim-treesitterはtree-sitterを使ってコードをハイライトするneovimのプラグインです。

https://github.com/nvim-treesitter/nvim-treesitter

このプラグイン一つでさまざまな言語をハイライトすることができます。
まだ、実験的な機能なので時々バグります。

インストールする

私はdeinユーザーなので基本的にその方向で説明します。
困ったら公式ドキュメントをご覧ください。

インストールする前に、
まず前提条件としてNeovim nightlyを使っている必要があります。
brewを使っている人であれば

$ brew install --HEAD luajit
$ brew install --HEAD neovim

とすることでnightlyバージョンのものをインストールすることができます。
エラーなどが発生した方は次のissueを参考にしてください。

https://github.com/neovim/neovim/issues/13529#issuecomment-748644315

次にnvim-treesitterをインストールしていきます。
deinユーザーであれば

call dein#add('nvim-treesitter/nvim-treesitter', { 'merged': 0 })

と書くだけでインストール完了です。

設定

次に設定をしていきます。
init.vimに以下のように記述します

lua <<EOF
require'nvim-treesitter.configs'.setup {
  highlight = {
    enable = true,
    disable = {
      'lua',
      'ruby',
      'toml',
      'c_sharp',
      'vue',
    }
  }
}
EOF

nvim-treesitterの設定は基本的にluaで行います。
次のようなlua<<EOFなどで囲ってあげることでvimファイルないにluaの設定を記述できます。

lua <<EOF
...
EOF

nvim-treesitterの設定の大事なところは以下のところです。
このように記述してあげることで機能を有効にしたり、一部の言語では無効にしたりできます。

require'nvim-treesitter.configs'.setup {
  highlight = {
    enable = true,  -- syntax highlightを有効にする
    disable = {     -- 一部の言語では無効にする
      'lua',
      'ruby',
      'toml',
      'c_sharp',
      'vue',
    }
  }
}

インデントの設定をする

tree-sitterを使ってインデントを整えることもできます

require'nvim-treesitter.configs'.setup {
  highlight = {
  ...
  },
  indent = {
    enable = true, -- これを設定することでtree-sitterによるインデントを有効にできます
  }
}

TSInstallをする

基本的な設定はしたのですがこれだけでは動きません。
TSInstallというコマンドを実行する必要があります。
nvim-treesitterでは言語ごとのパーサーやクエリファイルなどが必要になってくるのでこれをインスールします。

次のように実行することで特定の言語のTSInstallを実行できます

:TSInstall <言語名>

また、いちいち一つづつインストールするのがめんどくさいという方は

:TSIntall all

とすることで対応している言語全てのパーサーなどをインストールできます。

また、対応している言語の中でもしっかりとメンテナーがついているものだけをインストールしたいという場合には

:TSInstall maintained

と実行します。

また手動でコマンドを実行してインストールはしたくないという方は設定ファイルに記述することもできます。

require'nvim-treesitter.configs'.setup {
  highlight = {
    enable = true,  -- syntax highlightを有効にする
    disable = {     -- 一部の言語では無効にする
      'lua',
      'ruby',
      'toml',
      'c_sharp',
      'vue',
    }
  },
  ensure_installed = 'all', -- :TSInstall allと同じ
  -- ensure_installed = 'maintained' とすることもできる
}

実際に違いを見てみる

Go

  • Go(nvim-treesitterなし)
  • Go(nvim-treesitterあり)

TypeScript

  • TypeScript(nvim-treesitterなし)
  • TypeScript(nvim-treesitterあり)

nvim-treesitterを使うと何がいいのか?

ここまで見て
「普通にsyntax highlightしてくれるプラグインを使えばいいのでは?」
と思った方もいらっしゃると思います。

では実際にnvim-treesitterを使う前のJavaScript, JSX, TypeScript, TSXの設定をお見せします。

[[plugins]]	
repo = 'leafgarland/typescript-vim'

[[plugins]]
repo = 'othree/yajs.vim'

[[plugins]]	
repo = 'othree/es.next.syntax.vim'		

[[plugins]]	
repo = 'MaxMEllon/vim-jsx-pretty'	
hook_add = '''	
let g:vim_jsx_pretty_colorful_config = 1	
" let g:vim_jsx_pretty_disable_tsx = 1	
'''		

[[plugins]]	
repo = 'pangloss/vim-javascript'	
hook_add = '''	
set conceallevel=1	
let g:javascript_plugin_jsdoc = 1	
let g:javascript_plugin_flow = 1	
'''	

ご覧と通り5つのプラグインを使っていました。これはあくまでもJavaScript, JSX, TypeScript, TSXでのsyntax highlightの設定です。
実際にはさまざまな言語のsyntax highlight周りのプラグインを入れる必要があります。
しかし、nvim-treesitterを使えばnvim-treesitterだけで事足ります。
今までsyntax highlight周りの設定に苦戦していた私からするとnvim-treesitterはとても魅力的です。

最後に

今回は簡単なnvim-treesitterの設定や魅力についてお話ししました。
すでにnvim-treesitterを使っている方にとっては歯応えのない記事となってしまいましたが、この記事を見てnvim-treesitterを使ってくれる人が増えてくれたら嬉しいです(私が開発しているわけではないですが...)。

余談: IPFactoryについて

IPFactoryとは、情報科学専門学校という学校に存在する学内サークルです。 IPFに在籍するメンバーがそれぞれ自身の専門分野についての勉強やアウトプット活動を行っています。 サークル内有志メンバーでCTFを主催したりもしています。 IPFに所属する各メンバーのTwitterやブログ等はこちらのページを参照してください。

https://ipfactory.github.io/