diff --git a/syntax/vue.vim b/syntax/vue.vim index cd31e44..065a111 100644 --- a/syntax/vue.vim +++ b/syntax/vue.vim @@ -6,89 +6,57 @@ if exists("b:current_syntax") finish endif -if !exists("s:syntaxes") - " Search available syntax files. - function s:search_syntaxes(...) - let syntaxes = {} - let names = a:000 - for name in names - let syntaxes[name] = 0 - endfor +"" +" Get the pattern for a HTML {name} attribute with {value}. +function! s:attr(name, value) + return a:name . '=\("\|''\)[^\1]*' . a:value . '[^\1]*\1' +endfunction - for path in split(&runtimepath, ',') - if isdirectory(path . '/syntax') - for name in names - let syntaxes[name] = syntaxes[name] || filereadable(path . '/syntax/' . name . '.vim') - endfor - endif - endfor - return syntaxes - endfunction +"" +" Check whether a syntax file for a given {language} exists. +function! s:syntax_available(language) + return !empty(globpath(&runtimepath, 'syntax/' . a:language . '.vim')) +endfunction - let s:syntaxes = s:search_syntaxes('pug', 'slm', 'coffee', 'stylus', 'sass', 'scss', 'less', 'typescript') -endif +"" +" Register {language} for a given {tag}. +" If [omit_attr] is 1, the 'lang' attribute may be omitted. +" If [attr_override] is given and not empty, it will be used for the attribute pattern. +function! s:register_language(language, tag, ...) + let omit_attr = a:0 ? a:1 : 0 + let attr_override = a:0 >= 2 ? a:2 : '' + if omit_attr + let start_pattern = '' + else + let start_pattern = ' \_[^>]*' + let start_pattern .= !empty(attr_override) ? attr_override : s:attr('lang', a:language) + endif -syntax include @HTML syntax/html.vim -unlet! b:current_syntax -syntax region html keepend start=/^]*>/ end=/^<\/template>/ contains=@HTML fold + if s:syntax_available(a:language) + execute 'syntax include @' . a:language . ' syntax/' . a:language . '.vim' + unlet! b:current_syntax + execute 'syntax region vue_' . a:language + \ 'keepend' + \ 'matchgroup=Delimiter' + \ 'start=/^<' . a:tag . start_pattern . '\_[^>]*>/' + \ 'end="^"' + \ 'contains=@' . a:language + \ 'fold' + endif +endfunction -if s:syntaxes.pug - syntax include @PUG syntax/pug.vim - unlet! b:current_syntax - syntax region pug keepend start=/" contains=@PUG fold - syntax region pug keepend start=/" contains=@PUG fold -endif - -if s:syntaxes.slm - syntax include @SLM syntax/slm.vim - unlet! b:current_syntax - syntax region slm keepend start=/" contains=@SLM fold -endif - -syntax include @JS syntax/javascript.vim -unlet! b:current_syntax -syntax region javascript keepend matchgroup=Delimiter start=// end="" contains=@JS fold - -if s:syntaxes.typescript - syntax include @TS syntax/typescript.vim - unlet! b:current_syntax - syntax region typescript keepend matchgroup=Delimiter start=/" contains=@TS fold -endif - -if s:syntaxes.coffee - syntax include @COFFEE syntax/coffee.vim - unlet! b:current_syntax - " Matchgroup seems to be necessary for coffee - syntax region coffee keepend matchgroup=Delimiter start="" contains=@COFFEE fold -endif - -syntax include @CSS syntax/css.vim -unlet! b:current_syntax -syntax region css keepend start=/]*>/ end="" contains=@CSS fold - -if s:syntaxes.stylus - syntax include @stylus syntax/stylus.vim - unlet! b:current_syntax - syntax region stylus keepend start=/" contains=@stylus fold -endif - -if s:syntaxes.sass - syntax include @sass syntax/sass.vim - unlet! b:current_syntax - syntax region sass keepend start=/" contains=@sass fold -endif - -if s:syntaxes.scss - syntax include @scss syntax/scss.vim - unlet! b:current_syntax - syntax region scss keepend start=/" contains=@scss fold -endif - -if s:syntaxes.less - syntax include @less syntax/less.vim - unlet! b:current_syntax - syntax region less keepend matchgroup=PreProc start=/" contains=@less fold -endif +call s:register_language('html', 'template', 1) +call s:register_language('pug', 'template', 0, s:attr('lang', '\%(pug\|jade\)')) +call s:register_language('slm', 'template') +call s:register_language('handlebars', 'template') +call s:register_language('javascript', 'script', 1) +call s:register_language('typescript', 'script', 0, '\%(lang=\("\|''\)[^\1]*\(ts\|typescript\)[^\1]*\1\|ts\)') +call s:register_language('coffee', 'script') +call s:register_language('css', 'style', 1) +call s:register_language('stylus', 'style') +call s:register_language('sass', 'style') +call s:register_language('scss', 'style') +call s:register_language('less', 'style') let b:current_syntax = "vue" diff --git a/test/install.sh b/test/install.sh index ccc8e2a..1e08228 100755 --- a/test/install.sh +++ b/test/install.sh @@ -8,6 +8,7 @@ repos=( 'digitaltoad/vim-pug' 'groenewege/vim-less' 'kchmck/vim-coffee-script' + 'leafgarland/typescript-vim' 'slm-lang/vim-slm' 'wavded/vim-stylus' ) diff --git a/test/test_indent.vader b/test/test_indent.vader index 2e283b2..36c8847 100644 --- a/test/test_indent.vader +++ b/test/test_indent.vader @@ -1,7 +1,7 @@ # # HTML # -Given vue(An unindented html template): +Given vue (An unindented html template):