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
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
idiffo!
. - 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 zFile1
.
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
idiffoff!
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.
: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ówvd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }
i wywołuję to zvd file1 file2
. Używadiff
do określenia, czy pliki się różnią i otwiera tylkovimdiff
, 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.