multiverse.elで現在のファイルのスナップショットを取る

プログラミングしているとき、実験的修正をしたくなることがあるだろう。もし実験が失敗したときに元に戻す…なんてことは日常茶飯事だ。
RCSCVSSubversionなどのバージョン管理システムはまさしくそれをやっているのだが、未完成のままではコミットはできない。たとえば、複数の(細かな)実装が思い付いたとき、どっちかひとつをコミットしたいなんて場合とか。
そんなときはバックアップコピーを作成していつでも戻れるようにするべきだが、それをやるのはかなり面倒だ。そこで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年前にあって然るべきだと思う。