¿Cómo usar ambas variantes en Ediff?

17

La interfaz de Ediff tiene un +botón, pero no parece hacer nada (el minibúfer muestra invariablemente "nulo" cuando lo presiono), pensé que este botón estaba destinado a usar ambas variantes en el búfer de resultados.

De todos modos, la pregunta original es: ¿cómo hago para que Ediff resuelva un conflicto de fusión colocando el contenido de ambos buffers A y B en el buffer C (sé que puedo editar C, pero espero que esto se pueda hacer más fácilmente).

Supongamos que el archivo A es este:

Misma línea

Línea diferente

Misma línea

mientras que el archivo B es:

Misma línea

Otra linea

Misma línea

Quiero que el archivo C , el resultado de fusionar A con B se vea así:

Misma línea

Línea diferente

Otra linea

Misma línea

wvxvw
fuente
No estoy seguro de entender completamente la pregunta, pero esta sección del manual de Ediff sobre fusión y diff3puede ayudar .
Tianxiang Xiong
@ TianxiangXiong Agregaré un ejemplo de lo que quiero decir. No creo que la página del manual vinculada lo cubra.
wvxvw

Respuestas:

7

Vea esta respuesta de StackOverflow .

De @ killdash9 :

Al presionar d se copiarán tanto A como B al búfer 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)
Tianxiang Xiong
fuente
Debido a que el duplicado también está en la red de StackExchange (y, en consecuencia, si las personas pueden acceder a este sitio también podrán acceder a ese), estoy a favor de no copiar el código, sino simplemente vincularlo a la respuesta ( como un enfoque general para manejar duplicados entre sitios). De esa manera, si se mejora la respuesta original, no hay copias obsoletas flotando en otros sitios. Votado, independientemente.
phils
Tenía la impresión de que los sitios de StackExchange generalmente prefieren tener una respuesta en el sitio, en lugar de simplemente un enlace. ¿Pero tal vez sea diferente si el enlace es otro sitio de StackExchange? / encogimiento de hombros
Tianxiang Xiong
En realidad, no sé cuál es la política oficial, pero ciertamente creo que los enlaces dentro de la red deberían tratarse de manera diferente a los enlaces fuera de la red. No usar enlaces en general significa que la respuesta es accesible incluso si la fuente remota no está disponible, pero creo que sería muy poco probable que solo una parte de la red StackExchange esté disponible en un momento dado, por lo que creo que ese argumento desaparece; en ese momento la pregunta es si es sensato dividir las respuestas entre dos preguntas duplicadas diferentes, y creo que eso casi nunca es útil. OMI, de todos modos.
phils
3

Editar: El Q&A duplicado en StackOverflow tiene respuestas a esta pregunta (como lo señaló Tianxiang Xiong en los comentarios).

Mi respuesta a continuación es inútil, ya que evidentemente no puede obtener el resultado deseado de esa manera. Sólo no estoy eliminarlo porque la información que hace dar es algo relevante, y aún podría resultar interesante información a alguien.


Personalmente, solo edito el búfer de fusión directamente, pero puedes enseñarle a Emacs qué hacer si tienes un requisito estándar.

+llamadas ediff-combine-diffs:

Combine las regiones de enésima diferencia de las memorias intermedias A y B y coloque la combinación en C. N es un argumento prefijo. Si es nulo, combine las regiones de diferencia actual. La combinación se realiza según las especificaciones en variable ediff-combination-pattern.

cual es:

Patrón que se utilizará para combinar regiones de diferencia en las memorias intermedias A y B. El valor debe ser una lista de la forma (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) donde bufspec es el símbolo A, B o Ancestro. Por ejemplo, si el valor es, '(STRING1 A STRING2 Ancestor STRING3 B STRING4)entonces el texto combinado se verá así:

STRING1
región diff de la variante A
STRING2
región diff del ancestro
STRING3
región diff de la variante B
STRING4

Tenga en cuenta que cuando cree que no está haciendo nada, en realidad está combinando las variantes utilizando los marcadores de conflicto normales. es decir, si ya seleccionó A o B, entonces, de manera predeterminada, +es una forma de restaurar el conflicto original.

phils
fuente
¿Mi alteración de ediff-combination-patterneliminar las marcas de conflicto tradicionales utilizadas por defecto? Realmente me gustaría mantener el conflicto de esa manera hasta que lo resuelva usando cualquier combinación de diferencias de archivos fusionados.
wvxvw
Los marcadores de conflicto se originan fuera de Emacs, así que dudo que sea así, pero en realidad no lo sé. ¿Intentalo?
Phil
Lo haré, pero hoy más tarde. Actualizaré una vez que lo sepa.
wvxvw
De hecho, tiene razón: el ediff procesa y convierte todas las regiones en conflicto de acuerdo con ese patrón antes de presentar los buffers. Sin embargo, puede agregar un enlace personalizado para un comando que se vincula ediff-combination-patterna su patrón personalizado y luego llama ediff-combine-diffs.
Phil
2
Esta solución parece ser lo que quieres.
Tianxiang Xiong