Alloyのtssの文法ってよく分からんですね。css-modeあててもjs2-modeをあててもエラーばっか吐くし、快適にコーディングできん。
ということでちょっと調べてみた。
Alloyのソースコード探していたらgrammerのとこにtss.pegjsってのがあって、ヘッダを読んでみるとTSS parser based on JSON parserって書いてあったので基本的にはJSONらしい。
それにしては{で始まらないよなぁとソースコードを追いかけていくとcompilerUtilsに
// Add enclosing curly braces, if necessary contents = /^\s*\{[\s\S]+\}\s*$/gi.test(contents) ? contents : '{' + contents + '}';
ってあって、要するに{で始まってない場合ファイルのコンテントを{}で囲むことになっているらしい。それからtssはキー値を""で囲まなくてもいいんだけど、囲んでも別に問題なかったりする。
結論としてはJSONで書いておけば、即時構文チェックとかシンタックスハイライトとか効かせられていいんじゃないかと。
つまり
"Label": { font: {fontSize: 20, fontFamily: "Helvetica Neue"}, color: "#999" }
って書いてるところを、最初から
{"Label": { "font": {"fontSize": 20, "fontFamily": "Helvetica Neue"}, "color": "#999" }}
って書くようにすれば、事前に構文のエラーを潰せて気持ちがいい。
Emacsの設定
json-modeを使ってみますが、package.elでは入れられないのでgit cloneしてrequireします。javascript-modeを継承しているのでTabの設定なんかはそっちの設定に従う。
次にFlymakeの設定をする。構文チェックにjslintを使うのでインストールしてない場合には
npm install -g jslint
で入れます。
Emacsのほうの設定はこんな感じ。tabはスペース2個分(個人的な好み)にした。それからelectric-pair-modeも入れてるので{},""をよろしくやってくれる。
;; JSON (require 'json-mode) (add-to-list 'auto-mode-alist '("\\.tss$" . json-mode)) (add-hook 'json-mode-hook 'electric-pair-mode) (add-hook 'json-mode-hook '(lambda () (setq js-indent-level 2) )) (when (load "flymake" t) (defun flymake-jslint-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "jslint" (list "--terse" local-file)))) (setq flymake-err-line-patterns (cons '("^\\(.*\\)(\\([[:digit:]]+\\)):\\(.*\\)$" 1 2 nil 3) flymake-err-line-patterns)) (add-to-list 'flymake-allowed-file-name-masks '("\\.tss\\'" flymake-jslint-init))) (load-library "flymake-cursor")
この設定で少し使ってみる。