62 Commits

Author SHA1 Message Date
Yasuhiro Matsumoto
5fe726da47 fix abbreviation 2015-11-11 19:44:25 +09:00
Yasuhiro Matsumoto
451367a2ce add doc for emmet-update-tag
Close #285
2015-11-10 10:34:50 +09:00
Yasuhiro Matsumoto
f752a4250c add doc for emmet-expand-word 2015-11-10 10:25:11 +09:00
Yasuhiro Matsumoto
1672e5664c should behave on only html 2015-11-10 09:43:25 +09:00
Yasuhiro Matsumoto
5819343b88 oops. fixed bug 2015-11-10 09:41:17 +09:00
Yasuhiro Matsumoto
913dfe686d remove debug message 2015-11-10 09:39:13 +09:00
Yasuhiro Matsumoto
603d6e4fcd fix bug 2015-11-10 09:38:27 +09:00
Yasuhiro Matsumoto
136b87a330 expand snippets for filetypes like html.handlebars
Close #298
2015-11-10 09:36:15 +09:00
Yasuhiro Matsumoto
5eb1061a3d redirect expanding.
Close #237
2015-11-10 09:13:48 +09:00
Yasuhiro Matsumoto
4110fb0f7b ignore django template 2015-10-26 09:44:07 +09:00
Yasuhiro Matsumoto
1691ccc7e8 fix default_attributes 2015-10-20 10:49:55 +09:00
Yasuhiro Matsumoto
0bd0a38a29 fix merge configuration 2015-10-20 10:12:03 +09:00
Yasuhiro Matsumoto
13b842d9c4 default_attributes should be array of dictionary 2015-10-20 09:29:34 +09:00
Yasuhiro Matsumoto
fceb37243a appending array configuration into map
Close #301
2015-10-20 09:04:11 +09:00
Yasuhiro Matsumoto
abdf10e91c allow empty configuration 2015-10-02 19:01:19 +09:00
Yasuhiro Matsumoto
333fede99b fix #296 2015-09-29 14:51:44 +09:00
Yasuhiro Matsumoto
037c7e5720 add test for bem filter 2015-09-25 09:26:43 +09:00
Yasuhiro Matsumoto
5041c20aae don't use getchar(0). unittest.vim stop the test-sequence. 2015-09-25 09:19:16 +09:00
Yasuhiro Matsumoto
77747c762a fix bem filter. close #295 2015-09-25 09:18:47 +09:00
Yasuhiro Matsumoto
4933347202 fix #292 2015-08-31 14:24:14 +09:00
Yasuhiro Matsumoto
1c240c6d6d extendible configuration with '*' 2015-08-20 00:20:53 +09:00
Yasuhiro Matsumoto
2c429485ec fix #290. use getpos('.') instead 2015-08-18 21:57:16 +09:00
Yasuhiro Matsumoto
7a9412d3da fix #289. don't remove ${cursor} in attributes 2015-08-18 10:50:09 +09:00
Yasuhiro Matsumoto
6e1175326e Merge branch 'master' of https://github.com/mattn/emmet-vim 2015-08-17 20:33:14 +09:00
Yasuhiro Matsumoto
8a8f46bc17 should be g: 2015-08-17 20:32:16 +09:00
Yasuhiro Matsumoto
6d572e21e4 fix #287. set nogdefault 2015-08-17 20:22:52 +09:00
mattn
cee9e9d6c8 Merge pull request #286 from xnuk/master
Jade: add snippets
2015-08-17 09:34:40 +09:00
즈눅
0617f58dd6 Jade: add snippets 2015-08-15 05:34:52 +09:00
mattn
57a5263d1d update vimup file 2015-07-26 21:42:30 +09:00
mattn
e82844db78 bump up version 2015-07-26 21:42:01 +09:00
mattn
5dda53c1ec find resource for each of filetype which is separated with dot. fix #265 2015-07-26 21:36:29 +09:00
mattn
e2c2f48716 Merge branch 'master' of github.com:mattn/emmet-vim 2015-07-25 10:51:57 +09:00
mattn
f36d6f4025 exapnd $# of attribute in block element. close #282 2015-07-25 10:49:40 +09:00
mattn
a210cc0c5e Merge pull request #281 from josuecau/fix-jade
Jade: remove extra "/" after empty elements expansion
2015-07-16 09:43:02 +09:00
Josué Cau
7e3af15e4e Jade: remove extra "/" after empty elements expansion
For instance, `img` should be expanded to `img(src="", alt="")` rather than `img(src="", alt="")/`
2015-07-15 11:06:53 +02:00
mattn
c523cfd5e2 Merge pull request #280 from Bubujka/master
Added jade support (based on haml.vim)
2015-07-13 12:05:43 +09:00
Aleksej Kamynin
8289c323e0 Added jade support (based on haml.vim) 2015-07-11 12:36:52 +03:00
Yasuhiro Matsumoto
30f8568935 fix #276 2015-06-26 12:48:22 +09:00
Yasuhiro Matsumoto
cda7349b65 text content should be repeated with multiplier 2015-06-23 13:57:08 +09:00
mattn
610c2ea673 Merge pull request #267 from syohex/fix-typo
fix typo
2015-05-12 16:12:37 +09:00
Syohei YOSHIDA
87e50225c1 fix typo 2015-05-12 12:54:05 +09:00
Yasuhiro Matsumoto
1c46c5fb77 Add g:emmet_install_only_plug to install only <plug> mappings 2015-03-18 17:28:50 +09:00
Yasuhiro Matsumoto
03bb2b26fe Add some units behavior of css. Close #264 2015-03-18 11:28:39 +09:00
mattn
af10f14ae5 Merge pull request #261 from Cade-Forester/patch-1
Improve and extend documentation
2015-03-03 08:52:57 +09:00
Cade-Forester
1ddd5f2270 Improve and extend documentation 2015-03-02 18:55:58 +05:00
mattn
25d321c66f Support Vim 7.2 2015-02-27 01:39:55 +09:00
mattn
fd0c0db219 Merge pull request #258 from Cade-Forester/patch-1
Fix: don't ignore g:user_emmet_complete_tag
2015-02-27 00:53:58 +09:00
Cade-Forester
ab5d0f026c Fix: don't ignore g:user_emmet_complete_tag
"plugin/*.vim" files sourced at vim startup.
At vim startup no buffers exists,
so ":setlocal" command do nothing.
Move ":setlocal" command to  s:install_plugin() function.
2015-02-26 18:31:08 +05:00
mattn
b5a94de150 Merge pull request #256 from Cade-Forester/patch-1
Allow using ":EmmetInstall | OtherCommand"
2015-02-26 03:42:53 +09:00
Cade-Forester
971a13ca98 Allow using ":EmmetInstall | OtherCommand"
Example of usage:

