"============================================================================= " emmet.vim " Author: Yasuhiro Matsumoto " Last Change: 26-Jul-2015. let s:save_cpo = &cpoptions set cpoptions&vim let s:filtermx = '|\(\%(bem\|html\|blade\|haml\|slim\|e\|c\|s\|fc\|xsl\|t\|\/[^ ]\+\)\s*,\{0,1}\s*\)*$' function! emmet#getExpandos(type, key) abort let expandos = emmet#getResource(a:type, 'expandos', {}) if has_key(expandos, a:key) return expandos[a:key] endif return a:key endfunction function! emmet#splitFilterArg(filters) abort for f in a:filters if f =~# '^/' return f[1:] endif endfor return '' endfunction function! emmet#useFilter(filters, filter) abort for f in a:filters if a:filter ==# '/' && f =~# '^/' return 1 elseif f ==# a:filter return 1 endif endfor return 0 endfunction function! emmet#getIndentation(...) abort if a:0 > 0 let type = a:1 else let type = emmet#getFileType() endif if has_key(s:emmet_settings, type) && has_key(s:emmet_settings[type], 'indentation') let indent = s:emmet_settings[type].indentation elseif has_key(s:emmet_settings, 'indentation') let indent = s:emmet_settings.indentation elseif has_key(s:emmet_settings.variables, 'indentation') let indent = s:emmet_settings.variables.indentation else let sw = exists('*shiftwidth') ? shiftwidth() : &l:shiftwidth let indent = (&l:expandtab || &l:tabstop !=# sw) ? repeat(' ', sw) : "\t" endif return indent endfunction function! emmet#getBaseType(type) abort if !has_key(s:emmet_settings, a:type) return '' endif if !has_key(s:emmet_settings[a:type], 'extends') return a:type endif let extends = s:emmet_settings[a:type].extends if type(extends) ==# 1 let tmp = split(extends, '\s*,\s*') let ext = tmp[0] else let ext = extends[0] endif if a:type !=# ext return emmet#getBaseType(ext) endif return '' endfunction function! emmet#isExtends(type, extend) abort if a:type ==# a:extend return 1 endif if !has_key(s:emmet_settings, a:type) return 0 endif if !has_key(s:emmet_settings[a:type], 'extends') return 0 endif let extends = emmet#lang#getExtends(a:type) for ext in extends if a:extend ==# ext return 1 endif endfor return 0 endfunction function! emmet#parseIntoTree(abbr, type) abort let abbr = a:abbr let type = a:type return emmet#lang#{emmet#lang#type(type)}#parseIntoTree(abbr, type) endfunction function! emmet#expandAbbrIntelligent(feedkey) abort if !emmet#isExpandable() return a:feedkey endif return "\(emmet-expand-abbr)" endfunction function! emmet#isExpandable() abort let line = getline('.') if col('.') < len(line) let line = matchstr(line, '^\(.*\%'.col('.').'c\)') endif let part = matchstr(line, '\(\S.*\)$') let type = emmet#getFileType() let rtype = emmet#lang#type(type) let part = emmet#lang#{rtype}#findTokens(part) return len(part) > 0 endfunction function! emmet#mergeConfig(lhs, rhs) abort let [lhs, rhs] = [a:lhs, a:rhs] if type(lhs) ==# 3 if type(rhs) ==# 3 let lhs += rhs if len(lhs) call remove(lhs, 0, len(lhs)-1) endif for rhi in rhs call add(lhs, rhs[rhi]) endfor elseif type(rhs) ==# 4 let lhs += map(keys(rhs), '{v:val : rhs[v:val]}') endif elseif type(lhs) ==# 4 if type(rhs) ==# 3 for V in rhs if type(V) != 4 continue endif for k in keys(V) let lhs[k] = V[k] endfor endfor elseif type(rhs) ==# 4 for key in keys(rhs) if type(rhs[key]) ==# 3 if !has_key(lhs, key) let lhs[key] = [] endif if type(lhs[key]) == 3 let lhs[key] += rhs[key] elseif type(lhs[key]) == 4 for k in keys(rhs[key]) let lhs[key][k] = rhs[key][k] endfor endif elseif type(rhs[key]) ==# 4 if has_key(lhs, key) call emmet#mergeConfig(lhs[key], rhs[key]) else let lhs[key] = rhs[key] endif else let lhs[key] = rhs[key] endif endfor endif endif endfunction function! emmet#newNode() abort return { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'basevalue': 0, 'basedirect': 1, 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0, 'attrs_order': ['id', 'class'], 'block': 0, 'empty': 0 } endfunction function! s:itemno(itemno, current) abort let current = a:current if current.basedirect > 0 return current.basevalue - 1 + a:itemno else return current.multiplier + current.basevalue - 2 - a:itemno endif endfunction function! s:localvar(current, key) abort let val = '' let cur = a:current while !empty(cur) if has_key(cur, 'variables') && has_key(cur.variables, a:key) return cur.variables[a:key] endif let cur = cur.parent endwhile return '' endfunction function! emmet#toString(...) abort let current = a:1 if a:0 > 1 let type = a:2 else let type = &filetype endif if len(type) ==# 0 | let type = 'html' | endif if a:0 > 2 let inline = a:3 else let inline = 0 endif if a:0 > 3 if type(a:4) ==# 1 let filters = split(a:4, '\s*,\s*') else let filters = a:4 endif else let filters = ['html'] endif if a:0 > 4 let group_itemno = a:5 else let group_itemno = 0 endif if a:0 > 5 let indent = a:6 else let indent = '' endif let dollar_expr = emmet#getResource(type, 'dollar_expr', 1) let itemno = 0 let str = '' let rtype = emmet#lang#type(type) while itemno < current.multiplier if len(current.name) if current.multiplier ==# 1 let inner = emmet#lang#{rtype}#toString(s:emmet_settings, current, type, inline, filters, s:itemno(group_itemno, current), indent) else let inner = emmet#lang#{rtype}#toString(s:emmet_settings, current, type, inline, filters, s:itemno(itemno, current), indent) endif if current.multiplier > 1 let inner = substitute(inner, '\$#', '$line'.(itemno+1).'$', 'g') endif let str .= inner else let snippet = current.snippet if len(snippet) ==# 0 let snippets = emmet#getResource(type, 'snippets', {}) if !empty(snippets) && has_key(snippets, 'emmet_snippet') let snippet = snippets['emmet_snippet'] endif endif if len(snippet) > 0 let tmp = snippet let tmp = substitute(tmp, '\${emmet_name}', current.name, 'g') let snippet_node = emmet#newNode() let snippet_node.value = '{'.tmp.'}' let snippet_node.important = current.important let snippet_node.multiplier = current.multiplier let str .= emmet#lang#{rtype}#toString(s:emmet_settings, snippet_node, type, inline, filters, s:itemno(group_itemno, current), indent) if current.multiplier > 1 let str .= "\n" endif else if len(current.name) let str .= current.name endif if len(current.value) let text = current.value[1:-2] if dollar_expr " TODO: regexp engine specified if exists('®expengine') let text = substitute(text, '\%#=1\%(\\\)\@\ 0 let key = get(matcharr, 1) if key !~# '^\d\+:' let key = substitute(key, '\\{', '{', 'g') let key = substitute(key, '\\}', '}', 'g') let value = emmet#getDollarValueByKey(key) if type(value) ==# type('') let expr = get(matcharr, 0) call add(dollar_list, {'expr': expr, 'value': value}) endif endif else break endif let expand = substitute(expand, dollar_reg, '', '') endwhile return dollar_list endfunction function! emmet#getDollarValueByKey(key) abort let ret = 0 let key = a:key let ftsetting = get(s:emmet_settings, emmet#getFileType()) if type(ftsetting) ==# 4 && has_key(ftsetting, key) let V = get(ftsetting, key) if type(V) ==# 1 | return V | endif endif if type(ret) !=# 1 && has_key(s:emmet_settings.variables, key) let V = get(s:emmet_settings.variables, key) if type(V) ==# 1 | return V | endif endif if has_key(s:emmet_settings, 'custom_expands') && type(s:emmet_settings['custom_expands']) ==# 4 for k in keys(s:emmet_settings['custom_expands']) if key =~# k let V = get(s:emmet_settings['custom_expands'], k) if type(V) ==# 1 | return V | endif if type(V) ==# 2 | return V(key) | endif endif endfor endif return ret endfunction function! emmet#reExpandDollarExpr(expand, times) abort let expand = a:expand let dollar_exprs = emmet#getDollarExprs(expand) if len(dollar_exprs) > 0 if a:times < 9 for n in range(len(dollar_exprs)) let pair = get(dollar_exprs, n) let pat = get(pair, 'expr') let sub = get(pair, 'value') let expand = substitute(expand, pat, sub, '') endfor return emmet#reExpandDollarExpr(expand, a:times + 1) endif endif return expand endfunction function! emmet#expandDollarExpr(expand) abort return emmet#reExpandDollarExpr(a:expand, 0) endfunction function! emmet#expandCursorExpr(expand, mode) abort let expand = a:expand if expand !~# '\${cursor}' if a:mode ==# 2 let expand = '${cursor}' . expand else let expand .= '${cursor}' endif endif let expand = substitute(expand, '\${\d\+:\?\([^}]\+\)}', '$select$$cursor$\1$select$', 'g') let expand = substitute(expand, '\${\d\+}', '$select$$cursor$$select$', 'g') let expand = substitute(expand, '\${cursor}', '$cursor$', '') let expand = substitute(expand, '\${cursor}', '', 'g') let expand = substitute(expand, '\${cursor}', '', 'g') return expand endfunction function! emmet#unescapeDollarExpr(expand) abort return substitute(a:expand, '\\\$', '$', 'g') endfunction function! emmet#expandAbbr(mode, abbr) range abort let type = emmet#getFileType(1) let indent = emmet#getIndentation(type) let expand = '' let line = '' let part = '' let rest = '' let filters = emmet#getFilters(type) if len(filters) ==# 0 let filters = ['html'] endif if a:mode ==# 2 let leader = substitute(input('Tag: ', ''), '^\s*\(.*\)\s*$', '\1', 'g') if len(leader) ==# 0 return '' endif if leader =~# s:filtermx let filters = map(split(matchstr(leader, s:filtermx)[1:], '\s*[^\\]\zs,\s*'), 'substitute(v:val, "\\\\\\\\zs.\\\\ze", "&", "g")') let leader = substitute(leader, s:filtermx, '', '') endif if leader =~# '\*' let query = substitute(leader, '*', '*' . (a:lastline - a:firstline + 1), '') if query !~# '}\s*$' && query !~# '\$#' let query .= '>{$#}' endif if emmet#useFilter(filters, '/') let spl = emmet#splitFilterArg(filters) let fline = getline(a:firstline) let query = substitute(query, '>\{0,1}{\$#}\s*$', '{\\$column\\$}*' . len(split(fline, spl)), '') else let spl = '' endif let items = emmet#parseIntoTree(query, type).child let itemno = 0 for item in items let inner = emmet#toString(item, type, 0, filters, 0, indent) let inner = substitute(inner, '\$#', '$line'.(itemno*(a:lastline - a:firstline + 1)/len(items)+1).'$', 'g') let expand .= inner let itemno = itemno + 1 endfor if emmet#useFilter(filters, 'e') let expand = substitute(expand, '&', '\&', 'g') let expand = substitute(expand, '<', '\<', 'g') let expand = substitute(expand, '>', '\>', 'g') endif let line = getline(a:firstline) let part = substitute(line, '^\s*', '', '') for n in range(a:firstline, a:lastline) let lline = getline(n) let lpart = substitute(lline, '^\s\+', '', '') if emmet#useFilter(filters, 't') let lpart = substitute(lpart, '^[0-9.-]\+\s\+', '', '') let lpart = substitute(lpart, '\s\+$', '', '') endif if emmet#useFilter(filters, '/') for column in split(lpart, spl) let expand = substitute(expand, '\$column\$', '\=column', '') endfor else let expand = substitute(expand, '\$line'.(n-a:firstline+1).'\$', '\=lpart', 'g') endif endfor let expand = substitute(expand, '\$line\d*\$', '', 'g') let expand = substitute(expand, '\$column\$', '', 'g') let content = join(getline(a:firstline, a:lastline), "\n") if stridx(expand, '$#') < len(expand)-2 let expand = substitute(expand, '^\(.*\)\$#\s*$', '\1', '') endif let expand = substitute(expand, '\$#', '\=content', 'g') else let str = '' if visualmode() ==# 'V' let line = getline(a:firstline) let lspaces = matchstr(line, '^\s*', '', '') let part = substitute(line, '^\s*', '', '') for n in range(a:firstline, a:lastline) if len(leader) > 0 let line = getline(a:firstline) let spaces = matchstr(line, '^\s*', '', '') if len(spaces) >= len(lspaces) let str .= indent . getline(n)[len(lspaces):] . "\n" else let str .= getline(n) . "\n" endif else let lpart = substitute(getline(n), '^\s*', '', '') let str .= lpart . "\n" endif endfor if stridx(leader, '{$#}') ==# -1 let leader .= '{$#}' endif let items = emmet#parseIntoTree(leader, type).child else let save_regcont = @" let save_regtype = getregtype('"') silent! normal! gvygv let str = @" call setreg('"', save_regcont, save_regtype) if stridx(leader, '{$#}') ==# -1 let leader .= '{$#}' endif let items = emmet#parseIntoTree(leader, type).child endif for item in items let expand .= emmet#toString(item, type, 0, filters, 0, '') endfor if emmet#useFilter(filters, 'e') let expand = substitute(expand, '&', '\&', 'g') let expand = substitute(expand, '<', '\<', 'g') let expand = substitute(expand, '>', '\>', 'g') endif if stridx(leader, '{$#}') !=# -1 let expand = substitute(expand, '\$#', '\="\n" . str', 'g') endif endif elseif a:mode ==# 4 let line = getline('.') let spaces = matchstr(line, '^\s*') if line !~# '^\s*$' put =spaces.a:abbr else call setline('.', spaces.a:abbr) endif normal! $ call emmet#expandAbbr(0, '') return '' else let line = getline('.') if col('.') < len(line) let line = matchstr(line, '^\(.*\%'.col('.').'c\)') endif if a:mode ==# 1 let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$') else let part = matchstr(line, '\(\S.*\)$') let rtype = emmet#lang#type(type) let part = emmet#lang#{rtype}#findTokens(part) let line = line[0: strridx(line, part) + len(part) - 1] endif if col('.') ==# col('$') let rest = '' else let rest = getline('.')[len(line):] endif let str = part if str =~# s:filtermx let filters = split(matchstr(str, s:filtermx)[1:], '\s*,\s*') let str = substitute(str, s:filtermx, '', '') endif let items = emmet#parseIntoTree(str, type).child for item in items let expand .= emmet#toString(item, type, 0, filters, 0, indent) endfor if emmet#useFilter(filters, 'e') let expand = substitute(expand, '&', '\&', 'g') let expand = substitute(expand, '<', '\<', 'g') let expand = substitute(expand, '>', '\>', 'g') endif let expand = substitute(expand, '\$line\([0-9]\+\)\$', '\=submatch(1)', 'g') endif let expand = emmet#expandDollarExpr(expand) let expand = emmet#expandCursorExpr(expand, a:mode) if len(expand) if has_key(s:emmet_settings, 'timezone') && len(s:emmet_settings.timezone) let expand = substitute(expand, '${datetime}', strftime('%Y-%m-%dT%H:%M:%S') . s:emmet_settings.timezone, 'g') else " TODO: on windows, %z/%Z is 'Tokyo(Standard)' let expand = substitute(expand, '${datetime}', strftime('%Y-%m-%dT%H:%M:%S %z'), 'g') endif let expand = emmet#unescapeDollarExpr(expand) if a:mode ==# 2 && visualmode() ==# 'v' if a:firstline ==# a:lastline let expand = substitute(expand, '[\r\n]\s*', '', 'g') else let expand = substitute(expand, '[\n]$', '', 'g') endif silent! normal! gv let col = col('''<') silent! normal! c let line = getline('.') let lhs = matchstr(line, '.*\%<'.col.'c.') let rhs = matchstr(line, '\%>'.(col-1).'c.*') let expand = lhs.expand.rhs let lines = split(expand, '\n') call setline(line('.'), lines[0]) if len(lines) > 1 call append(line('.'), lines[1:]) endif else if line[:-len(part)-1] =~# '^\s\+$' let indent = line[:-len(part)-1] else let indent = '' endif let expand = substitute(expand, '[\r\n]\s*$', '', 'g') if emmet#useFilter(filters, 's') let epart = substitute(expand, '[\r\n]\s*', '', 'g') else let epart = substitute(expand, '[\r\n]', "\n" . indent, 'g') endif let expand = line[:-len(part)-1] . epart . rest let lines = split(expand, '[\r\n]', 1) if a:mode ==# 2 silent! exe 'normal! gvc' endif call setline('.', lines[0]) if len(lines) > 1 call append('.', lines[1:]) endif endif endif if g:emmet_debug > 1 call getchar() endif if search('\ze\$\(cursor\|select\)\$', 'c') let oldselection = &selection let &selection = 'inclusive' if foldclosed(line('.')) !=# -1 silent! foldopen endif let pos = emmet#util#getcurpos() let use_selection = emmet#getResource(type, 'use_selection', 0) try let l:gdefault = &gdefault let &gdefault = 0 if use_selection && getline('.')[col('.')-1:] =~# '^\$select' let pos[2] += 1 silent! s/\$select\$// let next = searchpos('.\ze\$select\$', 'nW') silent! %s/\$\(cursor\|select\)\$//g call emmet#util#selectRegion([pos[1:2], next]) return "\gv" else silent! %s/\$\(cursor\|select\)\$//g silent! call setpos('.', pos) if col('.') < col('$') return "\" endif endif finally let &gdefault = l:gdefault endtry let &selection = oldselection endif return '' endfunction function! emmet#updateTag() abort let type = emmet#getFileType() let region = emmet#util#searchRegion('<\S', '>') if !emmet#util#regionIsValid(region) || !emmet#util#cursorInRegion(region) return '' endif let content = emmet#util#getContent(region) let content = matchstr(content, '^<[^><]\+>') if content !~# '^<[^><]\+>$' return '' endif let current = emmet#lang#html#parseTag(content) if empty(current) return '' endif let str = substitute(input('Enter Abbreviation: ', ''), '^\s*\(.*\)\s*$', '\1', 'g') let item = emmet#parseIntoTree(str, type).child[0] for k in keys(item.attr) let current.attr[k] = item.attr[k] endfor let html = substitute(emmet#toString(current, 'html', 1), '\n', '', '') let html = substitute(html, '\${cursor}', '', '') let html = matchstr(html, '^<[^><]\+>') call emmet#util#setContent(region, html) return '' endfunction function! emmet#moveNextPrevItem(flag) abort let type = emmet#getFileType() return emmet#lang#{emmet#lang#type(type)}#moveNextPrevItem(a:flag) endfunction function! emmet#moveNextPrev(flag) abort let type = emmet#getFileType() return emmet#lang#{emmet#lang#type(type)}#moveNextPrev(a:flag) endfunction function! emmet#imageSize() abort let orgpos = emmet#util#getcurpos() let type = emmet#getFileType() call emmet#lang#{emmet#lang#type(type)}#imageSize() silent! call setpos('.', orgpos) return '' endfunction function! emmet#imageEncode() abort let type = emmet#getFileType() return emmet#lang#{emmet#lang#type(type)}#imageEncode() endfunction function! emmet#toggleComment() abort let type = emmet#getFileType() call emmet#lang#{emmet#lang#type(type)}#toggleComment() return '' endfunction function! emmet#balanceTag(flag) range abort let type = emmet#getFileType() return emmet#lang#{emmet#lang#type(type)}#balanceTag(a:flag) endfunction function! emmet#splitJoinTag() abort let type = emmet#getFileType() return emmet#lang#{emmet#lang#type(type)}#splitJoinTag() endfunction function! emmet#mergeLines() range abort let lines = join(map(getline(a:firstline, a:lastline), 'matchstr(v:val, "^\\s*\\zs.*\\ze\\s*$")'), '') let indent = substitute(getline('.'), '^\(\s*\).*', '\1', '') silent! exe 'normal! gvc' call setline('.', indent . lines) endfunction function! emmet#removeTag() abort let type = emmet#getFileType() call emmet#lang#{emmet#lang#type(type)}#removeTag() return '' endfunction function! emmet#mergeLines() abort let type = emmet#getFileType() call emmet#lang#{emmet#lang#type(type)}#mergeLines() return '' endfunction function! emmet#anchorizeURL(flag) abort let mx = 'https\=:\/\/[-!#$%&*+,./:;=?@0-9a-zA-Z_~]\+' let pos1 = searchpos(mx, 'bcnW') let url = matchstr(getline(pos1[0])[pos1[1]-1:], mx) let block = [pos1, [pos1[0], pos1[1] + len(url) - 1]] if !emmet#util#cursorInRegion(block) return '' endif let mx = '.*]*>\s*\zs\([^<]\+\)\ze\s*<\/title[^>]*>.*' let content = emmet#util#getContentFromURL(url) let content = substitute(content, '\r', '', 'g') let content = substitute(content, '[ \n]\+', ' ', 'g') let content = substitute(content, '', '', 'g') let title = matchstr(content, mx) let type = emmet#getFileType() let rtype = emmet#lang#type(type) if &filetype ==# 'markdown' let expand = printf('[%s](%s)', substitute(title, '[\[\]]', '\\&', 'g'), url) elseif &filetype ==# 'rst' let expand = printf('`%s <%s>`_', substitute(title, '[\[\]]', '\\&', 'g'), url) elseif a:flag ==# 0 let a = emmet#lang#html#parseTag('') let a.attr.href = url let a.value = '{' . title . '}' let expand = emmet#toString(a, rtype, 0, []) let expand = substitute(expand, '\${cursor}', '', 'g') else let body = emmet#util#getTextFromHTML(content) let body = '{' . substitute(body, '^\(.\{0,100}\).*', '\1', '') . '...}' let blockquote = emmet#lang#html#parseTag('
') let a = emmet#lang#html#parseTag('') let a.attr.href = url let a.value = '{' . title . '}' call add(blockquote.child, a) call add(blockquote.child, emmet#lang#html#parseTag('
')) let p = emmet#lang#html#parseTag('

