nashcft's blog

時々何か書く。

TortoiseHg (+Mercurial)のmerge toolやdiff toolがちゃんと使えるようになるまで

ひょんな事からLinux上でTortoiseHgを使う事になったがdiff toolやmerge toolにgvimdiffを設定した所上手く起動せず、二進も三進もいかなくなってtwitterでぼやいたら入門TortoiseHg+Mercurialの著者フジワラさん(@flyingfoozy)を始め複数人の方に助けていただいたので、教えていただいた内容をまとめます。
なおこの記事は私のケースと同じくgvimdiffを設定する場合のみ扱っています。より一般的な情報についてはフジワラさんによる解説記事を参照してください。

スタート地点

行き詰まっていた時点ではTortoiseHgから動かす事を一旦諦め、ターミナル上で動作確認している所でした。 その時の設定は、[extdiff]セクションでvimdiff, gvimdiffの呼び出し定義をして、[merge-tools]についてはmercurial(TortoiseHgではない)のレポジトリにあったmergetools.hgrcをincludeする形で設定していました。
そちらの記述を抜粋すると以下のようになります。

gvimdiff.args=--nofork -d -g -O $local $other $base
gvimdiff.regkey=Software\Vim\GVim
gvimdiff.regkeyalt=Software\Wow6432Node\Vim\GVim
gvimdiff.regname=path
gvimdiff.priority=-9

vimdiff.args=$local $other $base -c 'redraw | echomsg "hg merge conflict, type \":cq\" to abort vimdiff"'
vimdiff.check=changed
vimdiff.priority=-10

このときvimdiffは動いたがgvimdiffは動かない、という状況だったのでvimdiffの設定に寄せたりもしましたが、それでも動かない。

状態

hg extdiff -p gvimdiffなりhg gvimdiffなりで実行してもPress ENTER ...とだけ表示が出て、キーを押したあとは空白のファイルが表示されるだけでした。リビジョン指定して実行するとswpファイルがすでに存在している旨のエラーが出ました。後に指摘を頂いて気づいた事ですが、gvimdiffが起動した直後にhgが終了していました。

解決

vimdiff側に設定を寄せていた為--noforkオプションが抜けていた事、及び[merge-tools]セクションでdiffargsオプションが設定されていなかった事が原因でした。どうやらargsオプションは適用されないようです。
以下は現在の私の設定です。3way差分表示にも対応させる為にdiff3argsも設定してあります。

...
[extdiff]
cmd.vimdiff = vimdiff
cmd.gvimdiff = gvimdiff
...
[merge-tools]
gvimdiff.diffargs = --nofork -d -g $parent $child
gvimdiff.diff3args = --nofork -d -g $parent1 $parent2 $child
gvimdiff.priority=-9

# copy from hg/contrib/mergetools.hgrc
vimdiff.args=$local $other $base -c 'redraw | echomsg "hg merge conflict, type \":cq\" to abort vimdiff"'
vimdiff.check=changed
vimdiff.priority=-10
...

この件についてメンションを送ってくださった方々、特に事の始まりから最後まで丁寧に助言を下さったフジワラさん、本当にありがとうございました。
あと最初に紹介してくださった記事に解決方法が載ってたのに気づかないまま事を長引かせてしまって申し訳ありませんでした。