dsvn.el から Subversion をつかう

2009-06-14 01:32

dsvn.el をつかうと Emacs のなかから Subversion が使えるようになる。

どう便利なのか?

エディタで編集がおわったら M-x svn-status として、ディレクトリ名をいれる。

M-x svn-status

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

Svn status

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

status to diff

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

diff to buffer

この 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/...] と入力されかけたバッファが開くようになる。

Leave a Reply