smartinput.vim を入れてみた

重い腰を上げて今まで食わず嫌いだった smartinput.vim 入れてみた。


入れてみて少し試してみたんですがやっぱりどーしてもデフォルトの設定だと誤爆が多すぎてストレスが爆発しそうだったので結局自分で0から設定することに…。
とりあえず、括弧の削除は誤爆が多かったので挿入メインで設定してみました。
以下、いろいろと設定した結果。

function! s:set_smartinput(rule)
    call smartinput#define_rule(a:rule)
    let ignore_rule = a:rule

   " String と Comment の syntax は無視する
    let ignore_rule.syntax = ["String", "Comment"]
    let ignore_rule.input = ignore_rule.char
    call smartinput#define_rule(ignore_rule)
endfunction

call s:set_smartinput({'at': '\%#',     'char': '[',    'input': '[]<Left>'})
call s:set_smartinput({'at': '\%#]',    'char': '[',    'input': '['})
call s:set_smartinput({'at': '\[\%#\]', 'char': ']',    'input': '<Right>'})
call s:set_smartinput({'at': '\[\%#\]', 'char': '[',    'input': '[]<Left>'})


for [begin, end] in [['(', ')'], ['{', '}'], ['<', '>']
    let bracket = begin.end
    call s:set_smartinput({'at': '\%#',     'char': begin, 'input': bracket.'<Left>'})
    call s:set_smartinput({'at': '\%#'.end, 'char': begin, 'input': begin})

    call s:set_smartinput({'at': begin.'\%#'.end, 'char': end,   'input': '<Right>'})
    call s:set_smartinput({'at': begin.'\%#'.end, 'char': begin, 'input': bracket.'<Left>'})
endfor


文字列リテラル内やコメント時には自動挿入しないようにしました。
ルールの追加自体は smartinput#define_rule() で割と柔軟にできるぽいので、そこそこいい感じ。
ただ、追加は柔軟にできるけど ignore や削除みたいな事ができないのでちょっとつらいところ。
一応、特定の syntax や filetype のみ動作させることはできるぽいんだけど、その逆ができないのがなー。
まぁとりあえずこれで少し様子見てみます。
あと '" の補完は括弧以上に誤爆が多かったのでとりあえず保留。