autocmd FileType html EmmetInstall | setlocal omnifunc=emmet#completeTag
2015-02-25 23:33:09 +05:00
mattn
3d6862d5d1 Support jsx's className. Close #255 2015-02-21 21:06:33 +09:00
mattn
c24f2dcfcb Merge pull request #254 from shigo141/fix-doc
Update doc
2015-02-12 01:12:12 +09:00
shigo141
a7e876d5b5 Update doc 2015-02-12 00:51:16 +09:00
mattn
c6e11d22dc Merge pull request #252 from jwhitley/john/fix-indentation
Do not hardcode a default indentation setting
2015-01-29 09:13:50 +09:00
John Whitley
862abb3895 Do not hardcode a default indentation
Change 2a8f0e094d hardcoded a value for
s:emmet_settings.variables.indentation, which incorrectly overrides the
logic in emmet#getIndentation that respects a user's indentation
settings in the absence of an explicit emmet indentation config setting.
2015-01-28 12:31:44 -08:00
mattn
e1f2f00a5c Merge pull request #251 from dencold/master
Enhance link:import to be in line with emmet.io
2015-01-28 09:05:04 +09:00
Dennis Coldwell
d4647629b2 enhancing link:import abbreviation
- matching implementation to emmet.io reference
- https://github.com/emmetio/emmet/blob/master/lib/snippets.json#L670
2015-01-27 10:09:30 -08:00
mattn
8b9bcac7a0 Add some workaround for #248 2015-01-08 14:23:34 +09:00
mattn
a9b29f786e Fixes #249 2015-01-08 14:05:37 +09:00
mattn
fcf44c5f6d user_emmet_settings.indentation should be checked at the first 2014-12-21 23:56:59 +09:00
mattn
4cc293d464 Merge pull request #244 from RobAWilkinson/master
Spelling error, changed "toogle" to "toggle"
2014-12-18 09:34:33 +09:00
Robert Wilkinson
7be2d5b977 Spelling error, changed "toogle" to "toggle" 2014-12-17 16:01:11 -08:00
10 changed files with 2201 additions and 433 deletions

View File

