表題の通り、作ってみました。VSCode 用やら Atom 用などはすでにあるのですが、Vim 用のが見つかんなかったので……。
まずは、構文ハイライト機能を作りました。コード補完や定義ジャンプなどもそのうちできたらいいですね!(予定は未定)
こんな風に、いい感じに色がつきます。
syntax プラグインの作り方
Vim の構文ハイライトはとにかく高機能です。ありとあらゆる言語のニーズに対応するため、機能は複雑で簡単に把握できるものではありません。もちろんドキュメントは完備されているのですが、現時点で 5,344 行 / 142,720 文字あります。
というわけで、かいつまんで要点だけ書きます。
ftdetect
プラグイン
まずは、開いたファイルに対してどの構文ハイライトを使うのか決めないといけません。このために使われるのが ftdetect
プラグインです。プラグインのディレクトリに ftdetect/firestore.vim
というファイルを作ります。
autocmd BufNewFile,BufRead firestore.rules setfiletype=firestore
これには多くの説明はいらないでしょう。詳しくは :h ftdetect, :h :autocmdなどを読んでみてください。
syntax
プラグイン
ここからが本番です。syntax/firestore.vim
というファイルを作成し、まずはおまじないを記入します。
if exists('b:current_syntax')finishendif" ... ここにプラグイン本体を書く ...letb:current_syntax='firestore'
同じファイルタイプのファイルを開いたときに、重複して読み込まれないようにしているのですね。
文字に色がつく仕組み
Vim による構文ハイライトは以下のようにして行われます。
:syntax
コマンドで構文グループを定義する。:highlight
コマンドで構文グループに色をつける。
構文グループとは、指定した規則に基づいて区分した同種のアイテムを指します。……まあこの説明じゃまずわかんないと思いますので例をあげましょう。
構文グループの種類
キーワード
一番単純な構文グループです。指定した単語を色付けするときに使います。
syn keyword firestoreTodo TODO FIXME XXX BUG
syn
はsyntax
コマンドの省略形です。ここから先は慣例に則って省略形を使います。highlight
コマンドの省略形はhi
です。
この例では TODO
, FIXME
, XXX
, BUG
という単語たちに firestoreTodo
という名前をつけています。これが構文グループです。
リージョン
syn region firestoreFunctionBlock start=/{/end=/}/
これも何と無く分かりますね。{
から始まって、}
で終わる領域(リージョン)に firestoreFunctionBlock
という名前をつけています。
マッチ
synmatch firestoreComment +//.*+
これも簡単。正規表現を使って指定するパターンです。この例では //...
のような部分はコメントだよ、ってことで firestoreComment
と名付けているのです。
構文グループに色をつける
あとは色付け……なのですが、一つ一つの構文グループに直接色を指定することはまずありません。Vim にはカラースキームというものがありますので、個人の好みによってつけたい色が異なるはずだからです。
そこで、ハイライトのリンクという機能を使います。システムにデフォルトで定められた構文グループにリンクすることで、同種の色を使うことを Vim に教えてあげるのです。
hi def link firestoreComment Comment
これにより、firestoreComment
という構文グループは Comment
と同じ色にしてね、ということを伝えています。これにより、カラースキームごとに違った色で表示されるはずです。
さらなる深みへ……
はい!今日はここまで!ここまでの説明で、構文ハイライトの基本は抑えられています。vim-firestore を作るために調べたヘルプへのリンクを載せておきますので参考にしてください。
また、以下の記事には大変お世話になりました。もっと詳しく知りたい人は参照してください。
- Vim の構文ハイライトでクリスマスツリー🎄を飾ってメリクリする - はやくプログラムになりたい
- 構文ハイライト全然わかんない……ってときに出会った記事。これで今回のプラグインを書く気になりました。
- Vim のカラースキームが微妙に気に食わないときの対処法 - 反省はしても後悔はしない
SyntaxInfo
コマンド超便利ですね!