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


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)

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.