[Emacs] M-; の連続タイプで => を入力する方法


はじめに

開発効率が256倍になると言われている、るびきち先生の lispxmp や rcodetools の Rust 版を自分用に作ったのだけど M-; の連続タイプで => を入力する方法がわからなかったので先生のコードを参考にしながらコピペ改造してみる。

lispxmp

(defmacro lispxmp-comment-advice (func)
  `(defadvice ,func (around lispxmp-hack activate)
     ,(format "If `%s' is successively called, add => mark." func)
     (if (and (eq major-mode 'emacs-lisp-mode)
              (eq last-command ',func)
              (not (member "=>" (list (ignore-errors (buffer-substring (- (point) 2) (point)))
                                      (ignore-errors (buffer-substring (point) (+ (point) 2)))))))
         (insert " =>")
       ad-do-it)))
(lispxmp-comment-advice comment-dwim)
(lispxmp-comment-advice paredit-comment-dwim)

よくわからないけど major-modeemacs-lisp-mode のときに last-command が指定のコマンドと同じ、つまり2連続のときに insert を実行していることだけはわかる。

rcodetools

(defadvice comment-dwim (around rct-hack activate)
  "If comment-dwim is successively called, add => mark."
  (if (and (eq major-mode 'ruby-mode)
           (eq last-command 'comment-dwim)
           ;; TODO =>check
           )
      (insert "=>")
    ad-do-it))
;; To remove this advice.
;; (progn (ad-disable-advice 'comment-dwim 'around 'rct-hack) (ad-update 'comment-dwim))

こちらは comment-dwim だけに反応するようにしている。
lispxmp の方と比べると TODO のところは M-; を3連続でタイプしたときに insert を実行しないようにする処理だったことがわかる。
とりあえず => がさくっと入力できればよいのでここは省いてよい。

あと自分で advice を書くといつも解除できなくなって困っていたので advice を解除する方法がわかってよかった。

rust-mode 版

完成
(defadvice comment-dwim (around rustxmp-hack activate)
  "If comment-dwim is successively called, add => mark."
  (if (and (eq major-mode 'rust-mode)
           (eq last-command 'comment-dwim)
           ;; TODO =>check
           )
      (insert "=>")
    ad-do-it))
;; To remove this advice.
;; (progn (ad-disable-advice 'comment-dwim 'around 'rustxmp-hack) (ad-update 'comment-dwim))

rcodetools 版をコピペ&一部置換しただけだけどこれで問題なく動いた。

応用

コメントを書くときに TODO:FIXME: などのマークを必ず入れるようにしている場合は => のかわりに入力するようにしても良さそう。