30 lines
838 B
VimL
30 lines
838 B
VimL
function! Sc(char)
|
|
let closing = {'(': ')', '[': ']', '{': '}', '<': '>', '"': '"', "'": "'"}
|
|
|
|
if has_key(closing, a:char)
|
|
let line = getline('.')
|
|
let col = col('.') - 1
|
|
let before = col > 0 ? line[col-1] : ''
|
|
let after = col < len(line) ? line[col] : ''
|
|
if before =~ '\w' && after =~ '\w'
|
|
return a:char
|
|
endif
|
|
if (a:char == '"' || a:char == "'") && before == a:char
|
|
return a:char
|
|
endif
|
|
if after == closing[a:char]
|
|
return "\<Right>"
|
|
endif
|
|
return a:char . closing[a:char] . "\<Left>"
|
|
endif
|
|
|
|
return a:char
|
|
endfunction
|
|
|
|
inoremap ( <C-R>=Sc('(')<CR>
|
|
inoremap [ <C-R>=Sc('[')<CR>
|
|
inoremap { <C-R>=Sc('{')<CR>
|
|
inoremap < <C-R>=Sc('<')<CR>
|
|
inoremap " <C-R>=Sc('"')<CR>
|
|
inoremap ' <C-R>=Sc("'")<CR>
|