wrap-regionを autopairっぽく使う


Emacsには括弧などの対となるものを自動で挿入する各種ツール
ありますが、個人的にその手のツールは苦手です。ごくたまに、
「そこはペアじゃないんですけど」、ってことがあるとイライラ
するということが苦手な原因です。そんなわけで pareditを使って
いる以外は基本的に手動で入力してました。でも今日 wrap-regionを
リージョンサイズ 0で使えばいけるんじゃないかなと思って試してみました。


flex-autopairはコンテキストに応じて、ペア入力するかどうかを
決定できたりと柔軟そうなんですが、今回は採用を見送りました。

設定

wrap-region-after-wrap-hookに hook関数を設定し、左側のペアの
後ろにカーソルを移動しています。激しく内部実装に依存するコードですが、
そのあと Ctrl-fで移動するってなるとタイプ数節約の意味がなくなって
しまうのでこうしています。

(require 'wrap-region)
(wrap-region-global-mode t)

(defun my/wrap-region-zero-width ()
  (let ((region-size (- (region-end) (region-beginning)))
        (wrapper (wrap-region-find (char-to-string last-input-event))))
    (when (and (zerop region-size) wrapper)
      (let ((left (wrap-region-wrapper-left wrapper)))
        (forward-char (length left))))))

(add-hook 'wrap-region-after-wrap-hook 'my/wrap-region-zero-width)

おわりに

wrap-regionを使うとなるとマークをつける(C-SPC)必要があるので、
'()'ってタイプするのと正直変わらないんですけど、
wrap-regionの設定を使えるとか、ペアによってはタイプ数が
節約できるとか、自分でペア入力するかどうかを完全にコントロール
できるとか、個人的にメリット思える部分があったのでこれでいいかな
と思いました。


本来は意識せずに最適なペアを入力してくれるというのがベストなので
人におすすめできるものではありませんが、完全に満足するものが現状
ないので、ここらで手を打っておきます。