Hoe gebruik ik vim als een diff-tool?

Ik gebruik vim als mijn primaire editor.

Ik zou ook vim willen gebruiken om bestanden te differen en de bestanden te wijzigen terwijl ik de diff om eenvoudige wijzigingen op te lossen (in plaats van de meeste diff-technieken die een cyclus zijn van diff / fix / diff / fix).

Bovendien zijn er eenvoudige manieren om vim te integreren in diff-tools die worden gebruikt door bronbeheerprogrammas / sites (Ik denk specifiek aan git, maar ik ben er zeker van dat andere mensen geïnteresseerd zouden zijn in integratie met andere tools / sites voor bronbeheer).

Reacties

  • je zou vim-fugitive moeten proberen, het voegt de commandos :Gdiff en :Gvdiff toe. Beide commandos laten je de diff van de huidige buffer naast elkaar zien als je huidige buffer wordt beheerd door git. Het helpt je ook om conflicten op te lossen in een indeling met drie vensters wanneer je samenvoegconflicten hebt met sommige bestanden.
  • Ik heb deze eenvoudige functie in mijn bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; } en ik roep het met vd file1 file2. Het gebruikt diff om te bepalen of de bestanden verschillen en opent alleen vimdiff als dat zo is. Anders blijf ik in de schaal. Ik schakel ook syntaxisaccentuering uit in Vim omdat ik het storend vind bij het differen. Werkt alleen met twee bestanden.

Answer

vim heeft deze functionaliteit ingebouwd (met de juiste opdrachtregelvlag ).

vim -d <file1> <file2> 

Dit opent elk bestand in een weergave en benadrukt de verschillen.
Elke code die identiek is, is folded weg, zodat u niet naar identieke code hoeft te kijken of door grote brokken identieke code hoeft te scrollen.

Maar er is ook een wrapper-applicatie vimdiff die vim correct aanroept met de juiste vlaggen.

vimdiff source1.cpp source2.cpp 

Als je git gebruikt, kun je een externe diff-tool opzetten. Het is dus gemakkelijk om vimdiff in te stellen als de diff-tool voor git.

git config --global diff.tool vimdiff 

Als je vimdiff gebruikt, kun je beide zijden bewerken en diff-accentuering houdt gelijke tred om te tonen jij de verschillen.

Opmerking: bij het bewerken vanuit een git diff. Als je de in de repository opgeslagen versie van het bestand probeert te bewerken, worden je wijzigingen weggegooid wanneer je afsluit (git vertrouwt je niet met het origineel, dus je onderscheidt zich tegen een tmp-kopie) maar je kunt de lokale kopie naar hartenlust bewerken en sla het op over je huidige versie.

Enkele basiscommandos die handig zijn in 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 

Andere vim-instellingen die ik gebruik om met highliting met vimdiff te werken

if &diff highlight! link DiffText MatchParen endif 

Dit schakelt de accentuering van de stukjes code die zijn gewijzigd uit. Dus de regel die is gewijzigd, wordt gemarkeerd zodat ik de wijzigingen kan zien, maar de daadwerkelijke tekst die is gewijzigd, valt op de regel op (omdat deze niet is gemarkeerd).

Opmerkingen

  • Verwerkt ook tot 4 buffers, waardoor het ideaal is voor het vergelijken van configuratiebestanden.
  • Je kunt ook het :diffthis commando gebruiken om een diff als Vim al draait.
  • En: diffoff om het uit te schakelen. Ik denk dat een link naar de documentatie van vim ‘ s nuttig zou zijn: vimdoc.sourceforge.net/htmldoc/diff.html
  • Voor mij, zelfs na git config --global diff.tool vimdiff, laat git diff nog steeds alles zien alsof ik niets verander.
  • probeer git difftool

Answer

Als je dat bent een geopend bestand bewerken en het met een ander bestand willen vergelijken zonder het huidige te sluiten:

