🦬
[Emacs] M-; の連続タイプで => を入力する方法
はじめに
開発効率が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-mode
が emacs-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
vscodeからEmacsに移行しているのですが、EmacsでおすすめのRustの補完するelがありましたら教えてください。
教えてあげれるほど詳しくないんですけど、とりあえずボクはこちらを参考にさせてもらいました。
この記事の通りにやるといろいろ補完やエラーが出るようになりましたよ。ただ始めたばかりだと、そのありがた味がわからない上にEmacsがもっさりするのでリアルタイムに動く機能はいったん無効にしてしまいました。
どうもありがとうございます!
ぜひ使ってみます