Bagaimana cara menggunakan vim sebagai alat diff?

102

Saya menggunakan vim sebagai editor utama saya.

Saya juga ingin menggunakan vim untuk diff file dan memodifikasi file sambil melakukan diff untuk memperbaiki perubahan yang mudah (daripada kebanyakan teknik diff yang merupakan siklus dari diff / fix / diff / fix).

Selain itu ada cara mudah untuk mengintegrasikan vim ke dalam alat yang berbeda yang digunakan oleh alat / situs kontrol sumber (saya secara khusus memikirkan git tapi saya yakin orang lain akan tertarik untuk berintegrasi dengan alat / situs kontrol sumber lainnya).

Martin York
sumber
1
Anda harus mencoba vim-fugitive dan menambahkan perintah :Gdiffdan :Gvdiffkedua perintah memungkinkan Anda melihat perbedaan berdampingan dari buffer saat ini jika buffer Anda saat ini dikelola oleh git. Hal ini juga membuat Anda menyelesaikan konflik dalam tata letak tiga jendela saat Anda menggabungkan konflik pada beberapa file
rbernabe
Saya memiliki fungsi sederhana ini di bashrc saya vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }dan saya memohonnya dengan vd file1 file2. Ini digunakan diffuntuk menentukan apakah file berbeda dan hanya terbuka vimdiffjika demikian. Kalau tidak, saya tinggal di shell. Saya juga menonaktifkan penyorotan sintaks di Vim karena saya merasa mengganggu ketika berbeda. Hanya berfungsi dengan dua file.
Rolf

Jawaban:

122

vim memiliki fungsi ini bawaan (dengan flag baris perintah yang benar).

vim -d <file1> <file2>

Ini membuka setiap file dalam tampilan dan menyoroti perbedaan.
Kode apa pun yang identik sedang foldedtidak ada sehingga Anda tidak perlu melihat kode yang sama atau menggulir potongan besar kode yang identik.

Tetapi ada juga aplikasi pembungkus vimdiffyang memanggil vim dengan benar dengan flag yang benar.

vimdiff source1.cpp source2.cpp

Jika Anda menggunakan git, Anda dapat mengatur alat diff eksternal. Jadi mudah untuk mengatur vimdiff menjadi alat diff untuk git.

git config --global diff.tool vimdiff

Saat menggunakan vimdiff, Anda dapat mengedit sisi mana saja dan sorotan berbeda terus menunjukkan perbedaan.

Catatan: Saat mengedit dari git diff. Jika Anda mencoba dan mengedit versi repositori yang disimpan dari file, perubahan Anda akan dibuang ketika Anda keluar (git tidak mempercayai Anda dengan aslinya sehingga Anda berbeda dengan salinan tmp) tetapi Anda dapat mengedit salinan lokal ke isi hati Anda dan simpan di atas Anda versi saat ini.

Beberapa perintah dasar yang berguna di 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

Pengaturan vim lain yang saya gunakan untuk bekerja dengan highliting dengan vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Ini mematikan penyorotan pada bit kode yang diubah. Jadi baris yang diubah disorot sehingga saya bisa melihat perubahan, tetapi teks sebenarnya yang telah berubah menonjol pada baris (karena tidak disorot).

Martin York
sumber
Juga menangani hingga 4 buffer, menjadikannya bagus untuk membandingkan file konfigurasi
Izkata
34
Anda juga dapat menggunakan :diffthisperintah untuk memulai diff ketika Vim sudah berjalan.
Kaya
11
Dan: diffoff untuk mematikannya. Saya pikir tautan ke dokumentasi vim akan bermanfaat: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll
1
Bagi saya bahkan setelahnya git config --global diff.tool vimdiff, git diffmasih menunjukkan segalanya seperti jika saya tidak mengubah apa pun.
Hi-Angel
2
cobagit difftool
Martin York
13

Jika Anda mengedit file yang terbuka dan ingin membandingkannya dengan file lain tanpa menutup yang sekarang:

Buka file baru di layar terbagi:

Untuk pemisahan vertikal:

:vs otherFile

atau split horizontal:

:split otherFile

Alihkan kursor ke berbagai layar terbagi:

ctrl+w ctrl+w

Aktifkan "mode diff" dalam file:

:diffthis

Beralih ke file lain dan aktifkan "mode diff":

:diffthis

Untuk mematikan "mode diff":

:diffoff
saudara laki-laki
sumber
5
Untuk menghindari beralih antara buffer Anda dapat menggunakan :windo diffthisterlalu
statox
4

Anda dapat menempatkan pengaturan di bawah ini dalam .gitconfigfile yang ditemukan di %homepath%(atau %userprofile%) direktori pengguna yang saat ini login:

[diff]
    tool = vimdiff

Ini akan memungkinkan alat git bash untuk mulai menggunakan vimdiff sebagai alat diff eksternal juga.

RBT
sumber
2

Saya hanya dapat melihat tiga situasi untuk menggunakan vim sebagai difftool. Mereka dijelaskan secara singkat di bawah ini:

  • Untuk git difftool, letakkan yang berikut di Anda ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Untuk membuka vim sebagai alat bantu untuk dua file, Anda dapat melakukan hal berikut:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Untuk mendapatkan tampilan berbeda untuk buffer yang saat ini aktif, yaitu semua buffer yang memiliki jendela yang ditetapkan untuk mereka di halaman aktif saat ini, Anda dapat melakukan hal berikut:

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

Untuk informasi lebih lanjut, lihat :h diff

klaus
sumber
1

inilah yang saya lakukan:

  • buka jendela dengan file pertama (atau konten teks jika Anda menempelkan data)
  • buka file / jendela berikutnya menggunakan :vnew(untuk memiliki kedua jendela berdampingan) atau :new(untuk memiliki windows atas dan bawah). jika Anda memiliki file tertentu untuk dibuka di jendela kedua, Anda dapat memasukkan path seperti ini::vnew /path/to/secondfile.txt
  • gunakan F8 untuk mengaktifkan fungsi khusus yang mengaktifkan dan menonaktifkan mode diff

inilah fungsi khusus yang ada di saya ~/.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
kaan
sumber
Anda dapat menggunakan perintah :diffthisdan oleh diffoff!karena itu Anda tidak perlu mengatur sendiri semua opsi berbeda (mis. cursorbind juga diatur oleh diffmode)
Christian Brabandt