ฉันจะใช้ vim เป็นเครื่องมือ diff ได้อย่างไร


101

ฉันใช้เสียงเรียกเข้าเป็นเครื่องมือแก้ไขหลัก

ฉันต้องการใช้ vim เพื่อ diff files และแก้ไขไฟล์ในขณะที่ทำการ diff เพื่อแก้ไขการเปลี่ยนแปลงที่ง่าย (แทนที่จะใช้เทคนิค diff ส่วนใหญ่ซึ่งเป็นวัฏจักรของ diff / fix / diff / fix)

นอกจากนี้ยังมีวิธีที่ง่ายในการรวมเสียงเรียกเข้าเป็นเครื่องมือต่าง ๆ ที่ใช้โดยเครื่องมือ / แหล่งที่มาของการควบคุมไซต์ (ฉันกำลังคิดถึง git เป็นพิเศษ แต่ฉันแน่ใจว่าคนอื่น ๆ จะสนใจที่จะทำงานร่วมกับเครื่องมือ / ไซต์อื่น ๆ


1
คุณควรลอง vim-fugitive โดยจะเพิ่มคำสั่ง:Gdiffและ:Gvdiffทั้งสองคำสั่งให้คุณเห็นความแตกต่างของบัฟเฟอร์ปัจจุบันหากบัฟเฟอร์ปัจจุบันของคุณถูกจัดการโดย git นอกจากนี้ยัง heps คุณในการแก้ไขความขัดแย้งในรูปแบบหน้าต่างสามเมื่อคุณมีการผสานความขัดแย้งในบางไฟล์
rbernabe

ฉันมีฟังก์ชั่นนี้ง่ายใน bashrc ของฉันและฉันเรียกมันด้วยvd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; } vd file1 file2มันใช้diffเพื่อตรวจสอบว่าไฟล์ที่แตกต่างและเปิดเฉพาะvimdiffถ้าเป็นเช่นนั้น มิฉะนั้นฉันจะอยู่ในเปลือก ฉันยังปิดใช้งานการเน้นไวยากรณ์ใน Vim ด้วยเพราะฉันพบว่ามันเบี่ยงเบนความสนใจเมื่อกระจาย ใช้ได้กับไฟล์สองไฟล์เท่านั้น
Rolf

คำตอบ:


122

vim มีฟังก์ชันนี้ในตัว (พร้อมกับการตั้งค่าสถานะบรรทัดคำสั่งที่ถูกต้อง)

vim -d <file1> <file2>

สิ่งนี้จะเปิดแต่ละไฟล์ในมุมมองและเน้นความแตกต่าง
รหัสใด ๆ ที่เหมือนกันจะไม่foldedอยู่ดังนั้นคุณไม่จำเป็นต้องดูโค้ดที่เหมือนกันหรือเลื่อนดูโค้ดขนาดใหญ่ของโค้ดที่เหมือนกัน

แต่ยังมีแอปพลิเคชัน wrapper vimdiffที่เรียกใช้ vim ได้อย่างถูกต้องด้วยการตั้งค่าสถานะที่ถูกต้อง

vimdiff source1.cpp source2.cpp

หากคุณใช้คอมไพล์คุณสามารถตั้งค่าเครื่องมือดิฟภายนอกได้ ดังนั้นจึงง่ายที่จะตั้ง vimdiff ให้เป็นเครื่องมือ diff สำหรับคอมไพล์

git config --global diff.tool vimdiff

เมื่อใช้ vimdiff คุณสามารถแก้ไขด้านใดด้านหนึ่งและการเน้นที่แตกต่างกันตามจังหวะเพื่อแสดงความแตกต่าง

หมายเหตุ: เมื่อแก้ไขจากคอมไพล์ต่าง หากคุณลองและแก้ไขไฟล์เก็บข้อมูลเวอร์ชันที่เก็บไว้การเปลี่ยนแปลงของคุณจะถูกยกเลิกเมื่อคุณออก (git ไม่ไว้ใจคุณกับต้นฉบับดังนั้นคุณจึงแตกต่างกับสำเนา tmp) แต่คุณสามารถแก้ไขสำเนาโลคัลไปยังเนื้อหาใจและ บันทึกไว้เหนือรุ่นปัจจุบันของคุณ

คำสั่งพื้นฐานบางคำที่มีประโยชน์ vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

การตั้งค่า vim อื่น ๆ ที่ฉันใช้เพื่อทำงานกับ highliting กับ vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

