🦬

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

2022/03/27に公開
3

はじめに

開発効率が65536倍になると言われているるびきち先生の 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: などのマークを必ず入れるようにしている場合は => のかわりに入力するようにしても良さそう。

Discussion

oberkoberk

vscodeからEmacsに移行しているのですが、EmacsでおすすめのRustの補完するelがありましたら教えてください。

megetonmegeton

教えてあげれるほど詳しくないんですけど、とりあえずボクはこちらを参考にさせてもらいました。
https://emacs-jp.github.io/env/rust
この記事の通りにやるといろいろ補完やエラーが出るようになりましたよ。
ただ始めたばかりだと、そのありがた味がわからない上にEmacsがもっさりするのでリアルタイムに動く機能はいったん無効にしてしまいました。

oberkoberk

どうもありがとうございます!
ぜひ使ってみます