Vimで隣接した括弧の開き記号を消すと同時に閉じ記号も削除するスクリプト


Vimで以下のように,

inoremap { {}<LEFT>
inoremap [ []<LEFT>
inoremap ( ()<LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>

括弧/クォートの開き記号の入力時に閉じ記号を補完する方法が知られている.

この設定下で,誤入力した括弧/クォートを削除をする際,補完された閉じ記号も削除しなければならない.( 2,3個ほどキーを入力が必要)これは非常に手間である.

そこで,挿入モードでの BackSpace を,隣接した括弧/クォートの開き記号を消すときに限りもう一方も削除するように割り当てる.以下がそのスクリプトである.

function! DeleteParenthesesAdjoin()
    let pos = col(".") - 1  " カーソルの位置.1からカウント
    let str = getline(".")  " カーソル行の文字列
    let parentLList = ["(", "[", "{", "\'", "\""]
    let parentRList = [")", "]", "}", "\'", "\""]
    let cnt = 0

    let output = ""

    " カーソルが行末の場合
    if pos == strlen(str)
        return "\b"
    endif
    for c in parentLList
        " カーソルの左右が同種の括弧
        if str[pos-1] == c && str[pos] == parentRList[cnt]
            call cursor(line("."), pos + 2)
            let output = "\b"
            break
        endif
        let cnt += 1
    endfor
    return output."\b"
endfunction
" BackSpaceに割り当て
inoremap <silent> <BS> <C-R>=DeleteParenthesesAdjoin()<CR>

Mac OS X上のコンソール版Vimで動作が確認できた.
しかし,MacVim-KaoriYa(香り屋パッチ版MacVim)では日本語入力で不具合が発生するため,以下のようにCtrl-Hで代用した.

" Ctrl-Hに割り当て
inoremap <silent> <C-h> <C-R>=DeleteParenthesesAdjoin()<CR>
参考にしたサイト

Vimスクリプトリファレンス — 名無しのvim使い
Vim エディターのスクリプトの作成/ 第 2 回 ユーザー定義関数