mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	runtime(astro): Add filetype, syntax and indent plugin
related: vim/vim#14558
closes: vim/vim#14561
ported from: https://github.com/wuelnerdotexe/vim-astro
d3ff129ce8
Co-authored-by: Philip H <47042125+pheiduck@users.noreply.github.com>
		
	
		
			
				
	
	
		
			191 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" Vim syntax file.
 | 
						|
" Language:    Astro
 | 
						|
" Author:      Wuelner Martínez <wuelner.martinez@outlook.com>
 | 
						|
" Maintainer:  Wuelner Martínez <wuelner.martinez@outlook.com>
 | 
						|
" URL:         https://github.com/wuelnerdotexe/vim-astro
 | 
						|
" Last Change: 2022 Aug 22
 | 
						|
" Based On:    Evan Lecklider's vim-svelte
 | 
						|
" Changes:     See https://github.com/evanleck/vim-svelte
 | 
						|
" Credits:     See vim-svelte on github
 | 
						|
 | 
						|
" Quit when a (custom) syntax file was already loaded.
 | 
						|
if !exists('main_syntax')
 | 
						|
  if exists('b:current_syntax')
 | 
						|
    finish
 | 
						|
  endif
 | 
						|
  let main_syntax = 'astro'
 | 
						|
elseif exists('b:current_syntax') && b:current_syntax == 'astro'
 | 
						|
  finish
 | 
						|
endif
 | 
						|
 | 
						|
" Astro syntax variables are initialized.
 | 
						|
let g:astro_typescript = get(g:, 'astro_typescript', 'disable')
 | 
						|
let g:astro_stylus = get(g:, 'astro_stylus', 'disable')
 | 
						|
 | 
						|
let s:cpoptions_save = &cpoptions
 | 
						|
set cpoptions&vim
 | 
						|
 | 
						|
" Embedded HTML syntax.
 | 
						|
runtime! syntax/html.vim
 | 
						|
 | 
						|
" htmlTagName: expand HTML tag names to include mixed case and periods.
 | 
						|
syntax match htmlTagName contained "\<[a-zA-Z\.]*\>"
 | 
						|
 | 
						|
" astroDirectives: add Astro Directives to HTML arguments.
 | 
						|
syntax match astroDirectives contained '\<[a-z]\+:[a-z|]*\>' containedin=htmlTag
 | 
						|
 | 
						|
unlet b:current_syntax
 | 
						|
 | 
						|
if g:astro_typescript == 'enable'
 | 
						|
  " Embedded TypeScript syntax.
 | 
						|
  syntax include @astroJavaScript syntax/typescript.vim
 | 
						|
 | 
						|
  " javaScriptExpression: a javascript expression is used as an arg value.
 | 
						|
  syntax clear javaScriptExpression
 | 
						|
  syntax region javaScriptExpression
 | 
						|
        \ contained start=+&{+
 | 
						|
        \ keepend end=+};+
 | 
						|
        \ contains=@astroJavaScript,@htmlPreproc
 | 
						|
 | 
						|
  " javaScript: add TypeScript support to HTML script tag.
 | 
						|
  syntax clear javaScript
 | 
						|
  syntax region javaScript
 | 
						|
        \ start=+<script\_[^>]*>+
 | 
						|
        \ keepend
 | 
						|
        \ end=+</script\_[^>]*>+me=s-1
 | 
						|
        \ contains=htmlScriptTag,@astroJavaScript,@htmlPreproc,htmlCssStyleComment
 | 
						|
else
 | 
						|
  " Embedded JavaScript syntax.
 | 
						|
  syntax include @astroJavaScript syntax/javascript.vim
 | 
						|
endif
 | 
						|
 | 
						|
" astroFence: detect the Astro fence.
 | 
						|
syntax match astroFence contained +^---$+
 | 
						|
 | 
						|
" astrojavaScript: add TypeScript support to Astro code fence.
 | 
						|
syntax region astroJavaScript
 | 
						|
      \ start=+^---$+
 | 
						|
      \ keepend
 | 
						|
      \ end=+^---$+
 | 
						|
      \ contains=htmlTag,@astroJavaScript,@htmlPreproc,htmlCssStyleComment,htmlEndTag,astroFence
 | 
						|
      \ fold
 | 
						|
 | 
						|
unlet b:current_syntax
 | 
						|
 | 
						|
if g:astro_typescript == 'enable'
 | 
						|
  " Embedded TypeScript React (TSX) syntax.
 | 
						|
  syntax include @astroJavaScriptReact syntax/typescriptreact.vim
 | 
						|
else
 | 
						|
  " Embedded JavaScript React (JSX) syntax.
 | 
						|
  syntax include @astroJavaScriptReact syntax/javascriptreact.vim
 | 
						|
endif
 | 
						|
 | 
						|
" astroJavaScriptExpression: add {JSX or TSX} support to Astro expresions.
 | 
						|
