Vm で特定の条件でのみ <C-a> でインクリメントしないようにする
元ネタ
vim使っててインクリメント/デクリメントしようとして、たまにCTRL + aで減少して、CTRL + xで増加することがあってなんでかなー、って思ってたら"id-2"みたいなときなのに気づいた。-2って認識してるのね。
— Tomotaka Sakuma (@tmtk75) 2015, 5月 13
わたしもたまにアアアアアとなってしまう事があったので、雑に書いてみた。
コード
" 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>")
上の処理は『特定のパターンでのみインクリメント(デクリメント)しない』というアプローチになります。
また、マッチしなかった場合に逆のインクリメントを行うことで擬似的に『特定のパターンのみ逆にする』という感じになります。
ただ、結構尖った実装になってしまったのでプラグイン化するかどうかは悩みどころ。
ちなみにわたしとは別アプローチで実装したプラグインがすでにあったりします。
あとどうせプラグイン化するなら
@pink_bangbi @tmtk75 あと、私はc-a,c-xでカーソルが動くのが気に入らなくて、そこの挙動も変更してたりします
— 暗黒美夢王(暗黒美夢女王募集中) (@ShougoMatsu) 2015, 5月 13
というのも対応したいところですね。