วิธีที่แนะนำในการคัดลอกการเปลี่ยนแปลงด้วย vimdiff คืออะไร


117

เมื่อเปรียบเทียบไฟล์และอัปเดตที่เก็บซอร์สโค้ดฉันชอบใช้ vimdiff หากต้องการคัดลอกการเปลี่ยนแปลงที่ทำจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งฉันมักจะใช้ลำดับคีย์ดังนี้: -

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)

เป็นกลุ่มของแป้นพิมพ์ลัดควรมีวิธีที่ง่ายกว่าในการทำงานเดียวกันนี้ มีไหม คุณใช้อะไรเพื่ออัปเดตการเปลี่ยนแปลงซอร์สโค้ดด้วยตนเอง


2
ขอบคุณที่ให้ความรู้สึกที่คลุมเครือของฉัน "นี่ไม่ใช่สิ่งที่มันควรจะเป็น" เป็นคำถามที่มีความหมาย คำตอบที่นำออกมาเป็นสิ่งที่ฉันควรเรียนรู้มานานแล้ว
Caleb

1
คำตอบที่ดีที่สุดสำหรับคำถามของคุณอยู่ที่นี่: stackoverflow.com/questions/5288875/…
erik

คำตอบ:


181

do(diff ขอรับ) และdp(diff diff) คือสิ่งที่คุณต้องการ นี่คือรายการเล็ก ๆ ของคำสั่งโหมดปกติที่เป็นประโยชน์อื่น ๆ ในบริบทนี้

]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

หมายเหตุ:
ทั้งสองอย่างdoและdpทำงานได้ถ้าคุณอยู่บนบล็อกหรือเพียงหนึ่งบรรทัดภายใต้บล็อกในโหมดปกติ แต่ไม่ได้อยู่ในโหมดภาพ เมื่อเลือกบรรทัดข้อความในโหมดภาพคุณต้องใช้คำสั่งปกติ

  • :'<,'>diffget และ
  • :'<,'>diffput.

:h copy-diffsดูเพิ่มเติม

:diffupdate จะสแกนไฟล์ซ้ำเพื่อดูการเปลี่ยนแปลง


4
จริง ฉันพบว่ามันค่อนข้างสับสนในตอนแรกเนื่องจากมีการคัดลอกบล็อกทั้งหมด (ต่อเนื่องกัน) ไปทั่ว ฉันพบว่าตัวเองกำลังคิดว่า "เกิดอะไรขึ้นกันแน่?" ก่อนที่จะตรวจสอบการเคลื่อนไหวสามครั้งในทั้งสองบาน สมมติว่าคุณเปลี่ยนการเยื้องในไฟล์ใดไฟล์หนึ่ง จากนั้นฉันก็จินตนาการว่าทุกอย่างจะต้องถูกข้ามไป สำหรับการควบคุมที่ละเอียดยิ่งขึ้น (เช่นการเลือกภาพ) ฉันพบว่าคำสั่งเต็ม:[range]diffgetและ:[range]diffputจำเป็น
Alex Leach

8
คุณสามารถใช้โหมดภาพร่วมกับdiffgetและdiffput: ①เข้าสู่โหมดภาพและทำเครื่องหมายข้อความ / บรรทัด type จากนั้นพิมพ์:diffputเพื่อดันบรรทัดที่เลือกไปยังไฟล์อื่นหรือ:diffgetเพื่อรับบรรทัดที่เลือกจากไฟล์อื่น
erik

6
สวัสดีไม่มีใครทราบว่ามี "ทำ" (รับแตกต่างกัน) สำหรับเพียงหนึ่งบรรทัดหรือไม่ สมมติว่าคุณมีบล็อกของรหัส (มากกว่าหนึ่งบรรทัด) ที่แตกต่างกัน "ทำ" ด้วยเคอร์เซอร์ทั้งที่บรรทัดใด ๆ ของรหัสเหล่านี้เพียงแค่บรรทัดด้านล่างรหัสเหล่านี้จะได้รับความแตกต่างสำหรับบล็อกทั้งหมดของรหัส --- แต่ ฉันแค่ต้องการได้รับความแตกต่างสำหรับหนึ่งบรรทัด ทุกครั้งที่ผมต้องเลือกสายตาบรรทัดนี้ตามด้วย "diffget" บิตน่าเบื่อ ...
wiswit

12
สิ่งสำคัญคือให้สังเกตว่าคำสั่งเลิกทำจะทำงานเฉพาะในบัฟเฟอร์ที่เปลี่ยนไปดังนั้นหากคุณใช้dpและเปลี่ยนใจคุณต้องเปลี่ยนไปใช้บัฟเฟอร์อื่นเพื่อเลิกทำ
Random832

1
@wiswit: Vเพื่อเลือกทั้งบรรทัดจากนั้นdoทำงานเพื่อคัดลอกเหนือบรรทัดที่ระบุใน vim ปัจจุบัน (8.0) สำหรับสิ่งที่คุ้มค่า
dannysauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.