execute 'syntax region astroJavaScriptExpression start=+{+ keepend end=+}+ ' .
 | 
						|
      \ 'contains=@astroJavaScriptReact, @htmlPreproc containedin=' . join([
 | 
						|
      \   'htmlArg', 'htmlBold', 'htmlBoldItalic', 'htmlBoldItalicUnderline',
 | 
						|
      \   'htmlBoldUnderline', 'htmlBoldUnderlineItalic', 'htmlH1', 'htmlH2',
 | 
						|
      \   'htmlH3', 'htmlH4', 'htmlH5', 'htmlH6', 'htmlHead', 'htmlItalic',
 | 
						|
      \   'htmlItalicBold', 'htmlItalicBoldUnderline', 'htmlItalicUnderline',
 | 
						|
      \   'htmlItalicUnderlineBold', 'htmlLeadingSpace', 'htmlLink',
 | 
						|
      \   'htmlStrike', 'htmlString', 'htmlTag', 'htmlTitle', 'htmlUnderline',
 | 
						|
      \   'htmlUnderlineBold', 'htmlUnderlineBoldItalic',
 | 
						|
      \   'htmlUnderlineItalic', 'htmlUnderlineItalicBold', 'htmlValue'
 | 
						|
      \ ], ',')
 | 
						|
 | 
						|
" cssStyle: add CSS style tags support in TypeScript React.
 | 
						|
syntax region cssStyle
 | 
						|
      \ start=+<style\_[^>]*>+
 | 
						|
      \ keepend
 | 
						|
      \ end=+</style\_[^>]*>+me=s-1
 | 
						|
      \ contains=htmlTag,@htmlCss,htmlCssStyleComment,@htmlPreproc,htmlEndTag
 | 
						|
      \ containedin=@astroJavaScriptReact
 | 
						|
 | 
						|
unlet b:current_syntax
 | 
						|
 | 
						|
" Embedded SCSS syntax.
 | 
						|
syntax include @astroScss syntax/scss.vim
 | 
						|
 | 
						|
" cssStyle: add SCSS style tags support in Astro.
 | 
						|
syntax region scssStyle
 | 
						|
      \ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*scss[^\2]*\2\_[^>]*>/
 | 
						|
      \ keepend
 | 
						|
      \ end=+</style>+me=s-1
 | 
						|
      \ contains=@astroScss,astroSurroundingTag
 | 
						|
      \ fold
 | 
						|
 | 
						|
unlet b:current_syntax
 | 
						|
 | 
						|
" Embedded SASS syntax.
 | 
						|
syntax include @astroSass syntax/sass.vim
 | 
						|
 | 
						|
" cssStyle: add SASS style tags support in Astro.
 | 
						|
syntax region sassStyle
 | 
						|
      \ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*sass[^\2]*\2\_[^>]*>/
 | 
						|
      \ keepend
 | 
						|
      \ end=+</style>+me=s-1
 | 
						|
      \ contains=@astroSass,astroSurroundingTag
 | 
						|
      \ fold
 | 
						|
 | 
						|
unlet b:current_syntax
 | 
						|
 | 
						|
" Embedded LESS syntax.
 | 
						|
syntax include @astroLess syntax/less.vim
 | 
						|
 | 
						|
" cssStyle: add LESS style tags support in Astro.
 | 
						|
syntax region lessStyle
 | 
						|
      \ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*less[^\2]*\2\_[^>]*>/
 | 
						|
      \ keepend
 | 
						|
      \ end=+</style>+me=s-1
 | 
						|
      \ contains=@astroLess,astroSurroundingTag
 | 
						|
      \ fold
 | 
						|
 | 
						|
unlet b:current_syntax
 | 
						|
 | 
						|
" Embedded Stylus syntax.
 | 
						|
" NOTE: Vim does not provide stylus support by default, but you can install
 | 
						|
"       this plugin to support it: https://github.com/wavded/vim-stylus
 | 
						|
if g:astro_stylus == 'enable'
 | 
						|
  try
 | 
						|
    " Embedded Stylus syntax.
 | 
						|
    syntax include @astroStylus syntax/stylus.vim
 | 
						|
 | 
						|
    " stylusStyle: add Stylus style tags support in Astro.
 | 
						|
    syntax region stylusStyle
 | 
						|
          \ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*stylus[^\2]*\2\_[^>]*>/
 | 
						|
          \ keepend
 | 
						|
          \ end=+</style>+me=s-1
 | 
						|
          \ contains=@astroStylus,astroSurroundingTag
 | 
						|
          \ fold
 | 
						|
 | 
						|
    unlet b:current_syntax
 | 
						|
  catch
 | 
						|
    echomsg "you need install a external plugin for support stylus in .astro files"
 | 
						|
  endtry
 | 
						|
endif
 | 
						|
 | 
						|
" astroSurroundingTag: add surround HTML tag to script and style.
 | 
						|
syntax region astroSurroundingTag
 | 
						|
      \ start=+<\(script\|style\)+
 | 
						|
      \ end=+>+
 | 
						|
      \ contains=htmlTagError,htmlTagN,htmlArg,htmlValue,htmlEvent,htmlString
 | 
						|
      \ contained
 | 
						|
      \ fold
 | 
						|
 | 
						|
" Define the default highlighting.
 | 
						|
" Only used when an item doesn't have highlighting yet.
 | 
						|
highlight default link astroDirectives Special
 | 
						|
highlight default link astroFence Comment
 | 
						|
 | 
						|
let b:current_syntax = 'astro'
 | 
						|
if main_syntax == 'astro'
 | 
						|
  unlet main_syntax
 | 
						|
endif
 | 
						|
 | 
						|
" Sync from start because of the wacky nesting.
 | 
						|
syntax sync fromstart
 | 
						|
 | 
						|
let &cpoptions = s:cpoptions_save
 | 
						|
unlet s:cpoptions_save
 | 
						|
" vim: ts=8
 |