From 03bb2b26fed4b1a648228518316d5ce42b751258 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Wed, 18 Mar 2015 11:28:39 +0900 Subject: [PATCH 1/7] Add some units behavior of css. Close #264 --- autoload/emmet/lang/css.vim | 10 +++++++++- unittest.vim | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/autoload/emmet/lang/css.vim b/autoload/emmet/lang/css.vim index 361d89d..48bc3c2 100644 --- a/autoload/emmet/lang/css.vim +++ b/autoload/emmet/lang/css.vim @@ -31,7 +31,7 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort 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 =~# '^-' @@ -48,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' diff --git a/unittest.vim b/unittest.vim index 51baba2..53ac676 100644 --- a/unittest.vim +++ b/unittest.vim @@ -734,6 +734,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;}", + }, ], }, ], From 1c46c5fb775606621906f0bedc8da8bc636c1dac Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Wed, 18 Mar 2015 17:28:50 +0900 Subject: [PATCH 2/7] Add g:emmet_install_only_plug to install only mappings --- plugin/emmet.vim | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/plugin/emmet.vim b/plugin/emmet.vim index ae18852..67c04e3 100644 --- a/plugin/emmet.vim +++ b/plugin/emmet.vim @@ -114,6 +114,10 @@ function! s:install_plugin(mode, buffer) \ {'mode': 'n', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': ':call emmet#moveNextPrev(0)'}, \ {'mode': 'i', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(1)'}, \ {'mode': 'n', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(1)'}, + \ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': ':call emmet#moveNextPrevItem(0)'}, + \ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': ':call emmet#moveNextPrevItem(0)'}, + \ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)'}, + \ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)'}, \ {'mode': 'i', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': '=emmet#util#closePopup()=emmet#imageSize()'}, \ {'mode': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()'}, \ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': '=emmet#util#closePopup()=emmet#toggleComment()'}, @@ -130,18 +134,21 @@ function! s:install_plugin(mode, buffer) \ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()'}, \] + 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 .' (' . 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('(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode)) - exe item.mode . 'map ' . buffer . ' ' . key . ' (' . 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('(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode)) + exe item.mode . 'map ' . buffer . ' ' . key . ' (' . item.plug . ')' + endif endif endfor From 87e50225c1042c25430513713d46d6a077d62662 Mon Sep 17 00:00:00 2001 From: Syohei YOSHIDA Date: Tue, 12 May 2015 12:54:05 +0900 Subject: [PATCH 3/7] fix typo --- doc/emmet.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/emmet.txt b/doc/emmet.txt index e6d3a5e..dcaf776 100644 --- a/doc/emmet.txt +++ b/doc/emmet.txt @@ -906,7 +906,7 @@ inside generated tree and elements' attributes. < Other examples: > - .wrapper ->
+ .wrapper ->
#popup -> < When you expand abbreviation, Emmet tries to grab parent context, From cda7349b65086c67bfff47348a309515f2119271 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 23 Jun 2015 13:57:08 +0900 Subject: [PATCH 4/7] text content should be repeated with multiplier --- autoload/emmet.vim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/autoload/emmet.vim b/autoload/emmet.vim index b22114c..d571d31 100644 --- a/autoload/emmet.vim +++ b/autoload/emmet.vim @@ -237,7 +237,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 From 30f856893579d34531ac256e1f6752d809956025 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Fri, 26 Jun 2015 12:48:22 +0900 Subject: [PATCH 5/7] fix #276 --- autoload/emmet.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/emmet.vim b/autoload/emmet.vim index d571d31..315eb44 100644 --- a/autoload/emmet.vim +++ b/autoload/emmet.vim @@ -650,7 +650,7 @@ function! emmet#expandAbbr(mode, abbr) range abort endif let expand = substitute(expand, '[\r\n]\s*$', '', 'g') if emmet#useFilter(filters, 's') - let epart = substitute(expand, '[\r\n]\s\*', '', 'g') + let epart = substitute(expand, '[\r\n]\s*', '', 'g') else let epart = substitute(expand, '[\r\n]', "\n" . indent, 'g') endif From 8289c323e07363bacb9687aab59f0818d85e21b4 Mon Sep 17 00:00:00 2001 From: Aleksej Kamynin Date: Sat, 11 Jul 2015 12:36:44 +0300 Subject: [PATCH 6/7] Added jade support (based on haml.vim) --- autoload/emmet/lang/jade.vim | 335 +++++++++++++++++++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 autoload/emmet/lang/jade.vim diff --git a/autoload/emmet/lang/jade.vim b/autoload/emmet/lang/jade.vim new file mode 100644 index 0000000..70f8f7b --- /dev/null +++ b/autoload/emmet/lang/jade.vim @@ -0,0 +1,335 @@ +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 + let Val = substitute(Val, '\${cursor}', '', '') + 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 + if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 && len(current.value) == 0 + let str .= '/' + endif + + let inner = '' + if len(current.value) > 0 + let text = current.value[1:-2] + if dollar_expr + let text = substitute(text, '\%(\\\)\@\ 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, '\%(\\\)\@\\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 From 7e3af15e4eba230f03d8d77dd5c674bc25088e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Cau?= Date: Wed, 15 Jul 2015 11:06:53 +0200 Subject: [PATCH 7/7] Jade: remove extra "/" after empty elements expansion For instance, `img` should be expanded to `img(src="", alt="")` rather than `img(src="", alt="")/` --- autoload/emmet/lang/jade.vim | 3 --- 1 file changed, 3 deletions(-) diff --git a/autoload/emmet/lang/jade.vim b/autoload/emmet/lang/jade.vim index 70f8f7b..8b0596a 100644 --- a/autoload/emmet/lang/jade.vim +++ b/autoload/emmet/lang/jade.vim @@ -72,9 +72,6 @@ function! emmet#lang#jade#toString(settings, current, type, inline, filters, ite let str .= '(' . tmp . ')' end endif - if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 && len(current.value) == 0 - let str .= '/' - endif let inner = '' if len(current.value) > 0