multiverse.elで現在のファイルのスナップショットを取る
プログラミングしているとき、実験的修正をしたくなることがあるだろう。もし実験が失敗したときに元に戻す…なんてことは日常茶飯事だ。
RCS、CVS、Subversionなどのバージョン管理システムはまさしくそれをやっているのだが、未完成のままではコミットはできない。たとえば、複数の(細かな)実装が思い付いたとき、どっちかひとつをコミットしたいなんて場合とか。
そんなときはバックアップコピーを作成していつでも戻れるようにするべきだが、それをやるのはかなり面倒だ。そこでmultiverse.elが役立つ。
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/multiverse.el
multiverse.elは現在のファイルのスナップショットを取る。
M-x multiverse-storeで名前をつけてスナップショットを保存する。
M-x multiverse-restoreで保存したスナップショットに戻る。undoも効くから取り消すこともできる。
M-x multiverse-forgetでスナップショットを削除する。これは選択後にやろう。
M-x multiverse-diff-currentとM-x multiverse-diff-otherはスナップショットとのdiffを取る。
ちなみに作者はanything.elの原作者Tamas Patrovics氏だ。
save-bufferと統合するにはこんなコマンドを定義して、C-x C-sに割り当てよう。C-u C-x C-sでスナップショットを取る。
(defun my-save-buffer (arg) (interactive "P") (if arg (multiverse-store) (save-buffer)))
いちいちキーを割り当てるのも面倒だしコマンドを忘れそうなので、multiverse-storeを実行したバッファでのみ候補が表示されるようにしてみた。文脈に応じて最適なコマンドを提示するanything.elのソース - http://rubikitch.com/に移転しましたで
(setq anything-kyr-functions `((lambda () (when (assoc (current-buffer) multiverse-stored-versions) (list "multiverse-restore" "multiverse-diff-current" "multiverse-diff-other" "multiverse-forget"))) ;; 他の設定は略))
もちろん anything-c-source-kyr を anything-sourcesに登録することを忘れずに。
それにしても、なんでEmacsにはこういう機能がもともとなかったのだろう!?10年前にあって然るべきだと思う。