Як використовувати обидва варіанти в Ediff?


17

Інтерфейс Ediff має +кнопку, але він, здається, нічого не робить (мінібуфер незмінно показує "нуль", коли я натискаю на нього), я подумав, що ця кнопка призначена для використання обох варіантів у буфері результатів.

Так чи інакше, початкове питання: як змусити Едіффа вирішити конфлікт злиття, помістивши вміст обох буферів А і В у буфер C (я знаю, що я можу просто відредагувати C, але сподіваюся, що це можна зробити простіше).

Припустимо, файл A такий:

Той самий рядок

Різна лінія

Той самий рядок

а файл B :

Той самий рядок

Ще одна лінія

Той самий рядок

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

Той самий рядок

Різна лінія

Ще одна лінія

Той самий рядок


Я не впевнений, що цілком розумію це питання, але цей посібник з Едіффа в розділі про об’єднання diff3може допомогти .
Tianxiang Xiong

@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? / знизують плечима
Tianxiang Xiong

Я фактично не знаю, що таке офіційна політика, але я, звичайно, вважаю, що внутрішньомережеві посилання повинні трактуватися по-різному, як до позамережевих. Не використовувати посилання взагалі означає, що відповідь є доступною, навіть якщо віддалене джерело недоступне, але я думаю, було б малоймовірно, щоб лише частина мережі StackExchange була доступна в будь-який момент часу, тому я думаю, що цей аргумент відходить; на даний момент питання полягає в тому, чи розумно ділити відповіді між двома різними повторюваними питаннями, і я вважаю, що це майже ніколи не корисно. ІМО, як би там не було.
філс

3

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

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


Особисто я просто редагую буфер злиття безпосередньо, але ви можете навчити Emacs що робити, якщо у вас є стандартні вимоги.

+дзвінки ediff-combine-diffs:

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

який є:

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

Область STRING1 відрізняється
від варіанту Діапазон
STRING2 відрізняється
від предка
STRING3 відрізняється
областю B варіант
STRING4

Зауважте, що коли ви думаєте, що це нічого не робить, це фактично поєднує варіанти, використовуючи звичайні маркери конфлікту. тобто якщо ви вже вибрали A або B, то за замовчуванням +це спосіб відновити початковий конфлікт.


Не вдалося б змінити ediff-combination-patternвидалення традиційних позначень конфлікту, використовуваних за замовчуванням? Я дуже хотів би зберегти конфлікт таким чином, поки не вирішувати його, використовуючи будь-яку комбінацію відмінностей від об'єднаних файлів.
wvxvw

Маркери конфліктів походять за межами Emacs, тому я сумніваюся, що це так, але я насправді не знаю. Спробуй це?
філс

Буду, але пізніше сьогодні. Я оновлюсь, коли знаю.
wvxvw

Насправді ви маєте рацію - ediff обробляє та перетворює всі конфліктні регіони за цією схемою, перш ніж представляти буфери. Ви можете, однак, додати спеціальну прив'язку для команди, яка прив'язує ediff-combination-patternдо вашого власного шаблону, а потім викликає ediff-combine-diffs.
філс

2
Це рішення, здається, те, що ви хочете.
Tianxiang Xiong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.