vim中实现括号和引号自动补全

将下面内容加入.vimrc文件中即可
inoremap ( ()<Esc>i

inoremap [ []<Esc>i

inoremap { {<CR>}<Esc>O

autocmd Syntax html,vim inoremap < <lt>><Esc>i| inoremap > <c-r>=ClosePair('>')<CR>

inoremap ) <c-r>=ClosePair(')')<CR>

inoremap ] <c-r>=ClosePair(']')<CR>

inoremap } <c-r>=CloseBracket()<CR>

inoremap " <c-r>=QuoteDelim('"')<CR>

inoremap ' <c-r>=QuoteDelim("'")<CR>



function ClosePair(char)

 if getline('.')[col('.') - 1] == a:char

 return "\<Right>"

 else

 return a:char

 endif

endf



function CloseBracket()

 if match(getline(line('.') + 1), '\s*}') < 0

 return "\<CR>}"

 else

 return "\<Esc>j0f}a"

 endif

endf



function QuoteDelim(char)

 let line = getline('.')

 let col = col('.')

 if line[col - 2] == "\\"

 "Inserting a quoted quotation mark into the string

 return a:char

 elseif line[col - 1] == a:char

 "Escaping out of the string

 return "\<Right>"

 else

 "Starting a string

 return a:char.a:char."\<Esc>i"

 endif

endf

  

 

 

其他相关:

autocomplete.match.pair.vim

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

  

 

 

你可能感兴趣的:(自动补全)