Vm で特定の条件でのみ <C-a> でインクリメントしないようにする

元ネタ

わたしもたまにアアアアアとなってしまう事があったので、雑に書いてみた。

コード

" Need vital-Coaster : https://github.com/osyo-manga/vital-coaster
let s:Buffer = vital#of("vital").import("Coaster.Buffer")


function! s:count(pattern, then, else)
    let word = s:Buffer.get_text_from_pattern(a:pattern)
    if word !=# ""
        return a:then
    else
        return a:else
    endif
endfunction


" 第一引数に <C-a> を無視するパターンを設定
" 第二引数に無視した場合の代替キーを設定
function! s:increment(ignore_pattern, ...)
    let key = get(a:, 1, "")
    return s:count(a:ignore_pattern, key, "\<C-a>")
endfunction


function! s:decrement(ignore_pattern, ...)
    let key = get(a:, 1, "")
    return s:count(a:ignore_pattern, key, "\<C-x>")
endfunction


" - の前に空白文字以外があれば <C-x> を、それ以外は <C-a> を呼ぶ
" -423  ←これは <C-a> される
" d-423 ←これは <C-x> される
nnoremap <expr> <A-a> <SID>increment('\S-\d\+', "\<C-x>")

" - の前に空白文字以外があれば <C-a> を、それ以外は <C-x> を呼ぶ
nnoremap <expr> <A-x> <SID>decrement('\S-\d\+', "\<C-a>")

上の処理は『特定のパターンでのみインクリメント(デクリメント)しない』というアプローチになります。
また、マッチしなかった場合に逆のインクリメントを行うことで擬似的に『特定のパターンのみ逆にする』という感じになります。
ただ、結構尖った実装になってしまったのでプラグイン化するかどうかは悩みどころ。
ちなみにわたしとは別アプローチで実装したプラグインがすでにあったりします。

あとどうせプラグイン化するなら

というのも対応したいところですね。