From cade34d8b4fa0963ab837e0c85f578627c9cee68 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 28 Oct 2017 17:12:34 -0400 Subject: also remove matching parens, even if there is whitespace between --- vimrc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'vimrc') diff --git a/vimrc b/vimrc index ab72017..f0e672c 100644 --- a/vimrc +++ b/vimrc @@ -480,9 +480,23 @@ function s:move_cursor_right() \] call setpos('.', l:newpos) endfunction +function s:move_cursor_to_pos(lnum, col) + let l:pos = getcurpos() + let l:newpos = [ + \ l:pos[0], + \ a:lnum, + \ a:col, + \ 0, + \ a:col, + \] + call setpos('.', l:newpos) +endfunction let s:pair_bs_maps = { \ '"': "maybe_remove_adjacent_char('\"')", \ "'": "maybe_remove_adjacent_char(\"'\")", +\ '(': "maybe_remove_empty_pair(')')", +\ '[': "maybe_remove_empty_pair(']')", +\ '{': "maybe_remove_empty_pair('}')", \} function s:maybe_remove_matching_pair() let l:prevchar = strpart(getline('.'), col('.')-2, 1) @@ -499,6 +513,39 @@ function s:maybe_remove_adjacent_char(char) return "\" endif endfunction +function s:maybe_remove_empty_pair(char) + let l:startpos = [line('.'), col('.')] + let l:endpos = searchpos('[^ \t]', 'cnWz') + if l:endpos == [0, 0] + return "\" + endif + + let l:next_nonblank = getline(l:endpos[0])[l:endpos[1]-1] + if l:next_nonblank != a:char + return "\" + endif + + call s:move_cursor_to_pos(l:endpos[0], l:endpos[1] + 1) + return repeat("\", 2 + s:chars_between(l:startpos, l:endpos)) +endfunction +function s:chars_between(start, end) + if a:start[0] == a:end[0] + return a:end[1] - a:start[1] + else + let l:line = getline(a:start[0]) + let l:after_first = strpart(l:line, a:start[1] - 1) + + let l:line = getline(a:end[0]) + let l:before_last = strpart(l:line, 0, a:end[1] - 1) + + let l:nchars = len(l:after_first) + len(l:before_last) + 1 + for l:idx in range(a:start[0] + 1, a:end[0] - 1) + let l:nchars = l:nchars + len(getline(l:idx)) + 1 + endfor + + return l:nchars + endif +endfunction for s:pair in [['(', ')'], ['{', '}'], ['[', ']']] exe "inoremap " . s:pair[0] . " " . s:pair[0] . s:pair[1] . "=move_cursor_left()?\"\":\"\"" exe "inoremap " . s:pair[0] . " " . s:pair[0] . "" . s:pair[1] . "O" -- cgit v1.2.3-54-g00ecf