Open het nieuwe bestand in een gesplitst scherm:

Voor verticale splitsing:

:vs otherFile 

of horizontale splitsing:

:split otherFile 

Cursors wisselen naar een ander gesplitst scherm:

ctrl+w ctrl+w 

Roep “diff mode” op in bestand:

:diffthis 

Schakel over naar een ander bestand en roep “diff mode” op:

:diffthis 

Om “diff mode” uit te schakelen:

:diffoff 

Reacties

  • Om te voorkomen dat u tussen n de buffers kun je :windo diffthis ook gebruiken
  • @statox: werkt ook voor diffoff, dus :windo diffthis en :windo diffoff om start en stop diff voor twee geopende vensters. Of afgekort :windo difft en diffo!.
  • Als u begint met één geopend bestand File1, je kunt ook :vert diffs File2 gebruiken om File2 in een verticale splitsing aan de rechterkant te openen en het te verschuiven met File1.

Antwoord

U kunt onderstaande instelling plaatsen in .gitconfig bestand gevonden in %homepath% (of %userprofile%) directory van de momenteel aangemelde gebruiker:

[diff] tool = vimdiff 

Hierdoor kan de git bash tool ook vimdiff gaan gebruiken als de externe diff tool.

Answer

Hieronder volgt mijn git-configuratie:

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

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

Antwoord

Voor NeoVim kunt u uw ~/.gitconfig met de volgende commandos

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\"" 

Uw ~/.gitconfig zou er dan als volgt uit moeten zien:

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

Raadpleeg Nvim-documentatie: diff voor meer informatie over hoe u het naar wens kunt configureren.

Answer

Ik zie er maar drie zitten gebruiken om vim als een difftool te gebruiken. Ze worden hieronder kort beschreven:

  • Voor git difftool, plaats het volgende in uw ~/.gitconfig:

    [core] editor = vim [diff] tool = vimdiff [merge] tool = vimdiff conflictstyle = diff3 
  • Om vim te openen als een diff-tool voor twee bestanden, kun je het volgende doen:

    vimdiff file1.ext file2.ext # for vim nvim -d file1.ext file2.ext # for neovim 
  • Om een verschilweergave te krijgen voor de buffers die momenteel actief zijn, dwz alle buffers waaraan een venster is toegewezen in de momenteel actieve tabpagina, kunt u het volgende doen:

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

Voor meer informatie, zie :h diff

Reacties

  • als er nog maar één bestand open is: :vert diffs File2 om te verschillen met Bestand2.

Antwoord

hier is wat ik doe:

  • open een venster met het eerste bestand (of tekstinhoud als je plakt data)
  • open volgend bestand / venster met :vnew (om beide vensters naast elkaar te hebben) of :new ( om de ramen boven en b ottom). als je een specifiek bestand wilt openen in het tweede venster, kun je het pad als volgt toevoegen: :vnew /path/to/secondfile.txt
  • gebruik F8 om een aangepaste functie in te schakelen die diff verandert modus aan en uit

hier is de aangepaste functie die “in mijn ~/.vimrc staat:

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 

Reacties

  • je kunt het commando :diffthis en diffoff! dus je hoeft niet ‘ alle diff-opties zelf in te stellen (bijv. cursorbind wordt ook ingesteld door diffmode)

Answer

Ik heb door .vimrc overgenomen met enkele handige commandos in diff-modus (onderste deel). Als u in de normale modus bewerkt, wordt de instelling gereset (bovenste gedeelte). U kunt het eenvoudig in uw .vimrc-bestand kopiëren.

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 

Natuurlijk kunt u mijn instellingen wijzigen. Als je een ander commando wilt plaatsen op ” 0 “, verander het commando dan direct na ” Op ” bijv met ” za ” die schakelt tussen vouwen en uitvouwen:

 nmap <Esc>Op za " 0 0 

Let op het verschillende gebruik van ” map ” en ” nmap ” afhankelijk van de sleutel.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *