Vim C言語系の構文を持つプログラム言語用にVimを最適化する

動作

1.;が押された時に;+改行 ※文字列,文字,コメント中では改行しない
2.if文やfor文の(){}を以下のように補完する

if;と入力すると
  ↓
if ( ←ここにカーソル ) {
}
.vimrc
"if, else, else-if, switch, for, while, do-while文の入力補助
function AutoEndForC()
  let line = strpart(getline('.'), 0, col('.'))
  "if, else, else-if, switch, for, while, do
  let serchWords = [
    \ '^\t*if$',
    \ '^\t*} \=else$',
    \ '^\t*} \=else if$',
    \ '^\t*switch$',
    \ '^\t*for$',
    \ '^\t*while$',
    \ '^\t*do$'
    \ ]
  let endsStatements = [
    \ "\ (  ) {\n}\<Esc>0b4\<LEFT>a",
    \ "\ {\n}\<Esc>0b",
    \ "\ (  ) {\n}\<Esc>0b4\<LEFT>a",
    \ "\ (  ) {\n}\<Esc>0b4\<LEFT>a",
    \ "\ (  ) {\n}\<Esc>0b4\<LEFT>a",
    \ "\ (  ) {\n}\<Esc>0b4\<LEFT>a",
    \ "\ {\n} while(  );\<Esc>3\<LEFT>a"
    \]
  let i = 0
  for regexp in serchWords
    if line =~ regexp
      return endsStatements[i]
    endif
    let i = i + 1
  endfor
  return "NF"
endfunction

"セミコロンが押されたとき一緒に改行する。
function AutoSemicolonEnterForC()
  let line = strpart(getline('.'), 0, col('.') - 1)
  if line =~ '^\t*for \=('
    "for文を記述中
    return ";"
  else
    let words = [
      \ "cString",
      \ "cCppString",
      \ "cCharacter",
      \ "cComment",
      \ "cCommentStart",
      \ "cCommentL",
      \ "javaString",
      \ "javaCharacter",
      \ "javaComment",
      \ "javaLineComment",
      \ "javaScriptStringD",
      \ "javaScriptStringS",
      \ "javaScriptComment",
      \ "javaScriptLineComment"
      \ ]
    let s = synIDattr(synID(line("."),col("."),0),"name")
    for word in words
      if s == word
        return ";"
      endif
    endfor
    return ";\<CR>"
  endif
endfunction

function GetSemicolonForC()
  "自動的に(){}を付与する
  let result =  AutoEndForC()
  if result == "NF"
    ";+改行 or ;
    return AutoSemicolonEnterForC()
  endif
  return result
endfunction

au FileType c,cpp,java,javascript inoremap <expr> ; GetSemicolonForC()