というわけで中身を読もうとやっていっていたわけだが、SATySFiにはVim向けのシンタックスハイライターがない。当たり前だ。新興の言語なのだから。だが読むに当たってシンタックスハイライトがされないというのは非常にしんどい。なので最低限のハイライトがされるようなスクリプトを書くことにした。 気持ちとしては、SATySFiを使えるようになりたいがシンタックスハイライトがないと読みにくい、しかしSATySFiについて詳しくないのでどこをハイライトしたらいいかわからない、というデッドロックを破るための、ブートストラッピングの最初の一手というところである。
まだとても完成と言える状態ではないが、最低限度の質素なハイライトはされるので、自分でやるのが面倒だという方は使ってみて欲しい。そしてあなたがハイライトに物申したいときは遠慮なくissueなりPRを送っていただきたい。
これが突貫工事であることを除いても、私はまだvimのシンタックスファイルにもOCamlにもSATySFiの構文にも詳しくないので、ハイライトされるべき箇所がされていない可能性は高いし、それを見つけられる可能性も高い。
まあ、vimの構文ファイルもSATySFiも知らない人間が1時間で作ったということに思いを馳せれば、たいていのことは許していただけると思う。
ところで私は今までVim用のシンタックスファイルを書いたことがない。作り方も導入の仕方も知らない。今まで自作言語でも作っていれば経験があっただろうが、仕方のないことだ。調べなければならない。
vimには素晴らしいドキュメントがある。しかも日本語だ。
あるいは、こちらでもよい。
Creating your own syntax files | Vim Tips Wiki | FANDOM powered by Wikia
まず、vimの普段のシンタックスハイライトは、c.vimのようなファイルがあることがわかる。単純なコードならこれを見ることで色々とわかるかもしれないが、とても読めるような代物ではない。私と同様の環境なら、/usr/share/vim/vim??/syntax/*.vim
のような場所にシンタックスファイルが死ぬほど転がっているが、これを材料に独学するのは非常に難しい。
素直にドキュメントを読み進めることにしよう。ドキュメントの構文ハイライトファイルのセクションを見れば、ある程度のことがわかる。
しかし、書き始める前に確認できる状態を整えねばならない。最終的にはvimのパッケージマネージャで管理できるようにするべきだが、書いている途中に毎度updateするのはしんどい。それ以上に、パッケージマネージャの仕組みを今から調べる時間はない。
よって、一番原始的な方法で実行する。まず、~/.vim/
ディレクトリにftdetect
とsyntax
というディレクトリを作る。まずftdetect
にsatysfi.vim
というファイルを置き、その中に以下を書き込む。
autocmd BufNewFile,BufRead *.saty,*.satyh set filetype=satysfi
ftdetectは file type detect の略で、これによって*.saty
ファイルや*.satyh
ファイルを開いた時にファイルタイプが設定されるらしい。
ファイルタイプがわかったら、シンタックスファイルを選べる。syntax
ディレクトリにsatysfi.vim
なるファイルを設置する。で、とりあえず以下を書こう。
if exists("b:current_syntax") finish endif
これは、既にシンタックスが定義されていた場合に終了するためのものだ。やっておいた方が行儀がよいだろう。
では、まず手始めにコメントがコメントと認識されるようにしよう。
syn match satysfiComment /%.*/ hi def link satysfiComment Comment
一行目がsatysfiComment
という構文要素の定義だ。名前に続く正規表現、つまり%
から始まる文字列にマッチする場合、それはsatysfiComment
である。
続いて、hi def link
は構文要素をCommentというハイライトグループに紐付ける。
カラースキームはこれらの構文要素に色を設定していくものだろう、と思っている(作ったことがないのでこれは予想である)。
グループについてはドキュメントの以下の部分が、
基本的には、ハイライトしたいと感じる部分を見出し、一応Lexerを見つつどういったものか確認して、マッチする正規表現を書く、という形でやっていった。
括弧ごと何かしたい場合などは、syn region start="" end=""
が、単なるキーワードにはsyn keyword
が使える。
困ったのはキーワードのin
で、これを単にkeyword
にすると、例えばプリミティブのtext-in-math
などの真ん中のin
が誤ってハイライトされる。
普通にやるとケバブ・ケースの命名規則はサポートされないのだ。
ケバブ・ケースといえばLispなのでLispの構文ファイルを少し見に行ったが、難しすぎたので逃げ帰ってきた。
だがこの位なら自力でなんとかできるだろう、と思いしばらくsatysfiパッケージのソースなどを読んでいたところ、in
直後に改行もしくは空白のマッチでよいのではという気がしてきたのでそのようにした。
とまあ、いくつかの困ったところに関しては死ぬほどアドホックなことをしているので、まだ色々変わると思われる。 順調にSATySFi(とvimの構文ファイル)に詳しくなれればより改善されていくと思うので、暖かく見守ってほしい。