Wie benutzt man beide Varianten in Ediff?

17

Die Ediff-Oberfläche hat eine +Schaltfläche, aber sie scheint nichts zu bewirken (der Minipuffer zeigt beim Drücken immer "nil" an). Ich dachte, diese Schaltfläche ist für die Verwendung beider Varianten im Ergebnispuffer gedacht.

Wie auch immer, die ursprüngliche Frage lautet: Wie kann Ediff einen Zusammenführungskonflikt lösen, indem der Inhalt aus den beiden Puffern A und B in Puffer C abgelegt wird? (Ich weiß, dass ich C nur bearbeiten kann, hoffe aber, dass dies einfacher möglich ist.)

Angenommen, Datei A lautet wie folgt:

Gleiche Linie

Andere Linie

Gleiche Linie

während Datei B ist:

Gleiche Linie

Noch eine Zeile

Gleiche Linie

Ich möchte, dass die Datei C , das Ergebnis des Zusammenführens von A mit B , so aussieht:

Gleiche Linie

Andere Linie

Noch eine Zeile

Gleiche Linie

wvxvw
quelle
Ich bin mir nicht sicher, ob ich die Frage vollständig verstehe, aber dieser Abschnitt im Ediff-Handbuch zum Zusammenführen diff3kann hilfreich sein .
Tianxiang Xiong
@TianxiangXiong Ich werde ein Beispiel hinzufügen, was ich meine. Ich glaube nicht, dass die verlinkte Handbuchseite dies abdeckt.
wvxvw

Antworten:

7

Siehe diese StackOverflow-Antwort .

Von @ killdash9 :

Durch Drücken von d werden sowohl A als auch B in Puffer C kopiert.

(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)
Tianxiang Xiong
quelle
Da sich das Duplikat auch im StackExchange-Netzwerk befindet (und folglich, wenn die Benutzer zu dieser Site gelangen, können sie auch zu dieser Site gelangen), bin ich dafür , den Code nicht zu kopieren, sondern lediglich auf die Antwort zu verweisen ( als allgemeiner Ansatz für den Umgang mit standortübergreifenden Duplikaten). Auf diese Weise werden keine veralteten Kopien auf anderen Websites angezeigt, wenn die ursprüngliche Antwort verbessert wird. Unabhängig davon, ob sie gewählt wurden oder nicht.
Phils
Ich hatte den Eindruck, dass StackExchange-Sites in der Regel lieber eine Antwort auf die Site selbst haben als nur einen Link. Aber vielleicht ist es anders, wenn der Link eine andere StackExchange-Site ist? / Achselzucken
Tianxiang Xiong
Ich weiß eigentlich nicht, wie die offiziellen Richtlinien lauten, aber ich bin sicher, dass Intra-Netzwerk-Links anders behandelt werden sollten als Out-of-Network-Links. Wenn Sie im Allgemeinen keine Links verwenden, ist die Antwort auch dann verfügbar, wenn die Remote-Quelle nicht verfügbar ist. Ich halte es jedoch für sehr unwahrscheinlich, dass nur ein Teil des StackExchange-Netzwerks zu einem bestimmten Zeitpunkt verfügbar ist. An diesem Punkt stellt sich die Frage, ob es sinnvoll ist, die Antworten auf zwei verschiedene doppelte Fragen aufzuteilen, und ich glaube, das ist so gut wie nie hilfreich. IMO jedenfalls.
Phils
3

Bearbeiten: Das doppelte Q & A auf StackOverflow hat Antworten auf diese Frage (wie von Tianxiang Xiong in den Kommentaren herausgestellt).

Meine Antwort unten hat keinen Sinn, da Sie auf diese Weise offensichtlich nicht das gewünschte Ergebnis erzielen können. Ich Lösche nicht nur, weil die Informationen , die es tut gibt etwas von Bedeutung ist, und vielleicht noch interessante Informationen zu jemandem beweisen.


Persönlich bearbeite ich den Zusammenführungspuffer nur direkt, aber Sie können Emacs beibringen, was zu tun ist, wenn Sie eine Standardanforderung haben.

+Anrufe ediff-combine-diffs:

Kombinieren Sie die N-ten Diff-Bereiche der Puffer A und B und platzieren Sie die Kombination in C. N ist ein Präfixargument. Ist dies nicht der Fall, kombinieren Sie die aktuellen Differenzbereiche. Das Kombinieren erfolgt gemäß den Angaben in Variable ediff-combination-pattern.

welches ist:

Muster, das zum Kombinieren von Differenzbereichen in den Puffern A und B verwendet werden soll. Der Wert muss eine Liste der Form sein, (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) in der Bufspec das Symbol A, B oder Ancestor ist. Wenn der Wert beispielsweise so ist '(STRING1 A STRING2 Ancestor STRING3 B STRING4), sieht der kombinierte Text folgendermaßen aus:

STRING1-
Diff-Region von Variante A
STRING2-
Diff-Region vom Vorfahren
STRING3-
Diff-Region von Variante B
STRING4

Beachten Sie, dass die Varianten mit den normalen Konfliktmarkierungen kombiniert werden, wenn Sie der Meinung sind, dass sie nichts bewirken. Wenn Sie A oder B bereits ausgewählt haben, ist dies standardmäßig +eine Möglichkeit, den ursprünglichen Konflikt wiederherzustellen.

Phils
quelle
Würde ich nicht ediff-combination-patterndie traditionellen Konfliktmarkierungen entfernen, die standardmäßig verwendet werden? Ich würde den Konflikt gerne so lange aufrechterhalten, bis ich ihn mithilfe einer beliebigen Kombination von Unterschieden aus zusammengeführten Dateien behebe.
wvxvw
Die Konfliktmarker stammen von außerhalb von Emacs, daher bezweifle ich, dass dies der Fall ist, aber ich weiß es eigentlich nicht. Versuch es?
Phils
Ich werde, aber später heute. Ich werde es aktualisieren, sobald ich es weiß.
wvxvw
Tatsächlich verarbeitet und konvertiert Right-Ediff alle Konfliktregionen nach diesem Muster, bevor die Puffer angezeigt werden. Sie können jedoch eine benutzerdefinierte Bindung für einen Befehl hinzufügen, der sich ediff-combination-patternan Ihr benutzerdefiniertes Muster bindet und dann aufruft ediff-combine-diffs.
Phils
2
Diese Lösung scheint genau das zu sein, was Sie wollen.
Tianxiang Xiong