From 50b44d90c9a2778aa3235d893a0a3dc48f9b1c3d Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Wed, 19 Jun 2019 00:46:33 +0900 Subject: [PATCH 1/3] Fix hang-up while split/join tag --- autoload/emmet.vim | 3 +++ autoload/emmet/lang/html.vim | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/autoload/emmet.vim b/autoload/emmet.vim index 72b9f64..6815e95 100644 --- a/autoload/emmet.vim +++ b/autoload/emmet.vim @@ -386,6 +386,9 @@ function! emmet#getFileType(...) abort if type == 'htmlTagName' let type = '' endif + if type =~ '^mkdSnippet' + let type = tolower(type[10:]) + endif if type =~? '^css' let type = 'css' diff --git a/autoload/emmet/lang/html.vim b/autoload/emmet/lang/html.vim index 305e9c1..228bfba 100644 --- a/autoload/emmet/lang/html.vim +++ b/autoload/emmet/lang/html.vim @@ -894,8 +894,9 @@ endfunction function! emmet#lang#html#splitJoinTag() abort let curpos = emmet#util#getcurpos() + let mx = '<\(/\{0,1}[a-zA-Z][-a-zA-Z0-9:_\-]*\)\%(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\s*\%(/\{0,1}\)>' while 1 - let mx = '<\(/\{0,1}[a-zA-Z][-a-zA-Z0-9:_\-]*\)\%(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\%(/\{0,1}\)>' + let old = getpos('.')[1:2] let pos1 = searchpos(mx, 'bcnW') let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\).*$', '\1', '') @@ -927,6 +928,10 @@ function! emmet#lang#html#splitJoinTag() abort call setpos('.', curpos) return endif + if pos1 == old + call setpos('.', curpos) + return + endif endif endif endwhile From 32dd6d3064123d7307d535c3b2c0b4241c91413d Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Wed, 19 Jun 2019 01:08:51 +0900 Subject: [PATCH 2/3] Fix split/join tag --- autoload/emmet/lang/html.vim | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/autoload/emmet/lang/html.vim b/autoload/emmet/lang/html.vim index 228bfba..96b172b 100644 --- a/autoload/emmet/lang/html.vim +++ b/autoload/emmet/lang/html.vim @@ -910,28 +910,30 @@ function! emmet#lang#html#splitJoinTag() abort if tag_name[0] ==# '/' let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') call setpos('.', [0, pos1[0], pos1[1], 0]) - let pos2 = searchpos('', 'cneW') + let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^>]*>', '', '', 'W') else - let pos2 = searchpos('', 'cneW') + let pos2 = searchpairpos('<'. tag_name . '[^>]*>', '', '', 'W') endif + if pos2 == [0, 0] + return + endif + let pos2 = searchpos('>', 'neW') let block = [pos1, pos2] - let content = emmet#util#getContent(block) - if emmet#util#pointInRegion(curpos[1:2], block) && content[1:] !~# '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + if emmet#util#pointInRegion(curpos[1:2], block) let content = matchstr(content, mx)[:-2] . ' />' call emmet#util#setContent(block, content) call setpos('.', [0, block[0][0], block[0][1], 0]) return + endif + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) else - if block[0][0] > 0 - call setpos('.', [0, block[0][0]-1, block[0][1], 0]) - else - call setpos('.', curpos) - return - endif - if pos1 == old - call setpos('.', curpos) - return - endif + call setpos('.', curpos) + return + endif + if pos1 == old + call setpos('.', curpos) + return endif endif endwhile From b9f1ae467b4bec7e6a8661d9b9077030e51c41e9 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Wed, 19 Jun 2019 01:39:37 +0900 Subject: [PATCH 3/3] Fix remove tag --- autoload/emmet/lang/html.vim | 126 ++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/autoload/emmet/lang/html.vim b/autoload/emmet/lang/html.vim index 96b172b..bf15936 100644 --- a/autoload/emmet/lang/html.vim +++ b/autoload/emmet/lang/html.vim @@ -771,7 +771,7 @@ function! emmet#lang#html#toggleComment() abort let tag_name = matchstr(content, '^<\zs/\{0,1}[^ \r\n>]\+') if tag_name[0] ==# '/' call setpos('.', [0, pos1[0], pos1[1], 0]) - let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^>]*>', '', '', 'bnW') + let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^/>]*>', '', '', 'bnW') let pos1 = searchpos('>', 'cneW') let block = [pos2, pos1] elseif tag_name =~# '/$' @@ -786,7 +786,7 @@ function! emmet#lang#html#toggleComment() abort endif else call setpos('.', [0, pos2[0], pos2[1], 0]) - let pos3 = searchpairpos('<'. tag_name . '\>[^>]*>', '', '', 'nW') + let pos3 = searchpairpos('<'. tag_name . '\>[^/>]*>', '', '', 'nW') if pos3 == [0, 0] let block = [pos1, pos2] else @@ -906,73 +906,75 @@ function! emmet#lang#html#splitJoinTag() abort call emmet#util#setContent(block, content) call setpos('.', [0, block[0][0], block[0][1], 0]) return + endif + if tag_name[0] ==# '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^/>]*>', '', '', 'W') else - if tag_name[0] ==# '/' - let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') - call setpos('.', [0, pos1[0], pos1[1], 0]) - let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^>]*>', '', '', 'W') - else - let pos2 = searchpairpos('<'. tag_name . '[^>]*>', '', '', 'W') - endif - if pos2 == [0, 0] - return - endif - let pos2 = searchpos('>', 'neW') - let block = [pos1, pos2] - if emmet#util#pointInRegion(curpos[1:2], block) - let content = matchstr(content, mx)[:-2] . ' />' - call emmet#util#setContent(block, content) - call setpos('.', [0, block[0][0], block[0][1], 0]) - return - endif - if block[0][0] > 0 - call setpos('.', [0, block[0][0]-1, block[0][1], 0]) - else - call setpos('.', curpos) - return - endif - if pos1 == old - call setpos('.', curpos) - return - endif + let pos2 = searchpairpos('<'. tag_name . '[^/>]*>', '', '', 'W') + endif + if pos2 == [0, 0] + return + endif + let pos2 = searchpos('>', 'neW') + let block = [pos1, pos2] + if emmet#util#pointInRegion(curpos[1:2], block) + let content = matchstr(content, mx)[:-2] . ' />' + call emmet#util#setContent(block, content) + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + endif + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) + else + call setpos('.', curpos) + return + endif + if pos1 == old + call setpos('.', curpos) + return endif endwhile endfunction function! emmet#lang#html#removeTag() abort let curpos = emmet#util#getcurpos() - while 1 - let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*' - let pos1 = searchpos(mx, 'bcnW') - let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) - let tag_name = matchstr(content, '^<\zs/\{0,1}[a-zA-Z0-9:_\-]*') - let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] - if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block) - call emmet#util#setContent(block, '') - call setpos('.', [0, block[0][0], block[0][1], 0]) - return + let mx = '<\(/\{0,1}[a-zA-Z][-a-zA-Z0-9:_\-]*\)\%(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\s*\%(/\{0,1}\)>' + + let pos1 = searchpos(mx, 'bcnW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block) + call emmet#util#setContent(block, '') + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + endif + if tag_name[0] ==# '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^/>]*>', '', '', 'W') + else + echomsg string(tag_name) + let pos2 = searchpairpos('<'. tag_name . '[^/>]*>', '', '', 'W') + endif + echomsg string(pos2) + if pos2 == [0, 0] + return + endif + let pos2 = searchpos('>', 'neW') + let block = [pos1, pos2] + if emmet#util#pointInRegion(curpos[1:2], block) + call emmet#util#setContent(block, '') + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) else - if tag_name[0] ==# '/' - let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') - call setpos('.', [0, pos1[0], pos1[1], 0]) - let pos2 = searchpos('', 'cneW') - else - let pos2 = searchpos('', 'cneW') - endif - let block = [pos1, pos2] - let content = emmet#util#getContent(block) - if emmet#util#pointInRegion(curpos[1:2], block) && content[1:] !~# '^<' . tag_name . '[^a-zA-Z0-9]' - call emmet#util#setContent(block, '') - call setpos('.', [0, block[0][0], block[0][1], 0]) - return - else - if block[0][0] > 0 - call setpos('.', [0, block[0][0]-1, block[0][1], 0]) - else - call setpos('.', curpos) - return - endif - endif + call setpos('.', curpos) + return endif - endwhile + endif endfunction