diff --git a/autoload/emmet.vim b/autoload/emmet.vim index 64992e9..7258c79 100644 --- a/autoload/emmet.vim +++ b/autoload/emmet.vim @@ -85,12 +85,7 @@ function! emmet#isExtends(type, extend) abort if !has_key(s:emmet_settings[a:type], 'extends') return 0 endif - let extends = s:emmet_settings[a:type].extends - if type(extends) ==# 1 - let tmp = split(extends, '\s*,\s*') - unlet! extends - let extends = tmp - endif + let extends = emmet#lang#getExtends(a:type) for ext in extends if a:extend ==# ext return 1 @@ -119,7 +114,7 @@ function! emmet#isExpandable() abort endif let part = matchstr(line, '\(\S.*\)$') let type = emmet#getFileType() - let ftype = emmet#lang#exists(type) ? type : 'html' + let rtype = emmet#lang#type(type) let part = emmet#lang#{ftype}#findTokens(part) return len(part) > 0 endfunction @@ -334,14 +329,14 @@ function! emmet#getResource(type, name, default) abort let ret = a:default if has_key(s:emmet_settings[type], 'extends') - let extends = s:emmet_settings[type].extends - if type(extends) ==# 1 - let tmp = split(extends, '\s*,\s*') - unlet! extends - let extends = tmp - endif + let extends = emmet#lang#getExtends(a:type) + call reverse(extends) " reverse to overwrite the correct way for ext in extends - if has_key(s:emmet_settings, ext) && has_key(s:emmet_settings[ext], a:name) + if !has_key(s:emmet_settings, ext) + continue + endif + + if has_key(s:emmet_settings[ext], a:name) if type(ret) ==# 3 || type(ret) ==# 4 call emmet#mergeConfig(ret, s:emmet_settings[ext][a:name]) else @@ -386,13 +381,19 @@ function! emmet#getFileType(...) abort let pos = emmet#util#getcurpos() let type = synIDattr(synID(pos[1], pos[2], 1), 'name') + + " ignore htmlTagName as it seems to occur too often + if type == 'htmlTagName' + let type = '' + endif + if type =~? '^css' let type = 'css' elseif type =~? '^html' let type = 'html' elseif type =~? '^jsx' let type = 'jsx' - elseif type =~? '^js\w' || type =~? '^javascript' + elseif (type =~? '^js\w' || type =~? '^javascript') && !(&filetype =~? 'jsx') let type = 'javascript' elseif type =~? '^tsx' let type = 'tsx' @@ -403,7 +404,7 @@ function! emmet#getFileType(...) abort else let types = split(&filetype, '\.') for part in types - if emmet#lang#exists(part) + if has_key(s:emmet_settings, part) let type = part break endif @@ -515,7 +516,7 @@ function! emmet#unescapeDollarExpr(expand) abort endfunction function! emmet#expandAbbr(mode, abbr) range abort - let type = emmet#lang#type(emmet#getFileType(1)) + let type = emmet#getFileType(1) let indent = emmet#getIndentation(type) let expand = '' let line = '' @@ -652,8 +653,8 @@ function! emmet#expandAbbr(mode, abbr) range abort let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$') else let part = matchstr(line, '\(\S.*\)$') - let ftype = emmet#lang#exists(type) ? type : 'html' - let part = emmet#lang#{ftype}#findTokens(part) + 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('$') diff --git a/autoload/emmet/lang.vim b/autoload/emmet/lang.vim index 0bc416f..37e426b 100644 --- a/autoload/emmet/lang.vim +++ b/autoload/emmet/lang.vim @@ -28,3 +28,25 @@ function! emmet#lang#type(type) abort endwhile return 'html' endfunction + +" get all extends for a type recursively +function! emmet#lang#getExtends(type) abort + let settings = emmet#getSettings() + + if !has_key(settings[a:type], 'extends') + return [] + endif + + let extends = settings[a:type].extends + if type(extends) ==# 1 + let tmp = split(extends, '\s*,\s*') + unlet! extends + let extends = tmp + endif + + for ext in extends + let extends = extends + emmet#lang#getExtends(ext) + endfor + + return extends +endfunction diff --git a/unittest.vim b/unittest.vim index 85f3772..541de77 100644 --- a/unittest.vim +++ b/unittest.vim @@ -1060,5 +1060,67 @@ finish }, ], 'dummy': "}}}"}, +{ 'test-jade': "{{{", + 'type': 'jade', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "!!!$$$$\\,$$$$", + 'result': "doctype html\n\n", + }, + { + 'query': "span.my-span$$$$\\,$$$$", + 'result': "span.my-span", + }, + ], + }, + ], + 'dummy': "}}}"}, +{ 'test-pug': "{{{", + 'type': 'pug', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "!!!$$$$\\,$$$$", + 'result': "doctype html\n\n", + }, + { + 'query': "span.my-span$$$$\\,$$$$", + 'result': "span.my-span", + }, + { + 'query': "input$$$$\\,text$$$$", + 'result': "input(type=\"text\")", + }, + ], + }, + ], + 'dummy': "}}}"}, +{ 'test-jsx': "{{{", + 'type': 'javascript.jsx', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "img$$$$\\,$$$$", + 'result': "\"\"", + }, + { + 'query': "span.my-span$$$$\\,$$$$", + 'result': "", + }, + { + 'query': "function() { return span.my-span$$$$\\,$$$$; }", + 'result': "function() { return ; }", + }, + ], + }, + ], + 'dummy': "}}}"}, ] " vim:set et fdm=marker: