Cách sao chép đề xuất thay đổi với vimdiff là gì?


117

Khi so sánh các tệp và cập nhật kho lưu trữ mã nguồn, tôi muốn sử dụng vimdiff. Để sao chép các thay đổi được thực hiện từ tệp này sang tệp khác, tôi thường sử dụng một chuỗi khóa như thế này: -

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

Vim, là bậc thầy về các phím tắt, chắc chắn sẽ có cách dễ dàng hơn để thực hiện nhiệm vụ tương tự này. Có một cái không? Bạn sử dụng gì để cập nhật thủ công thay đổi mã nguồn?


2
Cảm ơn vì đã đặt ý thức mơ hồ của tôi về "đây không phải là điều nên làm" vào một câu hỏi có ý nghĩa. Câu trả lời gợi ra là điều mà lẽ ra tôi đã học được từ lâu.
Caleb

1
Câu trả lời tốt nhất cho câu hỏi của bạn đang ở đây: stackoverflow.com/questions/5288875/...
erik

Câu trả lời:


181

do(diff có được) và dp(diff put) là những gì bạn cần. Dưới đây là một danh sách nhỏ các lệnh chế độ bình thường hữu ích khác trong ngữ cảnh này.

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

GHI CHÚ:
Cả hai dodphoạt động nếu bạn ở trên một khối hoặc chỉ một dòng dưới một khối ở chế độ bình thường nhưng không ở chế độ trực quan. Khi chọn dòng văn bản trong chế độ trực quan, bạn phải sử dụng các lệnh thông thường

  • :'<,'>diffget
  • :'<,'>diffput.

Xem thêm :h copy-diffs.

:diffupdate sẽ quét lại các tập tin để thay đổi.


4
Thật. Tôi thấy ban đầu khá khó hiểu, vì toàn bộ các khối (liền kề) được sao chép qua. Điều đó, cùng với việc tự động ẩn các dòng giống hệt nhau của chế độ diff, tôi thấy mình đang nghĩ "Cái quái gì vừa xảy ra?", Trước khi kiểm tra ba lần mỗi lần di chuyển, trong cả hai bảng. Giả sử bạn đã thay đổi thụt lề trên một trong các tệp; sau đó tôi tưởng tượng mọi thứ sẽ được chuyển qua. Đối với điều khiển chi tiết hơn (tức là lựa chọn trực quan), tôi thấy rằng các lệnh đầy đủ :[range]diffget:[range]diffputcần thiết.
Alex Leach

8
Bạn có thể sử dụng chế độ trực quan cùng với diffgetdiffput: ① Nhập chế độ trực quan và đánh dấu một số văn bản / dòng. ② Sau đó gõ :diffputđể đẩy các dòng được chọn đến tập tin khác hoặc :diffgetđể có được những dòng được chọn từ các tập tin khác.
erik

6
Xin chào, có ai biết nếu có một tương đương với "làm" (có được sự khác biệt) cho CHỈ một dòng không? Giả sử bạn có một khối mã (nhiều hơn một dòng) khác nhau, "làm" với con trỏ ở bất kỳ dòng mã nào, chỉ dòng bên dưới các mã này sẽ có được sự khác biệt cho toàn bộ khối mã --- Nhưng Tôi chỉ muốn có được sự khác biệt cho MỘT dòng. Mỗi lần tôi phải chọn trực quan dòng này, theo sau là "diffget", hơi tẻ nhạt ...
khôn ngoan

12
Điều quan trọng cần lưu ý là lệnh hoàn tác sẽ chỉ hoạt động trong bộ đệm đã được thay đổi, vì vậy nếu bạn sử dụng dpvà thay đổi ý định, bạn cần chuyển sang bộ đệm khác để hoàn tác.
Random832

1
@wiswit: Vđể chọn toàn bộ dòng, sau đó dohoạt động để sao chép qua một dòng cụ thể trong vim hiện tại (8.0), cho bất cứ điều gì nó có giá trị.
dannysauer
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.