-
-
Save wenLiangcan/5583670 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
inoremap ( <c-r>=OpenPair('(')<CR> | |
inoremap ) <c-r>=ClosePair(')')<CR> | |
inoremap { <c-r>=OpenPair('{')<CR> | |
inoremap } <c-r>=ClosePair('}')<CR> | |
inoremap [ <c-r>=OpenPair('[')<CR> | |
inoremap ] <c-r>=ClosePair(']')<CR> | |
" just for xml document, but need not for now. | |
"inoremap < <c-r>=OpenPair('<')<CR> | |
"inoremap > <c-r>=ClosePair('>')<CR> | |
function! OpenPair(char) | |
let PAIRs = { | |
\ '{' : '}', | |
\ '[' : ']', | |
\ '(' : ')', | |
\ '<' : '>' | |
\} | |
if line('$')>2000 | |
let line = getline('.') | |
let txt = strpart(line, col('.')-1) | |
else | |
let lines = getline(1,line('$')) | |
let line="" | |
for str in lines | |
let line = line . str . "\n" | |
endfor | |
let blines = getline(line('.')-1, line("$")) | |
let txt = strpart(getline("."), col('.')-1) | |
for str in blines | |
let txt = txt . str . "\n" | |
endfor | |
endif | |
let oL = len(split(line, a:char, 1))-1 | |
let cL = len(split(line, PAIRs[a:char], 1))-1 | |
let ol = len(split(txt, a:char, 1))-1 | |
let cl = len(split(txt, PAIRs[a:char], 1))-1 | |
if oL>=cL || (oL<cL && ol>=cl) | |
return a:char . PAIRs[a:char] . "\<Left>" | |
else | |
return a:char | |
endif | |
endfunction | |
function! ClosePair(char) | |
if getline('.')[col('.')-1] == a:char | |
return "\<Right>" | |
else | |
return a:char | |
endif | |
endf | |
inoremap ' <c-r>=CompleteQuote("'")<CR> | |
inoremap " <c-r>=CompleteQuote('"')<CR> | |
function! CompleteQuote(quote) | |
let ql = len(split(getline('.'), a:quote, 1))-1 | |
let slen = len(split(strpart(getline("."), 0, col(".")-1), a:quote, 1))-1 | |
let elen = len(split(strpart(getline("."), col(".")-1), a:quote, 1))-1 | |
let isBefreQuote = getline('.')[col('.') - 1] == a:quote | |
if '"'==a:quote && "vim"==&ft && 0==match(strpart(getline('.'), 0, col('.')-1), "^[\t ]*$") | |
" for vim comment. | |
return a:quote | |
elseif "'"==a:quote && 0==match(getline('.')[col('.')-2], "[a-zA-Z0-9]") | |
" for Name's Blog. | |
return a:quote | |
elseif (ql%2)==1 | |
" a:quote length is odd. | |
return a:quote | |
elseif ((slen%2)==1 && (elen%2)==1 && !isBefreQuote) || ((slen%2)==0 && (elen%2)==0) | |
return a:quote . a:quote . "\<Left>" | |
elseif isBefreQuote | |
return "\<Right>" | |
else | |
return a:quote . a:quote . "\<Left>" | |
endif | |
endfunction |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment