This commit is contained in:
Adam Stankiewicz
2019-11-12 21:56:06 +01:00
parent 4e95df7c7e
commit 0c79dd3e73
18 changed files with 770 additions and 292 deletions

View File

@@ -21,7 +21,7 @@ if exists('s:did_indent')
endif
setlocal indentexpr=GetJsxIndent()
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,*<Return>,<>>,<<>,/
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,<>>,=*/
function! GetJsxIndent()
return jsx_pretty#indent#get(function('GetJavascriptIndent'))

View File

@@ -22,34 +22,31 @@ if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
if hlexists("jsNoise") " pangloss/vim-javascript
if hlexists("jsDebugger") || hlexists("jsNoise") " yuezk/vim-js or pangloss/vim-javascript
syntax cluster jsExpression add=jsxRegion
elseif hlexists("javascriptOpSymbols") " othree/yajs.vim
" refine the javascript line comment
syntax region javascriptLineComment start=+//+ end=/$/ contains=@Spell,javascriptCommentTodo extend keepend
syntax cluster javascriptValue add=jsxRegion
syntax cluster javascriptNoReserved add=jsxElement,jsxTag
" add support to arrow function which returns a tagged template string, e.g.
" () => html`<div></div>`
syntax cluster afterArrowFunc add=javascriptTagRef
else " build-in javascript syntax
" refine the javascript line comment
syntax region javaScriptLineComment start=+//+ end=/$/ contains=@Spell,javascriptCommentTodo extend keepend
" refine the template string syntax
syntax region javaScriptEmbed matchgroup=javaScriptEmbedBraces start=+\${+ end=+}+ contained contains=@javaScriptEmbededExpr
" add a javaScriptBlock group for build-in syntax
syntax region javaScriptBlockBuildIn
\ contained
syntax region javaScriptBlock
\ matchgroup=javaScriptBraces
\ start="{"
\ end="}"
\ contained
\ extend
\ contains=javaScriptBlockBuildIn,@javaScriptEmbededExpr,javaScript.*
\ contains=javaScriptBlock,@javaScriptEmbededExpr,javaScript.*
\ fold
syntax cluster javaScriptEmbededExpr add=jsxRegion
" refine the template string syntax
syntax region javaScriptStringT start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=javaScriptSpecial,javaScriptEmbed,@htmlPreproc extend
syntax region javaScriptEmbed matchgroup=javaScriptEmbedBraces start=+\${+ end=+}+ contained contains=@javaScriptEmbededExpr,javaScript.*
syntax cluster javaScriptEmbededExpr add=jsxRegion,javaScript.*
endif
runtime syntax/jsx_pretty.vim

View File

