ブログ記事からの転載です。
最近…というか asterisk.vim を使い始めた頃に(いまさら)dot repeat にはまっていたりします。
例えば、asterisk.vim を利用すると <Plug>(asterisk-z*)cgn
というキー入力で
『カーソル下の単語を変更し、dot repeat で次の単語も同じ変更をする』
という事ができます。
dot repeat をうまく活用できなかった勢としては、これがかなり衝撃的でめちゃくちゃ便利でした。
が、これにも欠点があり(asterisk.vim を使う上でしょうがないんですが)『カーソル下の単語』しか対象にする事ができません。
textobj を多用する Vim でこれはちょっと不便だったので、operator-exec_commandにヘルパ関数を追加し、もう少し柔軟性を高くしてみました。
operator#exec_command#mapexpr_gn({operator}[, {noremap}])
このヘルパ関数は『{motion} のテキストを @/ に保存したあとに {operator}gn を行う operator のキーマッピング』を返します。
例えば c
で dot repeat したい場合は以下のような設定になります。
" C{motion} で {motion} のテキストに対して dot repeat する事ができる
nmap <expr> C operator#exec_command#mapexpr_gn("c",1)
これにより任意の textobj({motion})に対して dot repeat する事ができるようになります。
また、c
以外のも <Plug>(operator-replace)
などを適用することもできます。
nmap <expr> S operator#exec_command#mapexpr_gn("\<Plug>(operator-replace)")
これでかなり捗るようになった。