From 6a94c30ec713b309ac9f79a081d028f22ce036dc Mon Sep 17 00:00:00 2001 From: leafOfTree Date: Fri, 16 Apr 2021 13:33:56 +0800 Subject: [PATCH] Add new 'initial indent' option --- autoload/vue.vim | 39 +++++++++++++++++++++++++------------ indent/vue.vim | 17 ++++++++-------- syntax/patch/javascript.vim | 12 ++++++++++-- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/autoload/vue.vim b/autoload/vue.vim index b5a3978..3148a30 100644 --- a/autoload/vue.vim +++ b/autoload/vue.vim @@ -24,7 +24,7 @@ function! s:MergeDefaultWithConfig(user) \'attribute': 0, \'keyword': 0, \'foldexpr': 0, - \'init_indent': expand('%:e') == 'wpy', + \'initial_indent': [], \'debug': 0, \} @@ -131,7 +131,9 @@ endfunction function! s:SyntaxAtEnd(lnum) let syns = s:SyntaxListAtEnd(a:lnum) - return empty(syns) ? '' : get(syns, 0, '') + let syntax_name = empty(syns) ? '' : get(syns, 0, '') + let syntax_name = s:RemoveCssPrefix(syntax_name) + return syntax_name endfunction function! vue#SyntaxSecondAtEnd(lnum) @@ -141,7 +143,9 @@ endfunction function! s:GetBlockTag(lnum) let syntax_name = s:SyntaxAtEnd(a:lnum) - let tag = tolower(matchstr(syntax_name, '\u\U\+\zeBlock')) + let tag = matchstr(syntax_name, '\(\u\U\+\)\+\zeBlock') + let tag = substitute(tag, '\U\zs\(\u\)', "-\\1", 'g') + let tag = tolower(tag) return tag endfunction @@ -157,21 +161,22 @@ function! vue#AlterSyntaxForEmmetVim(name, syntax) endfunction " Remove css prefix -function! s:RemoveCssPrefix(syntax_name, syntax) - let syntax = a:syntax +function! s:RemoveCssPrefix(syntax_name) + let syntax_name = a:syntax_name + let syntax = matchstr(syntax_name, '^\U\+') if syntax == 'css' - let next_syntax = tolower(matchstr(a:syntax_name, '^\U\+\zs\u\U\+')) + let next_syntax = tolower(matchstr(syntax_name, '^\U\+\zs\u\U\+')) if count(s:style_with_css_prefix, next_syntax) - let syntax = next_syntax + let syntax_name = matchstr(syntax_name, '^\U\+\zs.*') + let syntax_name = tolower(syntax_name[0]).syntax_name[1:] endif endif - return syntax + return syntax_name endfunction function! s:GetBlockSyntax(lnum) let syntax_name = s:SyntaxAtEnd(a:lnum) let syntax = matchstr(syntax_name, '^\U\+') - let syntax = s:RemoveCssPrefix(syntax_name, syntax) return syntax endfunction @@ -196,9 +201,7 @@ endfunction function! vue#LoadSyntax(group, syntax) let group = a:group let syntax = a:syntax - let full_syntax_type = type(s:full_syntax) - if (full_syntax_type == v:t_list && count(s:full_syntax, syntax)) - \ || (full_syntax_type == v:t_string && s:full_syntax == syntax) + if s:IncludeOrEqual(s:full_syntax, syntax) call vue#LoadFullSyntax(group, syntax) else let loaded = vue#LoadDefaultSyntax(group, syntax) @@ -272,6 +275,18 @@ function! vue#GetSyntaxList(config_syntax) return syntax_list endfunction +function! s:IncludeOrEqual(listOrString, item) + let listOrString = a:listOrString + let item = a:item + let type = type(listOrString) + return (type == v:t_list && count(listOrString, item)) + \ || (type == v:t_string && listOrString == item) +endfunction + +function! vue#IncludeOrEqual(listOrString, item) + return s:IncludeOrEqual(a:listOrString, a:item) +endfunction + function! s:ModifySyntaxOrder(syntax_list) let syntax_list = a:syntax_list diff --git a/indent/vue.vim b/indent/vue.vim index 37dd436..162b7cf 100644 --- a/indent/vue.vim +++ b/indent/vue.vim @@ -10,7 +10,7 @@ function! s:Init() """ Configs let s:config = vue#GetConfig('config', {}) let s:config_syntax = s:config.syntax - let s:enable_init_indent = s:config.init_indent + let s:initial_indent = s:config.initial_indent """ Variables let s:indent = {} @@ -131,14 +131,15 @@ function! s:AdjustBlockIndent(syntax, ind) return ind endfunction -function! s:CheckInitIndent(tag, syntax, ind) +function! s:CheckInitialIndent(tag, syntax, ind) let ind = a:ind - let curline = getline(v:lnum) + let add = 0 - let add = s:enable_init_indent - \&& ind == 0 - \&& count(['style', 'script'], a:tag) == 1 - \&& curline !~ s:block_tag + if ind == 0 && getline(v:lnum) !~ s:block_tag + let add = vue#IncludeOrEqual(s:initial_indent, a:tag.'.'.a:syntax) + \ || vue#IncludeOrEqual(s:initial_indent, a:tag) + \ || vue#IncludeOrEqual(s:initial_indent, a:syntax) + endif if add call vue#LogWithLnum('add initial indent') let ind = &sw @@ -284,7 +285,7 @@ function! GetVueIndent() call vue#LogWithLnum('context, ind '.ind) endif - let ind = s:CheckInitIndent(tag, syntax, ind) + let ind = s:CheckInitialIndent(tag, syntax, ind) return ind endfunction diff --git a/syntax/patch/javascript.vim b/syntax/patch/javascript.vim index 78b0c45..62aa030 100644 --- a/syntax/patch/javascript.vim +++ b/syntax/patch/javascript.vim @@ -5,7 +5,15 @@ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let s:config = vue#GetConfig('config', {}) let s:keyword = s:config.keyword -let s:init_indent = s:config.init_indent +let s:initial_indent = s:config.initial_indent + +let s:enable_initial_indent = 0 +for item in s:initial_indent + if match(item, 'script') != -1 + let s:enable_initial_indent = 1 + break + endif +endfor "}}} """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -23,7 +31,7 @@ if !s:keyword | finish | endif let s:vue_keywords = 'name parent functional delimiters comments components directives filters extends mixins inheritAttrs model props propsData data computed watch methods template render renderError inject provide beforeCreate created beforeMount mounted beforeUpdate updated activated deactivated beforeDestroy destroyed setup beforeUnmount unmounted errorCaptured renderTracked renderTriggered' -let s:indent = &sw * (1 + s:init_indent) +let s:indent = &sw * (1 + s:enable_initial_indent) let s:keywords_regexp = '\v^\s{'.s:indent.'}(async )?<(' \.join(split(s:vue_keywords, ' '), '|') \.')\ze'