Bagaimana cara menggunakan kedua varian di Ediff?

17

Antarmuka Ediff memiliki +tombol, tetapi sepertinya tidak melakukan apa-apa (minibuffer selalu menunjukkan "nil" ketika saya menekannya), saya pikir tombol ini dimaksudkan untuk menggunakan kedua varian dalam buffer hasil.

Bagaimanapun, pertanyaan awal adalah: bagaimana cara saya membuat Ediff menyelesaikan konflik gabungan dengan menempatkan konten dari kedua buffer A dan B ke buffer C (saya tahu saya bisa mengedit C, tetapi berharap ini bisa dilakukan dengan lebih mudah).

Misalkan file A adalah ini:

Baris yang sama

Garis yang berbeda

Baris yang sama

sedangkan file B adalah:

Baris yang sama

Baris lain

Baris yang sama

Saya ingin file C , hasil dari penggabungan A dengan B terlihat seperti ini:

Baris yang sama

Garis yang berbeda

Baris lain

Baris yang sama

wvxvw
sumber
Saya tidak yakin saya sepenuhnya memahami pertanyaan itu, tetapi bagian manual Ediff ini tentang penggabungan dan diff3dapat membantu .
Tianxiang Xiong
@TianxiangXiong Saya akan menambahkan contoh tentang apa yang saya maksud. Saya pikir halaman manual yang terhubung tidak mencakupnya.
wvxvw

Jawaban:

7

Lihat jawaban StackOverflow ini .

Dari @ killdash9 :

Menekan d akan menyalin A dan B ke 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
sumber
Karena duplikatnya juga ada di jaringan StackExchange (dan akibatnya jika orang dapat mengakses situs ini, mereka juga dapat mengaksesnya), saya lebih suka tidak menyalin kode, tetapi dengan murni menautkan ke jawabannya ( sebagai pendekatan umum untuk menangani duplikat lintas-situs). Dengan begitu, jika jawaban awal ditingkatkan, tidak ada salinan usang yang beredar di situs lain. Dipilih, bagaimanapun.
phils
Saya mendapat kesan bahwa situs StackExchange biasanya lebih suka memiliki jawaban di situs itu sendiri, daripada sekadar tautan. Tapi mungkin berbeda jika tautannya adalah situs StackExchange lain? / shrug
Tianxiang Xiong
Saya sebenarnya tidak tahu apa kebijakan resminya, tetapi saya tentu berpikir bahwa tautan intra-jaringan harus diperlakukan berbeda dengan tautan di luar jaringan. Tidak menggunakan tautan secara umum berarti bahwa jawabannya dapat diakses walaupun sumber jarak jauh tidak tersedia, tetapi saya pikir itu akan sangat tidak mungkin untuk hanya bagian dari jaringan StackExchange tersedia pada waktu tertentu, jadi saya pikir argumen itu hilang; pada titik pertanyaannya adalah apakah masuk akal untuk membagi jawaban antara dua pertanyaan duplikat yang berbeda, dan saya percaya itu hampir tidak pernah membantu. IMO, bagaimanapun.
phils
3

Edit: The duplikat Q & A pada StackOverflow memiliki jawaban untuk pertanyaan ini (sebagai keluar menunjuk oleh Tianxiang Xiong di komentar).

Jawaban saya di bawah tidak ada gunanya, karena Anda jelas tidak bisa mendapatkan hasil yang diinginkan seperti itu. Aku hanya tidak menghapusnya karena informasi itu tidak memberi agak relevan, dan mungkin masih membuktikan informasi menarik untuk seseorang.


Secara pribadi saya hanya mengedit buffer gabungan secara langsung, tetapi Anda dapat mengajari Emacs apa yang harus dilakukan jika Anda memiliki persyaratan standar.

+panggilan ediff-combine-diffs:

Kombinasikan Nth diff daerah buffer A dan B dan tempatkan kombinasi dalam C. N adalah argumen awalan. Jika nihil, gabungkan wilayah perbedaan saat ini. Penggabungan dilakukan sesuai dengan spesifikasi dalam variabel ediff-combination-pattern.

yang mana:

Pola yang akan digunakan untuk menggabungkan perbedaan wilayah dalam buffer A dan B. Nilai harus berupa daftar bentuk di (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) mana bufspec adalah simbol A, B, atau Ancestor. Misalnya, jika nilainya adalah '(STRING1 A STRING2 Ancestor STRING3 B STRING4)maka teks gabungan akan terlihat seperti ini:

STRING1
beda wilayah dari varian A
STRING2
beda daerah dari leluhur
STRING3
beda wilayah dari varian B
STRING4

Perhatikan bahwa ketika Anda berpikir itu tidak melakukan apa-apa, itu sebenarnya menggabungkan varian menggunakan penanda konflik normal. yaitu jika Anda sudah memilih A atau B, maka secara default +adalah cara untuk memulihkan konflik asli.

phils
sumber
Bukankah saya mengubah ediff-combination-patternpenghapusan tanda konflik tradisional yang digunakan secara default? Saya benar-benar ingin menjaga konflik seperti itu sampai saya menyelesaikannya dengan menggunakan kombinasi diff dari file yang digabungkan.
wvxvw
Penanda konflik berasal dari luar Emacs, jadi saya ragu itu masalahnya, tetapi saya tidak benar-benar tahu. Cobalah?
phils
Saya akan, tetapi hari ini nanti. Saya akan memperbarui setelah saya tahu.
wvxvw
Sebenarnya Anda benar - proses tepi dan mengkonversi semua wilayah konflik sesuai dengan pola itu sebelum menyajikan buffer. Namun, Anda dapat menambahkan pengikatan khusus untuk perintah yang membiarkan-terikat ediff-combination-patternke pola kustom Anda dan kemudian memanggil ediff-combine-diffs.
phils
2
Solusi ini sepertinya menjadi yang Anda inginkan.
Tianxiang Xiong