') let p.value = body call add(blockquote.child, p) let cite = emmet#lang#html#parseTag('') let cite.value = '{' . url . '}' call add(blockquote.child, cite) let expand = emmet#toString(blockquote, rtype, 0, []) let expand = substitute(expand, '\${cursor}', '', 'g') endif let indent = substitute(getline('.'), '^\(\s*\).*', '\1', '') let expand = substitute(expand, "\n", "\n" . indent, 'g') call emmet#util#setContent(block, expand) return '' endfunction function! emmet#codePretty() range abort let type = input('FileType: ', &filetype, 'filetype') if len(type) ==# 0 return endif let block = emmet#util#getVisualBlock() let content = emmet#util#getContent(block) silent! 1new let &l:filetype = type call setline(1, split(content, "\n")) let old_lazyredraw = &lazyredraw set lazyredraw silent! TOhtml let &lazyredraw = old_lazyredraw let content = join(getline(1, '$'), "\n") silent! bw! silent! bw! let content = matchstr(content, ']*>[\s\n]*\zs.*\ze') call emmet#util#setContent(block, content) endfunction function! emmet#expandWord(abbr, type, orig) abort let str = a:abbr let type = a:type let indent = emmet#getIndentation(type) if len(type) ==# 0 | let type = 'html' | endif if str =~# s:filtermx let filters = split(matchstr(str, s:filtermx)[1:], '\s*,\s*') let str = substitute(str, s:filtermx, '', '') else let filters = emmet#getFilters(a:type) if len(filters) ==# 0 let filters = ['html'] endif endif let str = substitute(str, '|', '${cursor}', 'g') let items = emmet#parseIntoTree(str, a:type).child let expand = '' for item in items let expand .= emmet#toString(item, a:type, 0, filters, 0, indent) endfor if emmet#useFilter(filters, 'e') let expand = substitute(expand, '&', '\&', 'g') let expand = substitute(expand, '<', '\<', 'g') let expand = substitute(expand, '>', '\>', 'g') endif if emmet#useFilter(filters, 's') let expand = substitute(expand, "\n\s\*", '', 'g') endif if a:orig ==# 0 let expand = emmet#expandDollarExpr(expand) let expand = substitute(expand, '\${cursor}', '', 'g') endif return expand endfunction function! emmet#getSnippets(type) abort let type = a:type if len(type) ==# 0 || !has_key(s:emmet_settings, type) let type = 'html' endif return emmet#getResource(type, 'snippets', {}) endfunction function! emmet#completeTag(findstart, base) abort if a:findstart let line = getline('.') let start = col('.') - 1 while start > 0 && line[start - 1] =~# '[a-zA-Z0-9:_\@\-]' let start -= 1 endwhile return start else let type = emmet#getFileType() let res = [] let snippets = emmet#getResource(type, 'snippets', {}) for item in keys(snippets) if stridx(item, a:base) !=# -1 call add(res, substitute(item, '\${cursor}\||', '', 'g')) endif endfor let aliases = emmet#getResource(type, 'aliases', {}) for item in values(aliases) if stridx(item, a:base) !=# -1 call add(res, substitute(item, '\${cursor}\||', '', 'g')) endif endfor return res endif endfunction unlet! s:emmet_settings let s:emmet_settings = { \ 'variables': { \ 'lang': "en", \ 'locale': "en-US", \ 'charset': "UTF-8", \ 'newline': "\n", \ 'use_selection': 0, \ }, \ 'custom_expands' : { \ '^\%(lorem\|lipsum\)\(\d*\)$' : function('emmet#lorem#en#expand'), \ }, \ 'css': { \ 'snippets': { \ "@i": "@import url(|);", \ "@import": "@import url(|);", \ "@m": "@media ${1:screen} {\n\t|\n}", \ "@media": "@media ${1:screen} {\n\t|\n}", \ "@f": "@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}", \ "@f+": "@font-face {\n\tfont-family: '${1:FontName}';\n\tsrc: url('${2:FileName}.eot');\n\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\n\t\t url('${2:FileName}.woff') format('woff'),\n\t\t url('${2:FileName}.ttf') format('truetype'),\n\t\t url('${2:FileName}.svg#${1:FontName}') format('svg');\n\tfont-style: ${3:normal};\n\tfont-weight: ${4:normal};\n}", \ "@kf": "@-webkit-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@-o-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@-moz-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}", \ "anim": "animation:|;", \ "anim-": "animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode};", \ "animdel": "animation-delay:${1:time};", \ "animdir": "animation-direction:${1:normal};", \ "animdir:n": "animation-direction:normal;", \ "animdir:r": "animation-direction:reverse;", \ "animdir:a": "animation-direction:alternate;", \ "animdir:ar": "animation-direction:alternate-reverse;", \ "animdur": "animation-duration:${1:0}s;", \ "animfm": "animation-fill-mode:${1:both};", \ "animfm:f": "animation-fill-mode:forwards;", \ "animfm:b": "animation-fill-mode:backwards;", \ "animfm:bt": "animation-fill-mode:both;", \ "animfm:bh": "animation-fill-mode:both;", \ "animic": "animation-iteration-count:${1:1};", \ "animic:i": "animation-iteration-count:infinite;", \ "animn": "animation-name:${1:none};", \ "animps": "animation-play-state:${1:running};", \ "animps:p": "animation-play-state:paused;", \ "animps:r": "animation-play-state:running;", \ "animtf": "animation-timing-function:${1:linear};", \ "animtf:e": "animation-timing-function:ease;", \ "animtf:ei": "animation-timing-function:ease-in;", \ "animtf:eo": "animation-timing-function:ease-out;", \ "animtf:eio": "animation-timing-function:ease-in-out;", \ "animtf:l": "animation-timing-function:linear;", \ "animtf:cb": "animation-timing-function:cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1});", \ "ap": "appearance:${none};", \ "!": "!important", \ "pos": "position:${1:relative};", \ "pos:s": "position:static;", \ "pos:a": "position:absolute;", \ "pos:r": "position:relative;", \ "pos:f": "position:fixed;", \ "t": "top:|;", \ "t:a": "top:auto;", \ "r": "right:|;", \ "r:a": "right:auto;", \ "b": "bottom:|;", \ "b:a": "bottom:auto;", \ "l": "left:|;", \ "l:a": "left:auto;", \ "z": "z-index:|;", \ "z:a": "z-index:auto;", \ "fl": "float:${1:left};", \ "fl:n": "float:none;", \ "fl:l": "float:left;", \ "fl:r": "float:right;", \ "cl": "clear:${1:both};", \ "cl:n": "clear:none;", \ "cl:l": "clear:left;", \ "cl:r": "clear:right;", \ "cl:b": "clear:both;", \ "colm": "columns:|;", \ "colmc": "column-count:|;", \ "colmf": "column-fill:|;", \ "colmg": "column-gap:|;", \ "colmr": "column-rule:|;", \ "colmrc": "column-rule-color:|;", \ "colmrs": "column-rule-style:|;", \ "colmrw": "column-rule-width:|;", \ "colms": "column-span:|;", \ "colmw": "column-width:|;", \ "d": "display:${1:block};", \ "d:n": "display:none;", \ "d:b": "display:block;", \ "d:f": "display:flex;", \ "d:if": "display:inline-flex;", \ "d:i": "display:inline;", \ "d:ib": "display:inline-block;", \ "d:ib+": "display: inline-block;\n*display: inline;\n*zoom: 1;", \ "d:li": "display:list-item;", \ "d:ri": "display:run-in;", \ "d:cp": "display:compact;", \ "d:tb": "display:table;", \ "d:itb": "display:inline-table;", \ "d:tbcp": "display:table-caption;", \ "d:tbcl": "display:table-column;", \ "d:tbclg": "display:table-column-group;", \ "d:tbhg": "display:table-header-group;", \ "d:tbfg": "display:table-footer-group;", \ "d:tbr": "display:table-row;", \ "d:tbrg": "display:table-row-group;", \ "d:tbc": "display:table-cell;", \ "d:rb": "display:ruby;", \ "d:rbb": "display:ruby-base;", \ "d:rbbg": "display:ruby-base-group;", \ "d:rbt": "display:ruby-text;", \ "d:rbtg": "display:ruby-text-group;", \ "v": "visibility:${1:hidden};", \ "v:v": "visibility:visible;", \ "v:h": "visibility:hidden;", \ "v:c": "visibility:collapse;", \ "ov": "overflow:${1:hidden};", \ "ov:v": "overflow:visible;", \ "ov:h": "overflow:hidden;", \ "ov:s": "overflow:scroll;", \ "ov:a": "overflow:auto;", \ "ovx": "overflow-x:${1:hidden};", \ "ovx:v": "overflow-x:visible;", \ "ovx:h": "overflow-x:hidden;", \ "ovx:s": "overflow-x:scroll;", \ "ovx:a": "overflow-x:auto;", \ "ovy": "overflow-y:${1:hidden};", \ "ovy:v": "overflow-y:visible;", \ "ovy:h": "overflow-y:hidden;", \ "ovy:s": "overflow-y:scroll;", \ "ovy:a": "overflow-y:auto;", \ "ovs": "overflow-style:${1:scrollbar};", \ "ovs:a": "overflow-style:auto;", \ "ovs:s": "overflow-style:scrollbar;", \ "ovs:p": "overflow-style:panner;", \ "ovs:m": "overflow-style:move;", \ "ovs:mq": "overflow-style:marquee;", \ "zoo": "zoom:1;", \ "zm": "zoom:1;", \ "cp": "clip:|;", \ "cp:a": "clip:auto;", \ "cp:r": "clip:rect(${1:top} ${2:right} ${3:bottom} ${4:left});", \ "bxz": "box-sizing:${1:border-box};", \ "bxz:cb": "box-sizing:content-box;", \ "bxz:bb": "box-sizing:border-box;", \ "bxsh": "box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:color};", \ "bxsh:r": "box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:spread }rgb(${6:0}, ${7:0}, ${8:0});", \ "bxsh:ra": "box-shadow:${1:inset }${2:h} ${3:v} ${4:blur} ${5:spread }rgba(${6:0}, ${7:0}, ${8:0}, .${9:5});", \ "bxsh:n": "box-shadow:none;", \ "m": "margin:|;", \ "m:a": "margin:auto;", \ "mt": "margin-top:|;", \ "mt:a": "margin-top:auto;", \ "mr": "margin-right:|;", \ "mr:a": "margin-right:auto;", \ "mb": "margin-bottom:|;", \ "mb:a": "margin-bottom:auto;", \ "ml": "margin-left:|;", \ "ml:a": "margin-left:auto;", \ "p": "padding:|;", \ "pt": "padding-top:|;", \ "pr": "padding-right:|;", \ "pb": "padding-bottom:|;", \ "pl": "padding-left:|;", \ "w": "width:|;", \ "w:a": "width:auto;", \ "h": "height:|;", \ "h:a": "height:auto;", \ "maw": "max-width:|;", \ "maw:n": "max-width:none;", \ "mah": "max-height:|;", \ "mah:n": "max-height:none;", \ "miw": "min-width:|;", \ "mih": "min-height:|;", \ "mar": "max-resolution:${1:res};", \ "mir": "min-resolution:${1:res};", \ "ori": "orientation:|;", \ "ori:l": "orientation:landscape;", \ "ori:p": "orientation:portrait;", \ "ol": "outline:|;", \ "ol:n": "outline:none;", \ "olo": "outline-offset:|;", \ "olw": "outline-width:|;", \ "olw:tn": "outline-width:thin;", \ "olw:m": "outline-width:medium;", \ "olw:tc": "outline-width:thick;", \ "ols": "outline-style:|;", \ "ols:n": "outline-style:none;", \ "ols:dt": "outline-style:dotted;", \ "ols:ds": "outline-style:dashed;", \ "ols:s": "outline-style:solid;", \ "ols:db": "outline-style:double;", \ "ols:g": "outline-style:groove;", \ "ols:r": "outline-style:ridge;", \ "ols:i": "outline-style:inset;", \ "ols:o": "outline-style:outset;", \ "olc": "outline-color:#${1:000};", \ "olc:i": "outline-color:invert;", \ "bfv": "backface-visibility:|;", \ "bfv:h": "backface-visibility:hidden;", \ "bfv:v": "backface-visibility:visible;", \ "bd": "border:|;", \ "bd+": "border:${1:1px} ${2:solid} ${3:#000};", \ "bd:n": "border:none;", \ "bdbk": "border-break:${1:close};", \ "bdbk:c": "border-break:close;", \ "bdcl": "border-collapse:|;", \ "bdcl:c": "border-collapse:collapse;", \ "bdcl:s": "border-collapse:separate;", \ "bdc": "border-color:#${1:000};", \ "bdc:t": "border-color:transparent;", \ "bdi": "border-image:url(|);", \ "bdi:n": "border-image:none;", \ "bdti": "border-top-image:url(|);", \ "bdti:n": "border-top-image:none;", \ "bdri": "border-right-image:url(|);", \ "bdri:n": "border-right-image:none;", \ "bdbi": "border-bottom-image:url(|);", \ "bdbi:n": "border-bottom-image:none;", \ "bdli": "border-left-image:url(|);", \ "bdli:n": "border-left-image:none;", \ "bdci": "border-corner-image:url(|);", \ "bdci:n": "border-corner-image:none;", \ "bdci:c": "border-corner-image:continue;", \ "bdtli": "border-top-left-image:url(|);", \ "bdtli:n": "border-top-left-image:none;", \ "bdtli:c": "border-top-left-image:continue;", \ "bdtri": "border-top-right-image:url(|);", \ "bdtri:n": "border-top-right-image:none;", \ "bdtri:c": "border-top-right-image:continue;", \ "bdbri": "border-bottom-right-image:url(|);", \ "bdbri:n": "border-bottom-right-image:none;", \ "bdbri:c": "border-bottom-right-image:continue;", \ "bdbli": "border-bottom-left-image:url(|);", \ "bdbli:n": "border-bottom-left-image:none;", \ "bdbli:c": "border-bottom-left-image:continue;", \ "bdf": "border-fit:${1:repeat};", \ "bdf:c": "border-fit:clip;", \ "bdf:r": "border-fit:repeat;", \ "bdf:sc": "border-fit:scale;", \ "bdf:st": "border-fit:stretch;", \ "bdf:ow": "border-fit:overwrite;", \ "bdf:of": "border-fit:overflow;", \ "bdf:sp": "border-fit:space;", \ "bdlen": "border-length:|;", \ "bdlen:a": "border-length:auto;", \ "bdsp": "border-spacing:|;", \ "bds": "border-style:|;", \ "bds:n": "border-style:none;", \ "bds:h": "border-style:hidden;", \ "bds:dt": "border-style:dotted;", \ "bds:ds": "border-style:dashed;", \ "bds:s": "border-style:solid;", \ "bds:db": "border-style:double;", \ "bds:dtds": "border-style:dot-dash;", \ "bds:dtdtds": "border-style:dot-dot-dash;", \ "bds:w": "border-style:wave;", \ "bds:g": "border-style:groove;", \ "bds:r": "border-style:ridge;", \ "bds:i": "border-style:inset;", \ "bds:o": "border-style:outset;", \ "bdw": "border-width:|;", \ "bdtw": "border-top-width:|;", \ "bdrw": "border-right-width:|;", \ "bdbw": "border-bottom-width:|;", \ "bdlw": "border-left-width:|;", \ "bdt": "border-top:|;", \ "bt": "border-top:|;", \ "bdt+": "border-top:${1:1px} ${2:solid} ${3:#000};", \ "bdt:n": "border-top:none;", \ "bdts": "border-top-style:|;", \ "bdts:n": "border-top-style:none;", \ "bdtc": "border-top-color:#${1:000};", \ "bdtc:t": "border-top-color:transparent;", \ "bdr": "border-right:|;", \ "br": "border-right:|;", \ "bdr+": "border-right:${1:1px} ${2:solid} ${3:#000};", \ "bdr:n": "border-right:none;", \ "bdrst": "border-right-style:|;", \ "bdrst:n": "border-right-style:none;", \ "bdrc": "border-right-color:#${1:000};", \ "bdrc:t": "border-right-color:transparent;", \ "bdb": "border-bottom:|;", \ "bb": "border-bottom:|;", \ "bdb+": "border-bottom:${1:1px} ${2:solid} ${3:#000};", \ "bdb:n": "border-bottom:none;", \ "bdbs": "border-bottom-style:|;", \ "bdbs:n": "border-bottom-style:none;", \ "bdbc": "border-bottom-color:#${1:000};", \ "bdbc:t": "border-bottom-color:transparent;", \ "bdl": "border-left:|;", \ "bl": "border-left:|;", \ "bdl+": "border-left:${1:1px} ${2:solid} ${3:#000};", \ "bdl:n": "border-left:none;", \ "bdls": "border-left-style:|;", \ "bdls:n": "border-left-style:none;", \ "bdlc": "border-left-color:#${1:000};", \ "bdlc:t": "border-left-color:transparent;", \ "bdrs": "border-radius:|;", \ "bdtrrs": "border-top-right-radius:|;", \ "bdtlrs": "border-top-left-radius:|;", \ "bdbrrs": "border-bottom-right-radius:|;", \ "bdblrs": "border-bottom-left-radius:|;", \ "bg": "background:#${1:000};", \ "bg+": "background:${1:#fff} url(${2}) ${3:0} ${4:0} ${5:no-repeat};", \ "bg:n": "background:none;", \ "bg:ie": "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1:x}.png',sizingMethod='${2:crop}');", \ "bgc": "background-color:#${1:fff};", \ "bgc:t": "background-color:transparent;", \ "bgi": "background-image:url(|);", \ "bgi:n": "background-image:none;", \ "bgr": "background-repeat:|;", \ "bgr:n": "background-repeat:no-repeat;", \ "bgr:x": "background-repeat:repeat-x;", \ "bgr:y": "background-repeat:repeat-y;", \ "bgr:sp": "background-repeat:space;", \ "bgr:rd": "background-repeat:round;", \ "bga": "background-attachment:|;", \ "bga:f": "background-attachment:fixed;", \ "bga:s": "background-attachment:scroll;", \ "bgp": "background-position:${1:0} ${2:0};", \ "bgpx": "background-position-x:|;", \ "bgpy": "background-position-y:|;", \ "bgbk": "background-break:|;", \ "bgbk:bb": "background-break:bounding-box;", \ "bgbk:eb": "background-break:each-box;", \ "bgbk:c": "background-break:continuous;", \ "bgcp": "background-clip:${1:padding-box};", \ "bgcp:bb": "background-clip:border-box;", \ "bgcp:pb": "background-clip:padding-box;", \ "bgcp:cb": "background-clip:content-box;", \ "bgcp:nc": "background-clip:no-clip;", \ "bgo": "background-origin:|;", \ "bgo:pb": "background-origin:padding-box;", \ "bgo:bb": "background-origin:border-box;", \ "bgo:cb": "background-origin:content-box;", \ "bgsz": "background-size:|;", \ "bgsz:a": "background-size:auto;", \ "bgsz:ct": "background-size:contain;", \ "bgsz:cv": "background-size:cover;", \ "c": "color:#${1:000};", \ "c:r": "color:rgb(${1:0}, ${2:0}, ${3:0});", \ "c:ra": "color:rgba(${1:0}, ${2:0}, ${3:0}, .${4:5});", \ "cm": "/* |${child} */", \ "cnt": "content:'|';", \ "cnt:n": "content:normal;", \ "cnt:oq": "content:open-quote;", \ "cnt:noq": "content:no-open-quote;", \ "cnt:cq": "content:close-quote;", \ "cnt:ncq": "content:no-close-quote;", \ "cnt:a": "content:attr(|);", \ "cnt:c": "content:counter(|);", \ "cnt:cs": "content:counters(|);", \ "tbl": "table-layout:|;", \ "tbl:a": "table-layout:auto;", \ "tbl:f": "table-layout:fixed;", \ "cps": "caption-side:|;", \ "cps:t": "caption-side:top;", \ "cps:b": "caption-side:bottom;", \ "ec": "empty-cells:|;", \ "ec:s": "empty-cells:show;", \ "ec:h": "empty-cells:hide;", \ "lis": "list-style:|;", \ "lis:n": "list-style:none;", \ "lisp": "list-style-position:|;", \ "lisp:i": "list-style-position:inside;", \ "lisp:o": "list-style-position:outside;", \ "list": "list-style-type:|;", \ "list:n": "list-style-type:none;", \ "list:d": "list-style-type:disc;", \ "list:c": "list-style-type:circle;", \ "list:s": "list-style-type:square;", \ "list:dc": "list-style-type:decimal;", \ "list:dclz": "list-style-type:decimal-leading-zero;", \ "list:lr": "list-style-type:lower-roman;", \ "list:ur": "list-style-type:upper-roman;", \ "lisi": "list-style-image:|;", \ "lisi:n": "list-style-image:none;", \ "q": "quotes:|;", \ "q:n": "quotes:none;", \ "q:ru": "quotes:'\\00AB' '\\00BB' '\\201E' '\\201C';", \ "q:en": "quotes:'\\201C' '\\201D' '\\2018' '\\2019';", \ "ct": "content:|;", \ "ct:n": "content:normal;", \ "ct:oq": "content:open-quote;", \ "ct:noq": "content:no-open-quote;", \ "ct:cq": "content:close-quote;", \ "ct:ncq": "content:no-close-quote;", \ "ct:a": "content:attr(|);", \ "ct:c": "content:counter(|);", \ "ct:cs": "content:counters(|);", \ "coi": "counter-increment:|;", \ "cor": "counter-reset:|;", \ "va": "vertical-align:${1:top};", \ "va:sup": "vertical-align:super;", \ "va:t": "vertical-align:top;", \ "va:tt": "vertical-align:text-top;", \ "va:m": "vertical-align:middle;", \ "va:bl": "vertical-align:baseline;", \ "va:b": "vertical-align:bottom;", \ "va:tb": "vertical-align:text-bottom;", \ "va:sub": "vertical-align:sub;", \ "ta": "text-align:${1:left};", \ "ta:l": "text-align:left;", \ "ta:c": "text-align:center;", \ "ta:r": "text-align:right;", \ "ta:j": "text-align:justify;", \ "ta-lst": "text-align-last:|;", \ "tal:a": "text-align-last:auto;", \ "tal:l": "text-align-last:left;", \ "tal:c": "text-align-last:center;", \ "tal:r": "text-align-last:right;", \ "td": "text-decoration:${1:none};", \ "td:n": "text-decoration:none;", \ "td:u": "text-decoration:underline;", \ "td:o": "text-decoration:overline;", \ "td:l": "text-decoration:line-through;", \ "te": "text-emphasis:|;", \ "te:n": "text-emphasis:none;", \ "te:ac": "text-emphasis:accent;", \ "te:dt": "text-emphasis:dot;", \ "te:c": "text-emphasis:circle;", \ "te:ds": "text-emphasis:disc;", \ "te:b": "text-emphasis:before;", \ "te:a": "text-emphasis:after;", \ "th": "text-height:|;", \ "th:a": "text-height:auto;", \ "th:f": "text-height:font-size;", \ "th:t": "text-height:text-size;", \ "th:m": "text-height:max-size;", \ "ti": "text-indent:|;", \ "ti:-": "text-indent:-9999px;", \ "tj": "text-justify:|;", \ "tj:a": "text-justify:auto;", \ "tj:iw": "text-justify:inter-word;", \ "tj:ii": "text-justify:inter-ideograph;", \ "tj:ic": "text-justify:inter-cluster;", \ "tj:d": "text-justify:distribute;", \ "tj:k": "text-justify:kashida;", \ "tj:t": "text-justify:tibetan;", \ "tov": "text-overflow:${ellipsis};", \ "tov:e": "text-overflow:ellipsis;", \ "tov:c": "text-overflow:clip;", \ "to": "text-outline:|;", \ "to+": "text-outline:${1:0} ${2:0} ${3:#000};", \ "to:n": "text-outline:none;", \ "tr": "text-replace:|;", \ "tr:n": "text-replace:none;", \ "tt": "text-transform:${1:uppercase};", \ "tt:n": "text-transform:none;", \ "tt:c": "text-transform:capitalize;", \ "tt:u": "text-transform:uppercase;", \ "tt:l": "text-transform:lowercase;", \ "tw": "text-wrap:|;", \ "tw:n": "text-wrap:normal;", \ "tw:no": "text-wrap:none;", \ "tw:u": "text-wrap:unrestricted;", \ "tw:s": "text-wrap:suppress;", \ "tsh": "text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000};", \ "tsh:r": "text-shadow:${1:h} ${2:v} ${3:blur} rgb(${4:0}, ${5:0}, ${6:0});", \ "tsh:ra": "text-shadow:${1:h} ${2:v} ${3:blur} rgba(${4:0}, ${5:0}, ${6:0}, .${7:5});", \ "tsh+": "text-shadow:${1:0} ${2:0} ${3:0} ${4:#000};", \ "tsh:n": "text-shadow:none;", \ "trf": "transform:|;", \ "trf:skx": "transform: skewX(${1:angle});", \ "trf:sky": "transform: skewY(${1:angle});", \ "trf:sc": "transform: scale(${1:x}, ${2:y});", \ "trf:scx": "transform: scaleX(${1:x});", \ "trf:scy": "transform: scaleY(${1:y});", \ "trf:scz": "transform: scaleZ(${1:z});", \ "trf:sc3": "transform: scale3d(${1:x}, ${2:y}, ${3:z});", \ "trf:r": "transform: rotate(${1:angle});", \ "trf:rx": "transform: rotateX(${1:angle});", \ "trf:ry": "transform: rotateY(${1:angle});", \ "trf:rz": "transform: rotateZ(${1:angle});", \ "trf:t": "transform: translate(${1:x}, ${2:y});", \ "trf:tx": "transform: translateX(${1:x});", \ "trf:ty": "transform: translateY(${1:y});", \ "trf:tz": "transform: translateZ(${1:z});", \ "trf:t3": "transform: translate3d(${1:tx}, ${2:ty}, ${3:tz});", \ "trfo": "transform-origin:|;", \ "trfs": "transform-style:${1:preserve-3d};", \ "trs": "transition:${1:prop} ${2:time};", \ "trsde": "transition-delay:${1:time};", \ "trsdu": "transition-duration:${1:time};", \ "trsp": "transition-property:${1:prop};", \ "trstf": "transition-timing-function:${1:tfunc};", \ "lh": "line-height:|;", \ "whs": "white-space:|;", \ "whs:n": "white-space:normal;", \ "whs:p": "white-space:pre;", \ "whs:nw": "white-space:nowrap;", \ "whs:pw": "white-space:pre-wrap;", \ "whs:pl": "white-space:pre-line;", \ "whsc": "white-space-collapse:|;", \ "whsc:n": "white-space-collapse:normal;", \ "whsc:k": "white-space-collapse:keep-all;", \ "whsc:l": "white-space-collapse:loose;", \ "whsc:bs": "white-space-collapse:break-strict;", \ "whsc:ba": "white-space-collapse:break-all;", \ "wob": "word-break:|;", \ "wob:n": "word-break:normal;", \ "wob:k": "word-break:keep-all;", \ "wob:ba": "word-break:break-all;", \ "wos": "word-spacing:|;", \ "wow": "word-wrap:|;", \ "wow:nm": "word-wrap:normal;", \ "wow:n": "word-wrap:none;", \ "wow:u": "word-wrap:unrestricted;", \ "wow:s": "word-wrap:suppress;", \ "wow:b": "word-wrap:break-word;", \ "wm": "writing-mode:${1:lr-tb};", \ "wm:lrt": "writing-mode:lr-tb;", \ "wm:lrb": "writing-mode:lr-bt;", \ "wm:rlt": "writing-mode:rl-tb;", \ "wm:rlb": "writing-mode:rl-bt;", \ "wm:tbr": "writing-mode:tb-rl;", \ "wm:tbl": "writing-mode:tb-lr;", \ "wm:btl": "writing-mode:bt-lr;", \ "wm:btr": "writing-mode:bt-rl;", \ "lts": "letter-spacing:|;", \ "lts-n": "letter-spacing:normal;", \ "f": "font:|;", \ "f+": "font:${1:1em} ${2:Arial,sans-serif};", \ "fw": "font-weight:|;", \ "fw:n": "font-weight:normal;", \ "fw:b": "font-weight:bold;", \ "fw:br": "font-weight:bolder;", \ "fw:lr": "font-weight:lighter;", \ "fs": "font-style:${italic};", \ "fs:n": "font-style:normal;", \ "fs:i": "font-style:italic;", \ "fs:o": "font-style:oblique;", \ "fv": "font-variant:|;", \ "fv:n": "font-variant:normal;", \ "fv:sc": "font-variant:small-caps;", \ "fz": "font-size:|;", \ "fza": "font-size-adjust:|;", \ "fza:n": "font-size-adjust:none;", \ "ff": "font-family:|;", \ "ff:s": "font-family:serif;", \ "ff:ss": "font-family:sans-serif;", \ "ff:c": "font-family:cursive;", \ "ff:f": "font-family:fantasy;", \ "ff:m": "font-family:monospace;", \ "ff:a": "font-family: Arial, \"Helvetica Neue\", Helvetica, sans-serif;", \ "ff:t": "font-family: \"Times New Roman\", Times, Baskerville, Georgia, serif;", \ "ff:v": "font-family: Verdana, Geneva, sans-serif;", \ "fef": "font-effect:|;", \ "fef:n": "font-effect:none;", \ "fef:eg": "font-effect:engrave;", \ "fef:eb": "font-effect:emboss;", \ "fef:o": "font-effect:outline;", \ "fem": "font-emphasize:|;", \ "femp": "font-emphasize-position:|;", \ "femp:b": "font-emphasize-position:before;", \ "femp:a": "font-emphasize-position:after;", \ "fems": "font-emphasize-style:|;", \ "fems:n": "font-emphasize-style:none;", \ "fems:ac": "font-emphasize-style:accent;", \ "fems:dt": "font-emphasize-style:dot;", \ "fems:c": "font-emphasize-style:circle;", \ "fems:ds": "font-emphasize-style:disc;", \ "fsm": "font-smooth:|;", \ "fsm:a": "font-smooth:auto;", \ "fsm:n": "font-smooth:never;", \ "fsm:aw": "font-smooth:always;", \ "fst": "font-stretch:|;", \ "fst:n": "font-stretch:normal;", \ "fst:uc": "font-stretch:ultra-condensed;", \ "fst:ec": "font-stretch:extra-condensed;", \ "fst:c": "font-stretch:condensed;", \ "fst:sc": "font-stretch:semi-condensed;", \ "fst:se": "font-stretch:semi-expanded;", \ "fst:e": "font-stretch:expanded;", \ "fst:ee": "font-stretch:extra-expanded;", \ "fst:ue": "font-stretch:ultra-expanded;", \ "op": "opacity:|;", \ "op+": "opacity: $1;\nfilter: alpha(opacity=$2);", \ "op:ie": "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);", \ "op:ms": "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';", \ "rsz": "resize:|;", \ "rsz:n": "resize:none;", \ "rsz:b": "resize:both;", \ "rsz:h": "resize:horizontal;", \ "rsz:v": "resize:vertical;", \ "cur": "cursor:${pointer};", \ "cur:a": "cursor:auto;", \ "cur:d": "cursor:default;", \ "cur:c": "cursor:crosshair;", \ "cur:ha": "cursor:hand;", \ "cur:he": "cursor:help;", \ "cur:m": "cursor:move;", \ "cur:p": "cursor:pointer;", \ "cur:t": "cursor:text;", \ "fxd": "flex-direction:|;", \ "fxd:r": "flex-direction:row;", \ "fxd:rr": "flex-direction:row-reverse;", \ "fxd:c": "flex-direction:column;", \ "fxd:cr": "flex-direction:column-reverse;", \ "fxw": "flex-wrap: |;", \ "fxw:n": "flex-wrap:nowrap;", \ "fxw:w": "flex-wrap:wrap;", \ "fxw:wr": "flex-wrap:wrap-reverse;", \ "fxf": "flex-flow:|;", \ "jc": "justify-content:|;", \ "jc:fs": "justify-content:flex-start;", \ "jc:fe": "justify-content:flex-end;", \ "jc:c": "justify-content:center;", \ "jc:sb": "justify-content:space-between;", \ "jc:sa": "justify-content:space-around;", \ "ai": "align-items:|;", \ "ai:fs": "align-items:flex-start;", \ "ai:fe": "align-items:flex-end;", \ "ai:c": "align-items:center;", \ "ai:b": "align-items:baseline;", \ "ai:s": "align-items:stretch;", \ "ac": "align-content:|;", \ "ac:fs": "align-content:flex-start;", \ "ac:fe": "align-content:flex-end;", \ "ac:c": "align-content:center;", \ "ac:sb": "align-content:space-between;", \ "ac:sa": "align-content:space-around;", \ "ac:s": "align-content:stretch;", \ "ord": "order:|;", \ "fxg": "flex-grow:|;", \ "fxsh": "flex-shrink:|;", \ "fxb": "flex-basis:|;", \ "fx": "flex:|;", \ "as": "align-self:|;", \ "as:a": "align-self:auto;", \ "as:fs": "align-self:flex-start;", \ "as:fe": "align-self:flex-end;", \ "as:c": "align-self:center;", \ "as:b": "align-self:baseline;", \ "as:s": "align-self:stretch;", \ "pgbb": "page-break-before:|;", \ "pgbb:au": "page-break-before:auto;", \ "pgbb:al": "page-break-before:always;", \ "pgbb:l": "page-break-before:left;", \ "pgbb:r": "page-break-before:right;", \ "pgbi": "page-break-inside:|;", \ "pgbi:au": "page-break-inside:auto;", \ "pgbi:av": "page-break-inside:avoid;", \ "pgba": "page-break-after:|;", \ "pgba:au": "page-break-after:auto;", \ "pgba:al": "page-break-after:always;", \ "pgba:l": "page-break-after:left;", \ "pgba:r": "page-break-after:right;", \ "orp": "orphans:|;", \ "us": "user-select:${none};", \ "wid": "widows:|;", \ "wfsm": "-webkit-font-smoothing:${antialiased};", \ "wfsm:a": "-webkit-font-smoothing:antialiased;", \ "wfsm:s": "-webkit-font-smoothing:subpixel-antialiased;", \ "wfsm:sa": "-webkit-font-smoothing:subpixel-antialiased;", \ "wfsm:n": "-webkit-font-smoothing:none;" \ }, \ 'filters': 'fc', \ 'ignore_embeded_filetype': 1, \ }, \ 'sass': { \ 'extends': 'css', \ 'snippets': { \ '@if': "@if {\n\t|\n}", \ '@e': "@else {\n\t|\n}", \ '@in': "@include |", \ '@ex': "@extend |", \ '@mx': "@mixin {\n\t|\n}", \ '@fn': "@function {\n\t|\n}", \ '@r': "@return |", \ }, \ }, \ 'scss': { \ 'extends': 'css', \ }, \ 'less': { \ 'extends': 'css', \ }, \ 'css.drupal': { \ 'extends': 'css', \ }, \ 'styled': { \ 'extends': 'css', \ }, \ 'html': { \ 'snippets': { \ '!': "html:5", \ '!!!': "\n", \ '!!!4t': "\n", \ '!!!4s': "\n", \ '!!!xt': "\n", \ '!!!xs': "\n", \ '!!!xxs': "\n", \ 'c': "", \ 'cc:ie6': "", \ 'cc:ie': "", \ 'cc:noie': "\n\t${child}|\n", \ 'html:4t': "\n" \ ."\n" \ ."\n" \ ."\t\n" \ ."\t\n" \ ."\n" \ ."\n\t${child}|\n\n" \ ."", \ 'html:4s': "\n" \ ."\n" \ ."\n" \ ."\t\n" \ ."\t\n" \ ."\n" \ ."\n\t${child}|\n\n" \ ."", \ 'html:xt': "\n" \ ."\n" \ ."\n" \ ."\t\n" \ ."\t\n" \ ."\n" \ ."\n\t${child}|\n\n" \ ."", \ 'html:xs': "\n" \ ."\n" \ ."\n" \ ."\t\n" \ ."\t\n" \ ."\n" \ ."\n\t${child}|\n\n" \ ."", \ 'html:xxs': "\n" \ ."\n" \ ."\n" \ ."\t\n" \ ."\t\n" \ ."\n" \ ."\n\t${child}|\n\n" \ ."", \ 'html:5': "\n" \ ."\n" \ ."\n" \ ."\t\n" \ ."\t\n" \ ."\n" \ ."\n\t${child}|\n\n" \ ."", \ }, \ 'default_attributes': { \ 'a': [{'href': ''}], \ 'a:blank': [{'href': 'http://|'},{'target': '_blank'},{'rel': 'noopener noreferrer'}], \ 'a:link': [{'href': 'http://|'}], \ 'a:mail': [{'href': 'mailto:|'}], \ 'a:tel': [{'href': 'tel:+|'}], \ 'abbr': [{'title': ''}], \ 'acronym': [{'title': ''}], \ 'acr': [{'title': ''}], \ 'base': [{'href': ''}], \ 'bdo': [{'dir': ''}], \ 'bdo:r': [{'dir': 'rtl'}], \ 'bdo:l': [{'dir': 'ltr'}], \ 'button:disabled': [{'disabled': 'disabled'}], \ 'button:d': [{'disabled': 'disabled'}], \ 'btn:d': [{'disabled': 'disabled'}], \ 'button:submit': [{'type': 'submit'}], \ 'button:s': [{'type': 'submit'}], \ 'btn:s': [{'type': 'submit'}], \ 'button:reset': [{'type': 'reset'}], \ 'button:r': [{'type': 'reset'}], \ 'btn:r': [{'type': 'reset'}], \ 'del': [{'datetime': '${datetime}'}], \ 'ins': [{'datetime': '${datetime}'}], \ 'link:css': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|style.css'}, {'media': 'all'}], \ 'link:manifest': [{'rel': 'manifest'},{'href': '|manifest.json'}], \ 'link:mf': [{'rel': 'manifest'},{'href': '|manifest.json'}], \ 'link:print': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|print.css'}, {'media': 'print'}], \ 'link:import': [{'rel': 'import'}, {'href': '|.html'}], \ 'link:im': [{'rel': 'import'}, {'href': '|.html'}], \ 'link:favicon': [{'rel': 'shortcut icon'}, {'type': 'image/x-icon'}, {'href': '|favicon.ico'}], \ 'link:touch': [{'rel': 'apple-touch-icon'}, {'href': '|favicon.png'}], \ 'link:rss': [{'rel': 'alternate'}, {'type': 'application/rss+xml'}, {'title': 'RSS'}, {'href': '|rss.xml'}], \ 'link:atom': [{'rel': 'alternate'}, {'type': 'application/atom+xml'}, {'title': 'Atom'}, {'href': 'atom.xml'}], \ 'marquee': [{'behavior': ''},{'direction': ''}], \ 'meta:utf': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=UTF-8'}], \ 'meta:vp': [{'name': 'viewport'}, {'content': 'width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'}], \ 'meta:win': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=Win-1251'}], \ 'meta:compat': [{'http-equiv': 'X-UA-Compatible'}, {'content': 'IE=7'}], \ 'meta:desc': [{'name': 'description'},{'content': ''}], \ 'meta:edge': [{'http-equiv': 'X-UA-Compatible'}, {'content': 'ie=edge'}], \ 'meta:kw': [{'name': 'keywords'},{'content': ''}], \ 'meta:redirect': [{'http-equiv': 'Content-Type'}, {'content': '0; url=http://example.com'}], \ 'style': g:emmet_html5 ? [] : [{'type': 'text/css'}], \ 'script': g:emmet_html5 ? [] : [{'type': 'text/javascript'}], \ 'script:src': (g:emmet_html5 ? [] : [{'type': 'text/javascript'}]) + [{'src': ''}], \ 'img': [{'src': ''}, {'alt': ''}], \ 'img:srcset': [{'srcset': ''},{'src': ''}, {'alt': ''}], \ 'img:s': [{'srcset': ''},{'src': ''}, {'alt': ''}], \ 'img:sizes': [{'sizes': ''},{'srcset': ''},{'src': ''}, {'alt': ''}], \ 'img:z': [{'sizes': ''},{'srcset': ''},{'src': ''}, {'alt': ''}], \ 'iframe': [{'src': ''}, {'frameborder': '0'}], \ 'embed': [{'src': ''}, {'type': ''}], \ 'object': [{'data': ''}, {'type': ''}], \ 'param': [{'name': ''}, {'value': ''}], \ 'map': {'name': ''}, \ 'area': [{'shape': ''}, {'coords': ''}, {'href': ''}, {'alt': ''}], \ 'area:d': [{'shape': 'default'}, {'href': ''}, {'alt': ''}], \ 'area:c': [{'shape': 'circle'}, {'coords': ''}, {'href': ''}, {'alt': ''}], \ 'area:r': [{'shape': 'rect'}, {'coords': ''}, {'href': ''}, {'alt': ''}], \ 'area:p': [{'shape': 'poly'}, {'coords': ''}, {'href': ''}, {'alt': ''}], \ 'link': [{'rel': 'stylesheet'}, {'href': ''}], \ 'fieldset:disabled': [{'disabled': 'disabled'}], \ 'fieldset:d': [{'disabled': 'disabled'}], \ 'fset:d': [{'disabled': 'disabled'}], \ 'fst:disabled': [{'disabled': 'disabled'}], \ 'form': [{'action': ''}], \ 'form:get': [{'action': ''}, {'method': 'get'}], \ 'form:post': [{'action': ''}, {'method': 'post'}], \ 'form:upload': [{'action': ''}, {'method': 'post'}, {'enctype': 'multipart/form-data'}], \ 'label': [{'for': ''}], \ 'input': [{'type': ''}], \ 'input:hidden': [{'type': 'hidden'}, {'name': ''}], \ 'input:h': [{'type': 'hidden'}, {'name': ''}], \ 'input:text': [{'type': 'text'}, {'name': ''}, {'id': ''}], \ 'input:t': [{'type': 'text'}, {'name': ''}, {'id': ''}], \ 'input:search': [{'type': 'search'}, {'name': ''}, {'id': ''}], \ 'input:email': [{'type': 'email'}, {'name': ''}, {'id': ''}], \ 'input:tel': [{'type': 'tel'}, {'name': ''}, {'id': ''}], \ 'input:url': [{'type': 'url'}, {'name': ''}, {'id': ''}], \ 'input:password': [{'type': 'password'}, {'name': ''}, {'id': ''}], \ 'input:p': [{'type': 'password'}, {'name': ''}, {'id': ''}], \ 'input:datetime': [{'type': 'datetime'}, {'name': ''}, {'id': ''}], \ 'input:date': [{'type': 'date'}, {'name': ''}, {'id': ''}], \ 'input:datetime-local': [{'type': 'datetime-local'}, {'name': ''}, {'id': ''}], \ 'input:month': [{'type': 'month'}, {'name': ''}, {'id': ''}], \ 'input:week': [{'type': 'week'}, {'name': ''}, {'id': ''}], \ 'input:time': [{'type': 'time'}, {'name': ''}, {'id': ''}], \ 'input:number': [{'type': 'number'}, {'name': ''}, {'id': ''}], \ 'input:color': [{'type': 'color'}, {'name': ''}, {'id': ''}], \ 'input:checkbox': [{'type': 'checkbox'}, {'name': ''}, {'id': ''}], \ 'input:c': [{'type': 'checkbox'}, {'name': ''}, {'id': ''}], \ 'input:radio': [{'type': 'radio'}, {'name': ''}, {'id': ''}], \ 'input:r': [{'type': 'radio'}, {'name': ''}, {'id': ''}], \ 'input:range': [{'type': 'range'}, {'name': ''}, {'id': ''}], \ 'input:file': [{'type': 'file'}, {'name': ''}, {'id': ''}], \ 'input:f': [{'type': 'file'}, {'name': ''}, {'id': ''}], \ 'input:submit': [{'type': 'submit'}, {'value': ''}], \ 'input:s': [{'type': 'submit'}, {'value': ''}], \ 'input:image': [{'type': 'image'}, {'src': ''}, {'alt': ''}], \ 'input:i': [{'type': 'image'}, {'src': ''}, {'alt': ''}], \ 'input:reset': [{'type': 'reset'}, {'value': ''}], \ 'input:button': [{'type': 'button'}, {'value': ''}], \ 'input:b': [{'type': 'button'}, {'value': ''}], \ 'select': [{'name': ''}, {'id': ''}], \ 'select:disabled': [{'name': ''}, {'id': ''}, {'disabled': 'disabled'}], \ 'source:media': [{'media': '(minwidth: )'},{'srcset': ''}], \ 'source:m': [{'media': '(minwidth: )'},{'srcset': ''}], \ 'source:media:type': [{'media': '(minwidth: )'},{'srcset': ''},{'type': 'image/'}], \ 'source:media:sizes': [{'media': '(minwidth: )'},{'srcset': ''},{'sizes': ''}], \ 'source:sizes:type': [{'sizes': ''},{'srcset': ''},{'type': 'image/'}], \ 'source:src': [{'src': ''},{'type': ''}], \ 'source:sc': [{'src': ''},{'type': ''}], \ 'source:srcset': [{'srcset': ''}], \ 'source:s': [{'srcset': ''}], \ 'source:type': [{'srcset': ''},{'type': 'image/'}], \ 'source:t': [{'srcset': ''},{'type': 'image/'}], \ 'source:sizes': [{'sizes': ''},{'srcset': ''}], \ 'source:z': [{'sizes': ''},{'srcset': ''}], \ 'option': [{'value': ''}], \ 'textarea': [{'name': ''}, {'id': ''}, {'cols': '30'}, {'rows': '10'}], \ 'menu:context': [{'type': 'context'}], \ 'menu:c': [{'type': 'context'}], \ 'menu:toolbar': [{'type': 'toolbar'}], \ 'menu:t': [{'type': 'toolbar'}], \ 'video': [{'src': ''}], \ 'audio': [{'src': ''}], \ 'html:xml': [{'xmlns': 'http://www.w3.org/1999/xhtml'}, {'xml:lang': '${lang}'}], \ }, \ 'aliases': { \ 'link:*': 'link', \ 'meta:*': 'meta', \ 'area:*': 'area', \ 'bdo:*': 'bdo', \ 'form:*': 'form', \ 'input:*': 'input', \ 'script:*': 'script', \ 'html:*': 'html', \ 'a:*': 'a', \ 'menu:*': 'menu', \ 'mn': 'main', \ 'tem': 'template', \ 'bq': 'blockquote', \ 'acr': 'acronym', \ 'fig': 'figure', \ 'figc': 'figcaption', \ 'ifr': 'iframe', \ 'emb': 'embed', \ 'obj': 'object', \ 'src:*': 'source', \ 'cap': 'caption', \ 'colg': 'colgroup', \ 'fst': 'fieldset', \ 'btn:': 'button', \ 'optg': 'optgroup', \ 'opt': 'option', \ 'pic': 'picture', \ 'tarea': 'textarea', \ 'leg': 'legend', \ 'sect': 'section', \ 'art': 'article', \ 'hdr': 'header', \ 'ftr': 'footer', \ 'adr': 'address', \ 'dlg': 'dialog', \ 'str': 'strong', \ 'sty': 'style', \ 'prog': 'progress', \ 'fset': 'fieldset', \ 'datag': 'datagrid', \ 'datal': 'datalist', \ 'kg': 'keygen', \ 'out': 'output', \ 'det': 'details', \ 'cmd': 'command', \ 'sum': 'summary', \ }, \ 'expandos': { \ 'ol': 'ol>li', \ 'ul': 'ul>li', \ 'dl': 'dl>dt+dd', \ 'map': 'map>area', \ 'table': 'table>tr>td', \ 'colgroup': 'colgroup>col', \ 'colg': 'colgroup>col', \ 'tr': 'tr>td', \ 'select': 'select>option', \ 'optgroup': 'optgroup>option', \ 'optg': 'optgroup>option', \ 'ri:dpr': 'img:s', \ 'ri:d': 'img:s', \ 'ri:viewport': 'img:z', \ 'ri:vp': 'img:z', \ 'ri:art': 'pic>source:m+img', \ 'ri:a': 'pic>source:m+img', \ 'ri:type': 'pic>source:t+img', \ 'ri:t': 'pic>source:t+img', \ }, \ 'empty_elements': 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command', \ 'block_elements': 'address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6', \ 'inline_elements': 'a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,small,span,strike,strong,sub,sup,textarea,tt,u,var', \ 'empty_element_suffix': g:emmet_html5 ? '>' : ' />', \ 'indent_blockelement': 0, \ 'block_all_childless': 0, \ }, \ 'elm': { \ 'indentation': ' ', \ 'extends': 'html', \ }, \ 'xml': { \ 'extends': 'html', \ 'empty_elements': '', \ 'block_elements': '', \ 'inline_elements': '', \ }, \ 'htmldjango': { \ 'extends': 'html', \ }, \ 'html.django_template': { \ 'extends': 'html', \ }, \ 'jade': { \ 'indentation': ' ', \ 'extends': 'html', \ 'snippets': { \ '!': "html:5", \ '!!!': "doctype html\n", \ '!!!4t': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"\n", \ '!!!4s': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"\n", \ '!!!xt': "doctype transitional\n", \ '!!!xs': "doctype strict\n", \ '!!!xxs': "doctype 1.1\n", \ 'c': "\/\/ |${child}", \ 'html:4t': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"\n" \ ."html(lang=\"${lang}\")\n" \ ."\thead\n" \ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n" \ ."\t\ttitle\n" \ ."\tbody\n\t\t${child}|", \ 'html:4s': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"\n" \ ."html(lang=\"${lang}\")\n" \ ."\thead\n" \ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n" \ ."\t\ttitle\n" \ ."\tbody\n\t\t${child}|", \ 'html:xt': "doctype transitional\n" \ ."html(xmlns=\"http://www.w3.org/1999/xhtml\", xml:lang=\"${lang}\")\n" \ ."\thead\n" \ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n" \ ."\t\ttitle\n" \ ."\tbody\n\t\t${child}|", \ 'html:xs': "doctype strict\n" \ ."html(xmlns=\"http://www.w3.org/1999/xhtml\", xml:lang=\"${lang}\")\n" \ ."\thead\n" \ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n" \ ."\t\ttitle\n" \ ."\tbody\n\t\t${child}|", \ 'html:xxs': "doctype 1.1\n" \ ."html(xmlns=\"http://www.w3.org/1999/xhtml\", xml:lang=\"${lang}\")\n" \ ."\thead\n" \ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n" \ ."\t\ttitle\n" \ ."\tbody\n\t\t${child}|", \ 'html:5': "doctype html\n" \ ."html(lang=\"${lang}\")\n" \ ."\thead\n" \ ."\t\tmeta(charset=\"${charset}\")\n" \ ."\t\ttitle\n" \ ."\tbody\n\t\t${child}|", \ }, \ }, \ 'pug': { \ 'extends': 'jade', \ }, \ 'xsl': { \ 'extends': 'html', \ 'default_attributes': { \ 'tmatch': [{'match': ''}, {'mode': ''}], \ 'tname': [{'name': ''}], \ 'xsl:when': {'test': ''}, \ 'var': [{'name': ''}, {'select': ''}], \ 'vari': {'name': ''}, \ 'if': {'test': ''}, \ 'call': {'name': ''}, \ 'attr': {'name': ''}, \ 'wp': [{'name': ''}, {'select': ''}], \ 'par': [{'name': ''}, {'select': ''}], \ 'val': {'select': ''}, \ 'co': {'select': ''}, \ 'each': {'select': ''}, \ 'ap': [{'select': ''}, {'mode': ''}] \ }, \ 'aliases': { \ 'tmatch': 'xsl:template', \ 'tname': 'xsl:template', \ 'var': 'xsl:variable', \ 'vari': 'xsl:variable', \ 'if': 'xsl:if', \ 'choose': 'xsl:choose', \ 'call': 'xsl:call-template', \ 'wp': 'xsl:with-param', \ 'par': 'xsl:param', \ 'val': 'xsl:value-of', \ 'attr': 'xsl:attribute', \ 'co' : 'xsl:copy-of', \ 'each' : 'xsl:for-each', \ 'ap' : 'xsl:apply-templates', \ }, \ 'expandos': { \ 'choose': 'xsl:choose>xsl:when+xsl:otherwise', \ } \ }, \ 'jsx': { \ 'extends': 'html', \ 'attribute_name': {'class': 'className', 'for': 'htmlFor'}, \ 'empty_element_suffix': ' />', \ }, \ 'javascriptreact': { \ 'extends': 'html', \ 'attribute_name': {'class': 'className', 'for': 'htmlFor'}, \ 'empty_element_suffix': ' />', \ }, \ 'tsx': { \ 'extends': 'jsx', \ }, \ 'typescriptreact': { \ 'extends': 'html', \ 'attribute_name': {'class': 'className', 'for': 'htmlFor'}, \ 'empty_element_suffix': ' />', \ }, \ 'xslt': { \ 'extends': 'xsl', \ }, \ 'haml': { \ 'indentation': ' ', \ 'extends': 'html', \ 'snippets': { \ 'html:5': "!!! 5\n" \ ."%html{:lang => \"${lang}\"}\n" \ ."\t%head\n" \ ."\t\t%meta{:charset => \"${charset}\"}\n" \ ."\t\t%title\n" \ ."\t%body\n" \ ."\t\t${child}|\n", \ }, \ 'attribute_style': 'hash', \ }, \ 'slim': { \ 'indentation': ' ', \ 'extends': 'html', \ 'snippets': { \ 'html:5': "doctype 5\n" \ ."html lang=\"${lang}\"\n" \ ."\thead\n" \ ."\t\tmeta charset=\"${charset}\"\n" \ ."\t\ttitle\n" \ ."\tbody\n" \ ."\t\t${child}|\n", \ }, \ 'ignore_embeded_filetype': 1, \ }, \ 'xhtml': { \ 'extends': 'html' \ }, \ 'mustache': { \ 'extends': 'html' \ }, \ 'xsd': { \ 'extends': 'html', \ 'snippets': { \ 'xsd:w3c': "\n" \ ."\n" \ ."\t\n" \ ."\n" \ } \ }, \} if exists('g:user_emmet_settings') call emmet#mergeConfig(s:emmet_settings, g:user_emmet_settings) endif let &cpoptions = s:save_cpo unlet s:save_cpo " vim:set et: