satysfi.vimを作った

というわけで中身を読もうとやっていっていたわけだが、SATySFiにはVim向けのシンタックスハイライターがない。当たり前だ。新興の言語なのだから。だが読むに当たってシンタックスハイライトがされないというのは非常にしんどい。なので最低限のハイライトがされるようなスクリプトを書くことにした。 気持ちとしては、SATySFiを使えるようになりたいがシンタックスハイライトがないと読みにくい、しかしSATySFiについて詳しくないのでどこをハイライトしたらいいかわからない、というデッドロックを破るための、ブートストラッピングの最初の一手というところである。

まだとても完成と言える状態ではないが、最低限度の質素なハイライトはされるので、自分でやるのが面倒だという方は使ってみて欲しい。そしてあなたがハイライトに物申したいときは遠慮なくissueなりPRを送っていただきたい。

github.com

これが突貫工事であることを除いても、私はまだvimシンタックスファイルにもOCamlにもSATySFiの構文にも詳しくないので、ハイライトされるべき箇所がされていない可能性は高いし、それを見つけられる可能性も高い。

まあ、vimの構文ファイルもSATySFiも知らない人間が1時間で作ったということに思いを馳せれば、たいていのことは許していただけると思う。


ところで私は今までVim用のシンタックスファイルを書いたことがない。作り方も導入の仕方も知らない。今まで自作言語でも作っていれば経験があっただろうが、仕方のないことだ。調べなければならない。

vimには素晴らしいドキュメントがある。しかも日本語だ。

syntax - 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/ディレクトリにftdetectsyntaxというディレクトリを作る。まずftdetectsatysfi.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というハイライトグループに紐付ける。 カラースキームはこれらの構文要素に色を設定していくものだろう、と思っている(作ったことがないのでこれは予想である)。

グループについてはドキュメントの以下の部分が、

syntax - Vim日本語ドキュメント

vimで使える正規表現は以下の記事が参考になる。

vim正規表現リファレンス - Qiita

基本的には、ハイライトしたいと感じる部分を見出し、一応Lexerを見つつどういったものか確認して、マッチする正規表現を書く、という形でやっていった。 括弧ごと何かしたい場合などは、syn region start="" end=""が、単なるキーワードにはsyn keywordが使える。


困ったのはキーワードのinで、これを単にkeywordにすると、例えばプリミティブのtext-in-mathなどの真ん中のinが誤ってハイライトされる。 普通にやるとケバブ・ケースの命名規則はサポートされないのだ。 ケバブ・ケースといえばLispなのでLispの構文ファイルを少し見に行ったが、難しすぎたので逃げ帰ってきた。 だがこの位なら自力でなんとかできるだろう、と思いしばらくsatysfiパッケージのソースなどを読んでいたところ、in直後に改行もしくは空白のマッチでよいのではという気がしてきたのでそのようにした。

とまあ、いくつかの困ったところに関しては死ぬほどアドホックなことをしているので、まだ色々変わると思われる。 順調にSATySFi(とvimの構文ファイル)に詳しくなれればより改善されていくと思うので、暖かく見守ってほしい。