mirror of
https://github.com/leafOfTree/vim-vue-plugin.git
synced 2025-12-08 21:54:46 +08:00
Refactor the whole plugin
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
README.html
|
README.html
|
||||||
test.vue
|
test.vue
|
||||||
|
.DS_STORE
|
||||||
|
|||||||
234
autoload/vue.vim
234
autoload/vue.vim
@@ -1,22 +1,78 @@
|
|||||||
" Since vue#Log and vue#GetConfig are always called
|
" Since vue#Log and vue#GetConfig are always called
|
||||||
" in syntax and indent files,
|
" in syntax and indent files,
|
||||||
" this file will be sourced when opening the first vue file
|
" this file will be sourced on opening the first vue file
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
function! s:GetConfig(name, default)
|
function! s:GetConfig(name, default)
|
||||||
let name = 'g:vim_vue_plugin_'.a:name
|
let name = 'g:vim_vue_plugin_'.a:name
|
||||||
return exists(name) ? eval(name) : a:default
|
let value = exists(name) ? eval(name) : a:default
|
||||||
|
|
||||||
|
if a:name == 'config'
|
||||||
|
let value = s:MergeDefaultWithConfig(value)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return value
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let s:name = 'vim-vue-plugin'
|
function! s:MergeDefaultWithConfig(user)
|
||||||
let s:load_full_syntax = s:GetConfig("load_full_syntax", 0)
|
let default = {
|
||||||
let s:debug = s:GetConfig("debug", 0)
|
\'syntax': {
|
||||||
|
\ 'script': ['javascript'],
|
||||||
|
\ 'template': ['html'],
|
||||||
|
\ 'style': ['css'],
|
||||||
|
\},
|
||||||
|
\'attribute': 0,
|
||||||
|
\'keyword': 0,
|
||||||
|
\'foldexpr': 0,
|
||||||
|
\'init_indent': expand('%:e') == 'wpy',
|
||||||
|
\'full_syntax': [],
|
||||||
|
\'debug': 0,
|
||||||
|
\}
|
||||||
|
|
||||||
|
let user = a:user
|
||||||
|
for key in keys(default)
|
||||||
|
if has_key(user, key)
|
||||||
|
let default[key] = user[key]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return default
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CheckVersion()
|
||||||
|
if !exists('g:vim_vue_plugin_config')
|
||||||
|
let message = 'Please check README.md or https://github.com/leafOfTree/vim-vue-plugin'
|
||||||
|
echom '['.s:name.'] '.message
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:Main()
|
||||||
|
let s:name = 'vim-vue-plugin'
|
||||||
|
let s:config = s:GetConfig('config', {})
|
||||||
|
let s:full_syntax = s:config.full_syntax
|
||||||
|
let s:debug = s:config.debug
|
||||||
|
|
||||||
|
call s:CheckVersion()
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! vue#Log(msg)
|
function! vue#Log(msg)
|
||||||
|
if s:debug
|
||||||
|
echom '['.s:name.'] '.a:msg
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! vue#LogWithLnum(msg)
|
||||||
if s:debug
|
if s:debug
|
||||||
echom '['.s:name.']['.v:lnum.'] '.a:msg
|
echom '['.s:name.']['.v:lnum.'] '.a:msg
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! vue#Warn(msg)
|
||||||
|
if s:debug
|
||||||
|
echohl WarningMsg
|
||||||
|
echom '['.s:name.'] '.a:msg
|
||||||
|
echohl None
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! vue#GetConfig(name, default)
|
function! vue#GetConfig(name, default)
|
||||||
return s:GetConfig(a:name, a:default)
|
return s:GetConfig(a:name, a:default)
|
||||||
endfunction
|
endfunction
|
||||||
@@ -39,78 +95,160 @@ if exists('##CursorMoved') && exists('*OnChangeVueSubtype')
|
|||||||
endfunction
|
endfunction
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! s:SynsEOL(lnum)
|
function! s:SyntaxListAtEnd(lnum)
|
||||||
let lnum = prevnonblank(a:lnum)
|
let plnum = prevnonblank(a:lnum)
|
||||||
let cnum = strlen(getline(lnum))
|
let col = strlen(getline(plnum))
|
||||||
return map(synstack(lnum, cnum), 'synIDattr(v:val, "name")')
|
return map(synstack(plnum, col), 'synIDattr(v:val, "name")')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:SyntaxAtEnd(lnum)
|
||||||
|
let syns = s:SyntaxListAtEnd(a:lnum)
|
||||||
|
return empty(syns) ? '' : get(syns, 0, '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! vue#SyntaxSecondAtEnd(lnum)
|
||||||
|
let syns = s:SyntaxListAtEnd(a:lnum)
|
||||||
|
return get(syns, 1, '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:GetBlockTag(lnum)
|
||||||
|
let syntax_name = s:SyntaxAtEnd(a:lnum)
|
||||||
|
let tag = tolower(matchstr(syntax_name, '\u\U\+\zeBlock'))
|
||||||
|
return tag
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:style_with_css_prefix = ['scss', 'less', 'stylus']
|
||||||
|
|
||||||
|
" Adjust syntax name to support emmet-vim by adding css prefix
|
||||||
|
function! vue#AlterSyntaxForEmmetVim(name, syntax)
|
||||||
|
let name = a:name
|
||||||
|
if count(s:style_with_css_prefix, a:syntax) == 1
|
||||||
|
let name = 'css'.toupper(name[0]).name[1:]
|
||||||
|
endif
|
||||||
|
return name
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Remove css prefix
|
||||||
|
function! s:RecoverSyntax(syntax_name, syntax)
|
||||||
|
let syntax = a:syntax
|
||||||
|
if syntax == 'css'
|
||||||
|
let next_syntax = tolower(matchstr(a:syntax_name, '^\U\+\zs\u\U\+'))
|
||||||
|
if count(s:style_with_css_prefix, next_syntax) == 1
|
||||||
|
let syntax = next_syntax
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return syntax
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:GetBlockSyntax(lnum)
|
||||||
|
let syntax_name = s:SyntaxAtEnd(a:lnum)
|
||||||
|
let syntax = matchstr(syntax_name, '^\U\+')
|
||||||
|
let syntax = s:RecoverSyntax(syntax_name, syntax)
|
||||||
|
return syntax
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! vue#GetBlockTag(lnum)
|
||||||
|
return s:GetBlockTag(a:lnum)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! vue#GetBlockSyntax(lnum)
|
||||||
|
return s:GetBlockSyntax(a:lnum)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! GetVueSubtype()
|
function! GetVueSubtype()
|
||||||
let lnum = line('.')
|
let lnum = line('.')
|
||||||
let cursyns = s:SynsEOL(lnum)
|
let syntax = vue#GetBlockSyntax(lnum)
|
||||||
let syn = !empty(cursyns) ? get(cursyns, 0, '') : ''
|
return syntax
|
||||||
|
|
||||||
let subtype = matchstr(syn, '\w\+\zeVue')
|
|
||||||
if subtype =~ 'css\w\+'
|
|
||||||
let subtype = subtype[3:]
|
|
||||||
endif
|
|
||||||
let subtype = tolower(subtype)
|
|
||||||
return subtype
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! GetVueTag(...)
|
function! GetVueTag(...)
|
||||||
let lnum = a:0 > 0 ? a:1 : line('.')
|
let lnum = a:0 > 0 ? a:1 : line('.')
|
||||||
let cursyns = s:SynsEOL(lnum)
|
return vue#GetBlockTag(lnum)
|
||||||
let syn = get(cursyns, 0, '')
|
|
||||||
|
|
||||||
if syn =~ 'VueTemplate'
|
|
||||||
let tag = 'template'
|
|
||||||
elseif syn =~ 'VueScript'
|
|
||||||
let tag = 'script'
|
|
||||||
elseif syn =~ 'VueStyle'
|
|
||||||
let tag = 'style'
|
|
||||||
else
|
|
||||||
let tag = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
return tag
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! vue#LoadSyntax(group, type)
|
function! vue#LoadSyntax(group, syntax)
|
||||||
if s:load_full_syntax
|
let group = a:group
|
||||||
call vue#LoadFullSyntax(a:group, a:type)
|
let syntax = a:syntax
|
||||||
|
if count(s:full_syntax, syntax) == 1
|
||||||
|
call vue#LoadFullSyntax(group, syntax)
|
||||||
else
|
else
|
||||||
call vue#LoadDefaultSyntax(a:group, a:type)
|
let loaded = vue#LoadDefaultSyntax(group, syntax)
|
||||||
|
if !loaded
|
||||||
|
call vue#LoadFullSyntax(group, syntax)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! vue#LoadDefaultSyntax(group, type)
|
function! vue#LoadDefaultSyntax(group, syntax)
|
||||||
unlet! b:current_syntax
|
unlet! b:current_syntax
|
||||||
let syntaxPaths = ['$VIMRUNTIME', '$VIM/vimfiles', '$HOME/.vim']
|
let loaded = 0
|
||||||
for path in syntaxPaths
|
let syntax_paths = ['$VIMRUNTIME', '$VIM/vimfiles', '$HOME/.vim']
|
||||||
let file = expand(path).'/syntax/'.a:type.'.vim'
|
for path in syntax_paths
|
||||||
|
let file = expand(path).'/syntax/'.a:syntax.'.vim'
|
||||||
if filereadable(file)
|
if filereadable(file)
|
||||||
|
let loaded = 1
|
||||||
execute 'syntax include '.a:group.' '.file
|
execute 'syntax include '.a:group.' '.file
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
if loaded
|
||||||
|
call vue#Log(a:syntax.': laod default')
|
||||||
|
else
|
||||||
|
call vue#Warn(a:syntax.': syntax not found in '.string(syntax_paths))
|
||||||
|
call vue#Warn(a:syntax.': load full instead')
|
||||||
|
endif
|
||||||
|
return loaded
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Load all syntax files in 'runtimepath'
|
" Load all syntax files in 'runtimepath'
|
||||||
" Useful if there is no default syntax file provided by vim
|
" Useful if there is no default syntax file provided by vim
|
||||||
function! vue#LoadFullSyntax(group, type)
|
function! vue#LoadFullSyntax(group, syntax)
|
||||||
call s:SetCurrentSyntax(a:type)
|
call vue#Log(a:syntax.': load full')
|
||||||
execute 'syntax include '.a:group.' syntax/'.a:type.'.vim'
|
call s:SetCurrentSyntax(a:syntax)
|
||||||
|
execute 'syntax include '.a:group.' syntax/'.a:syntax.'.vim'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Settings to avoid syntax overload
|
" Settings to avoid syntax overload
|
||||||
function! s:SetCurrentSyntax(type)
|
function! s:SetCurrentSyntax(type)
|
||||||
if a:type == 'coffee'
|
if a:type == 'coffee'
|
||||||
syntax cluster coffeeJS contains=@htmlJavaScript
|
" Avoid `syntax/javascript.vim` in kchmck/vim-coffee-script
|
||||||
|
|
||||||
" Avoid overload of `javascript.vim`
|
|
||||||
let b:current_syntax = 'vue'
|
let b:current_syntax = 'vue'
|
||||||
|
syntax cluster coffeeJS contains=@javascript,@htmlJavaScript
|
||||||
else
|
else
|
||||||
unlet! b:current_syntax
|
unlet! b:current_syntax
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
"}}}
|
|
||||||
|
function! vue#GetSyntaxList(config_syntax)
|
||||||
|
let syntax_list = []
|
||||||
|
for syntax in values(a:config_syntax)
|
||||||
|
let type = type(syntax)
|
||||||
|
if type == v:t_string
|
||||||
|
if !count(syntax_list, syntax)
|
||||||
|
call add(syntax_list, syntax)
|
||||||
|
endif
|
||||||
|
elseif type == v:t_list && len(syntax)
|
||||||
|
for syn in syntax
|
||||||
|
if !count(syntax_list, syn)
|
||||||
|
call add(syntax_list, syn)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
echoerr '[vim-vue-plugin] syntax value type'
|
||||||
|
\.' must be either string or list'
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" Move basic syntaxes 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 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()
|
||||||
|
|||||||
@@ -17,3 +17,4 @@ endif
|
|||||||
" indentexpr
|
" indentexpr
|
||||||
let b:syng_str = '^\%(.*template\)\@!.*string\|special'
|
let b:syng_str = '^\%(.*template\)\@!.*string\|special'
|
||||||
let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
|
let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
|
||||||
|
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
if exists("b:did_indent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:custom_blocks = vue#GetConfig("custom_blocks", {})
|
|
||||||
let s:indent = {}
|
|
||||||
|
|
||||||
function! s:GetSyntaxList()
|
|
||||||
let syntax_list = []
|
|
||||||
for syntax in values(s:custom_blocks)
|
|
||||||
let type = type(syntax)
|
|
||||||
if type == v:t_string
|
|
||||||
if !count(syntax_list, syntax)
|
|
||||||
call add(syntax_list, syntax)
|
|
||||||
endif
|
|
||||||
elseif type == v:t_list && len(syntax)
|
|
||||||
for syn in syntax
|
|
||||||
if !count(syntax_list, syn)
|
|
||||||
call add(syntax_list, syn)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
echoerr '[vim-vue-plugin] custom_blocks value type'
|
|
||||||
\.' must be either string or list'
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return syntax_list
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:GetIndentExpr(syntax_list)
|
|
||||||
for syntax in a:syntax_list
|
|
||||||
unlet! b:did_indent
|
|
||||||
execute 'runtime indent/'.syntax.'.vim'
|
|
||||||
let s:indent[syntax] = &l:indentexpr
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! GetVueCustomBlocksIndent(syn)
|
|
||||||
let syntax = matchstr(a:syn, '^\l\+')
|
|
||||||
call vue#Log('custom block syntax: '.syntax)
|
|
||||||
let ind = eval(s:indent[syntax])
|
|
||||||
return ind
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call s:GetIndentExpr(s:GetSyntaxList())
|
|
||||||
443
indent/vue.vim
443
indent/vue.vim
@@ -1,293 +1,132 @@
|
|||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
if exists('b:did_indent') | finish |endif
|
||||||
" Vim indent file
|
|
||||||
"
|
|
||||||
" Language: Vue
|
|
||||||
" Maintainer: leafOfTree <leafvocation@gmail.com>
|
|
||||||
"
|
|
||||||
" CREDITS: Inspired by mxw/vim-jsx.
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
if exists("b:did_indent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
function! s:Init()
|
||||||
"
|
""" Configs
|
||||||
" Config {{{
|
let s:config = vue#GetConfig('config', {})
|
||||||
"
|
let s:config_syntax = s:config.syntax
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
let s:enable_init_indent = s:config.init_indent
|
||||||
let s:use_pug = vue#GetConfig("use_pug", 0)
|
|
||||||
let s:use_sass = vue#GetConfig("use_sass", 0)
|
|
||||||
let s:use_scss = vue#GetConfig("use_scss", 0)
|
|
||||||
let s:use_stylus = vue#GetConfig("use_stylus", 0)
|
|
||||||
let s:use_coffee = vue#GetConfig("use_coffee", 0)
|
|
||||||
let s:use_typescript = vue#GetConfig("use_typescript", 0)
|
|
||||||
let s:has_init_indent = vue#GetConfig("has_init_indent",
|
|
||||||
\ expand("%:e") == 'wpy' ? 1 : 0)
|
|
||||||
let s:custom_blocks = vue#GetConfig("custom_blocks", {})
|
|
||||||
let s:use_custom_blocks = !empty(s:custom_blocks)
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
""" Variables
|
||||||
"
|
let s:indent = {}
|
||||||
" Variables {{{
|
let s:block_tag = '<\/\?'.join(keys(s:config_syntax), '\|')
|
||||||
"
|
" Let <template> handled by HTML
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
let s:template_tag = '\v^\s*\<\/?template'
|
||||||
" Let <template> handled by HTML
|
let s:vue_tag_start = '\v^\s*\<(script|style)'
|
||||||
let s:vue_tag_start = '\v^\s*\<(script|style)'
|
let s:vue_tag_end = '\v^\s*\<\/(script|style)'
|
||||||
let s:vue_tag_end = '\v^\s*\<\/(script|style)'
|
let s:empty_tagname = '(area|base|br|col|embed|hr|input|img|'
|
||||||
let s:template_tag = '\v^\s*\<\/?template'
|
\.'keygen|link|meta|param|source|track|wbr)'
|
||||||
let s:empty_tagname = '(area|base|br|col|embed|hr|input|img|keygen|link|meta|param|source|track|wbr)'
|
let s:empty_tag = '\v\<'.s:empty_tagname.'[^/]*\>'
|
||||||
let s:empty_tag = '\v\<'.s:empty_tagname.'[^/]*\>'
|
let s:empty_tag_start = '\v\<'.s:empty_tagname.'[^\>]*$'
|
||||||
let s:empty_tag_start = '\v\<'.s:empty_tagname.'[^\>]*$'
|
let s:empty_tag_end = '\v^\s*[^\<\>\/]*\/?\>\s*'
|
||||||
let s:empty_tag_end = '\v^\s*[^\<\>\/]*\/?\>\s*'
|
let s:tag_start = '\v^\s*\<\w*' " <
|
||||||
let s:tag_start = '\v^\s*\<\w*'
|
let s:tag_end = '\v^\s*\/?\>\s*' " />
|
||||||
let s:tag_end = '\v^\s*\/?\>\s*' " />
|
let s:full_tag_end = '\v^\s*\<\/' " </...>
|
||||||
let s:full_tag_end = '\v^\s*\<\/' " </...>
|
|
||||||
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Load indent method {{{
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" Save shiftwidth
|
|
||||||
let s:sw = &sw
|
|
||||||
|
|
||||||
" Use lib/indent/ files for compatibility
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime lib/indent/xml.vim
|
|
||||||
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime lib/indent/css.vim
|
|
||||||
|
|
||||||
" Use normal indent files
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime! indent/javascript.vim
|
|
||||||
let b:javascript_indentexpr = &indentexpr
|
|
||||||
|
|
||||||
if s:use_custom_blocks
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime indent/vue-custom-blocks.vim
|
|
||||||
let s:vue_custom_blocks_tag = '<\/\?'.join(keys(s:custom_blocks), '\|')
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:use_pug
|
|
||||||
unlet! b:did_indent
|
|
||||||
let s:save_formatoptions = &formatoptions
|
|
||||||
runtime! indent/pug.vim
|
|
||||||
let &formatoptions = s:save_formatoptions
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:use_sass
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime! indent/sass.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:use_scss
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime! indent/scss.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:use_stylus
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime! indent/stylus.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:use_coffee
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime! indent/coffee.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:use_typescript
|
|
||||||
unlet! b:did_indent
|
|
||||||
runtime! indent/typescript.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Recover shiftwidth
|
|
||||||
let &sw = s:sw
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Settings {{{
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" JavaScript indentkeys
|
|
||||||
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,:
|
|
||||||
" XML indentkeys
|
|
||||||
setlocal indentkeys+=*<Return>,<>>,<<>,/
|
|
||||||
setlocal indentexpr=GetVueIndent()
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Functions {{{
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
function! GetVueIndent()
|
|
||||||
let ind = s:GetIndentBySyntax()
|
|
||||||
let ind = s:AdjustIndent(ind)
|
|
||||||
call vue#Log('indent: '.ind)
|
|
||||||
return ind
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:GetIndentBySyntax()
|
function! s:SetVueIndent()
|
||||||
let prevlnum = prevnonblank(v:lnum - 1)
|
""" Settings
|
||||||
let prevline = getline(prevlnum)
|
" JavaScript indentkeys
|
||||||
let curline = getline(v:lnum)
|
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,:
|
||||||
let cursyn = get(s:SynsEOL(v:lnum), 0, '')
|
" XML indentkeys
|
||||||
|
setlocal indentkeys+=*<Return>,<>>,<<>,/
|
||||||
|
setlocal indentexpr=GetVueIndent()
|
||||||
|
endfunction
|
||||||
|
|
||||||
if s:SynHTML(cursyn)
|
function! s:GetIndentFile(syntax)
|
||||||
call vue#Log('syntax: html')
|
let syntax = a:syntax
|
||||||
let ind = s:GetHTMLIndent(prevlnum, prevline, curline)
|
" lib/indent/* files are preversed from previous version vim
|
||||||
elseif s:SynPug(cursyn)
|
if syntax == 'html'
|
||||||
call vue#Log('syntax: pug')
|
let file = 'lib/indent/xml.vim'
|
||||||
let ind = GetPugIndent()
|
elseif syntax == 'css'
|
||||||
elseif s:SynCoffee(cursyn)
|
let file = 'lib/indent/css.vim'
|
||||||
call vue#Log('syntax: coffee')
|
|
||||||
let ind = GetCoffeeIndent(v:lnum)
|
|
||||||
elseif s:SynTypeScript(cursyn)
|
|
||||||
call vue#Log('syntax: typescript')
|
|
||||||
let ind = GetTypescriptIndent()
|
|
||||||
elseif s:SynSASS(cursyn)
|
|
||||||
call vue#Log('syntax: sass')
|
|
||||||
let ind = GetSassIndent()
|
|
||||||
elseif s:SynSCSS(cursyn)
|
|
||||||
call vue#Log('syntax: scss')
|
|
||||||
if exists('*GetSCSSIndent')
|
|
||||||
call vue#Log('indent: scss')
|
|
||||||
let ind = GetSCSSIndent()
|
|
||||||
else
|
|
||||||
call vue#Log('indent: css')
|
|
||||||
let ind = GetCSSIndent()
|
|
||||||
endif
|
|
||||||
elseif s:SynStylus(cursyn)
|
|
||||||
call vue#Log('syntax: stylus')
|
|
||||||
let ind = GetStylusIndent()
|
|
||||||
elseif s:SynStyle(cursyn)
|
|
||||||
call vue#Log('syntax: css')
|
|
||||||
let ind = GetCSSIndent()
|
|
||||||
elseif s:use_custom_blocks && s:SynCustomBlocks(cursyn)
|
|
||||||
call vue#Log('syntax: custom blocks')
|
|
||||||
let ind = GetVueCustomBlocksIndent(cursyn)
|
|
||||||
else
|
else
|
||||||
" Default to JavaScript indent
|
let file = 'indent/'.syntax.'.vim'
|
||||||
call vue#Log('syntax: javascript')
|
endif
|
||||||
if len(b:javascript_indentexpr)
|
return file
|
||||||
let ind = eval(b:javascript_indentexpr)
|
endfunction
|
||||||
else
|
|
||||||
let ind = cindent(v:lnum)
|
function! s:SetIndentExpr(syntax_list)
|
||||||
endif
|
let saved_shiftwidth = &shiftwidth
|
||||||
|
let saved_formatoptions = &formatoptions
|
||||||
|
|
||||||
|
for syntax in a:syntax_list
|
||||||
|
unlet! b:did_indent
|
||||||
|
let &l:indentexpr = ''
|
||||||
|
execute 'runtime '.s:GetIndentFile(syntax)
|
||||||
|
let s:indent[syntax] = &l:indentexpr
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let &shiftwidth = saved_shiftwidth
|
||||||
|
let &formatoptions = saved_formatoptions
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:GetBlockIndent(syntax)
|
||||||
|
let syntax = a:syntax
|
||||||
|
let indentexpr = get(s:indent, syntax)
|
||||||
|
if !empty(indentexpr)
|
||||||
|
let ind = eval(indentexpr)
|
||||||
|
else
|
||||||
|
call vue#LogWithLnum('indentexpr not found for '.syntax.', use cindent')
|
||||||
|
let ind = cindent(v:lnum)
|
||||||
endif
|
endif
|
||||||
return ind
|
return ind
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:AdjustIndent(ind)
|
function! s:GetIndentByContext()
|
||||||
let ind = a:ind
|
let ind = -1
|
||||||
let prevline = getline(prevnonblank(v:lnum - 1))
|
let prevline = getline(s:PrevNonBlankNonComment(v:lnum))
|
||||||
let curline = getline(v:lnum)
|
let curline = getline(v:lnum)
|
||||||
let cursyn = get(s:SynsEOL(v:lnum), 0, '')
|
|
||||||
|
|
||||||
if curline =~? s:vue_tag_start
|
if curline =~ s:block_tag
|
||||||
\ || curline =~? s:vue_tag_end
|
|
||||||
\ || prevline =~? s:vue_tag_end
|
|
||||||
\ || (curline =~ s:template_tag && s:SynPug(cursyn))
|
|
||||||
call vue#Log('current line is vue tag or previous line is vue end tag')
|
|
||||||
call vue#Log(', or current line is pug template tag')
|
|
||||||
let ind = 0
|
|
||||||
elseif s:has_init_indent && ind < 1 && s:SynVueScriptOrStyle(cursyn)
|
|
||||||
call vue#Log('add initial indent')
|
|
||||||
let ind = &sw
|
|
||||||
elseif getline(s:PrevNonBlacnkNonComment(v:lnum)) =~? s:vue_tag_start
|
|
||||||
call vue#Log('previous line is vue tag start')
|
|
||||||
let ind = 0
|
|
||||||
elseif s:use_custom_blocks && curline =~ s:vue_custom_blocks_tag
|
|
||||||
call vue#Log('current line is vue custom blocks tag')
|
|
||||||
let ind = 0
|
let ind = 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return ind
|
if prevline =~ s:block_tag
|
||||||
endfunction
|
if prevline !~ s:template_tag
|
||||||
|
let ind = 0
|
||||||
function! s:GetHTMLIndent(prevlnum, prevline, curline)
|
|
||||||
let prevlnum = a:prevlnum
|
|
||||||
let prevline = a:prevline
|
|
||||||
let curline = a:curline
|
|
||||||
|
|
||||||
let ind = XmlIndentGet(v:lnum, 0)
|
|
||||||
if prevline =~? s:empty_tag
|
|
||||||
call vue#Log('previous line is an empty tag')
|
|
||||||
let ind = ind - &sw
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Align '/>' and '>' with '<' for multiline tags.
|
|
||||||
if curline =~? s:tag_end
|
|
||||||
let ind = ind - &sw
|
|
||||||
endif
|
|
||||||
" Then correct the indentation of any element following '/>' or '>'.
|
|
||||||
if prevline =~? s:tag_end
|
|
||||||
let ind = ind + &sw
|
|
||||||
|
|
||||||
" Decrease indent if prevlines are a multiline empty tag
|
|
||||||
let [start, end] = s:PrevMultilineEmptyTag(v:lnum)
|
|
||||||
if end == prevlnum
|
|
||||||
call vue#Log('previous line is a multiline empty tag')
|
|
||||||
if curline =~? s:full_tag_end
|
|
||||||
let ind = indent(v:lnum - 1) - &sw
|
|
||||||
else
|
|
||||||
let ind = indent(v:lnum - 1)
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return ind
|
return ind
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:SynsEOL(lnum)
|
function! s:PrevNonBlankNonComment(lnum)
|
||||||
let lnum = prevnonblank(a:lnum)
|
let lnum = a:lnum - 1
|
||||||
let col = strlen(getline(lnum))
|
let prevlnum = prevnonblank(lnum)
|
||||||
return map(synstack(lnum, col), 'synIDattr(v:val, "name")')
|
let prevsyn = vue#SyntaxSecondAtEnd(prevlnum)
|
||||||
|
while prevsyn =~? 'comment' && lnum > 1
|
||||||
|
let lnum = lnum - 1
|
||||||
|
let prevlnum = prevnonblank(lnum)
|
||||||
|
let prevsyn = vue#SyntaxSecondAtEnd(prevlnum)
|
||||||
|
endwhile
|
||||||
|
return prevlnum
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:SynHTML(syn)
|
function! s:AdjustBlockIndent(syntax, ind)
|
||||||
return a:syn ==? 'htmlVueTemplate'
|
let block = a:block
|
||||||
|
let syntax = a:syntax
|
||||||
|
let ind = a:ind
|
||||||
|
|
||||||
|
if syntax == 'html'
|
||||||
|
let ind = s:AdjustHTMLIndent(ind)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ind
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:SynPug(syn)
|
function! s:CheckInitIndent(tag, ind)
|
||||||
return a:syn ==? 'pugVueTemplate'
|
let ind = a:ind
|
||||||
endfunction
|
let curline = getline(v:lnum)
|
||||||
|
|
||||||
function! s:SynCoffee(syn)
|
let add = s:enable_init_indent
|
||||||
return a:syn ==? 'coffeeVueScript'
|
\&& ind == 0
|
||||||
endfunction
|
\&& count(['style', 'script'], a:tag) == 1
|
||||||
|
\&& curline !~ s:block_tag
|
||||||
function! s:SynTypeScript(syn)
|
if add
|
||||||
return a:syn ==? 'typescriptVueScript'
|
call vue#LogWithLnum('add initial indent')
|
||||||
endfunction
|
let ind = &sw
|
||||||
|
endif
|
||||||
function! s:SynSASS(syn)
|
return ind
|
||||||
return a:syn ==? 'sassVueStyle'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SynSCSS(syn)
|
|
||||||
return a:syn ==? 'cssScssVueStyle'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SynStylus(syn)
|
|
||||||
return a:syn ==? 'cssStylusVueStyle'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SynStyle(syn)
|
|
||||||
return a:syn =~? 'VueStyle'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SynCustomBlocks(syn)
|
|
||||||
return a:syn =~? 'Block'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SynVueScriptOrStyle(syn)
|
|
||||||
return a:syn =~? '\v(VueStyle)|(VueScript)'
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:PrevMultilineEmptyTag(lnum)
|
function! s:PrevMultilineEmptyTag(lnum)
|
||||||
@@ -312,27 +151,59 @@ function! s:PrevMultilineEmptyTag(lnum)
|
|||||||
endwhile
|
endwhile
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:PrevNonBlacnkNonComment(lnum)
|
function! s:AdjustHTMLIndent(ind)
|
||||||
let curline = getline(a:lnum)
|
let ind = a:ind
|
||||||
let cursyns = s:SynsEOL(a:lnum)
|
let prevlnum = prevnonblank(v:lnum - 1)
|
||||||
let cursyn = get(cursyns, 1, '')
|
let prevline = getline(prevlnum)
|
||||||
if cursyn =~? 'comment' && !empty(curline)
|
let curline = getline(v:lnum)
|
||||||
return prevnonblank(a:lnum - 1)
|
|
||||||
|
if prevline =~? s:empty_tag
|
||||||
|
call vue#LogWithLnum('previous line is an empty tag')
|
||||||
|
let ind = ind - &sw
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let lnum = a:lnum - 1
|
" Align '/>' and '>' with '<'
|
||||||
let prevlnum = prevnonblank(lnum)
|
if curline =~? s:tag_end
|
||||||
let prevsyns = s:SynsEOL(prevlnum)
|
let ind = ind - &sw
|
||||||
let prevsyn = get(prevsyns, 1, '')
|
endif
|
||||||
while prevsyn =~? 'comment' && lnum > 1
|
" Then correct the indentation of any element following '/>' or '>'.
|
||||||
let lnum = lnum - 1
|
if prevline =~? s:tag_end
|
||||||
let prevlnum = prevnonblank(lnum)
|
let ind = ind + &sw
|
||||||
let prevsyns = s:SynsEOL(prevlnum)
|
|
||||||
let prevsyn = get(prevsyns, 1, '')
|
|
||||||
endwhile
|
|
||||||
return prevlnum
|
|
||||||
endfunction
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
let b:did_indent = 1
|
" Decrease indent if prevlines are a multiline empty tag
|
||||||
" vim: fdm=marker
|
let [start, end] = s:PrevMultilineEmptyTag(v:lnum)
|
||||||
|
if prevlnum == end
|
||||||
|
call vue#LogWithLnum('previous line is a multiline empty tag')
|
||||||
|
let ind = indent(v:lnum - 1)
|
||||||
|
if curline =~? s:full_tag_end
|
||||||
|
let ind = ind - &sw
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return ind
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! GetVueIndent()
|
||||||
|
let ind = s:GetIndentByContext()
|
||||||
|
if ind == -1
|
||||||
|
let syntax = vue#GetBlockSyntax(v:lnum)
|
||||||
|
let ind = s:GetBlockIndent(syntax)
|
||||||
|
let ind = s:AdjustBlockIndent(syntax, ind)
|
||||||
|
call vue#LogWithLnum('syntax '.syntax.', ind '.ind)
|
||||||
|
else
|
||||||
|
call vue#LogWithLnum('context, ind '.ind)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let tag = vue#GetBlockTag(v:lnum)
|
||||||
|
let ind = s:CheckInitIndent(tag, ind)
|
||||||
|
return ind
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:Main()
|
||||||
|
call s:Init()
|
||||||
|
let syntax_list = vue#GetSyntaxList(s:config_syntax)
|
||||||
|
call s:SetIndentExpr(syntax_list)
|
||||||
|
call s:SetVueIndent()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
call s:Main()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ let s:keepcpo= &cpo
|
|||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
" [-- local settings (must come before aborting the script) --]
|
" [-- local settings (must come before aborting the script) --]
|
||||||
setlocal indentexpr=XmlIndentGet(v:lnum,1)
|
setlocal indentexpr=XmlIndentGet(v:lnum,0)
|
||||||
setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,}
|
setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,}
|
||||||
|
|
||||||
if !exists('b:xml_indent_open')
|
if !exists('b:xml_indent_open')
|
||||||
|
|||||||
3
syntax/patch/coffee.vim
Normal file
3
syntax/patch/coffee.vim
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
silent! syntax clear coffeeConstant
|
||||||
|
syn match coffeeConstant '\v<\u\C[A-Z0-9_]+>' display
|
||||||
|
\ containedin=@coffeeIdentifier
|
||||||
14
syntax/patch/css.vim
Normal file
14
syntax/patch/css.vim
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
" Use a different name in order to avoid css syntax interference
|
||||||
|
silent! syntax clear cssUnitDecorators
|
||||||
|
syntax match cssUnitDecorators2
|
||||||
|
\ /\(#\|-\|+\|%\|mm\|cm\|in\|pt\|pc\|em\|ex\|px\|ch\|rem\|vh\|vw\|vmin\|vmax\|dpi\|dppx\|dpcm\|Hz\|kHz\|s\|ms\|deg\|grad\|rad\)\ze\(;\|$\)/
|
||||||
|
\ contained
|
||||||
|
\ containedin=cssAttrRegion,sassCssAttribute,lessCssAttribute,stylusCssAttribute
|
||||||
|
|
||||||
|
silent! syntax clear cssKeyFrameProp
|
||||||
|
syn match cssKeyFrameProp2 /\d*%\|from\|to/
|
||||||
|
\ contained nextgroup=cssDefinition
|
||||||
|
\ containedin=cssAttrRegion,sassCssAttribute,lessCssAttribute,stylusCssAttribute
|
||||||
|
|
||||||
|
highlight default link cssUnitDecorators2 Number
|
||||||
|
highlight default link cssKeyFrameProp2 Constant
|
||||||
@@ -3,7 +3,8 @@
|
|||||||
" Config {{{
|
" Config {{{
|
||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
let s:highlight_vue_attr = vue#GetConfig("highlight_vue_attr", 0)
|
let s:config = vue#GetConfig('config', {})
|
||||||
|
let s:attribute = s:config.attribute
|
||||||
"}}}
|
"}}}
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
@@ -11,6 +12,15 @@ let s:highlight_vue_attr = vue#GetConfig("highlight_vue_attr", 0)
|
|||||||
" Syntax highlight {{{
|
" Syntax highlight {{{
|
||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
" Clear htmlHead that may cause highlighting out of bounds
|
||||||
|
silent! syntax clear htmlHead
|
||||||
|
|
||||||
|
" html5 data-*
|
||||||
|
syntax match htmlArg '\v<data(-[.a-z0-9]+)+>' containedin=@html
|
||||||
|
|
||||||
|
" Vue ref attribute
|
||||||
|
syntax match htmlArg 'ref' containedin=@html
|
||||||
|
|
||||||
" Use syn-match in order to highlight both transition and transition-group
|
" Use syn-match in order to highlight both transition and transition-group
|
||||||
" according to syn-priority
|
" according to syn-priority
|
||||||
syntax match VueComponentName containedin=htmlTagN '\v(component|slot|transition)'
|
syntax match VueComponentName containedin=htmlTagN '\v(component|slot|transition)'
|
||||||
@@ -36,7 +46,7 @@ syntax region VueExpression
|
|||||||
\ start="{{"
|
\ start="{{"
|
||||||
\ end="}}"
|
\ end="}}"
|
||||||
syntax region VueExpression
|
syntax region VueExpression
|
||||||
\ containedin=htmlVueTemplate,pugVueTemplate,VueValue,htmlString,htmlValue
|
\ containedin=htmlTemplateBlock,pugTemplateBlock,VueValue,htmlString,htmlValue
|
||||||
\ contains=@simpleJavascriptExpression
|
\ contains=@simpleJavascriptExpression
|
||||||
\ matchgroup=VueBrace
|
\ matchgroup=VueBrace
|
||||||
\ start="{{"
|
\ start="{{"
|
||||||
@@ -66,7 +76,7 @@ syntax match javaScriptOperator '\v(*)@<!/(/|*)@!' contained
|
|||||||
syntax keyword javaScriptOperator delete instanceof typeof void new in of contained
|
syntax keyword javaScriptOperator delete instanceof typeof void new in of contained
|
||||||
|
|
||||||
highlight default link VueAttr htmlTag
|
highlight default link VueAttr htmlTag
|
||||||
if s:highlight_vue_attr
|
if s:attribute
|
||||||
syntax match VueValue contained '\v\"\zs[^"]+\ze\"'
|
syntax match VueValue contained '\v\"\zs[^"]+\ze\"'
|
||||||
\ contains=VueInject,@simpleJavascriptExpression
|
\ contains=VueInject,@simpleJavascriptExpression
|
||||||
highlight default link VueKey Type
|
highlight default link VueKey Type
|
||||||
@@ -3,11 +3,9 @@
|
|||||||
" Config {{{
|
" Config {{{
|
||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
let s:highlight_vue_keyword = vue#GetConfig("highlight_vue_keyword", 0)
|
let s:config = vue#GetConfig('config', {})
|
||||||
if !s:highlight_vue_keyword | finish | endif
|
let s:keyword = s:config.keyword
|
||||||
|
let s:init_indent = s:config.init_indent
|
||||||
let s:has_init_indent = vue#GetConfig("has_init_indent",
|
|
||||||
\ expand("%:e") == 'wpy' ? 1 : 0)
|
|
||||||
"}}}
|
"}}}
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
@@ -15,9 +13,17 @@ let s:has_init_indent = vue#GetConfig("has_init_indent",
|
|||||||
" Syntax highlight {{{
|
" Syntax highlight {{{
|
||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
" Number with minus
|
||||||
|
syntax match javaScriptNumber '\v<-?\d+L?>|0[xX][0-9a-fA-F]+>'
|
||||||
|
\ containedin=@javascript display
|
||||||
|
highlight link javaScriptNumber Constant
|
||||||
|
|
||||||
|
" Vue keywords
|
||||||
|
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: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:has_init_indent)
|
let s:indent = &sw * (1 + s:init_indent)
|
||||||
let s:keywords_regexp = '\v^\s{'.s:indent.'}(async )?<('
|
let s:keywords_regexp = '\v^\s{'.s:indent.'}(async )?<('
|
||||||
\.join(split(s:vue_keywords, ' '), '|')
|
\.join(split(s:vue_keywords, ' '), '|')
|
||||||
\.')\ze'
|
\.')\ze'
|
||||||
@@ -26,7 +32,7 @@ let s:keywords_regexp = '\v^\s{'.s:indent.'}(async )?<('
|
|||||||
let s:useJavaScriptPlugin = hlexists('jsAsyncKeyword')
|
let s:useJavaScriptPlugin = hlexists('jsAsyncKeyword')
|
||||||
let s:containedin = s:useJavaScriptPlugin
|
let s:containedin = s:useJavaScriptPlugin
|
||||||
\? 'jsObject,jsFuncBlock,@jsExpression'
|
\? 'jsObject,jsFuncBlock,@jsExpression'
|
||||||
\: 'javascriptVueScript'
|
\: 'javascriptScriptBlock'
|
||||||
let s:contains = s:useJavaScriptPlugin
|
let s:contains = s:useJavaScriptPlugin
|
||||||
\? 'jsAsyncKeyword'
|
\? 'jsAsyncKeyword'
|
||||||
\: 'javaScriptReserved'
|
\: 'javaScriptReserved'
|
||||||
6
syntax/patch/less.vim
Normal file
6
syntax/patch/less.vim
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
" Use emmet-vim css type.
|
||||||
|
silent! syntax clear lessDefinition
|
||||||
|
syntax region cssLessDefinition matchgroup=cssBraces
|
||||||
|
\ contains=@LessSyntax,cssLessDefinition
|
||||||
|
\ contained containedin=cssLessVueStyle
|
||||||
|
\ start="{" end="}"
|
||||||
1
syntax/patch/pug.vim
Normal file
1
syntax/patch/pug.vim
Normal file
@@ -0,0 +1 @@
|
|||||||
|
syntax cluster htmlJavascript remove=javascriptParenthesisBlock
|
||||||
10
syntax/patch/sass.vim
Normal file
10
syntax/patch/sass.vim
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
silent! syntax clear sassDefinition
|
||||||
|
syntax region sassDefinition matchgroup=cssBraces
|
||||||
|
\ contains=@SassSyntax,sassDefinition
|
||||||
|
\ contained containedin=sassVueStyle
|
||||||
|
\ start="{" end="}"
|
||||||
|
|
||||||
|
" Extend to highlight all numbers in expression
|
||||||
|
syntax match cssValueNumber
|
||||||
|
\ /\W\zs\d\+\(\.\d\+\)\?%\?\ze\W/
|
||||||
|
\ contained containedin=sassDefinition
|
||||||
13
syntax/patch/scss.vim
Normal file
13
syntax/patch/scss.vim
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
" If not loading https://github.com/cakebaker/scss-syntax.vim
|
||||||
|
if !hlexists('scssNestedProperty')
|
||||||
|
silent! syntax clear scssDefinition
|
||||||
|
syntax region cssScssDefinition transparent matchgroup=cssBraces
|
||||||
|
\ contains=@ScssSyntax,cssScssDefinition
|
||||||
|
\ contained containedin=cssScssVueStyle
|
||||||
|
\ start="{" end="}"
|
||||||
|
|
||||||
|
" Extend to highlight all numbers in expression
|
||||||
|
syntax match cssValueNumber
|
||||||
|
\ /\W\zs\d\+\(\.\d\+\)\?%\?\ze\W/
|
||||||
|
\ contained containedin=cssScssDefinition
|
||||||
|
endif
|
||||||
5
syntax/patch/stylus.vim
Normal file
5
syntax/patch/stylus.vim
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
silent! syntax clear stylusDefinition
|
||||||
|
syntax region cssStylusDefinition matchgroup=cssBraces
|
||||||
|
\ contains=@StylusSyntax,cssStylusDefinition
|
||||||
|
\ contained containedin=cssStylusVueStyle
|
||||||
|
\ start="{" end="}"
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
let s:custom_blocks = vue#GetConfig("custom_blocks", {})
|
|
||||||
|
|
||||||
if empty(s:custom_blocks)
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! s:LoadSyntax()
|
|
||||||
let syntax_list = []
|
|
||||||
for syntax in values(s:custom_blocks)
|
|
||||||
let type = type(syntax)
|
|
||||||
if type == v:t_string
|
|
||||||
if !count(syntax_list, syntax)
|
|
||||||
call add(syntax_list, syntax)
|
|
||||||
endif
|
|
||||||
elseif type == v:t_list && len(syntax)
|
|
||||||
for syn in syntax
|
|
||||||
if !count(syntax_list, syn)
|
|
||||||
call add(syntax_list, syn)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
echoerr '[vim-vue-plugin] custom_blocks value type'
|
|
||||||
\.' must be either string or list'
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
for syntax in syntax_list
|
|
||||||
let syntaxGroup = '@'.syntax
|
|
||||||
call vue#LoadFullSyntax(syntaxGroup, syntax)
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SetSyntax(block, syntax, lang)
|
|
||||||
let block = a:block
|
|
||||||
let syntax = a:syntax
|
|
||||||
let lang = a:lang
|
|
||||||
|
|
||||||
let region_name = syntax.toupper(block[0]).block[1:].'Block'
|
|
||||||
let syntax_lang = lang ? 'lang=["'']'.syntax.'["''][^>]*' : ''
|
|
||||||
let start = '<'.block.'[^>]*'.syntax_lang.'>'
|
|
||||||
let end = '</'.block.'>'
|
|
||||||
let syntaxGroup = '@'.syntax
|
|
||||||
|
|
||||||
execute 'syntax region '.region_name.' fold matchgroup=vueTag'
|
|
||||||
\.' start=+'.start.'+'
|
|
||||||
\.' end=+'.end.'+'
|
|
||||||
\.' keepend contains='.syntaxGroup
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Highlight()
|
|
||||||
for [block, syntax] in items(s:custom_blocks)
|
|
||||||
let type = type(syntax)
|
|
||||||
if type == v:t_string
|
|
||||||
call s:SetSyntax(block, syntax, 0)
|
|
||||||
elseif type == v:t_list && len(syntax)
|
|
||||||
call s:SetSyntax(block, syntax[0], 0)
|
|
||||||
for syn in syntax
|
|
||||||
call s:SetSyntax(block, syn, 1)
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call s:LoadSyntax()
|
|
||||||
call s:Highlight()
|
|
||||||
433
syntax/vue.vim
433
syntax/vue.vim
@@ -1,306 +1,167 @@
|
|||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
if exists('b:current_syntax') && b:current_syntax == 'vue'
|
||||||
" Vim syntax file
|
|
||||||
"
|
|
||||||
" Language: Vue
|
|
||||||
" Maintainer: leaf <leafvocation@gmail.com>
|
|
||||||
"
|
|
||||||
" CREDITS: Inspired by mxw/vim-jsx.
|
|
||||||
"
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
if exists("b:current_syntax") && b:current_syntax == 'vue'
|
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" For advanced users, this variable can be used to avoid overload
|
" <sfile> is replaced with the file name of the sourced file
|
||||||
let b:current_loading_main_syntax = 'vue'
|
let s:patch_path = expand('<sfile>:p:h').'/patch'
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Config {{{
|
|
||||||
"
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
let s:use_pug = vue#GetConfig("use_pug", 0)
|
|
||||||
let s:use_less = vue#GetConfig("use_less", 0)
|
|
||||||
let s:use_sass = vue#GetConfig("use_sass", 0)
|
|
||||||
let s:use_scss = vue#GetConfig("use_scss", 0)
|
|
||||||
let s:use_stylus = vue#GetConfig("use_stylus", 0)
|
|
||||||
let s:use_coffee = vue#GetConfig("use_coffee", 0)
|
|
||||||
let s:use_typescript = vue#GetConfig("use_typescript", 0)
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
function! s:Init()
|
||||||
"
|
""" Configs
|
||||||
" Load main syntax {{{
|
let s:config = vue#GetConfig('config', {})
|
||||||
"
|
let s:config_syntax = s:config.syntax
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
" Load syntax/html.vim to syntax group, which loads full JavaScript and CSS
|
" For advanced users, it can be used to avoid overload
|
||||||
" syntax. It defines group @html, @htmlJavaScript, and @htmlCss.
|
let b:current_loading_main_syntax = 'vue'
|
||||||
call vue#LoadSyntax('@html', 'html')
|
endfunction
|
||||||
|
|
||||||
" Avoid overload
|
function! s:GetGroupNameForLoading(syntax)
|
||||||
if !hlexists('cssTagName')
|
return '@'.a:syntax
|
||||||
call vue#LoadSyntax('@htmlCss', 'css')
|
endfunction
|
||||||
endif
|
|
||||||
|
|
||||||
" Avoid overload
|
" Extend group name as
|
||||||
if !hlexists('javaScriptComment')
|
" html defines group @htmlJavaScript and @htmlCss.
|
||||||
call vue#Log('load javascript cluster')
|
" coffee defines group @coffeeJS.
|
||||||
call vue#LoadSyntax('@htmlJavaScript', 'javascript')
|
function! s:GetGroupNameForHighlight(syntax)
|
||||||
endif
|
let syntax = a:syntax
|
||||||
|
let name = '@'.a:syntax
|
||||||
" Load vue-html syntax
|
if syntax == 'javascript'
|
||||||
runtime syntax/vue-html.vim
|
let name = '@javascript,@htmlJavaScript,@coffeeJS'
|
||||||
|
elseif syntax == 'css'
|
||||||
" Load vue-javascript syntax
|
let name = '@css,@htmlCss'
|
||||||
runtime syntax/vue-javascript.vim
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Load pre-processors syntax {{{
|
|
||||||
"
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" If pug is enabled, load vim-pug syntax
|
|
||||||
if s:use_pug
|
|
||||||
call vue#LoadFullSyntax('@PugSyntax', 'pug')
|
|
||||||
syn cluster htmlJavascript remove=javascriptParenthesisBlock
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If less is enabled, load less syntax
|
|
||||||
if s:use_less
|
|
||||||
call vue#LoadSyntax('@LessSyntax', 'less')
|
|
||||||
runtime! after/syntax/less.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If sass is enabled, load sass syntax
|
|
||||||
if s:use_sass
|
|
||||||
call vue#LoadSyntax('@SassSyntax', 'sass')
|
|
||||||
runtime! after/syntax/sass.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If scss is enabled, load sass syntax
|
|
||||||
if s:use_scss
|
|
||||||
call vue#LoadSyntax('@ScssSyntax', 'scss')
|
|
||||||
runtime! after/syntax/scss.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If stylus is enabled, load stylus syntax
|
|
||||||
if s:use_stylus
|
|
||||||
call vue#LoadFullSyntax('@StylusSyntax', 'stylus')
|
|
||||||
runtime! after/syntax/stylus.vim
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If CoffeeScript is enabled, load the syntax. Keep name consistent with
|
|
||||||
" vim-coffee-script/after/html.vim
|
|
||||||
if s:use_coffee
|
|
||||||
call vue#LoadFullSyntax('@htmlCoffeeScript', 'coffee')
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If TypeScript is enabled, load the syntax.
|
|
||||||
if s:use_typescript
|
|
||||||
call vue#LoadFullSyntax('@TypeScript', 'typescript')
|
|
||||||
endif
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Syntax highlight {{{
|
|
||||||
"
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" All start with html/javascript/css for emmet-vim in-file type detection
|
|
||||||
syntax region htmlVueTemplate fold
|
|
||||||
\ start=+<template[^>]*>+
|
|
||||||
\ end=+^</template>+
|
|
||||||
\ keepend contains=@html
|
|
||||||
" When template code is not well indented
|
|
||||||
syntax region htmlVueTemplate fold
|
|
||||||
\ start=+<template[^>]*>+
|
|
||||||
\ end=+</template>\ze\n\(^$\n\)*<\(script\|style\)+
|
|
||||||
\ keepend contains=@html
|
|
||||||
|
|
||||||
syntax region javascriptVueScript fold
|
|
||||||
\ start=+<script[^>]*>+
|
|
||||||
\ end=+</script>+
|
|
||||||
\ keepend contains=@htmlJavaScript,jsImport,jsExport,vueTag
|
|
||||||
|
|
||||||
|
|
||||||
syntax region cssVueStyle fold
|
|
||||||
\ start=+<style[^>]*>+
|
|
||||||
\ end=+</style>+
|
|
||||||
\ keepend contains=@htmlCss,vueTag
|
|
||||||
|
|
||||||
" Preprocessors syntax
|
|
||||||
syntax region pugVueTemplate fold
|
|
||||||
\ start=+<template[^>]*lang=["']pug["'][^>]*>+
|
|
||||||
\ end=+</template>+
|
|
||||||
\ keepend contains=@PugSyntax,vueTag
|
|
||||||
|
|
||||||
syntax region coffeeVueScript fold
|
|
||||||
\ start=+<script[^>]*lang=["']coffee["'][^>]*>+
|
|
||||||
\ end=+</script>+
|
|
||||||
\ keepend contains=@htmlCoffeeScript,jsImport,jsExport,vueTag
|
|
||||||
|
|
||||||
syntax region typescriptVueScript fold
|
|
||||||
\ start=+<script[^>]*lang=["']ts["'][^>]*>+
|
|
||||||
\ end=+</script>+
|
|
||||||
\ keepend contains=@TypeScript,vueTag
|
|
||||||
|
|
||||||
syntax region cssLessVueStyle fold
|
|
||||||
\ start=+<style[^>]*lang=["']less["'][^>]*>+
|
|
||||||
\ end=+</style>+
|
|
||||||
\ keepend contains=@LessSyntax,vueTag
|
|
||||||
syntax region sassVueStyle fold
|
|
||||||
\ start=+<style[^>]*lang=["']sass["'][^>]*>+
|
|
||||||
\ end=+</style>+
|
|
||||||
\ keepend contains=@SassSyntax,vueTag
|
|
||||||
syntax region cssScssVueStyle fold
|
|
||||||
\ start=+<style[^>]*lang=["']scss["'][^>]*>+
|
|
||||||
\ end=+</style>+
|
|
||||||
\ keepend contains=@ScssSyntax,vueTag
|
|
||||||
|
|
||||||
" Backward compatiable for `use_sass` option
|
|
||||||
if s:use_sass && !s:use_scss
|
|
||||||
syntax region cssScssVueStyle fold
|
|
||||||
\ start=+<style[^>]*lang=["']scss["'][^>]*>+
|
|
||||||
\ end=+</style>+
|
|
||||||
\ keepend contains=@SassSyntax,vueTag
|
|
||||||
endif
|
|
||||||
|
|
||||||
syntax region cssStylusVueStyle fold
|
|
||||||
\ start=+<style[^>]*lang=["']stylus["'][^>]*>+
|
|
||||||
\ end=+</style>+
|
|
||||||
\ keepend contains=@StylusSyntax,vueTag
|
|
||||||
|
|
||||||
syntax region vueTag fold
|
|
||||||
\ start=+^<[^/]+ end=+>+ skip=+></+
|
|
||||||
\ contained contains=htmlTagN,htmlString,htmlArg
|
|
||||||
syntax region vueTag
|
|
||||||
\ start=+^</+ end=+>+
|
|
||||||
\ contains=htmlTagN,htmlString,htmlArg
|
|
||||||
|
|
||||||
highlight default link vueTag htmlTag
|
|
||||||
highlight default link cssUnitDecorators2 Number
|
|
||||||
highlight default link cssKeyFrameProp2 Constant
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Custom blocks {{{
|
|
||||||
"
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
runtime syntax/vue-custom-blocks.vim
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" Syntax patch {{{
|
|
||||||
"
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" Patch 7.4.1142
|
|
||||||
if has("patch-7.4-1142")
|
|
||||||
if has("win32")
|
|
||||||
syntax iskeyword @,48-57,_,128-167,224-235,$,-
|
|
||||||
else
|
|
||||||
syntax iskeyword @,48-57,_,192-255,$,-
|
|
||||||
endif
|
endif
|
||||||
else
|
return name
|
||||||
setlocal iskeyword+=-
|
endfunction
|
||||||
endif
|
|
||||||
|
|
||||||
" Style
|
function! s:GetSynatxName(block, syntax)
|
||||||
" Redefine (less|sass|stylus)Definition to highlight <style> correctly and
|
let block = a:block
|
||||||
" enable emmet-vim css type.
|
let syntax = a:syntax
|
||||||
if s:use_less
|
let name = syntax.toupper(block[0]).block[1:].'Block'
|
||||||
silent! syntax clear lessDefinition
|
let name = vue#AlterSyntaxForEmmetVim(name, syntax)
|
||||||
syntax region cssLessDefinition matchgroup=cssBraces
|
return name
|
||||||
\ contains=@LessSyntax,cssLessDefinition
|
endfunction
|
||||||
\ contained containedin=cssLessVueStyle
|
|
||||||
\ start="{" end="}"
|
|
||||||
endif
|
|
||||||
if s:use_sass
|
|
||||||
silent! syntax clear sassDefinition
|
|
||||||
syntax region sassDefinition matchgroup=cssBraces
|
|
||||||
\ contains=@SassSyntax,sassDefinition
|
|
||||||
\ contained containedin=sassVueStyle
|
|
||||||
\ start="{" end="}"
|
|
||||||
|
|
||||||
" Extend to highlight all numbers in expression
|
function! s:LoadSyntaxList(syntax_list)
|
||||||
syntax match cssValueNumber
|
for syntax in a:syntax_list
|
||||||
\ /\W\zs\d\+\(\.\d\+\)\?%\?\ze\W/
|
let loaded = s:BeforeLoadSyntax(syntax)
|
||||||
\ contained containedin=sassDefinition
|
if !loaded
|
||||||
endif
|
let syntax_group = s:GetGroupNameForLoading(syntax)
|
||||||
" If not loading https://github.com/cakebaker/scss-syntax.vim
|
call vue#LoadSyntax(syntax_group, syntax)
|
||||||
if s:use_scss && !hlexists('scssNestedProperty')
|
endif
|
||||||
silent! syntax clear scssDefinition
|
call s:AfterLoadSyntax(syntax)
|
||||||
syntax region cssScssDefinition transparent matchgroup=cssBraces
|
endfor
|
||||||
\ contains=@ScssSyntax,cssScssDefinition
|
endfunction
|
||||||
\ contained containedin=cssScssVueStyle
|
|
||||||
\ start="{" end="}"
|
|
||||||
|
|
||||||
" Extend to highlight all numbers in expression
|
" For specific syntax, we need to handle it specially
|
||||||
syntax match cssValueNumber
|
function! s:BeforeLoadSyntax(syntax)
|
||||||
\ /\W\zs\d\+\(\.\d\+\)\?%\?\ze\W/
|
let syntax = a:syntax
|
||||||
\ contained containedin=cssScssDefinition
|
|
||||||
endif
|
|
||||||
if s:use_stylus
|
|
||||||
silent! syntax clear stylusDefinition
|
|
||||||
syntax region cssStylusDefinition matchgroup=cssBraces
|
|
||||||
\ contains=@StylusSyntax,cssStylusDefinition
|
|
||||||
\ contained containedin=cssStylusVueStyle
|
|
||||||
\ start="{" end="}"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Use a different name in order to avoid css syntax interference
|
" Avoid overload if group already exists
|
||||||
silent! syntax clear cssUnitDecorators
|
let loaded = 0
|
||||||
syntax match cssUnitDecorators2
|
if syntax == 'javascript'
|
||||||
\ /\(#\|-\|+\|%\|mm\|cm\|in\|pt\|pc\|em\|ex\|px\|ch\|rem\|vh\|vw\|vmin\|vmax\|dpi\|dppx\|dpcm\|Hz\|kHz\|s\|ms\|deg\|grad\|rad\)\ze\(;\|$\)/
|
let loaded = hlexists('javaScriptComment')
|
||||||
\ contained
|
elseif syntax == 'css'
|
||||||
\ containedin=cssAttrRegion,sassCssAttribute,lessCssAttribute,stylusCssAttribute
|
let loaded = hlexists('cssTagName')
|
||||||
|
endif
|
||||||
|
return loaded
|
||||||
|
endfunction
|
||||||
|
|
||||||
silent! syntax clear cssKeyFrameProp
|
function! s:AfterLoadSyntax(syntax)
|
||||||
syn match cssKeyFrameProp2 /\d*%\|from\|to/
|
let syntax = a:syntax
|
||||||
\ contained nextgroup=cssDefinition
|
call s:LoadPatchSyntax(syntax)
|
||||||
\ containedin=cssAttrRegion,sassCssAttribute,lessCssAttribute,stylusCssAttribute
|
call s:LoadStyleAfterSyntax(syntax)
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Coffee
|
function! s:LoadPatchSyntax(syntax)
|
||||||
if s:use_coffee
|
let file = s:patch_path.'/'.a:syntax.'.vim'
|
||||||
silent! syntax clear coffeeConstant
|
if filereadable(file)
|
||||||
syn match coffeeConstant '\v<\u\C[A-Z0-9_]+>' display
|
execute 'syntax include '.file
|
||||||
\ containedin=@coffeeIdentifier
|
endif
|
||||||
endif
|
endfunction
|
||||||
|
|
||||||
" JavaScript
|
function! s:LoadStyleAfterSyntax(syntax)
|
||||||
" Number with minus
|
let syntax = a:syntax
|
||||||
syntax match javaScriptNumber '\v<-?\d+L?>|0[xX][0-9a-fA-F]+>'
|
if count(['scss', 'sass', 'less', 'stylus'], syntax) == 1
|
||||||
\ containedin=@javascriptVueScript display
|
execute 'runtime! after/syntax/'.syntax.'.vim'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
" HTML
|
function! s:GetSyntaxLangName(syntax)
|
||||||
" Clear htmlHead that may cause highlighting out of bounds
|
let syntax = a:syntax
|
||||||
silent! syntax clear htmlHead
|
if syntax == 'typescript'
|
||||||
|
let syntax = 'ts'
|
||||||
|
endif
|
||||||
|
return syntax
|
||||||
|
endfunction
|
||||||
|
|
||||||
" html5 data-*
|
function! s:SetSyntax(block, syntax, lang)
|
||||||
syntax match htmlArg '\v<data(-[.a-z0-9]+)+>' containedin=@html
|
let block = a:block
|
||||||
"}}}
|
let syntax = a:syntax
|
||||||
|
let lang = a:lang
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
let name = s:GetSynatxName(block, syntax)
|
||||||
"
|
let syntax_lang_name = s:GetSyntaxLangName(syntax)
|
||||||
" Syntax sync {{{
|
let syntax_lang = lang ? 'lang=["'']'.syntax_lang_name.'["''][^>]*' : ''
|
||||||
"
|
let start = '<'.block.'[^>]*'.syntax_lang.'>'
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
let end = '</'.block.'>'
|
||||||
syntax sync clear
|
let syntax_group = s:GetGroupNameForHighlight(syntax)
|
||||||
syntax sync minlines=100
|
|
||||||
syntax sync match vueHighlight groupthere NONE "</\(script\|template\|style\)"
|
execute 'syntax region '.name.' fold '
|
||||||
syntax sync match scriptHighlight groupthere javascriptVueScript "<script"
|
\.' start=+'.start.'+'
|
||||||
syntax sync match scriptHighlight groupthere coffeeVueScript "<script[^>]*lang=["']coffee["'][^>]*>"
|
\.' end=+'.end.'+'
|
||||||
syntax sync match scriptHighlight groupthere typescriptVueScript "<script[^>]*lang=["']ts["'][^>]*>"
|
\.' keepend contains='.syntax_group.', vueTag'
|
||||||
syntax sync match templateHighlight groupthere htmlVueTemplate "<template"
|
endfunction
|
||||||
syntax sync match templateHighlight groupthere pugVueTemplate "<template[^>]*lang=["']pug["'][^>]*>"
|
|
||||||
syntax sync match styleHighlight groupthere cssVueStyle "<style"
|
function! s:SetBlockSyntax(config_syntax)
|
||||||
syntax sync match styleHighlight groupthere cssLessVueStyle "<style[^>]*lang=["']less["'][^>]*>"
|
for [block, syntax] in items(a:config_syntax)
|
||||||
syntax sync match styleHighlight groupthere sassVueStyle "<style[^>]*lang=["']sass["'][^>]*>"
|
let type = type(syntax)
|
||||||
syntax sync match styleHighlight groupthere cssScssVueStyle "<style[^>]*lang=["']scss["'][^>]*>"
|
if type == v:t_string
|
||||||
syntax sync match styleHighlight groupthere cssStylusVueStyle "<style[^>]*lang=["']stylus["'][^>]*>"
|
call s:SetSyntax(block, syntax, 0)
|
||||||
"}}}
|
elseif type == v:t_list && len(syntax)
|
||||||
|
call s:SetSyntax(block, syntax[0], 0)
|
||||||
|
for syn in syntax
|
||||||
|
call s:SetSyntax(block, syn, 1)
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:HighlightVueTag()
|
||||||
|
syntax region vueTag fold
|
||||||
|
\ start=+^<[^/]+ end=+>+ skip=+></+
|
||||||
|
\ contained contains=htmlTagN,htmlString,htmlArg
|
||||||
|
syntax region vueTag
|
||||||
|
\ start=+^</+ end=+>+
|
||||||
|
\ contained contains=htmlTagN,htmlString,htmlArg
|
||||||
|
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")
|
||||||
|
syntax iskeyword @,48-57,_,128-167,224-235,$,-
|
||||||
|
else
|
||||||
|
syntax iskeyword @,48-57,_,192-255,$,-
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
setlocal iskeyword+=-
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! VimVuePluginSyntaxMain(id)
|
||||||
|
call s:Init()
|
||||||
|
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
|
||||||
|
|
||||||
|
" call timer_start(10, 'VimVuePluginSyntaxMain')
|
||||||
|
call VimVuePluginSyntaxMain(0)
|
||||||
|
|
||||||
let b:current_syntax = 'vue'
|
let b:current_syntax = 'vue'
|
||||||
" vim: fdm=marker
|
|
||||||
|
|||||||
Reference in New Issue
Block a user