mirror of
				https://github.com/vim/vim.git
				synced 2025-10-28 09:27:14 -04:00 
			
		
		
		
	related: #14558 closes: #14561 ported from: https://github.com/wuelnerdotexe/vim-astro Signed-off-by: Philip H <47042125+pheiduck@users.noreply.github.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
| " Vim indent file (experimental).
 | |
| " 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 07
 | |
| " Based On:    Evan Lecklider's vim-svelte
 | |
| " Changes:     See https://github.com/evanleck/vim-svelte
 | |
| " Credits:     See vim-svelte on github
 | |
| 
 | |
| " Only load this indent file when no other was loaded yet.
 | |
| if exists('b:did_indent')
 | |
|   finish
 | |
| endif
 | |
| 
 | |
| let b:html_indent_script1 = 'inc'
 | |
| let b:html_indent_style1 = 'inc'
 | |
| 
 | |
| " Embedded HTML indent.
 | |
| runtime! indent/html.vim
 | |
| let s:html_indent = &l:indentexpr
 | |
| unlet b:did_indent
 | |
| 
 | |
| let b:did_indent = 1
 | |
| 
 | |
| setlocal indentexpr=GetAstroIndent()
 | |
| setlocal indentkeys=<>>,/,0{,{,},0},0),0],0\,<<>,,!^F,*<Return>,o,O,e,;
 | |
| 
 | |
| let b:undo_indent = 'setl inde< indk<'
 | |
| 
 | |
| " Only define the function once.
 | |
| if exists('*GetAstroIndent')
 | |
|   finish
 | |
| endif
 | |
| 
 | |
| let s:cpoptions_save = &cpoptions
 | |
| setlocal cpoptions&vim
 | |
| 
 | |
| function! GetAstroIndent()
 | |
|   let l:current_line_number = v:lnum
 | |
| 
 | |
|   if l:current_line_number == 0
 | |
|     return 0
 | |
|   endif
 | |
| 
 | |
|   let l:current_line = getline(l:current_line_number)
 | |
| 
 | |
|   if l:current_line =~ '^\s*</\?\(script\|style\)'
 | |
|     return 0
 | |
|   endif
 | |
| 
 | |
|   let l:previous_line_number = prevnonblank(l:current_line_number - 1)
 | |
|   let l:previous_line = getline(l:previous_line_number)
 | |
|   let l:previous_line_indent = indent(l:previous_line_number)
 | |
| 
 | |
|   if l:previous_line =~ '^\s*</\?\(script\|style\)'
 | |
|     return l:previous_line_indent + shiftwidth()
 | |
|   endif
 | |
| 
 | |
|   execute 'let l:indent = ' . s:html_indent
 | |
| 
 | |
|   if searchpair('<style>', '', '</style>', 'bW') &&
 | |
|         \ l:previous_line =~ ';$' && l:current_line !~ '}'
 | |
|     return l:previous_line_indent
 | |
|   endif
 | |
| 
 | |
|   if synID(l:previous_line_number, match(
 | |
|         \   l:previous_line, '\S'
 | |
|         \ ) + 1, 0) == hlID('htmlTag') && synID(l:current_line_number, match(
 | |
|         \  l:current_line, '\S'
 | |
|         \ ) + 1, 0) != hlID('htmlEndTag')
 | |
|     let l:indents_match = l:indent == l:previous_line_indent
 | |
|     let l:previous_closes = l:previous_line =~ '/>$'
 | |
| 
 | |
|     if l:indents_match &&
 | |
|           \ !l:previous_closes && l:previous_line =~ '<\(\u\|\l\+:\l\+\)'
 | |
|       return l:previous_line_indent + shiftwidth()
 | |
|     elseif !l:indents_match && l:previous_closes
 | |
|       return l:previous_line_indent
 | |
|     endif
 | |
|   endif
 | |
| 
 | |
|   return l:indent
 | |
| endfunction
 | |
| 
 | |
| let &cpoptions = s:cpoptions_save
 | |
| unlet s:cpoptions_save
 | |
| " vim: ts=8
 |