diff --git a/autoload/delimitMate.vim b/autoload/delimitMate.vim index f8142dc..382f77c 100644 --- a/autoload/delimitMate.vim +++ b/autoload/delimitMate.vim @@ -10,30 +10,35 @@ "let delimitMate_loaded = 1 -function! delimitMate#ShouldJump() "{{{ +function! delimitMate#ShouldJump(...) "{{{ " Returns 1 if the next character is a closing delimiter. let char = delimitMate#GetCharFromCursor(0) let list = b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list " Closing delimiter on the right. - if index(list, char) > -1 + if (!a:0 && index(list, char) > -1) + \ || (a:0 && char == a:1) return 1 endif " Closing delimiter with space expansion. let nchar = delimitMate#GetCharFromCursor(1) - if b:_l_delimitMate_expand_space && char == " " + if !a:0 && b:_l_delimitMate_expand_space && char == " " if index(list, nchar) > -1 - return 1 + return 2 endif + elseif a:0 && b:_l_delimitMate_expand_space && nchar == a:1 + return 3 endif " Closing delimiter with CR expansion. - let uchar = getline(line('.') + 1)[0] - if b:_l_delimitMate_expand_cr && char == "" + let uchar = matchstr(getline(line('.') + 1), '^\s*\zs\S') + if !a:0 && b:_l_delimitMate_expand_cr && char == "" if index(list, uchar) > -1 - return 1 + return 4 endif + elseif a:0 && b:_l_delimitMate_expand_cr && uchar == a:1 + return 5 endif return 0 @@ -343,8 +348,15 @@ function! delimitMate#JumpOut(char) "{{{ if delimitMate#IsForbidden(a:char) return a:char endif - if delimitMate#GetCharFromCursor(0) == a:char + let jump = delimitMate#ShouldJump(a:char) + if jump == 1 return a:char . delimitMate#Del() + elseif jump == 3 + return ' '.a:char.delimitMate#Del().delimitMate#Del() + elseif jump == 5 + call delimitMate#FlushBuffer() + return "\" . matchstr(getline(line('.') + 1), '^\s*\S') + \ . delimitMate#Del() . "\" else return a:char endif diff --git a/test/expand_cr.txt b/test/expand_cr.txt index 7484435..fdf041d 100644 --- a/test/expand_cr.txt +++ b/test/expand_cr.txt @@ -10,3 +10,11 @@ $(document).ready(function() { x }) -------------------------------------------------------------------------------- +# Issue #95 +new +exec "normal i(\test)x" +================================================================================ +( +test +)x +-------------------------------------------------------------------------------- diff --git a/test/expand_space.txt b/test/expand_space.txt new file mode 100644 index 0000000..cc79092 --- /dev/null +++ b/test/expand_space.txt @@ -0,0 +1,6 @@ +# Issue #95 +new +exec "normal i( test)x" +================================================================================ +( test )x +-------------------------------------------------------------------------------- diff --git a/test/expand_space.vim b/test/expand_space.vim new file mode 100644 index 0000000..d306721 --- /dev/null +++ b/test/expand_space.vim @@ -0,0 +1,42 @@ +let g:delimitMate_expand_space = 1 +"DelimitMateReload +let lines = readfile(expand(':t:r').'.txt') +call vimtest#StartTap() +let testsnumber = len(filter(copy(lines), 'v:val =~ ''^=\{80}$''')) +call vimtap#Plan(testsnumber) +let tcount = 1 +let expect = 0 +let evaluate = 0 +for item in lines + if item =~ '^=\{80}$' + let expect = 1 + let expected = [] + continue + endif + + if item =~ '^#\|^\s*$' && expect == 0 + " A comment or empty line. + continue + endif + if ! expect + " A command. + exec item + call vimtap#Diag(item) + continue + endif + if item =~ '^-\{80}$' + let expect = 0 + endif + if expect + call add(expected, item) + continue + endif + let lines = getline(1, line('$')) + let passed = lines == expected + echom string(lines) + echom string(expected) + call vimtap#Ok(passed, string(expected) . + \ (passed ? ' =' : ' !') . '= ' . string(lines)) + let tcount += 1 +endfor +call vimtest#Quit()