Jak używać Vima jako narzędzia porównującego?

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

Chciałbym również używać vima do porównywania plików i modyfikowania plików podczas robienia diff do naprawiania łatwych zmian (zamiast większości technik diff, które są cyklem diff / fix / diff / fix).

Dodatkowo są łatwe sposoby na zintegrowanie vima z narzędziami porównywania używanymi przez narzędzia / strony kontroli źródła (Myślę konkretnie o git, ale jestem pewien, że inne osoby byłyby zainteresowane integracją z innymi narzędziami / witrynami kontroli źródła).

Komentarze

  • powinieneś wypróbować vim-fugitive, dodaje polecenia :Gdiff i :Gvdiff, oba polecenia pozwalają zobaczyć porównanie bieżącego bufora obok siebie, jeśli Twój obecny bufor jest zarządzany przez git. Ułatwia również rozwiązywanie konfliktów w układzie trzech okien, gdy występują konflikty scalania niektórych plików
  • 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ę to z vd file1 file2. Używa diff do określenia, czy pliki się różnią i otwiera tylko vimdiff, jeśli tak jest. W przeciwnym razie zostanę w skorupie. Wyłączam również podświetlanie składni w Vimie, ponieważ rozprasza mnie to podczas porównywania. Działa tylko z dwoma plikami.

Odpowiedź

vim ma wbudowaną tę funkcjonalność (z poprawną flagą wiersza poleceń ).

vim -d <file1> <file2> 

Spowoduje to otwarcie każdego pliku w widoku i zaznaczenie różnic.
Każdy identyczny kod to folded, więc nie musisz patrzeć na identyczny kod ani przewijać ogromnych fragmentów identycznego kodu.

Ale jest też aplikacja opakowująca vimdiff, która poprawnie wywołuje vim z poprawnymi flagami.

vimdiff source1.cpp source2.cpp 

Jeśli używasz git, możesz skonfigurować zewnętrzne narzędzie porównywania. Dlatego łatwo jest ustawić vimdiff jako narzędzie porównujące dla git.

git config --global diff.tool vimdiff 

Używając vimdiff, możesz edytować obie strony, a podświetlanie różnic utrzymuje tempo ty różnice.

Uwaga: Podczas edycji z różnicy git. Jeśli spróbujesz edytować wersję pliku przechowywaną w repozytorium, twoje zmiany zostaną odrzucone po wyjściu (git nie ufa ci oryginału, więc porównujesz się z kopią tmp), ale możesz edytować lokalną kopię zgodnie z zawartością twojego serca i zapisz go nad swoją aktualną wersją.

Niektóre podstawowe polecenia, które są 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 wyróżnianiem z vimdiff

if &diff highlight! link DiffText MatchParen endif 

To wyłącza podświetlanie na bitach kodu, które są zmieniane. Więc wiersz, który został zmieniony, jest podświetlony, więc mogę zauważyć zmiany, ale rzeczywisty tekst, który się zmienił, wyróżnia się w wierszu (ponieważ nie jest podświetlony).

Komentarze

  • Obsługuje także do 4 buforów, dzięki czemu świetnie nadaje się do porównywania plików konfiguracyjnych
  • Możesz także użyć polecenia :diffthis, aby zainicjować diff, gdy Vim już działa.
  • Oraz: diffoff, aby go wyłączyć. Myślę, że korzystny byłby link do dokumentacji vima ': vimdoc.sourceforge.net/htmldoc/diff.html
  • Dla mnie nawet po git config --global diff.tool vimdiff, git diff nadal pokazuje wszystko tak, jakby nic nie zmieniło.
  • spróbuj git difftool

Odpowiedz

Jeśli tak edytowanie otwartego pliku i chcesz porównać go z innym plikiem bez zamykania bieżącego:

Otwórz nowy plik na podzielonym ekranie:

W przypadku podziału pionowego:

:vs otherFile 

lub podział poziomy:

:split otherFile 

Przełącz kursory na inny podzielony ekran:

ctrl+w ctrl+w 

Wywołaj „tryb diff” w pliku:

:diffthis 

Przełącz na inny plik i wywołaj „tryb diff”:

:diffthis 

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

:diffoff 

Komentarze

  • Aby uniknąć przełączania między n bufory, których możesz użyć :windo diffthis też
  • @statox: działa również dla diffoff, więc :windo diffthis i :windo diffoff, aby rozpocząć i zatrzymać porównywanie dla dwóch otwartych okien. Lub w skrócie :windo difft i diffo!.
  • Jeśli zaczynasz od jednego otwartego pliku File1, możesz również użyć :vert diffs File2, aby otworzyć File2 w pionowym podziale po prawej stronie i porównać go z File1.

Odpowiedź

Poniższe ustawienie możesz umieścić w .gitconfig plik znaleziony w katalogu %homepath% (lub %userprofile%) aktualnie zalogowanego użytkownika:

