Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
302 lines (193 sloc) 7.48 KB

Auto Pairs

Insert or delete brackets, parens, quotes in pair.


copy plugin/auto-pairs.vim to ~/.vim/plugin


  • Insert in pair

    input: [
    output: [|]
  • Delete in pair

    input: foo[<BS>
    output: foo
  • Insert new indented line after Return

    input: {|} (press <CR> at |)
    output: {
  • Insert spaces before closing characters, only for [], (), {}

    input: {|} (press <SPACE> at |)
    output: { | }
    input: {|} (press <SPACE>foo} at |)
    output: { foo }|
    input: '|' (press <SPACE> at |)
    output: ' |'
  • Skip ' when inside a word

    input: foo| (press ' at |)
    output: foo'
  • Skip closed bracket.

    input: []
    output: []
  • Ignore auto pair when previous character is \

    input: "\'
    output: "\'"
  • Fast Wrap

    input: |'hello' (press (<M-e> at |)
    output: ('hello')
    wrap string, only support c style string
    input: |'h\\el\'lo' (press (<M-e> at |)
    output ('h\\ello\'')
    input: |[foo, bar()] (press (<M-e> at |)
    output: ([foo, bar()])
  • Quick jump to closed pair.

    (press } at |)
  • Support ``` ''' and """

  • Fly Mode

    input: if(a[3)
    output: if(a[3])| (In Fly Mode)
    output: if(a[3)]) (Without Fly Mode)
    (press } at |)
    (then press <M-b> at | to do backinsert)
    See Fly Mode section for details

Fly Mode

Fly Mode will always force closed-pair jumping instead of inserting. only for ")", "}", "]"

If jumps in mistake, could use AutoPairsBackInsert(Default Key: ) to jump back and insert closed pair.

the most situation maybe want to insert single closed pair in the string, eg ")"

Fly Mode is DISABLED by default.

add let g:AutoPairsFlyMode = 1 .vimrc to turn it on

Default Options:

let g:AutoPairsFlyMode = 0
let g:AutoPairsShortcutBackInsert = '<M-b>'


System Shortcuts:
    <CR>  : Insert new indented line after return if cursor in blank brackets or quotes.
    <BS>  : Delete brackets in pair
    <M-p> : Toggle Autopairs (g:AutoPairsShortcutToggle)
    <M-e> : Fast Wrap (g:AutoPairsShortcutFastWrap)
    <M-n> : Jump to next closed pair (g:AutoPairsShortcutJump)
    <M-b> : BackInsert

If <M-p> <M-e> or <M-n> conflict with another keys or want to bind to another keys, add

    let g:AutoPairShortcutToggle = '<another key>'

to .vimrc, it the key is empty string '', then the shortcut will be disabled.


  • g:AutoPairs

    Default: {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'}
  • b:AutoPairs

    Default: g:AutoPairs
    Buffer level pairs set.
  • g:AutoPairsShortcutToggle

    Default: '<M-p>'
    The shortcut to toggle autopairs.
  • g:AutoPairsShortcutFastWrap

    Default: '<M-e>'
    Fast wrap the word. all pairs will be consider as a block (include <>).
    (|)'hello' after fast wrap at |, the word will be ('hello')
    (|)<hello> after fast wrap at |, the word will be (<hello>)
  • g:AutoPairsShortcutJump

    Default: '<M-n>'
    Jump to the next closed pair
  • g:AutoPairsMapBS

    Default : 1
    Map <BS> to delete brackets, quotes in pair
    execute 'inoremap <buffer> <silent> <BS> <C-R>=AutoPairsDelete()<CR>'
  • g:AutoPairsMapCR

    Default : 1
    Map <CR> to insert a new indented line if cursor in (|), {|} [|], '|', "|"
    execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsReturn()<CR>'
  • g:AutoPairsCenterLine

    Default : 1
    When g:AutoPairsMapCR is on, center current line after return if the line is at the bottom 1/3 of the window.
  • g:AutoPairsMapSpace

    Default : 1
    Map <space> to insert a space after the opening character and before the closing one.
    execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsSpace()<CR>'
  • g:AutoPairsFlyMode

    Default : 0
    set it to 1 to enable FlyMode.
    see FlyMode section for details.
  • g:AutoPairsShortcutBackInsert

    Default : <M-b>
    Work with FlyMode, insert the key at the Fly Mode jumped postion

Buffer Level Pairs Setting

Set b:AutoPairs before BufEnter


" When the filetype is FILETYPE then make AutoPairs only match for parenthesis
au Filetype FILETYPE let b:AutoPairs = {"(": ")"}


The script will remap keys ([{'"}]) <BS>,
If auto pairs cannot work, use :imap ( to check if the map is corrected.
The correct map should be <C-R>=AutoPairsInsert("\(")<CR>
Or the plugin conflict with some other plugins.
use command :call AutoPairsInit() to remap the keys.
  • How to insert parens purely

    There are 3 ways

    1. use Ctrl-V ) to insert paren without trigger the plugin.

    2. use Alt-P to turn off the plugin.

    3. use DEL or x to delete the character insert by plugin.

Known Issues

There are the issues I cannot fix.

Compatible with Vimwiki - issue #19

Description: When works with vimwiki `<CR>` will output `<SNR>xx_CR()`
Reason: vimwiki uses `<expr>` on mapping `<CR>` that auto-pairs cannot expanding.
Solution A: Add

    " Copy from vimwiki.vim s:CR function for CR remapping
    function! VimwikiCR()
      let res = vimwiki#lst#kbd_cr()
      if res == "\<CR>" && g:vimwiki_table_mappings
        let res = vimwiki#tbl#kbd_cr()
      return res
    autocmd filetype vimwiki inoremap <buffer> <silent> <CR> <C-R>=VimwikiCR()<CR><C-R>=AutoPairsReturn()<CR>

to .vimrc, it will make vimwiki and auto-pairs 'Return' feature works together.

Solution B: add `let g:AutoPairsMapCR = 0` to .vimrc to disable `<CR>` mapping.

Compatible with viki - issue #25

Description: When works with viki `<CR>` will output viki#ExprMarkInexistentInElement('ParagraphVisible','<CR>')
Reason: viki uses `<expr>` on mapping `<CR>` that auto-pairs cannot expanding.
Solution A: Add 

    autocmd filetype viki inoremap <buffer> <silent> <CR> <C-R>=viki#ExprMarkInexistentInElement('ParagraphVisible',"\n")<CR><C-R>=AutoPairsReturn()<CR>` 

to .vimrc, it will make viki and auto-pairs works together.

Solution B: add `let g:AutoPairsMapCR = 0` to .vimrc to disable `<CR>` mapping.

Remarks: Solution A need NOT add `let g:AutoPairsMapCR = 0` to .vimrc, if Solution A still cannot work, then have to use Solution B to disable auto-pairs `<CR>`.

Breaks '.' - issue #3

Description: After entering insert mode and inputing `[hello` then leave insert
             mode by `<ESC>`. press '.' will insert 'hello' instead of '[hello]'.
Reason: `[` actually equals `[]\<LEFT>` and \<LEFT> will break '.'
Solution: none


Something went wrong with that request. Please try again.