Làm thế nào để sử dụng cả hai biến thể trong Ediff?


17

Giao diện Ediff có +nút, nhưng dường như nó không làm gì cả (bộ thu nhỏ luôn hiển thị "nil" khi tôi nhấn nó), tôi nghĩ nút này có nghĩa là sử dụng cả hai biến thể trong bộ đệm kết quả.

Dù sao, câu hỏi ban đầu là: làm cách nào để Ediff giải quyết xung đột hợp nhất bằng cách đưa nội dung từ cả bộ đệm A và B vào bộ đệm C (Tôi biết tôi chỉ có thể chỉnh sửa C, nhưng hy vọng điều này có thể được thực hiện dễ dàng hơn).

Giả sử tập tin A là đây:

Cùng dòng

Dòng khác nhau

Cùng dòng

trong khi tệp B là:

Cùng dòng

Một dòng khác

Cùng dòng

Tôi muốn tập tin C , kết quả của việc hợp nhất A với B trông như thế này:

Cùng dòng

Dòng khác nhau

Một dòng khác

Cùng dòng


Tôi không chắc là tôi hoàn toàn hiểu câu hỏi, nhưng phần hướng dẫn Ediff này về việc hợp nhất và diff3có thể giúp ích .
Tianxiang Xiong

@TianxiangXiong Tôi sẽ thêm một ví dụ về ý tôi. Tôi không nghĩ rằng trang hướng dẫn sử dụng được liên kết bao gồm nó.
wvxvw

Câu trả lời:


7

Xem câu trả lời StackOverflow này .

Từ @ killdash9 :

Nhấn d sẽ sao chép cả A và B vào bộ đệm 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)

Vì bản sao cũng có trên mạng StackExchange (và do đó, nếu mọi người có thể truy cập trang web này, họ cũng sẽ có thể truy cập trang đó), tôi ủng hộ không sao chép mã, nhưng hoàn toàn liên kết với câu trả lời ( như một cách tiếp cận chung để xử lý các bản sao chéo trang). Theo cách đó, nếu câu trả lời ban đầu được cải thiện, sẽ không có các bản sao lỗi thời trôi nổi trên các trang web khác. Bình chọn, bất kể.
phils

Tôi có ấn tượng rằng các trang web StackExchange thường thích có câu trả lời trên chính trang web đó, thay vì chỉ đơn giản là một liên kết. Nhưng có lẽ nó khác nếu liên kết là một trang web StackExchange khác? / nhún vai
Tianxiang Xiong

Tôi thực sự không biết chính sách chính thức là gì, nhưng tôi chắc chắn nghĩ rằng các liên kết trong mạng nên được đối xử khác với các liên kết ngoài mạng. Không sử dụng các liên kết nói chung có nghĩa là câu trả lời có thể truy cập được ngay cả khi nguồn từ xa không có sẵn, nhưng tôi nghĩ rằng rất khó có khả năng chỉ một phần của mạng StackExchange có sẵn tại bất kỳ thời điểm nào, vì vậy tôi nghĩ rằng tranh luận sẽ biến mất; tại thời điểm đó, câu hỏi là liệu có hợp lý để phân chia câu trả lời giữa hai câu hỏi trùng lặp khác nhau hay không và tôi tin rằng điều đó gần như không bao giờ hữu ích. IMO, dù sao đi nữa.
phils

3

Chỉnh sửa: Câu hỏi và trả lời trùng lặp trên StackOverflow có câu trả lời cho câu hỏi này (như Tianxiang Xiong đã chỉ ra trong các bình luận).

Câu trả lời của tôi dưới đây là không sử dụng, vì rõ ràng bạn không thể có được kết quả mong muốn theo cách đó. Tôi chỉ không xóa nó vì thông tin nó không đưa ra là hơi có liên quan, và vẫn có thể chứng minh thông tin thú vị cho người.


Cá nhân tôi chỉ cần chỉnh sửa bộ đệm hợp nhất trực tiếp, nhưng bạn có thể dạy Emacs phải làm gì nếu bạn có một yêu cầu tiêu chuẩn.

+các cuộc gọi ediff-combine-diffs:

Kết hợp các vùng khác nhau của Nth của bộ đệm A và B và đặt tổ hợp trong C. N là một đối số tiền tố. Nếu không, kết hợp các khu vực khác biệt hiện tại. Kết hợp được thực hiện theo các thông số kỹ thuật trong biến ediff-combination-pattern.

đó là:

Mẫu được sử dụng để kết hợp các vùng khác nhau trong bộ đệm A và B. Giá trị phải là danh sách của biểu mẫu (STRING1 bufspec1 STRING2 bufspec2 STRING3 bufspec3 STRING4) trong đó bufspec là ký hiệu A, B hoặc Tổ tiên. Chẳng hạn, nếu giá trị là '(STRING1 A STRING2 Ancestor STRING3 B STRING4)thì văn bản kết hợp sẽ trông như thế này:


Khu vực khác biệt của STRING1 từ biến thể Một khu vực khác biệt của
STRING2
từ khu vực khác biệt của tổ tiên
STRING3
từ biến thể B
STRING4

Lưu ý rằng khi bạn nghĩ rằng nó không làm gì cả, thì thực tế nó sẽ kết hợp các biến thể bằng cách sử dụng các dấu xung đột thông thường. tức là nếu bạn đã chọn A hoặc B, thì theo mặc định +là cách khôi phục xung đột ban đầu.


Tôi sẽ không thay đổi ediff-combination-patternloại bỏ các dấu xung đột truyền thống được sử dụng theo mặc định? Tôi thực sự muốn giữ xung đột theo cách đó cho đến khi tôi giải quyết nó bằng cách sử dụng bất kỳ sự kết hợp nào khác với các tệp được hợp nhất.
wvxvw

Các dấu hiệu xung đột bắt nguồn từ bên ngoài Emacs, vì vậy tôi nghi ngờ đó là trường hợp, nhưng tôi thực sự không biết. Thử nó?
phils

Tôi sẽ, nhưng sau ngày hôm nay. Tôi sẽ cập nhật một khi tôi biết.
wvxvw

Trong thực tế, bạn đúng - xử lý ediff và chuyển đổi tất cả các vùng xung đột theo mẫu đó trước khi trình bày bộ đệm. Tuy nhiên, bạn có thể thêm một ràng buộc tùy chỉnh cho một lệnh cho phép liên kết ediff-combination-patternvới mẫu tùy chỉnh của bạn và sau đó gọi ediff-combine-diffs.
phils

2
Giải pháp này dường như là những gì bạn muốn.
Tianxiang Xiong
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.