Jak korzystać z obu wariantów w Ediff?

17

Interfejs Ediff ma +przycisk, ale wydaje się, że nic nie robi (minibufor niezmiennie pokazuje „zero” po jego naciśnięciu), myślałem, że ten przycisk służy do używania obu wariantów w buforze wyników.

W każdym razie pierwotne pytanie brzmi: jak sprawić, by Ediff rozwiązał konflikt scalania, umieszczając treść z obu buforów A i B w buforze C (wiem, że mogę po prostu edytować C, ale mam nadzieję, że można to zrobić łatwiej).

Załóżmy, że plik A jest następujący:

Ta sama linia

Inna linia

Ta sama linia

podczas gdy plik B to:

Ta sama linia

Kolejna linia

Ta sama linia

Chcę, aby plik C , wynik scalenia A z B, wyglądał tak:

Ta sama linia

Inna linia

Kolejna linia

Ta sama linia

wvxvw
źródło
Nie jestem pewien, czy w pełni rozumiem pytanie, ale ten rozdział instrukcji Ediff dotyczący łączenia się i diff3może pomóc .
Tianxiang Xiong
@TianxiangXiong Dodam przykład tego, co mam na myśli. Nie sądzę, że linkowana strona podręcznika to obejmuje.
wvxvw

Odpowiedzi:

7

Zobacz tę odpowiedź StackOverflow .

From @ killdash9 :

Naciśnięcie d spowoduje skopiowanie zarówno A, jak i B do bufora 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
źródło
Ponieważ duplikat znajduje się również w sieci StackExchange (a w związku z tym, jeśli ludzie będą mogli dostać się do tej witryny, będą mogli również dostać się do tej strony), jestem zwolennikiem nie kopiowania kodu, a jedynie linku do odpowiedzi ( jako ogólne podejście do obsługi duplikatów między witrynami). W ten sposób, jeśli oryginalna odpowiedź zostanie poprawiona, nie będzie przestarzałych kopii unoszących się na innych stronach. Niezależnie od głosowania.
phils
Miałem wrażenie, że strony StackExchange zwykle wolą mieć odpowiedź na samej stronie niż link. Ale może jest inaczej, jeśli link jest inną witryną StackExchange? / wzruszenie ramionami
Tianxiang Xiong
Właściwie nie wiem, jaka jest oficjalna polityka, ale z pewnością uważam, że łącza wewnątrz sieci powinny być traktowane inaczej niż łącza poza siecią. Nieużywanie łączy ogólnie oznacza, że ​​odpowiedź jest dostępna, nawet jeśli zdalne źródło jest niedostępne, ale myślę, że byłoby bardzo mało prawdopodobne, aby tylko część sieci StackExchange była dostępna w danym momencie, więc myślę, że ten argument zniknie; w tym momencie pytanie brzmi, czy rozsądnie jest podzielić odpowiedzi między dwa różne duplikaty pytań i uważam, że to prawie nigdy nie jest pomocne. W każdym razie IMO.
phils
3

Edit: duplikat Q & A na StackOverflow ma odpowiedzi na to pytanie (jak podkreślił Tianxiang Xiong w komentarzach).

Moja odpowiedź poniżej jest bezużyteczna, ponieważ najwyraźniej nie można uzyskać pożądanego rezultatu w ten sposób. Ja nie tylko usuwając go, ponieważ informacje to nie dać się nieco znaczenie, a może jeszcze okazać się ciekawą informację do kogoś.


Osobiście po prostu edytuję bufor scalania bezpośrednio, ale możesz nauczyć Emacsa, jak postępować, jeśli masz standardowe wymagania.

+połączenia ediff-combine-diffs:

Połącz regiony Nth diff buforów A i B i umieść kombinację w C. N jest argumentem przedrostka. Jeśli zero, połącz obecne regiony różnic. Łączenie odbywa się zgodnie ze specyfikacjami w zmiennej ediff-combination-pattern.

który jest:

Wzorzec używany do łączenia regionów różnicowych w buforach A i B. Wartość musi być listą postaci, w (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) której bufspec jest symbolem A, B lub Przodkiem. Na przykład, jeśli wartością jest, '(STRING1 A STRING2 Ancestor STRING3 B STRING4)wówczas łączony tekst będzie wyglądał następująco:

Region
różnicowy STRING1 z wariantu A
Region
różnicowy STRING2 od przodka
STRING3
region różnicowy z wariantu B
STRING4

Zauważ, że kiedy myślisz, że nic nie robi, to w rzeczywistości łączy warianty przy użyciu normalnych znaczników konfliktu. tzn. jeśli już wybrałeś A lub B, domyślnie +jest to sposób na przywrócenie pierwotnego konfliktu.

phils
źródło
Czy moja zmiana polegająca na ediff-combination-patternusunięciu tradycyjnych oznaczeń konfliktu używanych domyślnie? Naprawdę chciałbym zachować ten konflikt, dopóki go nie rozwiążę, używając dowolnej kombinacji różnic z scalonych plików.
wvxvw
Znaczniki konfliktu pochodzą spoza Emacsa, więc wątpię, żeby tak było, ale tak naprawdę nie wiem. Spróbuj?
phils
Zrobię to, ale później dzisiaj. Zaktualizuję, gdy tylko będę wiedział.
wvxvw
W rzeczywistości masz rację - ediff przetwarza i konwertuje wszystkie regiony konfliktu zgodnie z tym wzorcem przed przedstawieniem buforów. Możesz jednak dodać niestandardowe powiązanie dla polecenia, które pozwala powiązać ediff-combination-patternniestandardowy wzorzec, a następnie wywołuje ediff-combine-diffs.
phils
2
To rozwiązanie wydaje się być tym, czego chcesz.
Tianxiang Xiong