Ediffで両方のバリアントを使用する方法は?


17

Ediffインターフェースには+ボタンがありますが、何もしないようです(ミニバッファーを押すと常に「nil」と表示されます)、このボタンは結果バッファーで両方のバリアントを使用するためのものだと思いました。

とにかく、元の質問は次のとおりです:バッファーAとBの両方のコンテンツをバッファーCに入れることで、Ediffでマージ競合を解決するにはどうすればよいですか(Cを編集することはできますが、これをもっと簡単に行えることを願っています)。

ファイルAがこれだとします:

同じ行

別の行

同じ行

ファイルBは次のとおりです。

同じ行

別の行

同じ行

ABにマージした結果のファイルCが次のようになるようにします。

同じ行

別の行

別の行

同じ行


私は質問を完全に理解しているとは思いませんが、このEdiffのマージdiff3に関するマニュアルのセクションは役立つかもしれません
天翔Xiong

@TianxiangXiong私が意味するものの例を追加します。リンクされたマニュアルページがそれをカバーするとは思わない。
wvxvw 16

回答:


7

StackOverflowの回答をご覧ください。

@ killdash9から:

dを押すと、AとBの両方がバッファーCにコピーされます。

(defun ediff-copy-both-to-C ()
  (interactive)
  (ediff-copy-diff ediff-current-difference nil 'C nil
                   (concat
                    (ediff-get-region-contents ediff-current-difference 'A ediff-control-buffer)
                    (ediff-get-region-contents ediff-current-difference 'B ediff-control-buffer))))
(defun add-d-to-ediff-mode-map () (define-key ediff-mode-map "d" 'ediff-copy-both-to-C))
(add-hook 'ediff-keymap-setup-hook 'add-d-to-ediff-mode-map)

重複はStackExchangeネットワークにもあるため(したがって、このサイトにアクセスできる場合は、そのサイトにもアクセスできます)、コードをコピーするのではなく、純粋に答えにリンクすることを好みます(クロスサイトの複製を処理する一般的なアプローチとして)。そうすれば、元の答えが改善されれば、他のサイトに古くなったコピーが漂うことはありません。関係なく、アップ投票。
phils 16

StackExchangeサイトは通常、単なるリンクではなく、サイト自体に回答があることを好むという印象を受けました。しかし、リンクが別のStackExchangeサイトである場合は異なるのでしょうか?/ shrug
Tianxiang Xiong

公式のポリシーが何であるかは実際にはわかりませんが、ネットワーク内リンクはネットワーク外リンクとは異なる方法で処理する必要があると確信しています。一般にリンクを使用しないということは、リモートソースが利用できない場合でも答えにアクセスできることを意味しますが、StackExchangeネットワークの一部のみがいつでも利用できる可能性は非常に低いと思うので、議論はなくなると思います。その時点で、質問は2つの異なる重複する質問に回答を分割することが賢明かどうかであり、私はそれがほとんど役に立たないと信じています。とにかく、IMO。
phils

3

編集:StackOverflow重複するQ&Aには、この質問に対する回答があります(Tianxiang Xiongがコメントで指摘したとおり)。

あなたが明らかに望ましい結果を得ることができないので、以下の私の答えは無駄です。それ提供する情報はある程度関連性があり、それでも誰かに興味深い情報を証明するかもしれないので、私はそれを削除するだけではありません。


個人的には、マージバッファーを直接編集するだけですが、標準的な要件がある場合にEmacsに何をすべきかを教えることができます。

+呼び出しediff-combine-diffs

バッファーAとBのN番目のdiff領域を結合し、その組み合わせをCに配置します。Nは接頭引数です。nilの場合、現在の差分領域を結合します。変数の指定に従って結合が行われます ediff-combination-pattern

これは:

バッファーAとBの差分領域を結合するために使用されるパターン。値(STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) は、bufspecがシンボルA、B、または祖先である形式のリストでなければなりません 。たとえば、値がその場合、 '(STRING1 A STRING2 Ancestor STRING3 B STRING4)結合されたテキストは次のようになります。

STRING1の
バリアントAから差分領域
STRING2の
祖先から差分領域
はstring3の
変異体Bから差分領域
STRING4

何もしていないと思う場合、実際には通常の競合マーカーを使用してバリアントを結合していることに注意してください。つまり、すでにAまたはBを選択している場合、デフォルトで+は元の競合を復元する方法です。


私の変更はediff-combination-pattern、デフォルトで使用される従来の競合マーキングを削除しませんか?マージされたファイルからの差分の組み合わせを使用して解決するまで、競合をそのように保ちたいと思います。
wvxvw

競合マーカーはEmacsの外部で発生しているため、そうではないと思いますが、実際にはわかりません。それを試してみてください?
phils 16

でも、今日は後で。わかったら更新します。
wvxvw 16

実際、そのとおりです。ediffは、バッファーを提示する前に、そのパターンに従ってすべての競合領域を処理および変換します。ただし、コマンドにカスタムバインディングを追加しediff-combination-patternて、カスタムパターンにバインドしてからを呼び出すこともできますediff-combine-diffs
phils 16

2
このソリューションはあなたが望むもののようです。
天翔Xiong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.