@@ -2,6 +2,12 @@ if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript')
let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0)
" detect jsx region
syntax region jsxRegion
\ start=+\%(\%(\_[([,?:=+\-*/>{}]\|<\s\+\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\%(>\|\z(\%(script\|T\s*>\s*(\)\@!\<[_$A-Za-z][-:._$A-Za-z0-9]*\>\)\%(\_s*\%([-+*)\]}&|?,]\|/\%([/*]\|\_s*>\)\@!\)\)\@!\)+
\ end=++
\ contains=jsxElement
" <tag id="sample">
" ~~~~~~~~~~~~~~~~~
" and self close tag
@@ -12,11 +18,14 @@ syntax region jsxTag
\ matchgroup=jsxOpenPunct
\ end=+>+
\ matchgroup=NONE
\ end=+\(/\_s*>\)\@=+
\ end=+\%(/\_s*>\)\@=+
\ contained
\ contains=jsxOpenTag,jsxEscapeJs,jsxAttrib,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment,jsxSpreadOperator
\ contains=jsxOpenTag,jsxAttrib,jsxEscapeJs,jsxSpreadOperator,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
\ keepend
\ extend
\ skipwhite
\ skipempty
\ nextgroup=jsxCloseString
" <tag></tag>
" ~~~~~~~~~~~
@@ -27,30 +36,15 @@ syntax region jsxTag
" <tag />
" ~~~~~~~
syntax region jsxElement
\ start=+<\_s*\(>\|\${\|\z(\<[-:_\.\$0-9A-Za-z]\+\>\)\)+
\ start=+<\_s*\%(>\|\${\|\z(\<[-:._$A-Za-z0-9]\+\>\)\)+
\ end=+/\_s*>+
\ end=+<\_s*/\_s*\z1\_s*>+
\ contains=jsxElement,jsxEscapeJs,jsxTag,jsxComment,jsxCloseString,jsxCloseTag,@Spell
\ contains=jsxElement,jsxTag,jsxEscapeJs,jsxComment,jsxCloseTag,@Spell
\ keepend
\ extend
\ contained
\ fold
" detect jsx region
syntax region jsxRegion
\ start=+\(\(\_[([,?:=+\-*/>{}]\|<\s\+\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\(>\|\z(\(script\|T\s*>\s*(\)\@!\<[_\$A-Za-z][-:_\.\$0-9A-Za-z]*\>\)\(\_s*\([-+*)\]}&|?,]\|/\([/*]\|\_s*>\)\@!\)\)\@!\)+
\ end=++
\ contains=jsxElement
" <tag key={this.props.key}>
" ~~~~~~~~~~~~~~~~
syntax region jsxEscapeJs
\ start=+{+
\ end=++
\ extend
\ contained
\ contains=jsBlock,javascriptBlock,javaScriptBlockBuildIn,typescriptBlock
" <tag key={this.props.key}>
" ~~~~
" and fragment start tag
@@ -66,19 +60,31 @@ exe 'syntax region jsxOpenTag
\ contains=jsxTagName
\ nextgroup=jsxAttrib
\ skipwhite
\ skipempty ' .(s:highlight_close_tag ? 'transparent' : '')
\ skipempty
\ ' .(s:highlight_close_tag ? 'transparent' : '')
" <tag key={this.props.key}>
" ~~~~~~~~~~~~~~~~
syntax region jsxEscapeJs
\ matchgroup=jsxBraces
\ start=+{+
\ end=+}+
\ contained
\ extend
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread
" <foo.bar>
" ~
syntax match jsxDot +\.+ contained display
syntax match jsxDot +\.+ contained
" <foo:bar>
" ~
syntax match jsxNamespace +:+ contained display
syntax match jsxNamespace +:+ contained
" <tag id="sample">
" ~
syntax match jsxEqual +=+ contained display nextgroup=jsxString,jsxEscapeJs,jsxRegion skipwhite
syntax match jsxEqual +=+ contained skipwhite skipempty nextgroup=jsxString,jsxEscapeJs,jsxRegion
" <tag />
" ~~
@@ -99,13 +105,12 @@ syntax region jsxCloseTag
" <tag key={this.props.key}>
" ~~~
syntax match jsxAttrib
\ +\<[-A-Za-z_][-:_\$0-9A-Za-z]*\>+
\ +\<[_$A-Za-z][-:_$A-Za-z0-9]*\>+
\ contained
\ nextgroup=jsxEqual
\ skipwhite
\ skipempty
\ contains=jsxAttribKeyword
\ display
\ contains=jsxAttribKeyword,jsxNamespace
" <MyComponent ...>
" ~~~~~~~~~~~
@@ -113,67 +118,71 @@ syntax match jsxAttrib
" <someCamel ...>
" ~~~~~
exe 'syntax match jsxComponentName
\ +\<[A-Z][\$0-9A-Za-z]\+\>+
\ +\<[_$]\?[A-Z][-_$A-Za-z0-9]*\>+
\ contained
\ display ' .(s:highlight_close_tag ? 'transparent' : '')
\ ' .(s:highlight_close_tag ? 'transparent' : '')
" <tag key={this.props.key}>
" ~~~
exe 'syntax match jsxTagName
\ +\<[-:_\.\$0-9A-Za-z]\+\>+
\ +\<[-:._$A-Za-z0-9]\+\>+
\ contained
\ contains=jsxComponentName,jsxDot,jsxNamespace
\ nextgroup=jsxAttrib
\ skipempty
\ skipwhite
\ display ' .(s:highlight_close_tag ? 'transparent' : '')
\ ' .(s:highlight_close_tag ? 'transparent' : '')
" <tag id="sample">
" ~~~~~~~~
" and
" <tag id='sample'>
" ~~~~~~~~
syntax region jsxString start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ contained contains=@Spell display
syntax region jsxString start=+\z(["']\)+ skip=+\\\\\|\\\z1\|\\\n+ end=+\z1+ contained contains=@Spell
let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'raw'])
let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx'])
let s:enable_tagged_jsx = !empty(s:tags)
" add support to JSX inside the tagged template string
" https://github.com/developit/htm
if s:enable_tagged_jsx
exe 'syntax region jsxTaggedRegion
\ start=+\%('. join(s:tags, '\|') .'\)\@<=`+ms=s+1
\ end=+`+me=e-1
exe 'syntax match jsxRegion +\%(' . join(s:tags, '\|') . '\)\%(\_s*`\)\@=+ contains=jsTemplateStringTag,jsTaggedTemplate,javascriptTagRef skipwhite skipempty nextgroup=jsxTaggedRegion'
syntax region jsxTaggedRegion
\ matchgroup=jsxBackticks
\ start=+`+
\ end=+`+
\ extend
\ contained
\ containedin=jsTemplateString,javascriptTemplate,javaScriptStringT,typescriptStringB
\ contains=jsxElement'
\ contains=jsxElement,jsxEscapeJs
\ transparent
syntax region jsxEscapeJs
\ matchgroup=jsxBraces
\ start=+\${+
\ end=++
\ end=+}+
\ extend
\ contained
\ contains=jsTemplateExpression,javascriptTemplateSubstitution,javaScriptEmbed,typescriptInterpolation
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread
syntax region jsxOpenTag
\ matchgroup=jsxOpenPunct
\ start=+<\%(\${\)\@=+
\ matchgroup=NONE
\ end=++
\ end=+}\@1<=+
\ contained
\ contains=jsxEscapeJs
\ nextgroup=jsxAttrib,jsxSpreadOperator
\ skipwhite
\ skipempty
\ nextgroup=jsxAttrib,jsxSpreadOperator
syntax keyword jsxAttribKeyword class contained display
syntax keyword jsxAttribKeyword class contained
syntax match jsxSpreadOperator +\.\.\.+ contained display nextgroup=jsxEscapeJs skipwhite
syntax match jsxSpreadOperator +\.\.\.+ contained nextgroup=jsxEscapeJs skipwhite
syntax match jsxCloseTag +<//>+ display
syntax match jsxCloseTag +<//>+ contained
syntax match jsxComment +<!--\_.\{-}-->+ display
syntax match jsxComment +<!--\_.\{-}-->+
endif
" Highlight the tag name
@@ -183,10 +192,14 @@ highlight def link jsxComponentName Function
highlight def link jsxAttrib Type
highlight def link jsxAttribKeyword jsxAttrib
highlight def link jsxEqual Operator
highlight def link jsxString String
highlight def link jsxComment Comment
highlight def link jsxDot Operator
highlight def link jsxNamespace Operator
highlight def link jsxEqual Operator
highlight def link jsxSpreadOperator Operator
highlight def link jsxBraces Special
if s:highlight_close_tag
highlight def link jsxCloseString Identifier
@@ -201,9 +214,6 @@ highlight def link jsxPunct jsxCloseString
highlight def link jsxClosePunct jsxPunct
highlight def link jsxCloseTag jsxCloseString
highlight def link jsxComment Comment
highlight def link jsxSpreadOperator Operator
let s:vim_jsx_pretty_colorful_config = get(g:, 'vim_jsx_pretty_colorful_config', 0)
if s:vim_jsx_pretty_colorful_config == 1
@@ -212,5 +222,4 @@ if s:vim_jsx_pretty_colorful_config == 1
highlight def link jsFuncArgs Type
endif
endif

View File

@@ -463,6 +463,14 @@ function! go#config#HighlightVariableDeclarations() abort
return get(g:, 'go_highlight_variable_declarations', 0)
endfunction
function! go#config#HighlightDiagnosticErrors() abort
return get(g:, 'go_highlight_diagnostic_errors', 1)
endfunction
function! go#config#HighlightDiagnosticWarnings() abort
return get(g:, 'go_highlight_diagnostic_warnings', 1)
endfunction
function! go#config#HighlightDebug() abort
return get(g:, 'go_highlight_debug', 1)
endfunction
@@ -487,6 +495,26 @@ function! go#config#Updatetime() abort
return go_updatetime == 0 ? &updatetime : go_updatetime
endfunction
function! go#config#ReferrersMode() abort
return get(g:, 'go_referrers_mode', 'gopls')
endfunction
function! go#config#GoplsCompleteUnimported() abort
return get(g:, 'go_gopls_complete_unimported', 0)
endfunction
function! go#config#GoplsDeepCompletion() abort
return get(g:, 'go_gopls_deep_completion', 1)
endfunction
function! go#config#GoplsFuzzyMatching() abort
return get(g:, 'go_gopls_fuzzy_matching', 1)
endfunction
function! go#config#GoplsUsePlaceholders() abort
return get(g:, 'go_gopls_use_placeholders', 0)
endfunction
" Set the default value. A value of "1" is a shortcut for this, for
" compatibility reasons.
if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1

View File

@@ -10,209 +10,604 @@ else
endfunction
endif
" Get the syntax group of start of line
function! s:syn_sol(lnum)
let line = getline(a:lnum)
let sol = matchstr(line, '^\s*')
return map(synstack(a:lnum, len(sol) + 1), 'synIDattr(v:val, "name")')
" Regexp for the start tag
let s:start_tag = '<\_s*\%(>\|\${\|\%(\<[-:._$A-Za-z0-9]\+\>\)\)'
" Regexp for the end tag
let s:end_tag = '\%(<\_s*/\_s*\%(\<[-:._$A-Za-z0-9]\+\>\)\_s*>\|/\_s*>\)'
" Get the syntax stack at the given position
function s:syntax_stack_at(lnum, col)
return map(synstack(a:lnum, a:col), 'synIDattr(v:val, "name")')
endfunction
" Get the syntax group of end of line
function! s:syn_eol(lnum)
let lnum = prevnonblank(a:lnum)
let col = strlen(getline(lnum))
return map(synstack(lnum, col), 'synIDattr(v:val, "name")')
" Get the syntax at the given position
function s:syntax_at(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name')
endfunction
function! s:prev_indent(lnum)
let lnum = prevnonblank(a:lnum - 1)
return indent(lnum)
" Get the start col of the non-space charactor
function s:start_col(lnum)
return len(matchstr(getline(a:lnum), '^\s*')) + 1
endfunction
function! s:prev_line(lnum)
let lnum = prevnonblank(a:lnum - 1)
return substitute(getline(lnum), '^\s*\|\s*$', '', 'g')
" Get the end col of the non-space charactor
function s:end_col(lnum)
return len(substitute(getline(a:lnum), '\s*$', '', 'g'))
endfunction
function! s:syn_attr_jsx(synattr)
return a:synattr =~? "^jsx"
" Get the start syntax of a given line number
function s:start_syntax(lnum)
return s:syntax_at(a:lnum, s:start_col(a:lnum))
endfunction
function! s:syn_xmlish(syns)
return s:syn_attr_jsx(get(a:syns, -1))
" Get the end syntax of a given line number
function s:end_syntax(lnum)
let end_col = len(substitute(getline(a:lnum), '\s*$', '', 'g'))
return s:syntax_at(a:lnum, end_col)
endfunction
function! s:syn_jsx_element(syns)
return get(a:syns, -1) =~? 'jsxElement'
endfunction
function! s:syn_js_comment(syns)
return get(a:syns, -1) =~? 'Comment$'
endfunction
function! s:syn_jsx_escapejs(syns)
return get(a:syns, -1) =~? '\(\(js\(Template\)\?\|javaScript\(Embed\)\?\|typescript\)Braces\|javascriptTemplateSB\|typescriptInterpolationDelimiter\)' &&
\ (get(a:syns, -2) =~? 'jsxEscapeJs' ||
\ get(a:syns, -3) =~? 'jsxEscapeJs')
endfunction
function! s:syn_jsx_attrib(syns)
return len(filter(copy(a:syns), 'v:val =~? "jsxAttrib"'))
endfunction
let s:start_tag = '<\s*\([-:_\.\$0-9A-Za-z]\+\|>\)'
" match `/end_tag>` and `//>`
let s:end_tag = '/\%(\s*[-:_\.\$0-9A-Za-z]*\s*\|/\)>'
let s:opfirst = '^' . get(g:,'javascript_opfirst',
\ '\C\%([<>=,.?^%|/&]\|\([-:+]\)\1\@!\|\*\+\|!=\|in\%(stanceof\)\=\>\)')
function! jsx_pretty#indent#get(js_indent)
let lnum = v:lnum
let line = substitute(getline(lnum), '^\s*\|\s*$', '', 'g')
let current_syn = s:syn_sol(lnum)
let current_syn_eol = s:syn_eol(lnum)
let prev_line_num = prevnonblank(lnum - 1)
let prev_syn_sol = s:syn_sol(prev_line_num)
let prev_syn_eol = s:syn_eol(prev_line_num)
let prev_line = s:prev_line(lnum)
let prev_ind = s:prev_indent(lnum)
if s:syn_xmlish(current_syn)
if !s:syn_xmlish(prev_syn_sol)
\ && !s:syn_jsx_escapejs(prev_syn_sol)
\ && !s:syn_jsx_escapejs(prev_syn_eol)
\ && !s:syn_js_comment(prev_syn_sol)
if line =~ '^/\s*>' || line =~ '^<\s*' . s:end_tag
return prev_ind
else
return prev_ind + s:sw()
endif
elseif !s:syn_xmlish(prev_syn_sol) && !s:syn_js_comment(prev_syn_sol) && s:syn_jsx_attrib(current_syn)
" For #79
return prev_ind + s:sw()
" {
" <div></div>
" ##} <--
elseif s:syn_jsx_element(current_syn) && line =~ '}$'
let pair_line = searchpair('{', '', '}', 'b')
return indent(pair_line)
elseif line =~ '^-->$'
if prev_line =~ '^<!--'
return prev_ind
else
return prev_ind - s:sw()
endif
elseif prev_line =~ '-->$'
return prev_ind
" close tag </tag> or /> including </>
elseif prev_line =~ s:end_tag . '$'
if line =~ '^<\s*' . s:end_tag
return prev_ind - s:sw()
elseif s:syn_jsx_attrib(prev_syn_sol)
return prev_ind - s:sw()
else
return prev_ind
endif
elseif line =~ '^\(>\|/\s*>\)'
if prev_line =~ '^<'
return prev_ind
else
return prev_ind - s:sw()
endif
elseif prev_line =~ '^\(<\|>\)' &&
\ (s:syn_xmlish(prev_syn_eol) || s:syn_js_comment(prev_syn_eol))
if line =~ '^<\s*' . s:end_tag
return prev_ind
else
return prev_ind + s:sw()
endif
elseif line =~ '^<\s*' . s:end_tag
if !s:syn_xmlish(prev_syn_sol)
if s:syn_jsx_escapejs(prev_syn_eol)
\ || s:syn_jsx_escapejs(prev_syn_sol)
return prev_ind - s:sw()
else
return prev_ind
endif
elseif prev_line =~ '^\<return'
return prev_ind
else
return prev_ind - s:sw()
endif
elseif !s:syn_xmlish(prev_syn_eol)
if prev_line =~ '\(&&\|||\|=>\|[([{]\|`\)$'
" <div>
" {
" }
" </div>
if line =~ '^[)\]}]'
return prev_ind
else
return prev_ind + s:sw()
endif
else
return prev_ind
endif
else
return prev_ind
endif
elseif s:syn_jsx_escapejs(current_syn)
if line =~ '^}'
let char = getline('.')[col('.') - 1]
" When pressing enter after the }, keep the indent
if char != '}' && search('}', 'b', lnum)
return indent(lnum)
else
let pair_line = searchpair('{', '', '}', 'bW')
return indent(pair_line)
endif
elseif line =~ '^{' || line =~ '^\${'
if s:syn_jsx_escapejs(prev_syn_eol)
\ || s:syn_jsx_attrib(prev_syn_sol)
return prev_ind
elseif s:syn_xmlish(prev_syn_eol) && (prev_line =~ s:end_tag || prev_line =~ '-->$')
return prev_ind
else
return prev_ind + s:sw()
endif
endif
elseif line =~ '^`' && s:syn_jsx_escapejs(current_syn_eol)
" For `} of template syntax
let pair_line = searchpair('{', '', '}', 'bW')
return indent(pair_line)
elseif line =~ '^/[/*]' " js comment in jsx tag
if get(prev_syn_sol, -1) =~ 'Punct'
return prev_ind + s:sw()
elseif synIDattr(synID(lnum - 1, 1, 1), 'name') =~ 'jsxTag'
return prev_ind
else
return a:js_indent()
endif
else
let ind = a:js_indent()
" Issue #68
" return (<div>
" |<div>)
if (line =~ '^/\s*>' || line =~ '^<\s*' . s:end_tag)
\ && !s:syn_xmlish(prev_syn_sol)
return prev_ind
endif
" If current syntax is not a jsx syntax group
if s:syn_xmlish(prev_syn_eol) && line !~ '^[)\]}]'
let sol = matchstr(line, s:opfirst)
if sol is ''
" Fix javascript continue indent
return ind - s:sw()
else
return ind
endif
endif
return ind
" The skip function for searchpair
function s:skip_if_not(current_lnum, ...)
" Skip the match in current line
if line('.') == a:current_lnum
return 1
endif
let syntax = s:syntax_at(line('.'), col('.'))
return syntax !~? join(a:000, '\|')
endfunction
" Whether the specified stytax group is an jsx-related syntax
function s:is_jsx(syntax_name)
return a:syntax_name =~ '^jsx' && a:syntax_name !=? 'jsxEscapeJs'
endfunction
" Whether the specified line is start with jsx-related syntax
function s:start_with_jsx(lnum)
let start_syntax = s:start_syntax(a:lnum)
return s:is_jsx(start_syntax)
endfunction
" Whether the specified line is end with jsx-related syntax
function s:end_with_jsx(lnum)
let end_syntax = s:end_syntax(a:lnum)
return s:is_jsx(end_syntax)
endfunction
" Whether the specified line is comment related syntax
function s:is_comment(syntax)
return a:syntax =~? 'comment'
endfunction
" Whether the specified line is embedded comment in jsxTag
function s:is_embedded_comment(lnum)
let start_col = s:start_col(a:lnum)
let syntax_stack = s:syntax_stack_at(a:lnum, start_col)
let last = get(syntax_stack, -1)
let last_2nd = get(syntax_stack, -2)
" Patch code for pangloss/vim-javascript
" <div
" /* hello */ <-- syntax stack is [..., jsxTag, jsComment, jsComment]
" >
if last_2nd =~ 'comment'
let last_2nd = get(syntax_stack, -3)
endif
return last =~? 'comment' && last_2nd =~? 'jsxTag' &&
\ trim(getline(a:lnum)) =~ '\%(^/[*/]\)\|\%(\*/$\)'
endfunction
" Whether the specified stytax group is the opening tag
function s:is_opening_tag(syntax)
return a:syntax =~? 'jsxOpenPunct'
endfunction
" Whether the specified stytax group is the closing tag
function s:is_closing_tag(syntax)
return a:syntax =~? 'jsxClose'
endfunction
" Whether the specified stytax group is the jsxAttrib
function s:is_jsx_attr(syntax)
return a:syntax =~? 'jsxAttrib'
endfunction
" Whether the specified syntax group is the jsxElement
function s:is_jsx_element(syntax)
return a:syntax =~? 'jsxElement'
endfunction
" Whether the specified syntax group is the jsxTag
function s:is_jsx_tag(syntax)
return a:syntax =~? 'jsxTag'
endfunction
" Whether the specified syntax group is the jsxBraces
function s:is_jsx_brace(syntax)
return a:syntax =~? 'jsxBraces'
endfunction
" Whether the specified syntax group is the jsxComment
function s:is_jsx_comment(syntax)
return a:syntax =~? 'jsxComment'
endfunction
" Whether the specified syntax group is the jsxComment
function s:is_jsx_backticks(syntax)
return a:syntax =~? 'jsxBackticks'
endfunction
" Get the prvious line number
function s:prev_lnum(lnum)
return prevnonblank(a:lnum - 1)
endfunction
" Given a lnum and get the information of its previous line
function s:prev_info(lnum)
let prev_lnum = s:prev_lnum(a:lnum)
let prev_start_syntax = s:start_syntax(prev_lnum)
let prev_end_syntax = s:end_syntax(prev_lnum)
return [prev_lnum, prev_start_syntax, prev_end_syntax]
endfunction
" Get the length difference between syntax stack a and b
function s:syntax_stack_length_compare(lnum_a, col_a, lnum_b, col_b)
let stack_a = s:syntax_stack_at(a:lnum_a, a:col_a)
let stack_b = s:syntax_stack_at(a:lnum_b, a:col_b)
return len(stack_a) - len(stack_b)
endfunction
" Determine whether child is a element of parent
function s:is_element_of(parent_lnum, child_lnum)
let parent_stack = s:syntax_stack_at(a:parent_lnum, s:start_col(a:parent_lnum))
let child_stack = s:syntax_stack_at(a:child_lnum, s:start_col(a:child_lnum))
let element_index = len(child_stack) - index(reverse(child_stack), 'jsxElement')
let rest = parent_stack[element_index:]
return index(rest, 'jsxElement') == -1
endfunction
" Compute the indention of the opening tag
function s:jsx_indent_opening_tag(lnum)
let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum)
" If current line is start with >
if trim(getline(a:lnum)) =~ '^>'
let pair_line = searchpair('<', '', '>', 'bW', 's:skip_if_not(a:lnum, "jsxOpenPunct", "jsxClose")')
return indent(pair_line)
endif
" If both the start and the end of the previous line are not jsx-related syntax
" return (
" <div></div> <--
" )
if !s:end_with_jsx(prev_lnum) && !s:start_with_jsx(prev_lnum)
" return -1, so that it will use the default js indent function
return -1
endif
" If the end of the previous line is not jsx-related syntax
" [
" <div></div>,
" <div></div> <--
" ]
" should not affect
" <div
" render={() => (
" <div> <--
" </div>
" )}
" >
" </div>
" <div>
" {items.map(() => (
" <Item /> <--
" ))}
" </div>
if !s:end_with_jsx(prev_lnum) &&
\ !s:is_jsx_attr(prev_start_syntax) &&
\ !s:is_jsx_brace(prev_start_syntax)
return indent(prev_lnum)
endif
" If the start of the previous line is not jsx-related syntax
" return <div>
" <div></div> <--
" </div>
if !s:start_with_jsx(prev_lnum)
return indent(prev_lnum) + s:sw()
endif
endif
" <div>
" <span>
" </span>
" <div> <--
" </div>
" </div>
if s:is_closing_tag(prev_start_syntax)
return indent(prev_lnum)
endif
" If the previous line is end with a closing tag
" <div>
" <br />
" <div></div> <--
" </div>
" should not affect case like
" <div><br />
" <span> <--
" </div>
if s:is_closing_tag(prev_end_syntax) &&
\ s:syntax_stack_length_compare(
\ prev_lnum, s:start_col(prev_lnum), prev_lnum, s:end_col(prev_lnum)) == 2
return indent(prev_lnum)
endif
" If the start of the previous line is the jsxElement
" <div>
" hello
" <div></div> <--
" </div>
if s:is_jsx_element(prev_start_syntax) ||
\ s:is_jsx_comment(prev_start_syntax)
return indent(prev_lnum)
endif
" If the start of the prvious line is the jsxBraces {
" <div>
" {foo}
" <div></div> <--
" </div>
" should not affect case like
" <div>
" {
" <div></div> <--
" }
" </div>
if s:is_jsx_brace(prev_start_syntax) &&
\ trim(getline(prev_lnum)) =~ '^[$]\?{' &&
\ s:syntax_stack_length_compare(
\ prev_lnum, s:start_col(prev_lnum), a:lnum, s:start_col(a:lnum)) == -2
return indent(prev_lnum)
endif
" If the start of the prvious line is the jsxBraces }
" <div>
" {
" foo
" }
" <div></div> <--
" </div>
if s:is_jsx_brace(prev_start_syntax) &&
\ trim(getline(prev_lnum)) =~ '}' &&
\ s:syntax_stack_length_compare(
\ prev_lnum, s:start_col(prev_lnum), a:lnum, s:start_col(a:lnum)) == -3
return indent(prev_lnum)
endif
" Otherwise, indent s:sw() spaces
return indent(prev_lnum) + s:sw()
endfunction
" Compute the indention of the closing tag
function s:jsx_indent_closing_tag(lnum)
let pair_line = searchpair(s:start_tag, '', s:end_tag, 'bW', 's:skip_if_not(a:lnum, "jsxOpenPunct", "jsxClose")')
return pair_line ? indent(pair_line) : indent(a:lnum)
endfunction
" Compute the indention of the jsxAttrib
function s:jsx_indent_attr(lnum)
let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum)
" If the start of the previous line is not jsx-related syntax
" return <div
" attr="hello" <--
" >
" should not affect
" <div
" // comment here
" attr="hello"
" >
" </div>
if !s:start_with_jsx(prev_lnum) &&
\ !s:is_comment(prev_start_syntax)
return indent(prev_lnum) + s:sw()
endif
" If the start of the previous line is the opening tag
" <div
" title="title" <--
" >
if s:is_opening_tag(prev_start_syntax)
return indent(prev_lnum) + s:sw()
endif
" Otherwise, align the attribute with its previous line
return indent(prev_lnum)
endfunction
" Compute the indentation of the jsxElement
function s:jsx_indent_element(lnum)
let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum)
" Fix test case like
" <div|> <-- press enter
" should indent as
" <div
" > <--
if trim(getline(a:lnum)) =~ '^>' && !s:is_opening_tag(prev_end_syntax)
return indent(prev_lnum)
endif
" If the start of the previous line is start with >
" <div
" attr="foo"
" >
" text <--
" </div>
if s:is_opening_tag(prev_start_syntax) &&
\ trim(getline(prev_lnum)) =~ '^>$'
return indent(prev_lnum) + s:sw()
endif
" <div>
" text <--
" </div>
" should not affect case like
" <div>
" <br />
" hello <--
" </div>
if s:is_opening_tag(prev_start_syntax) &&
\ s:is_element_of(prev_lnum, a:lnum)
return indent(prev_lnum) + s:sw()
endif
" return <div>
" text <--
" </div>
if !s:start_with_jsx(prev_lnum)
return indent(prev_lnum) + s:sw()
endif
" Otherwise, align with the previous line
" <div>
" {foo}
" text <--
" </div>
return indent(prev_lnum)
endfunction
" Compute the indentation of jsxBraces
function s:jsx_indent_brace(lnum)
let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum)
" If the start of the previous line is start with >
" <div
" attr="foo"
" >
" {foo} <--
" </div>
if s:is_opening_tag(prev_start_syntax) &&
\ trim(getline(prev_lnum)) =~ '^>$'
return indent(prev_lnum) + s:sw()
endif
" <div>
" {foo} <--
" </div>
" should not affect case like
" <div>
" <br />
" {foo} <--
" text
" {foo} <--
" </div>
if s:is_opening_tag(prev_start_syntax) &&
\ s:syntax_stack_length_compare(
\ prev_lnum, s:start_col(prev_lnum), a:lnum, s:start_col(a:lnum)) == 1
return indent(prev_lnum) + s:sw()
endif
" If current line is the close brace }
if trim(getline(a:lnum)) =~ '^}'
let pair_line = searchpair('{', '', '}', 'bW', 's:skip_if_not(a:lnum, "jsxBraces")')
return indent(pair_line)
endif
" return <div>
" {foo} <--
" </div>
" should not affect
" <div
" // js comment
" {...props} <--
" >
" </div>
if !s:start_with_jsx(prev_lnum) &&
\ !s:is_comment(prev_start_syntax)
return indent(prev_lnum) + s:sw()
endif
return indent(prev_lnum)
endfunction
" Compute the indentation of the comment
function s:jsx_indent_comment(lnum)
let [prev_lnum, prev_start_syntax, prev_end_syntax] = s:prev_info(a:lnum)
" If current line is jsxComment
if s:is_jsx_comment(s:start_syntax(a:lnum))
let line = trim(getline(a:lnum))
if line =~ '^<!--'
" Patch code for yajs.vim
" ${logs.map(log => html`
" <${Log} class="log" ...${log} />
" `)} <-- The backtick here is Highlighted as javascriptTemplate
" <!-- <-- Correct the indentation here
if !s:start_with_jsx(prev_lnum) && s:end_with_jsx(prev_lnum)
return indent(prev_lnum)
endif
" Return the element indent for the opening comment
return s:jsx_indent_element(a:lnum)
elseif line =~ '^-->'
" Return the paired indent for the closing comment
let pair_line = searchpair('<!--', '', '-->', 'bW')
return indent(pair_line)
else
if trim(getline(prev_lnum)) =~ '^<!--'
" <!--
" comment <--
" -->
return indent(prev_lnum) + s:sw()
else
" <!--
" comment
" comment <--
" -->
return indent(prev_lnum)
endif
endif
endif
" For comment inside the jsxTag
if s:is_opening_tag(prev_start_syntax)
return indent(prev_lnum) + s:sw()
endif
if trim(getline(a:lnum)) =~ '\*/$'
let pair_line = searchpair('/\*', '', '\*/', 'bW', 's:skip_if_not(a:lnum)')
return indent(pair_line) + 1
endif
return indent(prev_lnum)
endfunction
function s:jsx_indent_backticks(lnum)
let tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx'])
let start_tag = '\%(' . join(tags, '\|') . '\)`'
let end_tag = '\%(' . join(tags, '\|') . '\)\@<!`'
let pair_line = searchpair(start_tag, '', end_tag, 'bW', 's:skip_if_not(a:lnum)')
return indent(pair_line)
endfunction
" Compute the indentation for the jsx-related element
function s:jsx_indent(lnum)
let start_syntax = s:start_syntax(a:lnum)
if s:is_opening_tag(start_syntax)
return s:jsx_indent_opening_tag(a:lnum)
elseif s:is_closing_tag(start_syntax)
return s:jsx_indent_closing_tag(a:lnum)
elseif s:is_jsx_attr(start_syntax)
return s:jsx_indent_attr(a:lnum)
elseif s:is_jsx_element(start_syntax)
return s:jsx_indent_element(a:lnum)
elseif s:is_jsx_brace(start_syntax)
return s:jsx_indent_brace(a:lnum)
elseif s:is_jsx_comment(start_syntax)
return s:jsx_indent_comment(a:lnum)
elseif s:is_jsx_backticks(start_syntax)
return s:jsx_indent_backticks(a:lnum)
endif
return -1
endfunction
" Return the jsx context of the specified line
function s:jsx_context(lnum)
if !s:end_with_jsx(prev_lnum)
return 'non-jsx'
endif
let prev_lnum = s:prev_lnum(a:lnum)
let start_syntax = s:start_syntax(prev_lnum)
let end_col = s:end_col(prev_lnum)
let end_syntax_stack = s:syntax_stack_at(prev_lnum, end_col)
let reversed = reverse(end_syntax_stack)
for item in reversed
if item =~? 'jsxEscapeJs'
return 'unknown'
elseif s:is_jsx_element(item) && s:is_jsx(start_syntax) && start_syntax !~? 'jsxEscapeJs'
" <div>
" <br /> <-- press o
" </div>
" --------------------
" <div>
" {
" a > 0 ? 1 <div>|</div> <-- press enter
" }
" </div>
return 'jsxElement'
elseif s:is_jsx_tag(item)
return 'jsxTag'
elseif s:is_jsx_brace(item) && trim(getline(prev_lnum)) =~ '{$'
return 'jsxBraces'
endif
endfor
return 'unknown'
endfunction
function! jsx_pretty#indent#get(js_indent)
" The start column index of the current line (one-based)
let start_col = s:start_col(v:lnum)
" The end column index of the current line (one-based)
let end_col = s:end_col(v:lnum)
if s:start_with_jsx(v:lnum)
let ind = s:jsx_indent(v:lnum)
return ind == -1 ? a:js_indent() : ind
elseif s:is_embedded_comment(v:lnum)
return s:jsx_indent_comment(v:lnum)
else
let line = trim(getline(v:lnum))
let prev_lnum = s:prev_lnum(v:lnum)
" Fix the case where pressing enter at the cursor
" return <div>|</div>
if line =~ '^' . s:end_tag &&
\ s:end_with_jsx(s:prev_lnum(v:lnum))
return s:jsx_indent_closing_tag(v:lnum)
endif
" Fix cases for the new line
if empty(line)
let context = s:jsx_context(v:lnum)
if context == 'jsxElement'
" <div> <-- press o
" </div>
return s:jsx_indent_element(v:lnum)
elseif context == 'jsxTag'
" <div <-- press o
" >
" </div>
" -----------------------
" <div
" attr="attr" <-- press o
" >
" </div>
return s:jsx_indent_attr(v:lnum)
elseif context == 'jsxBraces'
" <div>
" { <-- press o
" }
" </div>
return indent(prev_lnum) + s:sw()
endif
endif
return a:js_indent()
endif
endfunction
endif

View File

@@ -632,6 +632,13 @@ autocmd BufNewFile,BufRead *Spec.js,*_spec.js set filetype=jasmine.javascript sy
augroup end
endif
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
augroup filetypedetect
" javascript, from flow.vim in pangloss/vim-javascript:_JAVASCRIPT
autocmd BufNewFile,BufRead *.flow setfiletype flow
augroup end
endif
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
augroup filetypedetect
" javascript, from javascript.vim in pangloss/vim-javascript:_JAVASCRIPT
@@ -1109,7 +1116,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'racket') == -1
let g:racket_hash_lang_regexp = '^#lang\s\+\([^][)(}{[:space:]]\+\)'
" Tries to detect filetype from #lang line; defaults to ft=racket.
function RacketDetectHashLang()
function! RacketDetectHashLang()
let old_ft = &filetype
let matches = matchlist(getline(1), g:racket_hash_lang_regexp)

View File

@@ -374,7 +374,6 @@ function! RubyCursorFile() abort
endtry
let pre = matchstr(strpart(getline('.'), 0, col('.')-1), '.*\f\@<!')
let post = matchstr(strpart(getline('.'), col('.')), '\f\@!.*')
let ext = getline('.') =~# '^\s*\%(require\%(_relative\)\=\|autoload\)\>' && cfile !~# '\.rb$' ? '.rb' : ''
if s:synid() ==# hlID('rubyConstant')
let cfile = substitute(cfile,'\.\w\+[?!=]\=$','','')
let cfile = substitute(cfile,'^::','','')
@@ -383,12 +382,15 @@ function! RubyCursorFile() abort
let cfile = substitute(cfile,'\(\l\|\d\)\(\u\)','\1_\2', 'g')
return tolower(cfile) . '.rb'
elseif getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$'
let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') . ext
let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$'
let target = matchstr(getline('.'),'\(["'']\)\.\.\zs/.\{-\}\ze\1')
let cfile = expand('%:p:h') . target . ext
let cfile = expand('%:p:h') . target
let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$'
let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') . ext
let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
elseif pre.post =~# '\<File.expand_path[( ].*[''"]\{2\}, *__FILE__\>' && cfile =~# '^\.\.'
let cfile = expand('%:p:h') . strpart(cfile, 2)
else

View File

@@ -52,7 +52,8 @@ syntax cluster typescriptPrimaryType contains=
\ typescriptTupleType,
\ typescriptTypeQuery,
\ typescriptStringLiteralType,
\ typescriptReadonlyArrayKeyword
\ typescriptReadonlyArrayKeyword,
\ typescriptAssertType
syntax region typescriptStringLiteralType contained
\ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/
@@ -130,6 +131,10 @@ syntax keyword typescriptTypeQuery typeof keyof
\ nextgroup=typescriptTypeReference
\ contained skipwhite skipnl
syntax keyword typescriptAssertType asserts
\ nextgroup=typescriptTypeReference
\ contained skipwhite skipnl
syntax cluster typescriptCallSignature contains=typescriptGenericCall,typescriptCall
syntax region typescriptGenericCall matchgroup=typescriptTypeBrackets
\ start=/</ end=/>/

View File

@@ -155,6 +155,7 @@ if exists("did_typescript_hilink")
HiLink typescriptTypeReference Identifier
HiLink typescriptConstructor Keyword
HiLink typescriptDecorator Special
HiLink typescriptAssertType Keyword
highlight link typeScript NONE

6
syntax/flow.vim Normal file
View File

@@ -0,0 +1,6 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
runtime syntax/javascript.vim
runtime extras/flow.vim
endif

View File

@@ -166,13 +166,19 @@ syn match goSingleDecl /\%(import\|var\|const\) [^(]\@=/ contains=g
" Integers
syn match goDecimalInt "\<-\=\d\+\%([Ee][-+]\=\d\+\)\=\>"
syn match goHexadecimalInt "\<-\=0[xX]\x\+\>"
syn match goHexadecimalError "\<-\=0[xX]\x*[^ \t0-9A-Fa-f]\S*\>"
syn match goOctalInt "\<-\=0\o\+\>"
syn match goOctalError "\<-\=0\o*[89]\d*\>"
syn match goOctalError "\<-\=0[^XxBb]\o*[^ \t0-7]\S*\>"
syn match goBinaryInt "\<-\=0[bB][01]\+\>"
syn match goBinaryError "\<-\=0[bB][01]*[^ \t01]\S*\>"
hi def link goDecimalInt Integer
hi def link goHexadecimalInt Integer
hi def link goHexadecimalError Error
hi def link goOctalInt Integer
hi def link goOctalError Error
hi def link goBinaryInt Integer
hi def link goBinaryError Error
hi def link Integer Number
" Floating point
@@ -384,6 +390,13 @@ hi def link goCoverageNormalText Comment
function! s:hi()
hi def link goSameId Search
hi def link goDiagnosticError SpellBad
hi def link goDiagnosticWarning SpellRare
hi def link goDeclsFzfKeyword Keyword
hi def link goDeclsFzfFunction Function
hi def link goDeclsFzfSpecialComment SpecialComment
hi def link goDeclsFzfComment Comment
" :GoCoverage commands
hi def goCoverageCovered ctermfg=green guifg=#A6E22E

View File

@@ -112,7 +112,7 @@ syntax keyword jsAsyncKeyword async await
syntax match jsSwitchColon contained /::\@!/ skipwhite skipempty nextgroup=jsSwitchBlock
" Keywords
syntax keyword jsGlobalObjects Array Boolean Date Function Iterator Number Object Symbol Map WeakMap Set WeakSet RegExp String Proxy Promise Buffer ParallelArray ArrayBuffer DataView Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray JSON Math console document window Intl Collator DateTimeFormat NumberFormat fetch
syntax keyword jsGlobalObjects ArrayBuffer Array BigInt64Array BigUint64Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray Boolean Buffer Collator DataView Date DateTimeFormat Function Intl Iterator JSON Map Set WeakMap WeakSet Math Number NumberFormat Object ParallelArray Promise Proxy Reflect RegExp String Symbol Uint8ClampedArray WebAssembly console document fetch window
syntax keyword jsGlobalNodeObjects module exports global process __dirname __filename
syntax match jsGlobalNodeObjects /\<require\>/ containedin=jsFuncCall
syntax keyword jsExceptions Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError
@@ -152,7 +152,7 @@ syntax region jsSwitchBlock contained matchgroup=jsSwitchBraces s
syntax region jsRepeatBlock contained matchgroup=jsRepeatBraces start=/{/ end=/}/ contains=@jsAll,jsBlock extend fold
syntax region jsDestructuringBlock contained matchgroup=jsDestructuringBraces start=/{/ end=/}/ contains=jsDestructuringProperty,jsDestructuringAssignment,jsDestructuringNoise,jsDestructuringPropertyComputed,jsSpreadExpression,jsComment nextgroup=jsFlowDefinition extend fold
syntax region jsDestructuringArray contained matchgroup=jsDestructuringBraces start=/\[/ end=/\]/ contains=jsDestructuringPropertyValue,jsDestructuringNoise,jsDestructuringProperty,jsSpreadExpression,jsDestructuringBlock,jsDestructuringArray,jsComment nextgroup=jsFlowDefinition extend fold
syntax region jsObject contained matchgroup=jsObjectBraces start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectShorthandProp,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsDecorator,jsAsyncKeyword extend fold
syntax region jsObject contained matchgroup=jsObjectBraces start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectShorthandProp,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsDecorator,jsAsyncKeyword,jsTemplateString extend fold
syntax region jsBlock matchgroup=jsBraces start=/{/ end=/}/ contains=@jsAll,jsSpreadExpression extend fold
syntax region jsModuleGroup contained matchgroup=jsModuleBraces start=/{/ end=/}/ contains=jsModuleKeyword,jsModuleComma,jsModuleAs,jsComment,jsFlowTypeKeyword skipwhite skipempty nextgroup=jsFrom fold
syntax region jsSpreadExpression contained matchgroup=jsSpreadOperator start=/\.\.\./ end=/[,}\]]\@=/ contains=@jsExpression

View File

@@ -30,7 +30,7 @@ endif
" We need nocompatible mode in order to continue lines with backslashes.
" Original setting will be restored.
let s:cpo_save = &cpo
setlocal cpo&vim
set cpo&vim
" http://mesonbuild.com/Syntax.html
syn keyword mesonConditional elif else if endif

View File

@@ -230,7 +230,18 @@ syn match ocamlStar "*"
syn match ocamlAngle "<"
syn match ocamlAngle ">"
" Custom indexing operators:
syn match ocamlIndexingOp "\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\(()\|\[]\|{}\)\(<-\)\?"
syn region ocamlIndexing matchgroup=ocamlIndexingOp
\ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*("
\ end=")\(\_s*<-\)\?"
\ contains=ALLBUT,@ocamlContained,ocamlParenErr
syn region ocamlIndexing matchgroup=ocamlIndexingOp
\ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*\["
\ end="]\(\_s*<-\)\?"
\ contains=ALLBUT,@ocamlContained,ocamlBrackErr
syn region ocamlIndexing matchgroup=ocamlIndexingOp
\ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*{"
\ end="}\(\_s*<-\)\?"
\ contains=ALLBUT,@ocamlContained,ocamlBraceErr
" Extension operators (has to be declared before regular infix operators):
syn match ocamlExtensionOp "#[#~?!.:|&$%<=>@^*/+-]\+"
" Infix and prefix operators:

View File

@@ -6,7 +6,7 @@ endif
" need %{vars}%
" env: [[CAML_LD_LIBRARY_PATH = "%{lib}%/stublibs"]]
syn keyword opamKeyword1 remove depends depopts conflicts env packages patches version maintainer tags license homepage authors doc install author available name depexts substs synopsis description
syn keyword opamKeyword1 remove depends pin-depends depopts conflicts env packages patches version maintainer tags license homepage authors doc install author available name depexts substs synopsis description
syn match opamKeyword2 "\v(bug-reports|post-messages|ocaml-version|opam-version|dev-repo|build-test|build-doc|build)"
syn keyword opamTodo FIXME NOTE NOTES TODO XXX contained

View File

@@ -24,22 +24,28 @@ syntax match plantumlPreProc /\%(\%(^@start\|^@end\)\%(dot\|mindmap\|uml\|salt\|
syntax region plantumlDir start=/\s\+/ms=s+1 end=/$/ contained
" type
" From 'java - jar plantuml.jar - language' results {{{
syntax keyword plantumlTypeKeyword abstract actor agent archimate artifact boundary card cloud component control
syntax keyword plantumlTypeKeyword database diamond entity enum file folder frame node object robust concise package participant
syntax keyword plantumlTypeKeyword queue rectangle stack state storage usecase
syntax keyword plantumlTypeKeyword database detach diamond entity enum file folder frame node object package
syntax keyword plantumlTypeKeyword participant queue rectangle stack state storage usecase
" class and interface are defined as plantumlClassKeyword
syntax keyword plantumlClassKeyword class interface
"}}}
" Not in 'java - jar plantuml.jar - language' results
syntax keyword plantumlTypeKeyword concise robust
" keyword
" Exclude 'top to bottom direction'
" From 'java - jar plantuml.jar - language' results {{{
" Since "syntax keyword" can handle only words, "top to bottom direction" is excluded.
syntax keyword plantumlKeyword accross activate again allow_mixing allowmixing also alt as autonumber bottom
syntax keyword plantumlKeyword box break caption center create critical deactivate destroy down else elseif end
syntax keyword plantumlKeyword endif endwhile footbox footer fork group header hide hnote if is kill left in at are to the and
syntax keyword plantumlKeyword legend endlegend link loop mainframe namespace newpage note of on opt order over package
syntax keyword plantumlKeyword legend link loop mainframe namespace newpage note of on opt order over package
syntax keyword plantumlKeyword page par partition ref repeat return right rnote rotate show skin skinparam
syntax keyword plantumlKeyword start stop title top up while
" Not in 'java - jar plantuml.jar - language' output
syntax keyword plantumlKeyword then detach split sprite
"}}}
" Not in 'java - jar plantuml.jar - language' results
syntax keyword plantumlKeyword endlegend split sprite then
" gantt
syntax keyword plantumlTypeKeyword project monday tuesday wednesday thursday friday saturday sunday
syntax keyword plantumlKeyword starts ends start end closed day after colored lasts happens

View File

@@ -15,9 +15,6 @@ endif
syn case match
syn keyword terraSection connection output provider variable data terraform locals
syn keyword terraValueBool true false on off yes no
""" data
syn keyword terraDataTypeBI
\ aci_access_port_block
@@ -4443,39 +4440,38 @@ syn keyword terraResourceTypeBI
\ yandex_vpc_subnet
""" end resources
syn keyword terraSection connection output variable terraform locals
syn keyword terraValueBool true false on off yes no
syn keyword terraTodo contained TODO FIXME XXX BUG
syn cluster terraCommentGroup contains=terraTodo
syn region terraComment start="/\*" end="\*/" contains=@terraCommentGroup,@Spell
syn region terraComment start="#" end="$" contains=@terraCommentGroup,@Spell
syn region terraComment start="//" end="$" contains=@terraCommentGroup,@Spell
syn match terraResource /\<resource\>/ nextgroup=terraResourceTypeStr skipwhite
syn region terraResourceTypeStr start=/"/ end=/"/ contains=terraResourceTypeBI
\ nextgroup=terraResourceName skipwhite
syn region terraResourceName start=/"/ end=/"/
\ nextgroup=terraResourceBlock skipwhite
syn keyword terraResource resource nextgroup=terraResourceTypeStr skipwhite
syn region terraResourceTypeStr start=/"/ end=/"/ contains=terraResourceTypeBI nextgroup=terraResourceName skipwhite
syn region terraResourceName start=/"/ end=/"/ nextgroup=terraResourceBlock skipwhite
syn match terraData /\<data\>/ nextgroup=terraDataTypeStr skipwhite
syn region terraDataTypeStr start=/"/ end=/"/ contains=terraDataTypeBI
\ nextgroup=terraDataName skipwhite
syn region terraDataName start=/"/ end=/"/
\ nextgroup=terraDataBlock skipwhite
syn keyword terraData data nextgroup=terraDataTypeStr skipwhite
syn region terraDataTypeStr start=/"/ end=/"/ contains=terraDataTypeBI nextgroup=terraDataName skipwhite
syn region terraDataName start=/"/ end=/"/ nextgroup=terraDataBlock skipwhite
""" provider
syn match terraProvider /\<provider\>/ nextgroup=terraProviderName skipwhite
syn region terraProviderName start=/"/ end=/"/ nextgroup=terraProviderBlock skipwhite
syn keyword terraProvider provider nextgroup=terraProviderName skipwhite
syn region terraProviderName start=/"/ end=/"/ nextgroup=terraProviderBlock skipwhite
""" provisioner
syn match terraProvisioner /\<provisioner\>/ nextgroup=terraProvisionerName skipwhite
syn region terraProvisionerName start=/"/ end=/"/ nextgroup=terraProvisionerBlock skipwhite
syn keyword terraProvisioner provisioner nextgroup=terraProvisionerName skipwhite
syn region terraProvisionerName start=/"/ end=/"/ nextgroup=terraProvisionerBlock skipwhite
""" module
syn match terraModule /\<module\>/ nextgroup=terraModuleName skipwhite
syn region terraModuleName start=/"/ end=/"/ nextgroup=terraModuleBlock skipwhite
syn keyword terraModule module nextgroup=terraModuleName skipwhite
syn region terraModuleName start=/"/ end=/"/ nextgroup=terraModuleBlock skipwhite
""" dynamic (HCL2)
syn match terraDynamic /\<dynamic\>/ nextgroup=terraDynamicName skipwhite
syn region terraDynamicName start=/"/ end=/"/ nextgroup=terraDynamicBlock skipwhite
syn keyword terraDynamic dynamic nextgroup=terraDynamicName skipwhite
syn region terraDynamicName start=/"/ end=/"/ nextgroup=terraDynamicBlock skipwhite
""" misc.
syn match terraValueDec "\<[0-9]\+\([kKmMgG]b\?\)\?\>"

View File

@@ -36,7 +36,7 @@ syn match zigBuiltinFn "\v\@(compileLog|ctz|popCount|divExact|divFloor|divTrunc)
syn match zigBuiltinFn "\v\@(embedFile|export|tagName|TagType|errorName)>"
syn match zigBuiltinFn "\v\@(errorReturnTrace|fence|fieldParentPtr|field|unionInit)>"
syn match zigBuiltinFn "\v\@(frameAddress|import|inlineCall|newStackCall|asyncCall|intToPtr|IntType)>"
syn match zigBuiltinFn "\v\@(maxValue|memberCount|memberName|memberType)>"
syn match zigBuiltinFn "\v\@(maxValue|memberCount|memberName|memberType|as)>"
syn match zigBuiltinFn "\v\@(memcpy|memset|minValue|mod|mulWithOverflow|splat)>"
syn match zigBuiltinFn "\v\@(noInlineCall|bitOffsetOf|byteOffsetOf|OpaqueType|panic|ptrCast)>"
syn match zigBuiltinFn "\v\@(ptrToInt|rem|returnAddress|setCold|Type|shuffle)>"
@@ -58,6 +58,8 @@ syn match zigCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:
syn match zigCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=zigEscape,zigEscapeError,zigCharacterInvalid,zigCharacterInvalidUnicode
syn match zigCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{6}\)\)'/ contains=zigEscape,zigEscapeUnicode,zigEscapeError,zigCharacterInvalid
syn region zigBlock start="{" end="}" transparent fold
syn region zigCommentLine start="//" end="$" contains=zigTodo,@Spell
syn region zigCommentLineDoc start="////\@!" end="$" contains=zigTodo,@Spell