vc-modeをトグルする

昨日ぐらいから FreeBSDEmacsがもっさりするし、やたら落ちるしって
ことで topを眺めていると gitが動きまくっていることがわかった。
なんで今までそうならなかったのかがよくわからないけど、vc-gitだと
裏でやたらと gitが動いてdiffを取ったりしているようです.


メモを書きためているディレクトリなら何の問題もなかったんですが、
NetBSDFreeBSDカーネル内のファイルを見ていると問題が発生した
のでこれは offにするしかないってことで調べてみました。


vc-modeは vc-handled-backendsリストに格納される Version管理システム下で
ソースを開くと有効になるようです。直接無効にするような関数はちらっと
見た限りではありませんでした。なんで vc-handled-backendsリストを
操作して、トグルを実現します。試してみたところ、リストを操作して
バッファを再読込すると、うまく切り替わりました。


コードは以下のような感じです。

(require 'cl)
(setq toggle-vc-list '(Git SVN))
(defun toggle-vc-mode ()
  "toggle vc-mode"
  (interactive)
  (if (intersection vc-handled-backends toggle-vc-list)
      (setq vc-handled-backends (set-difference vc-handled-backends toggle-vc-list))
    (setq vc-handled-backends (union vc-handled-backends toggle-vc-list))))

;; for auto reload buffer 自己責任でお願いします。
(global-auto-revert-mode 1)

toggle-vc-listに格納されているリストが vc-handled-backendsに含まれて
いたらそれを取り去り、含まれていなければリストに足すというものです。
intersection, set-difference, unionはそれぞれ積集合、差集合、和集合を
返す関数です。なんか集合関数ばっかりになってしまいました。


バッファの切り替えのために最後に revert-bufferを呼ぶようにしたんだけど、
変更を保存していないときだけ、リロードしますかと表示する方法がわから
なかった。optionalな引数で 'noconfirm'っていうのがあるんだけど、
これを non-nilにすると、保存していなくてもリロードしてしまい、
変更が失われてしまったのでやめました。そのあたりは自己責任で
なんとかしてください。


まあもうちょっと良いマシン使ったらマシなんでしょうけど。
会社のなんであんまり贅沢言えないので、これで我慢します。


追記
はじめに設定したマシンではなんともなかったんだけど、他のマシンで
設定してみたら max-specpdl-sizeと max-lisp-eval-depthでエラーが
出てしまった。それに該当する部分はなさそうなんだけど・・・。
とりあえず上限値を増やすことで解決しました。


ちゃんと見る必要がありそうですけどね。

(setq max-specpdl-size 5000)
(setq max-lisp-eval-depth 5000)