2010-03-02
mercurialのマージ作業をvimで
GUIの無い環境で開発してると手動マージが発生したときに結構たるい作業を強いられる訳です。
<<<<<<<<<local ウオー ========== うおー >>>>>>>>>other
なんてのをテキストエディタでちまちま直す必要があるわけで、めんどい。
マージツールつかえよ
vim様にはマージ機能があるというのは前から知ってて使いたかったんだけど、どうも操作がよくわかんなくて放置していました。
ということで、ちょっと真面目に調べてみた。
設定
まずmercurialの設定
hgrcなどにマージツールとしてvimdiffを使う設定を書く
[ui] merge = vimdiff
使う
confrectが発生するようなマージを行うと、勝手にvimがdiffモードで立ち上がります。
デフォルトでは
マージ結果 | local | other
てな感じに縦3分割されてます。
マージ結果のところにlocalとotherの成果を集めます。
diffの見方とかについては割愛。
作業
下記のコマンドを駆使してよしなにマージしましょう。
- diffg[et] buf
- カレントバッファにbufからカーソル位置に対応するブロックを引っ張ってくる。
- diffpu[t] buf
- カレントバッファのカーソル位置のブロックをbufに突っ込む
- [c
- 前の衝突位置へカーソル移動
- ]c
- 次の衝突位置へカーソル移動
bufはバッファ番号を指定します。デフォルトのままであれば左から1, 2, 3と番号が振られるので
- 結果のところで:diffg 2 = use local
- 〃:diffg 3 = use other
という感じ。
終わったら:wqaなどして結果を保存してvimを終了します。
複数のファイルが衝突していた場合、一つ目を閉じると二つ目のvimが現れます。がんばって全部マージして下さい。
全てのマージが終わったらコミットして終了です。
一工夫
上のままでも悪くはないですが
- :diffgとか毎度打ってらんない
- スクロールめんどい
- なんかどんどん表示が崩れていく
などの不満が出ると思います。
なのでこんな感じにmapを書いてみました。
map dl :diffg 2<CR>:diffupdate<CR>]czz map do :diffg 3<CR>:diffupdate<CR>]czz map dp :diffp 1<CR>:diffupdate<CR>]czz
dl,doはマージ結果のペインで使用する想定、dpはlocal, otherのペインで使用する想定です。
また崩れ対策の為の:diffupdateの実行、次の衝突箇所へのカーソル移動+カーソル行を画面中央に持ってくる までを一撃で。
総評
わるくないです。ソースに謎の<<<<<<<が残ってしまう事も無くなるし。
トラックバック - http://d.hatena.ne.jp/feiz/20100302/1267557399
リンク元
- 53 http://pipes.yahoo.com/pipes/pipe.info?_id=tDfBdGWF3RGl9XNm1L3fcQ
- 3 http://logiq.orz.hm/
- 2 http://74.125.153.132/search?q=cache:NzSgXnrJFUcJ:d.hatena.ne.jp/feiz/20090309/1236625265+velocity+膓????&cd=2&hl=ja&ct=clnk&gl=jp
- 2 http://k.hatena.ne.jp/keywordblog/Mercurial
- 2 http://www.google.co.jp/reader/view/
- 1 http://d.hatena.ne.jp/johzan/
- 1 http://d.hatena.ne.jp/keyword/vim
- 1 http://d.hatena.ne.jp/notify-Notify_user_ifilter?aHR0cDovL2QuaGF0ZW5hLm5lLmpwL2ZlaXovMjAxMDAzMDIvMTI2NzU1NzM5OQ==
- 1 http://k.hatena.ne.jp/keywordblog/vim
- 1 http://reader.livedoor.com/reader/