สิ่งนี้จะปิดการเน้นที่บิตของรหัสที่มีการเปลี่ยนแปลง ดังนั้นบรรทัดที่มีการเปลี่ยนแปลงจะถูกเน้นเพื่อให้ฉันสามารถมองเห็นการเปลี่ยนแปลง แต่ข้อความจริงที่มีการเปลี่ยนแปลงโดดเด่นในบรรทัด (เพราะมันไม่ได้เน้น)


จัดการได้ถึง 4 บัฟเฟอร์ทำให้เหมาะสำหรับการเปรียบเทียบไฟล์การตั้งค่า
Izkata

34
คุณยังสามารถใช้:diffthisคำสั่งเพื่อเริ่มต้น diff เมื่อ Vim ทำงานอยู่แล้ว
รวย

11
และ: diffoff เพื่อปิด ฉันคิดว่าลิงก์ไปยังเอกสารของ vim จะเป็นประโยชน์: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll

1
สำหรับฉันแม้หลังจากgit config --global diff.tool vimdiffนั้นgit diffยังคงแสดงทุกอย่างเช่นถ้าฉันไม่มีอะไรเปลี่ยนแปลง
Hi-Angel

2
ลองgit difftool
Martin York

13

หากคุณกำลังแก้ไขไฟล์ที่เปิดอยู่และต้องการเปรียบเทียบกับไฟล์อื่นโดยไม่ต้องปิดไฟล์ปัจจุบัน:

เปิดไฟล์ใหม่ในหน้าจอแยก:

สำหรับการแยกตามแนวตั้ง:

:vs otherFile

หรือแยกแนวนอน:

:split otherFile

สลับเคอร์เซอร์ไปที่หน้าจอแยกอื่น:

ctrl+w ctrl+w

เรียกใช้ "โหมด diff" ในไฟล์:

:diffthis

เปลี่ยนเป็นไฟล์อื่นแล้วเรียกใช้ "โหมดต่าง":

:diffthis

วิธีปิด "โหมด diff":

:diffoff

5
เพื่อหลีกเลี่ยงการสลับระหว่างบัฟเฟอร์คุณสามารถใช้:windo diffthisเช่นกัน
statox

4

คุณสามารถวางการตั้งค่าที่กล่าวถึงด้านล่างใน.gitconfigไฟล์ที่พบในไดเรกทอรี%homepath%(หรือ%userprofile%) ของผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน:

[diff]
    tool = vimdiff

สิ่งนี้จะช่วยให้เครื่องมือทุบตี git เริ่มใช้ vimdiff เป็นเครื่องมือ diff ภายนอกเช่นกัน



2

ฉันเห็นสามสถานการณ์เท่านั้นที่ใช้ vim เป็น difftool พวกเขาอธิบายสั้น ๆ ด้านล่าง:

  • สำหรับคอมไพล์ difftool ใส่ต่อไปนี้ในของคุณ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • หากต้องการเปิด vim เป็น diff-tool สำหรับสองไฟล์คุณสามารถทำสิ่งต่อไปนี้:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • ในการรับมุมมองที่ต่างกันสำหรับบัฟเฟอร์ที่ใช้งานอยู่ในปัจจุบันเช่นบัฟเฟอร์ทั้งหมดที่มีหน้าต่างที่กำหนดให้กับพวกเขาในแท็บที่ใช้งานอยู่ในปัจจุบันคุณสามารถทำสิ่งต่อไปนี้:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

สำหรับข้อมูลเพิ่มเติมโปรดดู :h diff


1

นี่คือสิ่งที่ฉันทำ:

  • เปิดหน้าต่างที่มีไฟล์แรก (หรือเนื้อหาข้อความหากคุณกำลังวางข้อมูล)
  • เปิดไฟล์ / หน้าต่างถัดไปโดยใช้:vnew(เพื่อให้ทั้งสองแบบเคียงข้างกัน) หรือ:new(เพื่อให้มีหน้าต่างด้านบนและด้านล่าง) หากคุณมีไฟล์เฉพาะที่จะเปิดในหน้าต่างที่สองคุณสามารถรวมพา ธ ดังนี้::vnew /path/to/secondfile.txt
  • ใช้ F8 เพื่อสลับฟังก์ชั่นที่กำหนดเองซึ่งเปิดและปิดโหมด diff

นี่คือฟังก์ชั่นที่กำหนดเองที่อยู่ในฉัน~/.vimrc:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction

คุณสามารถใช้คำสั่ง:diffthisและdiffoff!ดังนั้นคุณไม่จำเป็นต้องตั้งค่าตัวเลือก diff ทั้งหมดด้วยตนเอง (เช่น cursorbind ตั้งค่าโดย diffmode)
Christian Brabandt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.