Emacs で編集した subversion コミットメッセージのバックアップをやめる

ワーキングツリーに svn-commit.tmp~ がとっちらかって嫌になっていたので、ようやく重い腰をあげて対処。

以下を ~/.emacs に追加。

(setq backup-enable-predicate
      '(lambda (path)
         (and (normal-backup-enable-predicate path)
              (let ((name (file-name-nondirectory path)))
                (or (< (length name) 10)
                    (not (string-equal "svn-commit" (substring name 0 10)))))
              )))

オリジナルのアイデアEmacsTips - wiki.bazaar.canonical.com。あわせて公式マニュアルを参考に。

ファイルを編集する際、 backup-enable-predicate という関数がファイルの絶対パスを引数にして呼ばれ、これが nil (偽)を返すとバックアップなしになる。また backup-enable-predicate の規定の動作は normal-backup-enable-predicate だということ。

ということで、規定動作に加えてファイル名が svn-commit ではじまったらバックアップしないという条件を追加した。(当初 normal-backup-enable-predicate の結果と or で結んだため、期待通りにバックアップ除外されずに悩んだことを白状しておこう。白状してどうにかなるわけではないけれど)

将来の自分のために追加補足しておく。 backup-enable-predicate がバックアップ対象を決める述語であることに対して、ここでの興味はバックアップ除外対象を探しているというので話が面倒になっている。
(file-name-nondirectory path) で path のうちディレクトリー部分を除いたファイル名を取り出し、これを let 式で name に束縛。 name が 10 文字未満の場合は svn-commit (10 文字) ではじまらないことが確定しているため、バックアップ対象に含める((< (length name) 10) で検査)。
次に svn-commit ではじまらなければバックアップ対象、という条件を指定。あらかじめ 10 文字未満は切り捨てているため (substring name 0 10) で name 文字列先頭から 10 文字とって、これを svn-commit と比較。等しくなければバックアップ対象、という構成。
さらに先に検査している normal-backup-enable-predicate の結果とあわせてバックアップ対象判定が出たときに限りバックアップが作成される。

それにしても emacs lisp、使ってないからというところが大きいのだろうけれど、もうひとつ体に入ってこない。 setq で関数を値に設定するときに quote しないとダメとか、難しい。 quote せずに渡すと、その場で関数評価される …んだろうな。でも引数も与えてないのにどう評価にまわるっていうんだこんちくしょー。