dsvn.el から Subversion をつかう
dsvn.el をつかうと Emacs のなかから Subversion が使えるようになる。
どう便利なのか?
エディタで編集がおわったら M-x svn-status として、ディレクトリ名をいれる。

すると、そのディレクトリで svn status をしたようなバッファができる。

ここで main.c のある行にカーソルを移動して = を押せば、下に svn diff の結果が表示される。

diff に問題がなければいい。もし変なものが混じっていることに気づいたら、この diff の結果のバッファにカーソルを移して return すれば、その diff のファイルの該当行に飛んで、すぐ編集ができる。

この status, diff, ファイルの編集、とをパチパチ切り替えられるのはかなり便利だと思う。大きめのブランチのマージでも、status をインクリメンタルサーチして M なファイルを確認、C なファイルを編集、と進めていける。
細かい使い方は status のところで ? でヘルプが出てくるので、それを参照してください。
diff を化けなくする
ここからもう応用です。
レポジトリに EUC-JP なものと UTF-8 のものが混じっているような事態のときは svn (1) の出力を lv で変換して diff が化けないようにしている。
まず、こういう svn-with-lv を $PATH の通ったところに置く。$LANG を明示的に指定しているのは Carbon Emacs というか Mac 対策なので、普通の Unix だったらいらないはず。
#! /bin/sh export LANG='ja_JP.UTF-8' svn "$@" | lv | cat
これを dsvn.el が使う svn として指定すればいい。
(setq svn-program "svn-with-lv")
コミットメッセージにパスをいれる
関わっているものに、コミットメッセージに以下のようなパスをいれるルールのレポジトリがある。
[branches/ruby-19] lambda とか長いの書かなくてよくなった
パス部分は機械的に決まるので Emacs にいれさせている。dsvn.el にはやや hook が足りないので advice でなんとかした。
(defadvice svn-commit (around dsvn-commit-with-message activate)
(let ((url (apply 'buffer-substring svn-url-label)))
(cond ((string-match "^.+?:/+example\.org/\\(.*\\)$" url)
(let ((path (match-string 1 url)))
ad-do-it
(insert (format "[%s] " path)) ))
(t
ad-do-it) )))
これで example.org/branches/… にコミットするときは [branches/...] と入力されかけたバッファが開くようになる。