EmacsでviをエミュレートするViperを強化してVimをエミュレートするようにしたのがVimpulse. ここ最近開発が活発で, 設計もかなりスマートになって, ゆくゆくは本家Viperを置き換えることを目指すまでになっている. 入れる場合は最新版をgit cloneする.
ぼちぼち散歩 Vimでoperator-userを使って他のプラグインをoperatorとして使えるようにしてみたを見て, Vimpulseでもコメントアウト/アンコメントするoperatorがあったら便利そうなので作ってみた.
実はVimpulseの中のvimpulse-operator.elに道具は揃っている. リージョンに対してなにかするコマンドがあれば, それをvimpulse-convert-to-operatorマクロに渡すだけでoperatorが出来上がる. たとえば.emacsで以下のようにしておくと, CCで行をコメントアウト/アンコメントしたり, C$で行末までをコメントアウトしたり, Ciwでカーソル位置の単語だけコメントアウトしたり, Ci(でカーソル位置を囲む括弧の内側をコメントアウトしたりできる.
(vimpulse-convert-to-operator comment-or-uncomment-region) (define-key viper-vi-basic-map (kbd "C") 'comment-or-uncomment-region-operator) (define-key vimpulse-visual-basic-map (kbd "C") 'comment-or-uncomment-region-operator)
追記
requireするだけで使えるようにプラグイン化した. minor-modeになっているので, 特定のバッファで有効/無効にしたりもできる(デフォルトではすべてのバッファで有効).
http://github.com/tarao/vimpulse-plugins/
http://github.com/tarao/vimpulse-plugins/raw/master/vimpulse-operator-comment.el