自作のVim colorschemeをTreesitterに対応させる
拙作のカラースキーム eva01.vim をTreesitterに対応させる。
とりあえず nvim-treesitterをいれただけの状態は
あきらかに派手になったり、
劣化したり?したが
全体的にはカラフルになった。
しかし、個人的にはカラフルになれば見やすくなるかというとそうではないと思っているので、
もとのシンタックスととあまり変わらないぐらいの見た目にしたい。
Nvim 0.8で破壊的変更があったらしく、それまでの TS*
としていたhighlightは削除されたらしい。
なのでNvim0.8以上を対象に、新しい書き方 (例:hi link @keyword Keyword
) でやっていく。
colors/eva01.vim
に以下のように書いていく。
highlight の種類は h treesitter-highlight-groups
を参照。
if has('nvim-0.8')
hi link @text.literal Comment
hi link @text.reference Identifier
hi link @text.title Title
hi link @text.uri Underlined
hi link @text.underline Underlined
hi link @text.todo Todo
" ...
endif
言語によって変えたいhighlightがある場合はドットに続けて言語名を書く
" rubyのコメントをSpecialにする例
hi link @comment.ruby Special
カーソル下の syntax highlight を知りたい場合は nvim-treesitter/playground プラグインを導入して :TSHighlightCapturesUnderCursor
コマンドを使う。
query を使って更にカスタマイズできる。
after/queries/言語名/highlights.scm
というファイルを作って query を書いていく。
queryの書き方は以下を参照private
の部分に色をつけたい(今回は @preproc
をリンクしたい)なら以下のようにする。
なお行頭の ;; extends
は必須のよう。
;; extends
((identifier) @preproc
(#vim-match? @preproc "^(private|protected|public)$"))
ちなみにqueryの部分はその言語のtreesitterのhighlights.scm を参考にした
もし lua に切り出したいなら lua/eva01/treesitter.lua
のような感じにファイルを作成して
hi link @text.literal String
の部分は以下のように書けば良い。
vim.api.nvim_set_hl(0, "@text.literal", { link = "String" })
colors/eva01.vim
では require する。
if has('nvim-0.8')
lua package.loaded["eva01.treesitter"] = nil
lua require("eva01.treesitter")
endif
注意点としては
- ディレクトリ名を
lua/{your_plugin_name}/
のように名前空間を作ること。 -
lua package.loaded["eva01.treesitter"] = nil
の一行いれること。-
require()
はキャッシュするのでたとえばsource $MYVIMRC
してVimを再読込したときなどに設定がうまく反映されない。
-
参考: https://github.com/willelz/nvim-lua-guide-ja/blob/master/README.ja.md