Closed6

自作のVim colorschemeをTreesitterに対応させる

hachyhachy

拙作のカラースキーム eva01.vim をTreesitterに対応させる。
とりあえず nvim-treesitterをいれただけの状態は

あきらかに派手になったり、

劣化したり?したが

全体的にはカラフルになった。

しかし、個人的にはカラフルになれば見やすくなるかというとそうではないと思っているので、
もとのシンタックスととあまり変わらないぐらいの見た目にしたい。

hachyhachy

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 コマンドを使う。

hachyhachy

もしハイライトされてない場合があればこちら を参考に、利用できるハイライトグループがあるかもしれない。

hachyhachy

query を使って更にカスタマイズできる。
after/queries/言語名/highlights.scm というファイルを作って query を書いていく。

queryの書き方は以下を参照
https://zenn.dev/monaqa/articles/2021-12-22-vim-nvim-treesitter-highlight
例えば ruby の private の部分に色をつけたい(今回は @preproc をリンクしたい)なら以下のようにする。
なお行頭の ;; extends は必須のよう。

;; extends

((identifier) @preproc
 (#vim-match? @preproc "^(private|protected|public)$"))

ちなみにqueryの部分はその言語のtreesitterのhighlights.scm を参考にした

hachyhachy

もし 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

このスクラップは2022/11/27にクローズされました