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