コメント内と文字列内で electric-pair-mode を無効化する

今まで対応する括弧などが勝手に挿入されるのを嫌っていたんですが、慣れればそっちの方が作業効率高いかと思い、Emacs 24.1 から組み込みの electric-pair-mode を試しています。
electric-pair-mode は、単語の手前でクォートを挿入した場合は対応するクォートを挿入しないなど、ちょっとした気遣いがあって好感が持てます。1

そんな気遣いがあるのに、コメント内や文字列内でも対応する括弧・クォートが挿入されるのが鬱陶しいです。
例えば、コメントや文字列で “Don’t” とか書きたい場合にアポストロフィを入力したところで 2 つのシングルクォートが挿入されます。
また、単語の手前でクォートを挿入した場合に対応するクォートが挿入されないということは、以降どこかに手動でクォートを挿入しないといけないわけですが、手動で挿入した時に 2 つクォートが挿入されることになります。

というわけで次のような advice を定義して、コメント内または文字列内の場合は electric-pair-post-self-insert-function を実行しないようにしました。

(defadvice electric-pair-post-self-insert-function
  (around electric-pair-post-self-insert-function-around activate)
  "Don't insert the closing pair in comments or strings"
  (unless (nth 8 (save-excursion (syntax-ppss (1- (point)))))
    ad-do-it))

このように、around-advice を定義することで、対応する括弧・クォートが挿入されるとお節介な場合を除外することができるのでかなり融通が効きそうです。

  1. 単語の手前でクォートを挿入するということは、多くの場合その単語、またはその単語で始まる後続の文を括りたい場合なので、対応するクォートまで挿入されても削除するだけですよね