Comment utiliser les deux variantes dans Ediff?


17

L'interface Ediff a un +bouton, mais il ne semble rien faire (le mini-tampon affiche invariablement "zéro" lorsque j'appuie dessus), je pensais que ce bouton était destiné à utiliser les deux variantes dans le tampon de résultat.

Quoi qu'il en soit, la question initiale est: comment puis-je faire en sorte qu'Ediff résolve un conflit de fusion en plaçant le contenu des deux tampons A et B dans le tampon C (je sais que je peux simplement modifier C, mais j'espère que cela pourra être fait plus facilement).

Supposons que le fichier A soit le suivant:

Même ligne

Ligne différente

Même ligne

tandis que le fichier B est:

Même ligne

Une autre ligne

Même ligne

Je veux que le fichier C , le résultat de la fusion de A avec B, ressemble à ceci:

Même ligne

Ligne différente

Une autre ligne

Même ligne


Je ne suis pas sûr de bien comprendre la question, mais cette section du manuel Ediff sur la fusion et diff3peut vous aider .
Tianxiang Xiong

@TianxiangXiong Je vais ajouter un exemple de ce que je veux dire. Je ne pense pas que la page de manuel liée le couvre.
wvxvw

Réponses:


7

Voir cette réponse StackOverflow .

De @ killdash9 :

Appuyez sur d pour copier A et B dans le tampon 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)

Étant donné que le doublon se trouve également sur le réseau StackExchange (et par conséquent, si les gens peuvent accéder à ce site, ils pourront également accéder à celui-ci), je suis en faveur de ne pas copier le code, mais simplement de lier à la réponse ( comme une approche générale pour gérer les doublons intersites). De cette façon, si la réponse d'origine est améliorée, il n'y a pas de copies obsolètes flottant sur d'autres sites. Voté, peu importe.
phils

J'avais l'impression que les sites StackExchange préfèrent généralement avoir une réponse sur le site lui-même, plutôt que simplement un lien. Mais c'est peut-être différent si le lien est un autre site StackExchange? / haussement d'épaules
Tianxiang Xiong

En fait, je ne sais pas quelle est la politique officielle, mais je pense certainement que les liaisons intra-réseau devraient être traitées différemment des liaisons hors réseau. Ne pas utiliser de liens en général signifie que la réponse est accessible même si la source distante n'est pas disponible, mais je pense qu'il serait hautement improbable qu'une partie seulement du réseau StackExchange soit disponible à un moment donné, donc je pense que cet argument disparaît; à ce stade, la question est de savoir s'il est judicieux de diviser les réponses entre deux questions en double différentes, et je pense que cela n'est presque jamais utile. OMI, de toute façon.
phils

3

Edit: Le Q&A en double sur StackOverflow a des réponses à cette question (comme l'a souligné Tianxiang Xiong dans les commentaires).

Ma réponse ci-dessous est inutile, car vous ne pouvez évidemment pas obtenir le résultat souhaité de cette façon. Je ne le supprime pas seulement parce que les informations qu'il fournit sont quelque peu pertinentes et pourraient encore s'avérer intéressantes pour quelqu'un.


Personnellement, je modifie simplement le tampon de fusion directement, mais vous pouvez apprendre à Emacs quoi faire si vous avez une exigence standard.

+appelle ediff-combine-diffs:

Combinez Nth diff régions des tampons A et B et placez la combinaison dans C. N est un argument de préfixe. Si nul, combinez les régions de différence actuelles. La combinaison se fait selon les spécifications en variable ediff-combination-pattern.

lequel est:

Modèle à utiliser pour combiner les régions de différence dans les tampons A et B. La valeur doit être une liste de la forme (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) où bufspec est le symbole A, B ou Ancêtre. Par exemple, si la valeur est '(STRING1 A STRING2 Ancestor STRING3 B STRING4)alors le texte combiné ressemblera à ceci:

STRING1
région diff de la variante A
STRING2
région diff de l'ancêtre
STRING3
région diff de la variante B
STRING4

Notez que lorsque vous pensez que cela ne fait rien, il combine en fait les variantes à l'aide des marqueurs de conflit normaux. c'est-à-dire si vous aviez déjà sélectionné A ou B, alors par défaut +est un moyen de restaurer le conflit d'origine.


Ma modification de ne ediff-combination-patternsupprimerait-elle pas les marques de conflit traditionnelles utilisées par défaut? J'aimerais vraiment garder le conflit de cette façon jusqu'à ce que je le résolve en utilisant la combinaison de différences des fichiers fusionnés.
wvxvw

Les marqueurs de conflit proviennent de l'extérieur d'Emacs, donc je doute que ce soit le cas, mais je ne sais pas vraiment. Essayez-le?
phils

Je le ferai, mais plus tard dans la journée. Je mettrai à jour une fois que je sais.
wvxvw

En fait, vous avez raison - ediff traite et convertit toutes les régions de conflit selon ce modèle avant de présenter les tampons. Vous pouvez cependant ajouter une liaison personnalisée pour une commande qui permet de se lier ediff-combination-patternà votre modèle personnalisé, puis d'appeler ediff-combine-diffs.
phils

2
Cette solution semble être ce que vous voulez.
Tianxiang Xiong
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.