Como usar as duas variantes no Ediff?

17

A interface do Ediff possui um +botão, mas parece não fazer nada (o minibuffer invariavelmente mostra "nulo" quando o pressiono), achei que esse botão foi feito para usar as duas variantes no buffer de resultados.

De qualquer forma, a pergunta original é: como faço para que o Ediff resolva um conflito de mesclagem colocando o conteúdo dos dois buffers A e B no buffer C (eu sei que posso editar C, mas espero que isso possa ser feito mais facilmente).

Suponha que o arquivo A seja este:

Mesma linha

Linha diferente

Mesma linha

enquanto o arquivo B é:

Mesma linha

Outra linha

Mesma linha

Eu quero que o arquivo C , o resultado da mesclagem de A com B, fique assim:

Mesma linha

Linha diferente

Outra linha

Mesma linha

wvxvw
fonte
Não sei se entendi completamente a pergunta, mas esta seção do manual da Ediff sobre fusão e diff3pode ajudar .
Tianxiang Xiong
@TianxiangXiong Vou adicionar um exemplo do que quero dizer. Eu não acho que a página de manual vinculada o cobre.
Wwxvw

Respostas:

7

Veja esta resposta StackOverflow .

From @ killdash9 :

Pressionar d copiará A e B para o buffer 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
fonte
Como a duplicata também está na rede StackExchange (e, consequentemente, se as pessoas puderem acessar esse site, também poderão acessá-lo), sou a favor de não copiar o código, mas vincular puramente a resposta ( como uma abordagem geral para lidar com duplicatas entre sites). Dessa forma, se a resposta original for aprimorada, não haverá cópias desatualizadas em outros sites. Up-vote, independentemente.
Phd #
Fiquei com a impressão de que os sites StackExchange geralmente preferem ter uma resposta no próprio site, em vez de simplesmente um link. Mas talvez seja diferente se o link for outro site StackExchange? / shrug
Tianxiang Xiong
Na verdade, não sei qual é a política oficial, mas certamente acho que os links intra-rede devem ser tratados de maneira diferente dos links fora da rede. Não usar links em geral significa que a resposta está acessível mesmo que a fonte remota não esteja disponível, mas acho que é altamente improvável que apenas parte da rede StackExchange esteja disponível a qualquer momento, por isso acho que esse argumento desaparece; Nesse ponto, a pergunta é se é sensato dividir as respostas entre duas perguntas duplicadas diferentes, e acredito que isso quase nunca é útil. IMO, de qualquer maneira.
Phs #
3

Edit: As perguntas e respostas duplicadas no StackOverflow têm respostas para essa pergunta (conforme apontado por Tianxiang Xiong nos comentários).

Minha resposta abaixo é inútil, pois você não pode obter o resultado desejado dessa maneira. Não estou excluindo só ele, porque as informações que ele faz dar é pouco relevante, e ainda pode revelar informações interessantes para alguém.


Pessoalmente, apenas edito o buffer de mesclagem diretamente, mas você pode ensinar ao Emacs o que fazer se você tiver um requisito padrão.

+chamadas ediff-combine-diffs:

Combine Nésimas regiões diff dos buffers A e B e coloque a combinação em C. N é um argumento de prefixo. Se nulo, combine as regiões de diferença atuais. A combinação está feita de acordo com as especificações em variável ediff-combination-pattern.

qual é:

Padrão a ser usado para combinar regiões de diferença nos buffers A e B. O valor deve ser uma lista da forma em (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) que bufspec é o símbolo A, B ou Ancestor. Por exemplo, se o valor for '(STRING1 A STRING2 Ancestor STRING3 B STRING4), o texto combinado terá a seguinte aparência:

Região
diff STRING1 da variante A região diff
STRING2
do ancestral região diff
STRING3
da variante B
STRING4

Observe que, quando você pensa que não está fazendo nada, na verdade está combinando as variantes usando os marcadores de conflito normais. Se você já selecionou A ou B, por padrão +é uma maneira de restaurar o conflito original.

phils
fonte
Minha alteração não ediff-combination-patternremoveria as marcas de conflito tradicionais usadas por padrão? Eu realmente gostaria de manter o conflito assim até resolvê-lo usando qualquer combinação de diffs dos arquivos mesclados.
Wwxvw
Os marcadores de conflito se originam fora do Emacs, então duvido que seja o caso, mas na verdade não sei. Tente?
Phd #
Eu vou, mas mais tarde hoje. Vou atualizar assim que souber.
Wwxvw
Na verdade, você tem processos corretos e converte todas as regiões de conflito de acordo com esse padrão antes de apresentar os buffers. No entanto, você pode adicionar uma ligação customizada para um comando que permita ediff-combination-patternligações ao seu padrão customizado e depois chame ediff-combine-diffs.
Phs #
2
Esta solução parece ser o que você deseja.
Tianxiang Xiong