Jak używać vima jako narzędzia do porównywania?

101

Używam vima jako mojego głównego edytora.

Chciałbym również użyć vima do różnicowania plików i modyfikowania plików podczas robienia różnic, aby naprawić łatwe zmiany (zamiast większości technik różnic, które są cyklem różnic / poprawek / różnic / poprawek).

Ponadto istnieją proste sposoby integracji vima z narzędziami różnicowymi używanymi przez narzędzia / strony kontroli źródła (szczególnie myślę o git, ale jestem pewien, że inni ludzie byliby zainteresowani integracją z innymi narzędziami / stronami kontroli źródła).

Martin York
źródło
1
powinieneś spróbować vim-fugitive, który dodaje polecenia :Gdiffi :Gvdiffoba polecenia pozwalają zobaczyć różnicę między bieżącym buforem, jeśli bieżącym buforem zarządza git. Pomaga także w rozwiązywaniu konfliktów w układzie trzech okien, gdy występują konflikty scalania niektórych plików
rbernabe
Mam tę prostą funkcję w moim bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }i wywołuję ją vd file1 file2. Służy diffdo ustalenia, czy pliki się różnią i otwiera się tylko vimdiffwtedy, gdy tak jest. W przeciwnym razie pozostanę w skorupce. Wyłączam także podświetlanie składni w Vimie, ponieważ uważam, że rozprasza to różnicę. Działa tylko z dwoma plikami.
Rolf

Odpowiedzi:

122

vim ma tę funkcję wbudowaną (z poprawną flagą wiersza poleceń).

vim -d <file1> <file2>

Spowoduje to otwarcie każdego pliku w widoku i wyróżnienie różnic.
Każdy identyczny kod jest foldedniedostępny, więc nie musisz patrzeć na identyczny kod ani przewijać dużych fragmentów identycznego kodu.

Ale jest też aplikacja otoki, vimdiffktóra poprawnie wywołuje vima z poprawnymi flagami.

vimdiff source1.cpp source2.cpp

Jeśli używasz git, możesz skonfigurować zewnętrzne narzędzie do porównywania. Łatwo jest więc ustawić vimdiff jako narzędzie do porównywania git.

git config --global diff.tool vimdiff

Korzystając z vimdiff, możesz edytować dowolną stronę, a podświetlanie różnic utrzymuje tempo, aby pokazać różnice.

Uwaga: Podczas edycji z git diff. Jeśli spróbujesz edytować wersję pliku przechowywaną w repozytorium, twoje zmiany zostaną odrzucone po wyjściu (git nie ufa ci z oryginałem, więc różnisz się od kopii tmp), ale możesz edytować lokalną kopię do swoich serc i zapisz go nad swoją aktualną wersją.

Niektóre podstawowe polecenia przydatne w 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

Inne ustawienia vima, których używam do pracy z highlitingiem w vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Wyłącza to podświetlanie bitów kodu, które zostały zmienione. Tak więc zmieniona linia jest podświetlona, ​​dzięki czemu mogę dostrzec zmiany, ale tekst, który się zmienił, wyróżnia się na linii (ponieważ nie jest podświetlony).

Martin York
źródło
Obsługuje również do 4 buforów, dzięki czemu doskonale nadaje się do porównywania plików konfiguracyjnych
Izkata
34
Możesz także użyć :diffthispolecenia, aby zainicjować różnicę, gdy Vim już działa.
Bogaty
11
I: diffoff, aby wyłączyć. Myślę, że link do dokumentacji vima byłby korzystny: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll
1
Dla mnie nawet po git config --global diff.tool vimdiff, git diffnadal pokazuje wszystko jak gdyby nic nie zmieni.
Cześć Anioł
2
spróbujgit difftool
Martin York
13

Jeśli edytujesz otwarty plik i chcesz porównać go z innym plikiem bez zamykania bieżącego:

Otwórz nowy plik na podzielonym ekranie:

Dla podziału pionowego:

:vs otherFile

lub podział poziomy:

:split otherFile

Przełącz kursory na inny podzielony ekran:

ctrl+w ctrl+w

Wywołaj „tryb różnicowy” w pliku:

:diffthis

Przełącz na inny plik i wywołaj „tryb różnicowy”:

:diffthis

Aby wyłączyć „tryb różnicowy”:

:diffoff
brat-bilo
źródło
5
Aby uniknąć przełączania pomiędzy zderzakami można używać :windo diffthiszbyt
statox
4

Możesz umieścić poniższe ustawienie w .gitconfigpliku znalezionym w katalogu %homepath%(lub %userprofile%) aktualnie zalogowanego użytkownika:

[diff]
    tool = vimdiff

Umożliwi to narzędziu git bash korzystanie z vimdiff jako zewnętrznego narzędzia do porównywania.

RBT
źródło
2

Widzę tylko trzy sytuacje, aby użyć vim jako difftool. Są one krótko opisane poniżej:

  • W przypadku git difftool umieść w swoim ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Aby otworzyć vima jako narzędzie do porównywania dwóch plików, możesz wykonać następujące czynności:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Aby uzyskać widok różnicowy dla buforów, które są obecnie aktywne, tj. Dla wszystkich buforów, które mają przypisane okno na aktualnie aktywnej karcie, możesz wykonać następujące czynności:

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

Aby uzyskać więcej informacji, zobacz :h diff

klaus
źródło
1

oto co robię:

  • otwórz okno z pierwszym plikiem (lub treścią, jeśli wklejasz dane)
  • otwórz następny plik / okno za pomocą :vnew(aby mieć oba okna obok siebie) lub :new(aby mieć okna na górze i na dole). jeśli masz konkretny plik do otwarcia w drugim oknie, możesz dołączyć ścieżkę w następujący sposób::vnew /path/to/secondfile.txt
  • użyj klawisza F8, aby przełączyć funkcję niestandardową, która włącza i wyłącza tryb różnicowy

oto funkcja niestandardowa, która jest w moim ~/.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
źródło
możesz użyć polecenia :diffthisi diffoff!nie musisz sam ustawiać wszystkich opcji diff (np. ustawianie kursora również przez diffmode)
Christian Brabandt