@@ -1,7 +1,7 @@
"=============================================================================
" emmet.vim
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
" Last Change: 17-Dec-2014.
" Last Change: 26-Jul-2015.
let s:save_cpo = &cpoptions
set cpoptions&vim
@@ -44,10 +44,10 @@ function! emmet#getIndentation(...) abort
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.variables, 'indentation')
let indent = s:emmet_settings.variables.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 indent = (&l:expandtab || &l:tabstop !=# &l:shiftwidth) ? repeat(' ', &l:shiftwidth) : "\t"
endif
@@ -108,7 +108,7 @@ endfunction
function! emmet#expandAbbrIntelligent(feedkey) abort
if !emmet#isExpandable()
return a:feedkey
endif
endif
return "\<plug>(emmet-expand-abbr)"
endfunction
@@ -126,31 +126,52 @@ endfunction
function! emmet#mergeConfig(lhs, rhs) abort
let [lhs, rhs] = [a:lhs, a:rhs]
if type(lhs) ==# 3 && type(rhs) ==# 3
let lhs += rhs
if len(lhs)
call remove(lhs, 0, len(lhs)-1)
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
for rhi in rhs
call add(lhs, rhs[rhi])
endfor
elseif type(lhs) ==# 4 && type(rhs) ==# 4
for key in keys(rhs)
if type(rhs[key]) ==# 3
if !has_key(lhs, key)
let lhs[key] = []
elseif type(lhs) ==# 4
if type(rhs) ==# 3
for V in rhs
if type(V) != 4
continue
endif
let lhs[key] += rhs[key]
elseif type(rhs[key]) ==# 4
if has_key(lhs, key)
call emmet#mergeConfig(lhs[key], rhs[key])
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
else
let lhs[key] = rhs[key]
endif
endfor
endfor
endif
endif
endfunction
@@ -237,7 +258,11 @@ function! emmet#toString(...) abort
let snippet_node = emmet#newNode()
let snippet_node.value = '{'.tmp.'}'
let snippet_node.important = current.important
let str = emmet#lang#{rtype}#toString(s:emmet_settings, snippet_node, type, inline, filters, s:itemno(group_itemno, current), indent)
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
@@ -265,6 +290,7 @@ function! emmet#toString(...) abort
else
let inner = current.value[1:-2]
endif
let inner = substitute(inner, '\${child}', '', '')
let inner = substitute(inner, "\n", "\n" . indent, 'g')
let str = substitute(str, '\${child}', inner, '')
endif
@@ -286,44 +312,74 @@ function! emmet#getResource(type, name, default) abort
if exists('b:emmet_' . a:name)
return get(b:, 'emmet_' . a:name)
endif
if !has_key(s:emmet_settings, a:type)
return a:default
let global = {}
if has_key(s:emmet_settings, '*') && has_key(s:emmet_settings['*'], a:name)
let global = extend(global, s:emmet_settings['*'][a:name])
endif
let ret = a:default
if has_key(s:emmet_settings[a:type], 'extends')
let extends = s:emmet_settings[a:type].extends
if type(extends) ==# 1
let tmp = split(extends, '\s*,\s*')
unlet! extends
let extends = tmp
if has_key(s:emmet_settings, a:type)
let types = [a:type]
else
let types = split(a:type, '\.')
endif
for type in types
if !has_key(s:emmet_settings, type)
continue
endif
for ext in extends
if has_key(s:emmet_settings, ext) && 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
let ret = s:emmet_settings[ext][a:name]
endif
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
endfor
endif
if has_key(s:emmet_settings[a:type], a:name)
if type(ret) ==# 3 || type(ret) ==# 4
call emmet#mergeConfig(ret, s:emmet_settings[a:type][a:name])
else
let ret = s:emmet_settings[a:type][a:name]
for ext in extends
if has_key(s:emmet_settings, ext) && 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
let ret = s:emmet_settings[ext][a:name]
endif
endif
endfor
endif
endif
if has_key(s:emmet_settings[type], a:name)
if type(ret) ==# 3 || type(ret) ==# 4
call emmet#mergeConfig(ret, s:emmet_settings[type][a:name])
return extend(global, ret)
else
return s:emmet_settings[type][a:name]
endif
endif
if !empty(ret)
if type(ret) ==# 3 || type(ret) ==# 4
let ret = extend(global, ret)
endif
return ret
endif
endfor
let ret = a:default
if type(ret) ==# 3 || type(ret) ==# 4
let ret = extend(global, ret)
endif
return ret
endfunction
function! emmet#getFileType(...) abort
let flg = get(a:000, 0, 0)
let type = ''
for part in split(&filetype, '\.')
if has_key(s:emmet_settings, &filetype)
let types = [&filetype]
else
let types = split(&filetype, '\.')
endif
for part in types
if emmet#lang#exists(part)
let type = part
break
@@ -475,7 +531,7 @@ function! emmet#expandAbbr(mode, abbr) range abort
endif
if leader =~# '\*'
let query = substitute(leader, '*', '*' . (a:lastline - a:firstline + 1), '')
if query !~# '}\s*$'
if query !~# '}\s*$' && query !~# '\$#'
let query .= '>{$#}'
endif
if emmet#useFilter(filters, '/')
@@ -486,8 +542,12 @@ function! emmet#expandAbbr(mode, abbr) range abort
let spl = ''
endif
let items = emmet#parseIntoTree(query, type).child
let itemno = 0
for item in items
let expand .= emmet#toString(item, rtype, 0, filters, 0, indent)
let inner = emmet#toString(item, rtype, 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, '&', '\&amp;', 'g')
@@ -622,9 +682,9 @@ function! emmet#expandAbbr(mode, abbr) range abort
let expand = emmet#unescapeDollarExpr(expand)
if a:mode ==# 2 && visualmode() ==# 'v'
if a:firstline ==# a:lastline
let expand = substitute(expand, '\n\s*', '', 'g')
let expand = substitute(expand, '[\r\n]\s*', '', 'g')
else
let expand = substitute(expand, '\n$', '', 'g')
let expand = substitute(expand, '[\n]$', '', 'g')
endif
silent! normal! gv
let col = col('''<')
@@ -644,14 +704,14 @@ function! emmet#expandAbbr(mode, abbr) range abort
else
let indent = ''
endif
let expand = substitute(expand, '\n\s*$', '', 'g')
let expand = substitute(expand, '[\r\n]\s*$', '', 'g')
if emmet#useFilter(filters, 's')
let epart = substitute(expand, "\n\s\*", '', 'g')
let epart = substitute(expand, '[\r\n]\s*', '', 'g')
else
let epart = substitute(expand, "\n", "\n" . indent, 'g')
let epart = substitute(expand, '[\r\n]', "\n" . indent, 'g')
endif
let expand = line[:-len(part)-1] . epart . rest
let lines = split(expand, "\n", 1)
let lines = split(expand, '[\r\n]', 1)
if a:mode ==# 2
silent! exe 'normal! gvc'
endif
@@ -664,7 +724,7 @@ function! emmet#expandAbbr(mode, abbr) range abort
if g:emmet_debug > 1
call getchar()
endif
if search('\ze\$\(cursor\|select\)\$')
if search('\ze\$\(cursor\|select\)\$', 'c')
let oldselection = &selection
let &selection = 'inclusive'
if foldclosed(line('.')) !=# -1
@@ -672,20 +732,26 @@ function! emmet#expandAbbr(mode, abbr) range abort
endif
let pos = emmet#util#getcurpos()
let use_selection = emmet#getResource(type, 'use_selection', 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 "\<esc>gv"
else
silent! %s/\$\(cursor\|select\)\$//g
silent! call setpos('.', pos)
if col('.') < col('$')
return "\<right>"
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 "\<esc>gv"
else
silent! %s/\$\(cursor\|select\)\$//g
silent! call setpos('.', pos)
if col('.') < col('$')
return "\<right>"
endif
endif
endif
finally
let &gdefault = l:gdefault
endtry
let &selection = oldselection
endif
return ''
@@ -929,7 +995,6 @@ let s:emmet_settings = {
\ 'lang': "en",
\ 'locale': "en-US",
\ 'charset': "UTF-8",
\ 'indentation': "\t",
\ 'newline': "\n",
\ 'use_selection': 0,
\ },
@@ -1562,8 +1627,7 @@ let s:emmet_settings = {
\ 'extends': 'css',
\ },
\ 'html': {
\ 'snippets': {
\ '!': "html:5",
\ 'abbreviations': {
\ '!!!': "<!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",
@@ -1574,70 +1638,34 @@ let s:emmet_settings = {
\ 'cc:ie6': "<!--[if lte IE 6]>\n\t${child}|\n<![endif]-->",
\ 'cc:ie': "<!--[if IE]>\n\t${child}|\n<![endif]-->",
\ 'cc:noie': "<!--[if !IE]><!-->\n\t${child}|\n<!--<![endif]-->",
\ '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"
\ ."<head>\n"
\ ."\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\">\n"
\ ."\t<title></title>\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ 'html:4s': "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n"
\ ."<html lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\">\n"
\ ."\t<title></title>\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ 'html:xt': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
\ ."<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\" />\n"
\ ."\t<title></title>\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ 'html:xs': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
\ ."<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\" />\n"
\ ."\t<title></title>\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ 'html:xxs': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n"
\ ."<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\" />\n"
\ ."\t<title></title>\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ 'html:5': "<!DOCTYPE html>\n"
\ ."<html lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta charset=\"${charset}\">\n"
\ ."\t<title></title>\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ },
\ 'snippets': {
\ '!': "html:5",
\ 'doc': "html>(head>meta[charset=${charset}]+title{${1:Document}})+body>${child}",
\ 'doc4': "html>(head>meta[http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\"]+title{${1:Document}})+body>${child}",
\ 'html:4t': "!!!4t+doc4[lang=${lang}]",
\ 'html:4s': "!!!4s+doc4[lang=${lang}]",
\ 'html:xt': "!!!xt+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]",
\ 'html:xs': "!!!xs+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]",
\ 'html:xxs': "!!!xxs+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]",
\ 'html:5': "!!!+doc[lang=${lang}]",
\ },
\ 'default_attributes': {
\ 'a': {'href': ''},
\ 'a:link': {'href': 'http://|'},
\ 'a:mail': {'href': 'mailto:|'},
\ 'abbr': {'title': ''},
\ 'acronym': {'title': ''},
\ 'base': {'href': ''},
\ 'bdo': {'dir': ''},
\ 'bdo:r': {'dir': 'rtl'},
\ 'bdo:l': {'dir': 'ltr'},
\ 'del': {'datetime': '${datetime}'},
\ 'ins': {'datetime': '${datetime}'},
\ 'a': [{'href': ''}],
\ 'a:link': [{'href': 'http://|'}],
\ 'a:mail': [{'href': 'mailto:|'}],
\ 'abbr': [{'title': ''}],
\ 'acronym': [{'title': ''}],
\ 'base': [{'href': ''}],
\ 'bdo': [{'dir': ''}],
\ 'bdo:r': [{'dir': 'rtl'}],
\ 'bdo:l': [{'dir': 'ltr'}],
\ 'del': [{'datetime': '${datetime}'}],
\ 'ins': [{'datetime': '${datetime}'}],
\ 'link:css': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|style.css'}, {'media': 'all'}],
\ 'link:print': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|print.css'}, {'media': 'print'}],
\ 'link:import': [{'rel': 'import'}, {'href': ''}],
\ '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'}],
@@ -1646,9 +1674,9 @@ let s:emmet_settings = {
\ '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'}],
\ 'style': g:emmet_html5 ? {} : {'type': 'text/css'},
\ 'script': g:emmet_html5 ? {} : {'type': 'text/javascript'},
\ 'script:src': g:emmet_html5 ? {'src': ''} : [{'type': 'text/javascript'}, {'src': ''}],
\ 'style': g:emmet_html5 ? [] : [{'type': 'text/css'}],
\ 'script': [{'src': ''}] + (g:emmet_html5 ? [] : [{'type': 'text/javascript'}]),
\ 'script:src': [{'src': ''}] + (g:emmet_html5 ? [] : [{'type': 'text/javascript'}, {'src': ''}]),
\ 'img': [{'src': ''}, {'alt': ''}],
\ 'iframe': [{'src': ''}, {'frameborder': '0'}],
\ 'embed': [{'src': ''}, {'type': ''}],
@@ -1661,12 +1689,12 @@ let s:emmet_settings = {
\ 'area:r': [{'shape': 'rect'}, {'coords': ''}, {'href': ''}, {'alt': ''}],
\ 'area:p': [{'shape': 'poly'}, {'coords': ''}, {'href': ''}, {'alt': ''}],
\ 'link': [{'rel': 'stylesheet'}, {'href': ''}],
\ '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': ''},
\ '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': ''}],
@@ -1699,14 +1727,14 @@ let s:emmet_settings = {
\ 'input:button': [{'type': 'button'}, {'value': ''}],
\ 'input:b': [{'type': 'button'}, {'value': ''}],
\ 'select': [{'name': ''}, {'id': ''}],
\ 'option': {'value': ''},
\ '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': ''},
\ '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': {
@@ -1769,6 +1797,7 @@ let s:emmet_settings = {
\ '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,select,small,span,strike,strong,sub,sup,textarea,tt,u,var',
\ 'empty_element_suffix': g:emmet_html5 ? '>' : ' />',
\ 'indent_blockelement': 0,
\ },
\ 'htmldjango': {
\ 'extends': 'html',
@@ -1776,6 +1805,10 @@ let s:emmet_settings = {
\ 'html.django_template': {
\ 'extends': 'html',
\ },
\ 'jade': {
\ 'indentation': ' ',
\ 'extends': 'html',
\ },
\ 'xsl': {
\ 'extends': 'html',
\ 'default_attributes': {
@@ -1794,6 +1827,47 @@ let s:emmet_settings = {
\ 'each': {'select': ''},
\ 'ap': [{'select': ''}, {'mode': ''}]
\ },
\ "abbreviations": {
\ 'tm|tmatch': "<xsl:template match=\"\" mode=\"\">",
\ 'tn|tname': "<xsl:template name=\"\">",
\ 'call': "<xsl:call-template name=\"\"/>",
\ 'ap': "<xsl:apply-templates select=\"\" mode=\"\"/>",
\ 'api': "<xsl:apply-imports/>",
\ 'imp': "<xsl:import href=\"\"/>",
\ 'inc': "<xsl:include href=\"\"/>",
\ 'ch': "<xsl:choose>",
\ 'wh|xsl:when': "<xsl:when test=\"\">",
\ 'ot': "<xsl:otherwise>",
\ 'if': "<xsl:if test=\"\">",
\ 'par': "<xsl:param name=\"\">",
\ 'pare': "<xsl:param name=\"\" select=\"\"/>",
\ 'var': "<xsl:variable name=\"\">",
\ 'vare': "<xsl:variable name=\"\" select=\"\"/>",
\ 'wp': "<xsl:with-param name=\"\" select=\"\"/>",
\ 'key': "<xsl:key name=\"\" match=\"\" use=\"\"/>",
\ 'elem': "<xsl:element name=\"\">",
\ 'attr': "<xsl:attribute name=\"\">",
\ 'attrs': "<xsl:attribute-set name=\"\">",
\ 'cp': "<xsl:copy select=\"\"/>",
\ 'co': "<xsl:copy-of select=\"\"/>",
\ 'val': "<xsl:value-of select=\"\"/>",
\ 'for|each': "<xsl:for-each select=\"\">",
\ 'tex': "<xsl:text></xsl:text>",
\ 'com': "<xsl:comment>",
\ 'msg': "<xsl:message terminate=\"no\">",
\ 'fall': "<xsl:fallback>",
\ 'num': "<xsl:number value=\"\"/>",
\ 'nam': "<namespace-alias stylesheet-prefix=\"\" result-prefix=\"\"/>",
\ 'pres': "<xsl:preserve-space elements=\"\"/>",
\ 'strip': "<xsl:strip-space elements=\"\"/>",
\ 'proc': "<xsl:processing-instruction name=\"\">",
\ 'sort': "<xsl:sort select=\"\" order=\"\"/>",
\ 'choose+': "xsl:choose>xsl:when+xsl:otherwise",
\ 'xsl': "!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\n|}"
\ },
\ "snippets": {
\ "!!!": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
\ },
\ 'aliases': {
\ 'tmatch': 'xsl:template',
\ 'tname': 'xsl:template',
@@ -1814,34 +1888,25 @@ let s:emmet_settings = {
\ 'choose': 'xsl:choose>xsl:when+xsl:otherwise',
\ }
\ },
\ 'jsx': {
\ 'extends': 'html',
\ 'attribute_name': {'class': 'className'},
\ },
\ '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",
\ 'abbreviations': {
\ '!!!': "!!! 5",
\ },
\ '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",
\ 'abbreviations': {
\ },
\ },
\ 'xhtml': {
@@ -1858,7 +1923,7 @@ let s:emmet_settings = {
\ ."\t<xsd:element name=\"\" type=\"\"/>\n"
\ ."</xsd:schema>\n"
\ }
\ }
\ },
\}
if exists('g:user_emmet_settings')

View File

@@ -1,4 +1,9 @@
function! emmet#lang#css#findTokens(str) abort
let tmp = substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '')
if tmp =~ '/' && tmp =~ '^[a-zA-Z0-9/_.]\+$'
" maybe path or something
return ''
endif
return substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '')
endfunction
@@ -20,13 +25,13 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
let block = emmet#util#searchRegion('{', '}')
if abbr !~# '^@' && emmet#getBaseType(type) ==# 'css' && type !=# 'sass' && block[0] ==# [0,0] && block[1] ==# [0,0]
let current = emmet#newNode()
let current.snippet = abbr . " {\n" . indent . "${cursor}\n}"
let current.snippet = substitute(abbr, '\s\+$', '', '') . " {\n" . indent . "${cursor}\n}"
let current.name = ''
call add(root.child, deepcopy(current))
else
for n in range(len(tokens))
let token = tokens[n]
let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+[pe]\{0,1}-\{0,1}\|-auto\)*\)$')
let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|re\|rem\|%\)\{0,1}-\{0,1}\|-auto\)*\)$')
if len(prop)
let token = substitute(prop[1], '^(\(.*\))', '\1', '')
if token =~# '^-'
@@ -43,8 +48,16 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
let value .= substitute(v, '[^0-9.]*$', '', '')
elseif v =~# 'p$'
let value .= substitute(v, 'p$', '%', '')
elseif v =~# '%$'
let value .= v
elseif v =~# 'e$'
let value .= substitute(v, 'e$', 'em', '')
elseif v =~# 'em$'
let value .= v
elseif v =~# 're$'
let value .= substitute(v, 're$', 'rem', '')
elseif v =~# 'rem$'
let value .= v
elseif v =~# '\.'
let value .= v . 'em'
elseif v ==# 'auto'
@@ -186,13 +199,16 @@ endfunction
function! emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) abort
let current = a:current
let value = current.value[1:-2]
if emmet#useFilter(a:filters, 'fc')
let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g')
else
let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g')
endif
if current.important
let value = substitute(value, ';', ' !important;', '')
let tmp = substitute(value, '\${cursor}', '', 'g')
if tmp !~ '.*{[ \t\r\n]*}$'
if emmet#useFilter(a:filters, 'fc')
let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g')
else
let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g')
endif
if current.important
let value = substitute(value, ';', ' !important;', '')
endif
endif
return value
endfunction

View File

@@ -56,7 +56,6 @@ function! emmet#lang#haml#toString(settings, current, type, inline, filters, ite
let tmp .= ' '
endif
endif
let Val = substitute(Val, '\${cursor}', '', '')
if attribute_style ==# 'hash'
let tmp .= ' :' . attr . ' => "' . Val . '"'
elseif attribute_style ==# 'html'

View File

@@ -1,6 +1,6 @@
let s:mx = '\([+>]\|[<^]\+\)\{-}\s*'
\ .'\((*\)\{-}\s*'
\ .'\([@#.]\{-}[a-zA-Z_\!][a-zA-Z0-9:_\!\-$]*\|{\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}*[ \t\r\n}]*\|\[[^\]]\+\]\)'
\ .'\([@#.]\{-}[a-zA-Z_\!][a-zA-Z0-9:_\!\-$]*\|\${[^}]\+}\|{\%([^%$}]\+\|\$#\|\${\w\+}\|\$\+\)*}*[ \t\r\n}]*\|\[[^\]]\+\]\)'
\ .'\('
\ .'\%('
\ .'\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)'
@@ -22,6 +22,13 @@ function! emmet#lang#html#findTokens(str) abort
endif
let pos = stridx(str, tag, pos) + len(tag)
endwhile
while 1
let tag = matchstr(str, '{%[^%]\{-}%}', pos)
if len(tag) == 0
break
endif
let pos = stridx(str, tag, pos) + len(tag)
endwhile
let last_pos = pos
while len(str) > 0
let token = matchstr(str, s:mx, pos)
@@ -116,25 +123,54 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
let use_pipe_for_cursor = emmet#getResource(type, 'use_pipe_for_cursor', 1)
" snippets
let snippets = emmet#getResource(type, 'snippets', {})
if !empty(snippets)
let snippet_name = tag_name
if has_key(snippets, snippet_name)
let snippet = snippet_name
while has_key(snippets, snippet)
let snippet = snippets[snippet]
let abbreviations = emmet#getResource(type, 'abbreviations', {})
if !empty(abbreviations)
let abbreviation_name = tag_name
if has_key(abbreviations, abbreviation_name)
let abbreviation = abbreviation_name
while has_key(abbreviations, abbreviation)
let abbreviation = abbreviations[abbreviation]
endwhile
if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g')
let abbreviation = substitute(abbreviation, '|', '${cursor}', 'g')
endif
let lines = split(snippet, "\n", 1)
let lines = split(abbreviation, "\n", 1)
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n")
let current.name = ''
endif
endif
" snippets
let snippets = emmet#getResource(type, 'snippets', {})
if empty(current.snippet)
let snippets = emmet#getResource(type, 'snippets', {})
if !empty(snippets)
let snippet_name = tag_name
if has_key(snippets, snippet_name)
let snippet = snippet_name
while has_key(snippets, snippet)
let snippet = snippets[snippet]
endwhile
if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif
if emmet#isExtends(type, 'html') && snippet !~ '^\s*[{\[<]'
let current = emmet#lang#html#parseIntoTree(snippet, a:type)
if current.name == '' && current.value == '' && current.snippet == '' && len(current.child) > 0
let parent.child += current.child[:-2]
let current = current.child[-1]
endif
else
let lines = split(snippet, "\n", 1)
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n")
let current.name = ''
endif
endif
endif
endif
let custom_expands = emmet#getResource(type, 'custom_expands', {})
if empty(custom_expands) && has_key(settings, 'custom_expands')
let custom_expands = settings['custom_expands']
@@ -207,7 +243,7 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
let atts = item[1:-2]
if matchstr(atts, '^\s*\zs[0-9a-zA-Z-:]\+\(="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\)') ==# ''
let ks = []
if has_key(default_attributes, current.name)
if has_key(default_attributes, current.name)
let dfa = default_attributes[current.name]
let ks = type(dfa) == 3 ? keys(dfa[0]) : keys(dfa)
endif
@@ -251,6 +287,9 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
if tag_name =~# '^{.*}$'
let current.name = ''
let current.value = tag_name
elseif tag_name =~# '^\$\?{.*}$'
let current.name = ''
let current.value = '{' . tag_name . '}'
else
let current.value = value
endif
@@ -371,6 +410,7 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let q = emmet#getResource(type, 'quote_char', '"')
let ct = emmet#getResource(type, 'comment_type', 'both')
let an = emmet#getResource(type, 'attribute_name', {})
if emmet#useFilter(filters, 'haml')
return emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent)
@@ -441,22 +481,25 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
if len(Val) > 0
let Val .= ' '
endif
if _val =~# '^\a_'
let lead = _val[0]
let Val .= lead . ' ' . _val
elseif _val =~# '^_'
if _val =~# '^_'
let lead = vals[0]
let Val .= lead . _val
elseif _val =~# '^-'
if len(lead) == 0
let pattr = current.parent.attr
if has_key(pattr, 'class')
let lead = pattr['class']
let lead = split(pattr['class'], '\s\+')[0]
endif
endif
let Val .= lead . ' ' . lead . _val
let Val .= lead . _val
else
let Val .= _val
endif
endfor
endif
if has_key(an, attr)
let attr = an[attr]
endif
let str .= ' ' . attr . '=' . q . Val . q
if emmet#useFilter(filters, 'c')
if attr ==# 'id' | let comment .= '#' . Val | endif
@@ -483,7 +526,9 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
endif
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
let str = substitute(str, '\("\zs$#\ze"\|\s\zs\$#"\|"\$#\ze\s\)', text, 'g')
if text != ''
let str = substitute(str, '\("\zs$#\ze"\|\s\zs\$#"\|"\$#\ze\s\)', text, 'g')
endif
endif
let str .= text
let nc = len(current.child)
@@ -510,7 +555,11 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
let str .= inner
endfor
else
let str .= '${cursor}'
if settings.html.indent_blockelement && len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1
let str .= "\n" . indent . '${cursor}' . "\n"
else
let str .= '${cursor}'
endif
endif
if dr
let str .= "\n"
@@ -613,8 +662,8 @@ function! emmet#lang#html#parseTag(tag) abort
endfunction
function! emmet#lang#html#toggleComment() abort
let orgpos = emmet#util#getcurpos()
let curpos = emmet#util#getcurpos()
let orgpos = getpos('.')
let curpos = getpos('.')
let mx = '<\%#[^>]*>'
while 1
let block = emmet#util#searchRegion('<!--', '-->')
@@ -632,7 +681,7 @@ function! emmet#lang#html#toggleComment() abort
if pos1[0] == 0 && pos1[1] == 0
return
endif
let curpos = emmet#util#getcurpos()
let curpos = getpos('.')
continue
endif
let pos1 = block[0]

View File

@@ -0,0 +1,331 @@
function! emmet#lang#jade#findTokens(str) abort
return emmet#lang#html#findTokens(a:str)
endfunction
function! emmet#lang#jade#parseIntoTree(abbr, type) abort
return emmet#lang#html#parseIntoTree(a:abbr, a:type)
endfunction
function! emmet#lang#jade#toString(settings, current, type, inline, filters, itemno, indent) abort
let settings = a:settings
let current = a:current
let type = a:type
let inline = a:inline
let filters = a:filters
let itemno = a:itemno
let indent = emmet#getIndentation(type)
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let attribute_style = emmet#getResource('jade', 'attribute_style', 'hash')
let str = ''
let current_name = current.name
if dollar_expr
let current_name = substitute(current.name, '\$$', itemno+1, '')
endif
if len(current.name) > 0
let str .= '' . current_name
let tmp = ''
for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(current.attr, attr)
continue
endif
let Val = current.attr[attr]
if type(Val) == 2 && Val == function('emmet#types#true')
if attribute_style ==# 'hash'
let tmp .= ' ' . attr . ' = true'
elseif attribute_style ==# 'html'
let tmp .= attr . '=true'
end
else
if dollar_expr
while Val =~# '\$\([^#{]\|$\)'
let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile
let attr = substitute(attr, '\$$', itemno+1, '')
endif
let valtmp = substitute(Val, '\${cursor}', '', '')
if attr ==# 'id' && len(valtmp) > 0
let str .= '#' . Val
elseif attr ==# 'class' && len(valtmp) > 0
let str .= '.' . substitute(Val, ' ', '.', 'g')
else
if len(tmp) > 0
if attribute_style ==# 'hash'
let tmp .= ', '
elseif attribute_style ==# 'html'
let tmp .= ' '
endif
endif
if attribute_style ==# 'hash'
let tmp .= '' . attr . '="' . Val . '"'
elseif attribute_style ==# 'html'
let tmp .= attr . '="' . Val . '"'
end
endif
endif
endfor
if len(tmp)
if attribute_style ==# 'hash'
let str .= '(' . tmp . ')'
elseif attribute_style ==# 'html'
let str .= '(' . tmp . ')'
end
endif
let inner = ''
if len(current.value) > 0
let text = current.value[1:-2]
if dollar_expr
let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
let str = substitute(str, '\$#', text, 'g')
endif
let lines = split(text, "\n")
if len(lines) == 1
let str .= ' ' . text
else
for line in lines
let str .= "\n" . indent . line . ' |'
endfor
endif
elseif len(current.child) == 0
let str .= '${cursor}'
endif
if len(current.child) == 1 && len(current.child[0].name) == 0
let text = current.child[0].value[1:-2]
if dollar_expr
let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
endif
let lines = split(text, "\n")
if len(lines) == 1
let str .= ' ' . text
else
for line in lines
let str .= "\n" . indent . line . ' |'
endfor
endif
elseif len(current.child) > 0
for child in current.child
let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor
let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let str .= "\n" . indent . inner
endif
else
let str = current.value[1:-2]
if dollar_expr
let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let str = substitute(str, '\${nr}', "\n", 'g')
let str = substitute(str, '\\\$', '$', 'g')
endif
endif
let str .= "\n"
return str
endfunction
function! emmet#lang#jade#imageSize() abort
let line = getline('.')
let current = emmet#lang#jade#parseTag(line)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn =~# '^\s*$'
return
elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = emmet#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let current.attrs_order += ['width', 'height']
let jade = emmet#toString(current, 'jade', 1)
let jade = substitute(jade, '\${cursor}', '', '')
call setline('.', substitute(matchstr(line, '^\s*') . jade, "\n", '', 'g'))
endfunction
function! emmet#lang#jade#encodeImage() abort
endfunction
function! emmet#lang#jade#parseTag(tag) abort
let current = emmet#newNode()
let mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)'
let match = matchstr(a:tag, mx)
let current.name = substitute(match, mx, '\1', '')
let attrs = substitute(match, mx, '\2', '')
let mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(attrs) > 0
let match = matchstr(attrs, mx)
if len(match) ==# 0
break
endif
let attr_match = matchlist(match, mx)
let name = attr_match[1]
let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let current.attr[name] = value
let current.attrs_order += [name]
let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile
return current
endfunction
function! emmet#lang#jade#toggleComment() abort
let line = getline('.')
let space = matchstr(line, '^\s*')
if line =~# '^\s*-#'
call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*'))
elseif line =~# '^\s*%[a-z]'
call setline('.', space . '-# ' . line[len(space):])
endif
endfunction
function! emmet#lang#jade#balanceTag(flag) range abort
let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = emmet#util#getcurpos()
endif
let n = curpos[1]
let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(block)
let n = line('.')
else
while n > 0
let l = len(matchstr(getline(n), '^\s*\ze%[a-z]'))
if l > 0 && l < ml
let ml = l
break
endif
let n -= 1
endwhile
endif
let sn = n
if n == 0
let ml = 0
endif
while n < line('$')
let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l > 0 && l <= ml
let n -= 1
break
endif
let n += 1
endwhile
call setpos('.', [0, n, 1, 0])
normal! V
call setpos('.', [0, sn, 1, 0])
else
while n > 0
let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l > 0 && l > ml
let ml = l
break
endif
let n += 1
endwhile
let sn = n
if n == 0
let ml = 0
endif
while n < line('$')
let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l > 0 && l <= ml
let n -= 1
break
endif
let n += 1
endwhile
call setpos('.', [0, n, 1, 0])
normal! V
call setpos('.', [0, sn, 1, 0])
endif
endfunction
function! emmet#lang#jade#moveNextPrevItem(flag) abort
return emmet#lang#jade#moveNextPrev(a:flag)
endfunction
function! emmet#lang#jade#moveNextPrev(flag) abort
let pos = search('""', a:flag ? 'Wb' : 'W')
if pos != 0
silent! normal! l
startinsert
endif
endfunction
function! emmet#lang#jade#splitJoinTag() abort
let n = line('.')
let sml = len(matchstr(getline(n), '^\s*%[a-z]'))
while n > 0
if getline(n) =~# '^\s*\ze%[a-z]'
if len(matchstr(getline(n), '^\s*%[a-z]')) < sml
break
endif
let line = getline(n)
call setline(n, substitute(line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', ''))
let sn = n
let n += 1
let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
if len(matchstr(getline(n), '^\s*')) > ml
while n <= line('$')
let l = len(matchstr(getline(n), '^\s*'))
if l <= ml
break
endif
exe n 'delete'
endwhile
call setpos('.', [0, sn, 1, 0])
else
let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)')
let spaces = matchstr(getline(sn), '^\s*')
let settings = emmet#getSettings()
if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1
call append(sn, spaces . ' ')
call setpos('.', [0, sn+1, 1, 0])
else
call setpos('.', [0, sn, 1, 0])
endif
startinsert!
endif
break
endif
let n -= 1
endwhile
endfunction
function! emmet#lang#jade#removeTag() abort
let n = line('.')
let ml = 0
while n > 0
if getline(n) =~# '^\s*\ze[a-z]'
let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
break
endif
let n -= 1
endwhile
let sn = n
while n < line('$')
let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l > 0 && l <= ml
let n -= 1
break
endif
let n += 1
endwhile
if sn == n
exe 'delete'
else
exe sn ',' (n-1) 'delete'
endif
endfunction

View File

@@ -292,7 +292,7 @@ function! emmet#util#imageSizeWithImageMagick(fn) abort
endfunction
function! emmet#util#isImageMagickInstalled() abort
if !get(s:, 'emmet_use_identify', 1)
if !get(g:, 'emmet_use_identify', 1)
return 0
endif
return executable('identify')

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@ script_name: Emmet.vim
script_id: '2981'
script_type: utility
script_package: emmet-vim.zip
script_version: '0.85'
script_version: '0.86'
required_vim_version: '7.0'
summary: vim plugins for HTML and CSS hi-speed coding.
@@ -98,6 +98,8 @@ install_details: |
# git clone http://github.com/mattn/emmet-vim.git
versions:
- '0.86': |
This is an upgrade for Emmet.vim: lot of bug fixes.
- '0.85': |
This is an upgrade for Emmet.vim: lot of bug fixes.
- '0.84': |

View File

@@ -1,8 +1,8 @@
"=============================================================================
" File: emmet.vim
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
" Last Change: 17-Dec-2014.
" Version: 0.85
" Last Change: 26-Jul-2015.
" Version: 0.86
" WebPage: http://github.com/mattn/emmet-vim
" Description: vim plugins for HTML and CSS hi-speed coding.
" SeeAlso: http://emmet.io/
@@ -90,10 +90,6 @@ if !exists('g:emmet_curl_command')
let g:emmet_curl_command = 'curl -s -L -A Mozilla/5.0'
endif
if exists('g:user_emmet_complete_tag') && g:user_emmet_complete_tag
setlocal omnifunc=emmet#completeTag
endif
if !exists('g:user_emmet_leader_key')
let g:user_emmet_leader_key = '<c-y>'
endif
@@ -118,10 +114,14 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': ':call emmet#moveNextPrev(0)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': '<esc>:call emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': '<esc>:call emmet#moveNextPrevItem(0)<cr>'},
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': ':call emmet#moveNextPrevItem(0)<cr>'},
\ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': '<esc>:call emmet#moveNextPrevItem(1)<cr>'},
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#imageSize()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toogle-comment', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#toggleComment()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toogle-comment', 'func': ':call emmet#toggleComment()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#toggleComment()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': ':call emmet#toggleComment()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': '<esc>:call emmet#splitJoinTag()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': ':call emmet#splitJoinTag()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_removetag_key', 'key': 'k', 'plug': 'emmet-remove-tag', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#removeTag()<cr>'},
@@ -134,23 +134,34 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'},
\]
let only_plug = get(g:, 'emmet_install_only_plug', 0)
for item in items
if a:mode !=# 'a' && stridx(a:mode, item.mode) == -1
continue
endif
exe item.mode . 'noremap '. buffer .' <plug>(' . item.plug . ') ' . item.func
if exists('g:' . item.var)
let key = eval('g:' . item.var)
else
let key = g:user_emmet_leader_key . item.key
endif
if !hasmapto('<plug>(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode))
exe item.mode . 'map ' . buffer . ' <unique> ' . key . ' <plug>(' . item.plug . ')'
if item.var != '' && !only_plug
if exists('g:' . item.var)
let key = eval('g:' . item.var)
else
let key = g:user_emmet_leader_key . item.key
endif
if !hasmapto('<plug>(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode))
exe item.mode . 'map ' . buffer . ' <unique> ' . key . ' <plug>(' . item.plug . ')'
endif
endif
endfor
if exists('g:user_emmet_complete_tag') && g:user_emmet_complete_tag
if get(g:, 'user_emmet_install_global', 1)
set omnifunc=emmet#completeTag
else
setlocal omnifunc=emmet#completeTag
endif
endif
endfunction
command! -nargs=0 EmmetInstall call <SID>install_plugin(get(g:, 'user_emmet_mode', 'a'), 1)
command! -nargs=0 -bar EmmetInstall call <SID>install_plugin(get(g:, 'user_emmet_mode', 'a'), 1)
if get(g:, 'user_emmet_install_global', 1)
call s:install_plugin(get(g:, 'user_emmet_mode', 'a'), 0)

View File

@@ -241,7 +241,7 @@ finish
},
{
'query': "html:xt>div#header>div#logo+ul#nav>li.item-$*5>a",
'result': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\n\t<title></title>\n</head>\n<body>\n\t<div id=\"header\">\n\t\t<div id=\"logo\"></div>\n\t\t<ul id=\"nav\">\n\t\t\t<li class=\"item-1\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-2\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-3\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-4\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-5\"><a href=\"\"></a></li>\n\t\t</ul>\n\t</div>\n\t\n</body>\n</html>",
'result': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\n\t\t<title>${1:Document}</title>\n\t</head>\n\t<body>\n\t<div id=\"header\">\n\t\t<div id=\"logo\"></div>\n\t\t<ul id=\"nav\">\n\t\t\t<li class=\"item-1\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-2\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-3\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-4\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-5\"><a href=\"\"></a></li>\n\t\t</ul>\n\t</div>\n\t\n</body>\n</html>",
},
{
'query': "ol>li*2",
@@ -491,6 +491,10 @@ finish
'query': "test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,input[type=input value=$#]*\\<cr>$$$$",
'result': "<input type=\"input\" value=\"test1\">\n<input type=\"input\" value=\"test2\">\n<input type=\"input\" value=\"test3\">",
},
{
'query': "test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,div[id=$#]*\\<cr>$$$$",
'result': "<div id=\"test1\"></div>\n<div id=\"test2\"></div>\n<div id=\"test3\"></div>",
},
{
'query': "div#id-$*5>div#id2-$",
'result': "<div id=\"id-1\">\n\t<div id=\"id2-1\"></div>\n</div>\n<div id=\"id-2\">\n\t<div id=\"id2-2\"></div>\n</div>\n<div id=\"id-3\">\n\t<div id=\"id2-3\"></div>\n</div>\n<div id=\"id-4\">\n\t<div id=\"id2-4\"></div>\n</div>\n<div id=\"id-5\">\n\t<div id=\"id2-5\"></div>\n</div>\n",
@@ -531,6 +535,10 @@ finish
'query': "<small>a$$$$</small>",
'result': "<small><a href=\"\"></a></small>",
},
{
'query': "form.search-form._wide>input.-query-string+input:s.-btn_large|bem",
'result': "<form class=\"search-form search-form_wide\" action=\"\">\n\t<input class=\"search-form-query-string\" type=\"\">\n\t<input class=\"search-form-btn_large\" type=\"submit\" value=\"\">\n</form>\n",
},
],
},
{
@@ -734,6 +742,30 @@ finish
'query': "{dn$$$$}",
'result': "{display: none;}",
},
{
'query': "{p10%$$$$}",
'result': "{padding: 10%;}",
},
{
'query': "{p10p$$$$}",
'result': "{padding: 10%;}",
},
{
'query': "{p10e$$$$}",
'result': "{padding: 10em;}",
},
{
'query': "{p10em$$$$}",
'result': "{padding: 10em;}",
},
{
'query': "{p10re$$$$}",
'result': "{padding: 10rem;}",
},
{
'query': "{p10rem$$$$}",
'result': "{padding: 10rem;}",
},
],
},
],