From 8d3c18621d0bfb47e16a904b8cd106ade7f2111f Mon Sep 17 00:00:00 2001 From: leafOfTree Date: Wed, 14 Apr 2021 10:51:25 +0800 Subject: [PATCH] Set syntax sync by each block syntax --- autoload/vue.vim | 14 +++++++++++--- syntax/vue.vim | 35 ++++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/autoload/vue.vim b/autoload/vue.vim index e95086a..7fb7cf5 100644 --- a/autoload/vue.vim +++ b/autoload/vue.vim @@ -265,17 +265,25 @@ function! vue#GetSyntaxList(config_syntax) endif endfor - " Move basic syntaxes to the end of the list, so we can check + call s:ModifySyntaxOrder(syntax_list) + + return syntax_list +endfunction + +function! s:ModifySyntaxOrder(syntax_list) + let syntax_list = a:syntax_list + + " Move basic syntax to the end of the list, so we can check " if they are already loaded by other syntax. " Order matters - for syntax in ['html', 'javascript', 'css'] + let load_last = ['html', 'javascript', 'css'] + for syntax in load_last let idx = index(syntax_list, syntax) if idx >= 0 call remove(syntax_list, idx) call add(syntax_list, syntax) endif endfor - return syntax_list endfunction call s:Main() diff --git a/syntax/vue.vim b/syntax/vue.vim index 0ff5660..b8892da 100644 --- a/syntax/vue.vim +++ b/syntax/vue.vim @@ -2,13 +2,15 @@ " Maintainer: leaf " Credits: Inspired by mxw/vim-jsx. -if exists('b:current_syntax') && b:current_syntax == 'vue' - finish +if !exists('main_syntax') + if exists('b:current_syntax') && b:current_syntax == 'vue' + finish + endif + let main_syntax = 'vue' endif " is replaced with the file name of the sourced file let s:patch_path = expand(':p:h').'/patch' - let s:test = exists('g:vim_vue_plugin_test') function! s:Init() @@ -99,15 +101,19 @@ function! s:GetSyntaxLangName(syntax) return syntax endfunction -function! s:SetSyntax(block, syntax, lang) +function! s:SetSyntax(block, syntax, has_lang) let block = a:block let syntax = a:syntax - let lang = a:lang + let has_lang = a:has_lang let name = s:GetSynatxName(block, syntax) - let syntax_lang_name = s:GetSyntaxLangName(syntax) - let syntax_lang = lang ? 'lang=["'']'.syntax_lang_name.'["''][^>]*' : '' - let start = '^<'.block.'[^>]*'.syntax_lang.'>' + if has_lang + let lang_name = s:GetSyntaxLangName(syntax) + let lang = 'lang=["'']'.lang_name.'["''][^>]*' + else + let lang = '' + endif + let start = '^<'.block.'[^>]*'.lang.'>' let end = '^' let syntax_group = s:GetGroupNameForHighlight(syntax) @@ -115,9 +121,14 @@ function! s:SetSyntax(block, syntax, lang) \.' start=+'.start.'+' \.' end=+'.end.'+' \.' keepend contains='.syntax_group.', vueTag' + + execute 'syntax sync match vueSync groupthere '.name.' +'.start.'+' + execute 'syntax sync match vueSync groupthere NONE +'.end.'+' endfunction function! s:SetBlockSyntax(config_syntax) + syntax sync clear + for [block, syntax] in items(a:config_syntax) let type = type(syntax) if type == v:t_string @@ -141,10 +152,6 @@ function! s:HighlightVueTag() highlight default link vueTag htmlTag endfunction -function! s:SetSyntaxSync() - syntax sync fromstart -endfunction - function! s:SetIsKeyword() if has("patch-7.4-1142") if has("win32") @@ -162,7 +169,6 @@ function! VimVuePluginSyntaxMain(...) let syntax_list = vue#GetSyntaxList(s:config_syntax) call s:LoadSyntaxList(syntax_list) call s:SetBlockSyntax(s:config_syntax) - " call s:SetSyntaxSync() call s:SetIsKeyword() call s:HighlightVueTag() endfunction @@ -174,3 +180,6 @@ else endif let b:current_syntax = 'vue' +if main_syntax == 'vue' + unlet main_syntax +endif