lexima.vim で ignore を設定できるようなヘルパ関数を書いてみた

lexima.vim で特定の条件で補完をしてほしくない場合は次のように設定する必要があります。

" (| を入力した時に () の補完を行う
call lexima#add_rule({'char': '(', 'input_after': ')'})

" ただし、以下の場合は補完しない
" |) の場合は補完しない
call lexima#add_rule({'char': '(', 'input': '(', 'at': '\%#)'})

" コメント内では補完しない
call lexima#add_rule({'char': '(', 'input': '(', 'syntax' : 'Comment'})

" 文字列内では補完しない
call lexima#add_rule({'char': '(', 'input': '(', 'syntax' : 'String'})

上記のような設定では重複する部分がいくつか出てきます。
と、いうことで上記のように『特定の場合に設定を無視する』ようなことを簡単にできるヘルパ関数を書いてみました。

function! s:as_list(a)
    return type(a:a) == type([]) ? a:a : [a:a]
endfunction

function! s:add_ignore_rule(rule)
    let rule = copy(a:rule)
    let rule.input = rule.char
    let rule.input_after = ""
    call lexima#add_rule(rule)
endfunction


function! s:add_rule(rule, ...)
    call lexima#add_rule(a:rule)
    if a:0 == 0
        return
    endif

    for ignore in s:as_list(a:1)
        call s:add_ignore_rule(extend(copy(a:rule), ignore))
    endfor
endfunction


" 第二引数に無視する条件の rule を渡す
call s:add_rule({'char': '(', 'input_after': ')'},[
\   {'at': '\%#)'},
\   {'syntax' : 'Comment'},
\   {'syntax' : 'String'},
\])

使い方は s:add_rule() の第二引数に『無視する条件の rule』をリストで渡すことができます。
これでだいぶ設定がすっきりとしました。