[diff] tool = vimdiff 

Umożliwi to narzędziu git bash rozpoczęcie używania vimdiff jako zewnętrznego narzędzia porównującego.

Odpowiedź

Oto moja konfiguracja gita:

https://github.com/tracyone/dotfiles/blob/master/.gitconfig

[core] editor = vim [diff] tool = vimdiff [merge] tool = vimdiff conflictstyle = diff3 [difftool] prompt = 0 

Odpowiedź

W przypadku NeoVim możesz skonfigurować ~/.gitconfig z następującymi poleceniami

git config --global merge.tool nvim git config --global mergetool.keepBackup false git config --global mergetool.nvim.cmd $"nvim -d $LOCAL $REMOTE $MERGED -c \"$wincmd w\" -c \"wincmd J\"" 

Twój ~/.gitconfig powinien wyglądać następująco:

[merge] tool = nvim [mergetool] keepBackup = false [mergetool "nvim"] cmd = nvim -d $LOCAL $REMOTE $MERGED -c "$wincmd w" -c "wincmd J" 

Zapoznaj się z dokumentacją Nvim: diff , aby uzyskać więcej informacji na temat konfigurowania go według własnych upodobań.

Odpowiedź

Widzę tylko trzy miejsca zastosowania Vima jako difftool. Zostały one pokrótce opisane poniżej:

  • W przypadku git difftool umieść następujące elementy w swoim ~/.gitconfig:

    [core] editor = vim [diff] tool = vimdiff [merge] tool = vimdiff conflictstyle = diff3 
  • Aby otworzyć vima jako narzędzie porównujące dla 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óżnic dla aktualnie aktywnych buforów, tj. wszystkich buforów, które mają przypisane do nich 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

Komentarze

  • jeśli otwarty jest tylko jeden plik: :vert diffs File2 aby porównać z plikiem 2.

Odpowiedź

oto co robię:

  • otwórz okno z pierwszym plikiem (lub treścią tekstową, jeśli wklejasz data)
  • otwórz następny plik / okno za pomocą :vnew (aby mieć oba okna obok siebie) lub :new ( mieć okna na górze i b ottom). jeśli masz określony plik do otwarcia w drugim oknie, możesz dołączyć taką ścieżkę: :vnew /path/to/secondfile.txt
  • użyj F8, aby przełączyć niestandardową funkcję, która zmienia włączanie i wyłączanie trybu

tutaj „jest 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 

Komentarze

  • możesz użyć polecenia :diffthis i diffoff! więc nie ' nie musisz samodzielnie ustawiać wszystkich opcji porównywania (np. cursorbind jest również ustawiany przez diffmode)

Odpowiedz

Zaimplementowałem w .vimrc kilka przydatnych poleceń w trybie diff (dolna część). Jeśli edytujesz w trybie normalnym, ustawienia są resetowane (górna część). Możesz go po prostu skopiować do pliku .vimrc.

nmap <silent> <F2> :exec &nu==&rnu? "se nu!" : "se rnu!"<CR> inoremap <Esc>Oq 1 inoremap <Esc>Or 2 inoremap <Esc>Os 3 inoremap <Esc>Ot 4 inoremap <Esc>Ou 5 inoremap <Esc>Ov 6 inoremap <Esc>Ow 7 inoremap <Esc>Ox 8 inoremap <Esc>Oy 9 inoremap <Esc>Op 0 inoremap <Esc>On . inoremap <Esc>OQ / inoremap <Esc>OR * inoremap <Esc>Ol + inoremap <Esc>OS - inoremap <Esc>OM <Enter> nnoremap <Esc>OQ B " / nnoremap <Esc>OR E " * if &diff map <Esc>Oq zc " 1 close a fold map <Esc>Or <down> " 2 cursor down map <Esc>Os ]c " 3 next diff nmap <Esc>Ot <left> " 4 curosor left nnoremap <Esc>Ou <c-w>w " 5 jump to next file map <Esc>Ov <right> " 6 cursor right map <Esc>Ow zo " 7 open a fold map <Esc>Ox <up> " 8 curosor right map <Esc>Oy [c " 9 prefious diff map <Esc>Op 0 " 0 0 nmap <Esc>On . " . . nmap <Esc>OQ B " / back one word nmap <Esc>OR E " * end of word nmap <Esc>Ol dp " - diffput nmap <Esc>OS do " + diffget nmap <Esc>OM :diffupdate " Enter endif 

Oczywiście możesz zmienić moje ustawienia. Jeśli chcesz umieścić inne polecenie na ” 0 „, zmień to polecenie bezpośrednio po ” Op ” np z ” za „, który przełącza między zwijaniem a rozwijaniem:

 nmap <Esc>Op za " 0 0 

Należy pamiętać o różnym zastosowaniu ” map ” i ” nmap ” w zależności od klucza.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *