syntax のメモ
vim-js を使っていて、 <script type="text/x-template"> 内のハイライトが JavaScript になっていたから、Issue あげたら、すごい丁寧に返してくれた...!!!!!!! すごい優しい方だ...!!!!!!!!
まず、html.vim の部分を見てみる
code:vim
syn region javasScript start=+<script\_^>*>+ keepend end=+</script\_^>*>+me=s-1 contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc んーわからん
:syn-define を見てみる
構文アイテムには3種類ある
1.Keyword (キーワード)
'iskeyword' の文字からなる
完全な単語にのみマッチする
2.Match (マッチ)
単一の正規表現パターンにマッチする
3.Region (リージョン)
正規表現を使う
start のマッチ位置から、endのマッチ位置で終わる
その間はなんでもOK
skip で end にマッチするのを避けることも可能
html.vim の javaScript の構文ハイライトは Region だ
正規表現を使って、範囲を対象とするということか
start={start_pattern}
リージョンの開始のパターン
end={end_pattern}
リージョンの終了のパターン
keepend
リージョンのネストをできないようにする
:syn-keepend をみてね
実際に見ていく
start=+<script\_[^>]*>+ を見てみる
:s などのように、パターンを同じ文字で挟む
この場合、+ で挟んでいる
<script\_[^>]*> にマッチするものが開始位置
\_[] は [] とほぼ同じだけど、改行 (\n) も含める (\n が自動で含まれるのと同じ意味)
複数行に対応するということ
<script type="text/javascript"> とかにマッチする
end=</script\_[^>]*>+me=s-1 を見てみる
</script\_[^>]*> の後ろの me=s-1 が気になる
オフセットを指定できる
{what}={offset} の形で指定
me=s-1 の場合
me:Match End (マッチしたテキストの終了位置のオフセット)
s-1:マッチ部分の先頭から左へ 1文字目
me=s-1 は、</script> の1つ左の文字までという解釈になる
keepend
入れ子を考慮しない
contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc を見てみる
script タグ内での構文グループを指定している
contains とは
:syn-contains を見てね
構文グループ名のリストを指定
指定された構文グループは、そのアイテムの中 (今回の場合、<script> から </script> の間) で始まることを許可される
マッチとリージョンが再帰的にネストできるようになる?
@htmlJavaScript とは?
code:vim
syn include @htmlJavaScript syntax/javascript.vim
include ってなんだ
:syn-include を見てね
関係する構文ファイルを読み込む (source)
htmlCssStyleComment はただのコメント
code:vim
syn match htmlCssStyleCommnet contained "\(<!--\|-->\)"
hi def link htmlCssStyleCommnet Commnet
対処法で教えてもらったものを見てみる
code:vim
augroup ft_html
au!
autocmd FileType html :syn region htmlTemplate matchgroup=htmlScriptTag start=+<script type="text/x-template"\_^>*>+ keepend end=+</script\_^>*>+ contains=@htmlTop augroup END
ファイルタイプが html のときに実行する
region
htmlTemplate という新しい構文グループを作成する
matchgroup とは
リージョンの本体とその開始、終了パターンに対して異なるハイライトをしたいときに使う
この場合、htmlScriptTag グループでハイライトする
で、次に htmlScriptTag が現れるまで、htmlScriptTag として扱われるようになる
contains
@htmlTop とは
code:vim
syn cluster htmlTop contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,javaScript,@htmlPreproc
@htmlTop で @Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,javaScript,@htmlPreproc を表現できる