commit d4acd6e0148675ab17d7dc2161ab885e57b3ee2d Author: jiangfriend@gmail.com Date: Mon May 23 01:11:23 2011 +0800 release 1.0 diff --git a/README.md b/README.md new file mode 100644 index 0000000..751eaf3 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +Auto Pairs +========== +Insert or delete brackets, parens, quotes in pair. + +Installation +------------ +copy plugin/auto-pairs.vim to ~/.vim/plugin + +Features +-------- +### Insert in pair + + input: [ + output: [|] + +### Delete in pair + + input: foo[ + output: foo + +### Double input open brackets will insert new indented line. + + input: {{ + output: { + | + } + +### Skip closed bracket. + + input: [] + output: [] + +### Ignore auto pair when previous character is \ + + input: "\' + output: "\'" + +Options +------- +* g:AutoPairs + + Default: {'(':')', '[':']', '{':'}',"'":"'",'"':'"'} + +* g:AutoPairsShortcuts + + Default: 1 + + imap 3 shortcuts + jump to next closed bracket. + jump to end of line. + jump to newline with indented. + +TroubleShooting +--------------- + The script will remap keys ([{'"}]) , + If auto pairs cannot work, use :imap ( to check if the map is corrected. + The correct map should be =AutoPairsInsert("\(") + Or the plugin conflict with some other plugins. + use command :call AutoPairsInit() to remap the keys. + diff --git a/plugin/auto-pairs.vim b/plugin/auto-pairs.vim new file mode 100644 index 0000000..7eead0b --- /dev/null +++ b/plugin/auto-pairs.vim @@ -0,0 +1,105 @@ +" Language: JavaScript +" Maintainer: JiangMiao +" Last Change: 2011-05-22 +" Version: 1.0 +" Repository: https://github.com/jiangmiao/auto-pairs +" +" Insert or delete brackets, parens, quotes in pairs. + +if exists('g:AutoPairsLoaded') || &cp + finish +end +let g:AutoPairsLoaded = 1 + +" Shortcurs for +" newline with indetation +" jump to of line +" jmup to next pairs +if !exists('g:AutoPairsShortcuts') + let g:AutoPairsShortcuts = 1 +end + +if !exists('g:AutoPairs') + let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"'} +end + + +function! AutoPairsInsert(key) + let line = getline('.') + let prev_char = line[col('.')-2] + let current_char = line[col('.')-1] + + " Ignore auto close if prev character is \ + if prev_char == '\' + return a:key + end + + " Skip the character if current character is the same as input + if current_char == a:key + return "\" + end + + " Input directly if the key is not an open key + if !has_key(g:AutoPairs, a:key) + return a:key + end + + let open = a:key + let close = g:AutoPairs[open] + + + " Auto return only if open and close is same + if prev_char == open && open != close + return "\\==O" + end + + return open.close."\" +endfunction + + + +function! AutoPairsDelete() + let line = getline('.') + let prev_char = line[col('.')-2] + let pprev_char = line[col('.')-3] + + if pprev_char == '\' + return "\" + end + + if has_key(g:AutoPairs, prev_char) + let close = g:AutoPairs[prev_char] + if match(line,'^\s*'.close, col('.')-1) != -1 + return "\\cf".close + end + end + + return "\" +endfunction + +function! AutoPairsJump() + call search('[{("\[\]'')}]','W') +endfunction + +function! AutoPairsMap(key) + execute 'inoremap '.a:key.' =AutoPairsInsert("\'.a:key.'")' +endfunction + +function! AutoPairsInit() + for [open, close] in items(g:AutoPairs) + call AutoPairsMap(open) + if open != close + call AutoPairsMap(close) + end + endfor + execute 'inoremap =AutoPairsDelete()' + + " If the keys map conflict with your own settings, delete or change them + if g:AutoPairsShortcuts + execute 'inoremap :call AutoPairsJump()a' + execute 'inoremap ' + execute 'inoremap ' + end +endfunction + +call AutoPairsInit()