Vim'i diff aracı olarak nasıl kullanırım?


101

Birincil editörüm olarak vim kullanıyorum.

Ayrıca, kolay değişiklikleri düzeltmek için diff'i yaparken diff'i dosyaları dağıtmak ve dosyaları değiştirmek için vim'i kullanmak isterim (diff / fix / diff / fix döngüsünün çoğu diff tekniği yerine).

Ek olarak vim'i kaynak kontrol araçları / siteleri tarafından kullanılan diff araçlarına entegre etmenin kolay yolları var (özellikle gitmeyi düşünüyorum ama diğer insanların diğer kaynak kontrol araçları / siteleriyle entegrasyonla ilgileneceğinden eminim).


1
Eğer komutlar ekler vim-kaçak denemelisiniz :Gdiffve :Gvdiffher iki komutları geçerli tampon git ile yönetiliyorsa geçerli tampon yan fark yana görmenizi sağlar. Ayrıca, bazı dosyalar üzerinde çakışmalar olduğunda üç pencere düzenindeki çakışmaları
çözmenizi

Bashrc'mde bu basit fonksiyon var vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }ve onu çağırdım vd file1 file2. diffDosyaların farklılık gösterip göstermediğini belirlemek için kullanır ve yalnızca vimdifföyleyse açılır . Aksi takdirde, kabukta kalırım. Ayrıca, Vim'de vurgulanan sözdizimini de etkisizleştiriyorum, çünkü fark ederken dikkat dağıtıcı buluyorum. Sadece iki dosya ile çalışır.
Rolf

Yanıtlar:


122

vim bu işlevselliğe yerleşiktir (doğru komut satırı işaretiyle).

vim -d <file1> <file2>

Bu, her dosyayı bir görünümde açar ve farklılıkları vurgular.
Aynı olan kodlar foldeduzakta olduğundan, aynı kodlara bakmanıza ya da aynı kodun büyük parçalarını kaydırmanıza gerek kalmaz.

Ancak vimdiff, doğru bayraklarla vim'i çağıran bir sarmalayıcı uygulaması da vardır .

vimdiff source1.cpp source2.cpp

Git kullanıyorsanız, harici bir fark aracı ayarlayabilirsiniz. Bu yüzden, git için diff aracı olarak vimdiff'u kurmak kolaydır.

git config --global diff.tool vimdiff

Vimdiff işlevini kullanırken, her iki tarafı da düzenleyebilirsiniz ve farkla vurgulama, farkları göstermeye ayak uydurur.

Not: Git diff'den düzenleme yaparken. Dosyanın depolanan depo sürümünü denemeyi ve düzenlemeyi denerseniz, çıktığınızda değişiklikleriniz atılır (git orijinal belgeye güvenmez, git bir tmp kopyasına karşı farklı olursunuz); o anki sürümü üzerine kaydedin.

Yararlı olan bazı temel komutlar 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

Vimdiff ile highliting ile çalışmak için kullandığım diğer vim ayarları

if &diff
    highlight! link DiffText MatchParen
endif

Bu, değiştirilen kod bitlerini vurgulayarak kapanır. Bu yüzden değiştirilen çizgi vurgulanır, böylece değişiklikleri görebiliyorum, fakat değiştirilen asıl metin çizgide göze çarpıyor (vurgulanmadığı için).


Ayrıca, 4 tamponu da kullanabilir, konfigürasyon dosyalarını karşılaştırmak için harika
kılar

34
:diffthisVim zaten çalışıyorken bir diff başlatmak için de komutu kullanabilirsiniz .
Zengin

11
Ve: kapatmak için diffoff. Vim'in
Cody Anket

1
Benim için sonra bile git config --global diff.tool vimdiff, git diffhala hiçbir şeyi değiştirmezsem her şeyi gösterir.
Hi-Angel,

2
deneyingit difftool
Martin York

13

Açık bir dosyayı düzenliyorsanız ve geçerli dosyayı kapatmadan başka bir dosyayla karşılaştırmak istiyorsanız:

Yeni dosyayı bölünmüş ekranda açın:

Dikey bölme için:

:vs otherFile

veya yatay bölme:

:split otherFile

İmleçleri farklı bölünmüş ekranlara geçirin:

ctrl+w ctrl+w

Dosyada "diff modu" çağır:

:diffthis

Diğer dosyaya geç ve "diff mode" u çağır:

:diffthis

"Dif modunu" kapatmak için:

:diffoff

5
Kullanabileceğiniz tamponlar arasında geçiş önlemek için :windo diffthisçok
statox

4

Şu anda oturum açmış kullanıcının (veya ) dizininde bulunan .gitconfigdosyaya aşağıda belirtilen ayarları yapabilirsiniz :%homepath%%userprofile%

[diff]
    tool = vimdiff

Bu, git bash aracının harici dif araç olarak vimdiff kullanmaya başlamasını sağlar.



2

Vim'i bir difftool olarak kullanmak için yalnızca üç durum görebiliyorum. Aşağıda kısaca açıklanmıştır:

  • Git difftool için, aşağıdakileri içine koyun ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Vim'i iki dosya için diff aracı olarak açmak için aşağıdakileri yapabilirsiniz:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Şu anda etkin olan arabelleklerin farklı görünümlerini elde etmek için, yani şu anda etkin olan sekme sayfasında kendilerine atanmış bir pencere bulunan tüm arabellekleri aşağıdakileri yapabilirsiniz:

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

Daha fazla bilgi için bakınız :h diff


1

İşte yaptığım şey:

  • ilk dosyayı içeren bir pencere açın (veya veri yapıştırıyorsanız metin içeriği)
  • :vnew(her iki pencerenin de yan yana olması için) veya :new(pencerelerin üst ve alt kısmına sahip olmak için ) kullanarak bir sonraki dosyayı / pencereyi açın . ikinci pencerede açılacak belirli bir dosyanız varsa, aşağıdaki yolu kullanabilirsiniz::vnew /path/to/secondfile.txt
  • fark modunu açıp kapatan özel bir işlevi değiştirmek için F8'i kullanın

işte benim özel işlevim ~/.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

Eğer komutunu kullanabilirsiniz :diffthisve diffoff!böylece (örneğin cursorbind da diffmode tarafından ayarlanır) tüm fark seçenekleri kendiniz ayarlamak gerekmez
Christian Brabandt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.