" Language: Vue " Maintainer: leaf " Credits: Inspired by mxw/vim-jsx. if exists('b:did_indent') | finish |endif let s:test = exists('g:vim_vue_plugin_test') function! s:Init() """ Configs let s:config = vue#GetConfig('config', {}) let s:config_syntax = s:config.syntax let s:initial_indent = s:config.initial_indent """ Variables let s:indent = {} let s:block_tag = '<\/\?\('.join(keys(s:config_syntax), '\|').'\)' " To adjust HTML 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_start = '\v\<'.s:empty_tagname.'[^>]*$' let s:empty_tag_end = '\v^\s*[^<>/]*\/?\>\s*' let s:tag_start = '\v^\s*\<\w*' " < let s:tag_end = '\v^\s*\/?\>\s*' " /> let s:full_tag_end = '\v^\s*\<\/' " let s:ternary_q = '^\s\+?' let s:ternary_e = '^\s\+:.*,\s*$' endfunction function! s:SetVueIndent() """ Settings " JavaScript indentkeys setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,: " XML indentkeys setlocal indentkeys+=*,<>>,<<>,/ setlocal indentexpr=GetVueIndent() endfunction function! s:GetIndentFile(syntax) let syntax = a:syntax " lib/indent/* files are perferred for better indent result " from previous version Vim if syntax == 'html' let file = 'lib/indent/xml.vim' elseif syntax == 'css' let file = 'lib/indent/css.vim' elseif syntax == 'javascript' let file = 'lib/indent/typescript.vim' else let file = 'indent/'.syntax.'.vim' endif return file endfunction function! s:SetSyntaxIndentExpr(syntax_list) 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 return ind endfunction function! s:GetIndentByContext(tag, syntax) let ind = -1 let prevline = getline(s:PrevNonBlankNonComment(v:lnum)) let curline = getline(v:lnum) if a:tag != 'template' && a:syntax == 'html' " Set indent to 0 for custom tag with 'html' syntax if curline =~ s:block_tag && empty(prevline) let ind = 0 endif elseif a:tag == 'template' " When 'pug' syntax in