2012/11/02

Vimで括弧の補完とそのトグル

Vimのmapについて調べると
下記の括弧保管をよく見かけます。

(* → ()*

() → (*)

※アスタリスクはカーソル位置

便利な時もありますが
ターミナルにコピペするときなどは邪魔です
(クリップボードと連携取ればいいんだろうけど…)

使いやすいようにスクリプトを書いてコマンドで切り替えられるようにしました。

" 自動で括弧内に移動を切り替え
function! g:toggleAutoBack()
 if(0 == g:autoBackState)
  inoremap {} {}<Left>
  inoremap [] []<Left>
  inoremap () ()<Left>
  inoremap "" ""<Left>
  inoremap '' ''<Left>
  inoremap <> <><Left>
  if !has('vim_starting')
   echo "AutoBack is ON"
  endif
  let g:autoBackState = 1
 else
  iunmap {}
  iunmap []
  iunmap ()
  iunmap ""
  iunmap ''
  iunmap <>
  
  if !has('vim_starting')
   echo "AutoBack is OFF"
  endif
  
  let g:autoBackState = 0
 endif
endfunction

" 起動時のみ自動実行
if !exists("g:autoBackState")
 " 初期値
 let g:autoBackState = 0
 call g:toggleAutoBack()
endif

" 括弧移動切り替え
nnoremap taub :call g:toggleAutoBack()<Return>

" 自動で括弧を閉じる
function! g:toggleAutoPair()

 " 重くなるだけなのでOFF
 if(1 == g:autoBackState)
  call g:toggleAutoBack()
 endif

 if(0 == g:autoPairState)
  inoremap { {}
  inoremap [ []
  inoremap ( ()
  inoremap " ""
  inoremap ' ''
  inoremap < <>
  if !has('vim_starting')
   echo "AutoPair is ON"
  endif
  let g:autoPairState = 1
 else
  iunmap {
  iunmap [
  iunmap (
  iunmap "
  iunmap '
  iunmap <
  
  if !has('vim_starting')
   echo "AutoPair is OFF"
  endif
  
  let g:autoPairState = 0
 endif
endfunction

" 起動時のみ自動実行
if !exists("g:autoPairState")
 " 初期値
 let g:autoPairState = 0
 " call g:toggleAutoPair()
endif


" 自動括弧閉じ切り替え
nnoremap taup :call g:toggleAutoPair()<Return>


AutoPairは標準でOffにしてます。

書いてからなんだけどそこまで便利でもないかな…