Как использовать оба варианта в Ediff?

17

В интерфейсе Ediff есть +кнопка, но она, похоже, ничего не делает (минибуфер неизменно показывает «ноль», когда я нажимаю на нее), я думал, что эта кнопка предназначена для использования обоих вариантов в буфере результатов.

В любом случае, оригинальный вопрос: как заставить Ediff разрешить конфликт слияния, поместив содержимое из обоих буферов A и B в буфер C (я знаю, что могу просто отредактировать C, но надеюсь, что это будет легче сделать).

Предположим, файл A это:

Та же строка

Другая линия

Та же строка

в то время как файл B :

Та же строка

Другая линия

Та же строка

Я хочу, чтобы файл C , результат слияния A с B, выглядел так:

Та же строка

Другая линия

Другая линия

Та же строка

wvxvw
источник
Я не уверен, что полностью понимаю вопрос, но этот раздел руководства Ediff по слиянию diff3может помочь .
Тяньсян Сюн
@TianxiangXiong Я добавлю пример того, что я имею в виду. Я не думаю, что связанная страница руководства покрывает это.
wvxvw

Ответы:

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 (и, следовательно, если люди смогут попасть на этот сайт, они также смогут попасть и на этот), я за то, чтобы не копировать код, а просто ссылаться на ответ ( как общий подход к обработке дубликатов между сайтами). Таким образом, если исходный ответ улучшится, на других сайтах не будет устаревших копий. Голосование за, независимо.
Филс
У меня сложилось впечатление, что сайты StackExchange обычно предпочитают иметь ответ на самом сайте, а не просто ссылку. Но, может быть, все по-другому, если ссылка - это другой сайт StackExchange? / пожимание плечами
Тяньсян Сюн
Я на самом деле не знаю, какова официальная политика, но я, конечно, думаю, что внутрисетевые ссылки следует трактовать иначе, чем внесетевые ссылки. Отказ от использования ссылок в целом означает, что ответ доступен, даже если удаленный источник недоступен, но я думаю, что было бы маловероятно, чтобы только часть сети StackExchange была доступна в любой момент времени, поэтому я думаю, что аргумент пропадает; в этот момент вопрос заключается в том, имеет ли смысл разделять ответы между двумя различными дублирующимися вопросами, и я считаю, что это почти никогда не помогает. ИМО, во всяком случае.
Филс
3

Edit: дубликат Q & А на StackOverflow есть ответы на этот вопрос (как указывало Tianxiang Сюно в комментариях).

Мой ответ ниже бесполезен, так как вы, очевидно, не можете получить желаемый результат таким образом. Я только не удаляю это, потому что информация, которую это действительно дает, несколько уместна, и может все еще доказать интересную информацию кому-то.


Лично я просто редактирую буфер слияния напрямую, но вы можете научить Emacs, что делать, если у вас есть стандартные требования.

+звонки ediff-combine-diffs:

Объедините N-ю область различий буферов A и B и поместите комбинацию в C. N - префиксный аргумент. Если ноль, объедините регионы текущей разницы. Объединение производится в соответствии со спецификациями в переменных ediff-combination-pattern.

который:

Шаблон, который будет использоваться для объединения разностных областей в буферах A и B. Значение должно быть списком формы, (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) где bufspec является символом A, B или Ancestor. Например, если значение равно, '(STRING1 A STRING2 Ancestor STRING3 B STRING4)объединенный текст будет выглядеть так:

Дифференциал STRING1
из варианта А
Дифференц STRING2
из предка
Дифференциал STRING3
из варианта Б
STRING4

Обратите внимание, что когда вы думаете, что ничего не делает, он фактически комбинирует варианты, используя обычные маркеры конфликта. т.е. если вы уже выбрали A или B, то по умолчанию +это способ восстановить исходный конфликт.

Phils
источник
Не будет ли мое изменение ediff-combination-patternудалить традиционные маркировки конфликтов, используемые по умолчанию? Мне бы очень хотелось сохранить конфликт таким образом, пока я не разрешу его, используя любую комбинацию различий из объединенных файлов.
wvxvw
Маркеры конфликта происходят за пределами Emacs, поэтому я сомневаюсь, что это так, но на самом деле я не знаю. Попытайся?
Филс
Я буду, но позже сегодня. Я обновлю, как только узнаю.
wvxvw
На самом деле вы правы - перед обработкой буферизируйте и обрабатывайте все конфликтные области в соответствии с этим шаблоном. Однако вы можете добавить пользовательскую привязку для команды, которая разрешает привязку ediff-combination-patternк вашему пользовательскому шаблону и затем вызывает ediff-combine-diffs.
Филс
2
Это решение, кажется, то, что вы хотите.
Тяньсян Сюн