閉じ括弧の自動入力(thincaの場合)

http://d.hatena.ne.jp/ns9tks/20081005/1223173570
たまに見かける閉じ括弧を自動で補完するvimのkey mapping、私は一切やってません。
が、括弧を多用しまくるSchemeの場合だけは別で、ftplugin/scheme.vimには↓みたいになってます。

" 現在位置の構文グループの名前。リンクは解決済み
function! s:getSyntaxName()
  let col = col('.')
  if col == col('$')
    let col -= 1
  endif
  return synIDattr(synIDtrans(synID(line("."), col, 1)), "name")
endfunction

function! s:isDisablePareAssist()
  let synname = s:getSyntaxName()
  return synname ==? 'Constant' || synname ==? 'Comment'
endfunction

" 開き括弧の直前で(を押した時、既にある括弧全体を囲む
" そうでなければ()にして間にカーソルを置く
" ただし文字列中やコメント中は何もしない
function! s:overwrapPare()
  if s:isDisablePareAssist()
    return "("
  elseif getline('.')[col('.') - 1] == '('
    return "\<C-o>%)\<C-o>h\<C-o>%("
  endif
  return "()\<Left>"
endfunction

" 次の文字が ')' だった時指定したキーを押す
function! s:skipClosePare(defkey,altkey)
  if !s:isDisablePareAssist() && getline('.')[col('.') - 1] == ')'
    return a:altkey
  endif
  return a:defkey
endfunction

" ()の真ん中で指定キーを押した時)を消す
function! s:delPare(defkey)
  if !s:isDisablePareAssist() && getline('.')[col('.') - 2] == '('
    return a:defkey . s:skipClosePare("", "\<Del>")
  endif
  return a:defkey
endfunction

" 閉じ括弧も同時入力
inoremap <buffer> <expr> ( <SID>overwrapPare()
" タブで閉じ括弧をスキップ
inoremap <buffer> <expr> <Tab> <SID>skipClosePare("\<Tab>", "\<Right>")
" )でも余計にはさまずスキップ(使いづらかったら削除)
inoremap <buffer> <expr> ) <SID>skipClosePare(")", "\<Right>")

" ()の真ん中で(を消した時)も消す
inoremap <buffer> <expr> <BS> <SID>delPare("\<BS>")
inoremap <buffer> <expr> <C-H> <SID>delPare("\<C-H>")

閉じ括弧の自動入力のほか、括弧入力直後にBSすると閉じ括弧も一緒に消したり、閉じ括弧の直前でや閉じ括弧を入力すると文字を入力せずに閉じ括弧を飛ばしたり。
更に、開き括弧の直前で開き括弧を入れると対応する括弧全体を括弧で囲む。S式全体を別のS式で囲みたい時に便利。
しかも、文字列中やコメント中はこれらの機能が無効になる。

惜しむらくは、私がScheme勉強中なのでまともにSchemeのコードが書けないくらいか…。しかも最近勉強止まってるし。