mirror of
https://github.com/mattn/emmet-vim.git
synced 2025-12-07 19:24:27 +08:00
get extends recursively, minor additional fixes for pug and jsx
This commit is contained in:
@@ -85,12 +85,7 @@ function! emmet#isExtends(type, extend) abort
|
|||||||
if !has_key(s:emmet_settings[a:type], 'extends')
|
if !has_key(s:emmet_settings[a:type], 'extends')
|
||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
let extends = s:emmet_settings[a:type].extends
|
let extends = emmet#lang#getExtends(a:type)
|
||||||
if type(extends) ==# 1
|
|
||||||
let tmp = split(extends, '\s*,\s*')
|
|
||||||
unlet! extends
|
|
||||||
let extends = tmp
|
|
||||||
endif
|
|
||||||
for ext in extends
|
for ext in extends
|
||||||
if a:extend ==# ext
|
if a:extend ==# ext
|
||||||
return 1
|
return 1
|
||||||
@@ -119,7 +114,7 @@ function! emmet#isExpandable() abort
|
|||||||
endif
|
endif
|
||||||
let part = matchstr(line, '\(\S.*\)$')
|
let part = matchstr(line, '\(\S.*\)$')
|
||||||
let type = emmet#getFileType()
|
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)
|
let part = emmet#lang#{ftype}#findTokens(part)
|
||||||
return len(part) > 0
|
return len(part) > 0
|
||||||
endfunction
|
endfunction
|
||||||
@@ -334,14 +329,14 @@ function! emmet#getResource(type, name, default) abort
|
|||||||
let ret = a:default
|
let ret = a:default
|
||||||
|
|
||||||
if has_key(s:emmet_settings[type], 'extends')
|
if has_key(s:emmet_settings[type], 'extends')
|
||||||
let extends = s:emmet_settings[type].extends
|
let extends = emmet#lang#getExtends(a:type)
|
||||||
if type(extends) ==# 1
|
call reverse(extends) " reverse to overwrite the correct way
|
||||||
let tmp = split(extends, '\s*,\s*')
|
|
||||||
unlet! extends
|
|
||||||
let extends = tmp
|
|
||||||
endif
|
|
||||||
for ext in extends
|
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
|
if type(ret) ==# 3 || type(ret) ==# 4
|
||||||
call emmet#mergeConfig(ret, s:emmet_settings[ext][a:name])
|
call emmet#mergeConfig(ret, s:emmet_settings[ext][a:name])
|
||||||
else
|
else
|
||||||
@@ -386,13 +381,19 @@ function! emmet#getFileType(...) abort
|
|||||||
|
|
||||||
let pos = emmet#util#getcurpos()
|
let pos = emmet#util#getcurpos()
|
||||||
let type = synIDattr(synID(pos[1], pos[2], 1), 'name')
|
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'
|
if type =~? '^css'
|
||||||
let type = 'css'
|
let type = 'css'
|
||||||
elseif type =~? '^html'
|
elseif type =~? '^html'
|
||||||
let type = 'html'
|
let type = 'html'
|
||||||
elseif type =~? '^jsx'
|
elseif type =~? '^jsx'
|
||||||
let type = 'jsx'
|
let type = 'jsx'
|
||||||
elseif type =~? '^js\w' || type =~? '^javascript'
|
elseif (type =~? '^js\w' || type =~? '^javascript') && !(&filetype =~? 'jsx')
|
||||||
let type = 'javascript'
|
let type = 'javascript'
|
||||||
elseif type =~? '^tsx'
|
elseif type =~? '^tsx'
|
||||||
let type = 'tsx'
|
let type = 'tsx'
|
||||||
@@ -403,7 +404,7 @@ function! emmet#getFileType(...) abort
|
|||||||
else
|
else
|
||||||
let types = split(&filetype, '\.')
|
let types = split(&filetype, '\.')
|
||||||
for part in types
|
for part in types
|
||||||
if emmet#lang#exists(part)
|
if has_key(s:emmet_settings, part)
|
||||||
let type = part
|
let type = part
|
||||||
break
|
break
|
||||||
endif
|
endif
|
||||||
@@ -515,7 +516,7 @@ function! emmet#unescapeDollarExpr(expand) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! emmet#expandAbbr(mode, abbr) range abort
|
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 indent = emmet#getIndentation(type)
|
||||||
let expand = ''
|
let expand = ''
|
||||||
let line = ''
|
let line = ''
|
||||||
@@ -652,8 +653,8 @@ function! emmet#expandAbbr(mode, abbr) range abort
|
|||||||
let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$')
|
let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$')
|
||||||
else
|
else
|
||||||
let part = matchstr(line, '\(\S.*\)$')
|
let part = matchstr(line, '\(\S.*\)$')
|
||||||
let ftype = emmet#lang#exists(type) ? type : 'html'
|
let rtype = emmet#lang#type(type)
|
||||||
let part = emmet#lang#{ftype}#findTokens(part)
|
let part = emmet#lang#{rtype}#findTokens(part)
|
||||||
let line = line[0: strridx(line, part) + len(part) - 1]
|
let line = line[0: strridx(line, part) + len(part) - 1]
|
||||||
endif
|
endif
|
||||||
if col('.') ==# col('$')
|
if col('.') ==# col('$')
|
||||||
|
|||||||
@@ -28,3 +28,25 @@ function! emmet#lang#type(type) abort
|
|||||||
endwhile
|
endwhile
|
||||||
return 'html'
|
return 'html'
|
||||||
endfunction
|
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
|
||||||
|
|||||||
62
unittest.vim
62
unittest.vim
@@ -1060,5 +1060,67 @@ finish
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
'dummy': "}}}"},
|
'dummy': "}}}"},
|
||||||
|
{ 'test-jade': "{{{",
|
||||||
|
'type': 'jade',
|
||||||
|
'categories': [
|
||||||
|
{
|
||||||
|
'name': 'expand abbreviation',
|
||||||
|
'tests': [
|
||||||
|
{
|
||||||
|
'query': "!!!$$$$\\<c-y>,$$$$",
|
||||||
|
'result': "doctype html\n\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'query': "span.my-span$$$$\\<c-y>,$$$$",
|
||||||
|
'result': "span.my-span",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'dummy': "}}}"},
|
||||||
|
{ 'test-pug': "{{{",
|
||||||
|
'type': 'pug',
|
||||||
|
'categories': [
|
||||||
|
{
|
||||||
|
'name': 'expand abbreviation',
|
||||||
|
'tests': [
|
||||||
|
{
|
||||||
|
'query': "!!!$$$$\\<c-y>,$$$$",
|
||||||
|
'result': "doctype html\n\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'query': "span.my-span$$$$\\<c-y>,$$$$",
|
||||||
|
'result': "span.my-span",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'query': "input$$$$\\<c-y>,text$$$$",
|
||||||
|
'result': "input(type=\"text\")",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'dummy': "}}}"},
|
||||||
|
{ 'test-jsx': "{{{",
|
||||||
|
'type': 'javascript.jsx',
|
||||||
|
'categories': [
|
||||||
|
{
|
||||||
|
'name': 'expand abbreviation',
|
||||||
|
'tests': [
|
||||||
|
{
|
||||||
|
'query': "img$$$$\\<c-y>,$$$$",
|
||||||
|
'result': "<img src=\"\" alt=\"\" />",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'query': "span.my-span$$$$\\<c-y>,$$$$",
|
||||||
|
'result': "<span className=\"my-span\"></span>",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'query': "function() { return span.my-span$$$$\\<c-y>,$$$$; }",
|
||||||
|
'result': "function() { return <span className=\"my-span\"></span>; }",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'dummy': "}}}"},
|
||||||
]
|
]
|
||||||
" vim:set et fdm=marker:
|
" vim:set et fdm=marker:
|
||||||
|
|||||||
Reference in New Issue
Block a user