Hur använder jag vim som ett diffverktyg?

Jag använder vim som min primära redigerare.

Jag skulle också vilja använda vim för att diff-filer och modifiera filerna medan jag gör diff för att fixa enkla ändringar (snarare än de flesta diff-tekniker som är en cykel av diff / fix / diff / fix).

Dessutom finns det enkla sätt att integrera vim i diff-verktyg som används av källkontrollverktyg / webbplatser (Jag tänker specifikt på git men jag är säker på att andra skulle vara intresserade av integration med andra källkontrollverktyg / webbplatser).

Kommentarer

  • du bör prova vim-fugitive det lägger till kommandona :Gdiff och :Gvdiff båda kommandona låter dig se sidan vid sida diff av den aktuella bufferten din nuvarande buffert hanteras av git. Det ber dig också att lösa konflikter i en trefönsterlayout när du har sammanslagningskonflikter på vissa filer
  • Jag har den här enkla funktionen i min bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; } och jag åberopar det med vd file1 file2. Den använder diff för att avgöra om filerna skiljer sig åt och bara öppnar vimdiff om så är fallet. Annars stannar jag i skalet. Jag inaktiverar också syntaxmarkering i Vim eftersom jag tycker att det är distraherande när det skiljer sig. Fungerar bara med två filer.

Svar

vim har den här funktionen inbyggd (med rätt kommandoradsflagga ).

vim -d <file1> <file2> 

Detta öppnar varje fil i en vy och belyser skillnaderna.
En kod som är identisk är folded bort så att du inte behöver titta på identisk kod eller bläddra genom stora bitar med identisk kod.

Men det finns också ett omslagsprogram vimdiff som korrekt åberopar vim med rätt flaggor.

vimdiff source1.cpp source2.cpp 

Om du använder git kan du ställa in ett externt diff-verktyg. Så det är lätt att ställa in vimdiff som diff-verktyg för git.

git config --global diff.tool vimdiff 

När du använder vimdiff kan du redigera båda sidor och diff-markering håller takten för att visa du skillnaderna.

Obs! När du redigerar från en git diff. Om du försöker redigera lagringsversionen av filen kommer dina ändringar att kasseras när du avslutar (git litar inte på originalet så att du skiljer dig från en tmp-kopia) men du kan redigera den lokala kopian till ditt hjärta och spara det över din nuvarande version.

Några grundläggande kommandon som är användbara i 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 

Andra vim-inställningar jag använder för att arbeta med highliting med vimdiff

if &diff highlight! link DiffText MatchParen endif 

Detta stänger av markering på kodbitarna som ändras. Så raden som ändras är markerad så att jag kan se ändringarna, men den faktiska texten som har ändrats sticker ut på raden (eftersom den inte är markerad).

Kommentarer

  • Hanterar också upp till 4 buffertar, vilket gör det bra för att jämföra konfigurationsfiler
  • Du kan också använda kommandot :diffthis för att initiera en diff när Vim redan körs.
  • Och: diffoff för att stänga av den. Jag tror att en länk till vim ’ s dokumentation skulle vara till nytta: vimdoc.sourceforge.net/htmldoc/diff.html
  • För mig även efter git config --global diff.tool vimdiff visar git diff fortfarande allt som om jag ändrar ingenting.
  • prova git difftool

Svar

Om du är redigera en öppen fil och vill jämföra den med en annan fil utan att stänga den aktuella:

Öppna den nya filen i delad skärm:

För vertikal delning:

:vs otherFile 

eller horisontell delning:

:split otherFile 

Byt markör till annan delad skärm:

ctrl+w ctrl+w 

Åkalla ”diff mode” i fil:

:diffthis 

Byt till annan fil och anropa ”diff mode”:

:diffthis 

För att stänga av ”diff mode”:

:diffoff 

Kommentarer

  • För att undvika att byta mellan två n buffertarna kan du använda :windo diffthis också
  • @statox: fungerar även för diffoff, så :windo diffthis och :windo diffoff till start och stoppdiff för två öppna fönster. Eller förkortat :windo difft och diffo!.
  • Om du börjar med en öppen fil File1, du kan också använda :vert diffs File2 för att öppna File2 i en vertikal delning till höger och diffundera med File1.

Svar

Du kan placera nedan nämnda inställning i .gitconfig fil hittades i %homepath% (eller %userprofile%) katalog för den inloggade användaren:

[diff] tool = vimdiff 

Detta gör att git bash-verktyget också kan börja använda vimdiff som det externa diff-verktyget.

Svar

Följande är min git-konfiguration:

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

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

Svar

För NeoVim kan du ställa in ditt ~/.gitconfig med följande kommandon

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

Ditt ~/.gitconfig ska då se ut:

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

Se Nvim-dokumentation: diff för mer information om hur du konfigurerar det efter eget tycke.

Svar

Jag kan bara se tre sit vations att använda vim som en difftool. De beskrivs kort nedan:

  • För git difftool, lägg följande i din ~/.gitconfig:

    [core] editor = vim [diff] tool = vimdiff [merge] tool = vimdiff conflictstyle = diff3 
  • För att öppna vim som ett diff-verktyg för två filer kan du göra följande:

    vimdiff file1.ext file2.ext # for vim nvim -d file1.ext file2.ext # for neovim 
  • För att få diff-vy för buffertarna som är aktiva, dvs. alla buffertar som har ett fönster tilldelat på den aktuella aktiva fliksidan, kan du göra följande:

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

Mer information finns i :h diff

Kommentarer

  • om bara en fil är öppen ännu: :vert diffs File2 för att skilja sig från File2.

Svar

här gör jag:

  • öppnar ett fönster med första filen (eller textinnehåll om du klistrar in data)
  • öppna nästa fil / fönster med :vnew (för att ha båda fönstren sida vid sida) eller :new ( att ha windows top och b ottom). om du har en specifik fil att öppna i det andra fönstret kan du inkludera sökvägen så här: :vnew /path/to/secondfile.txt
  • använd F8 för att växla en anpassad funktion som blir diff läge på och av

här är den anpassade funktionen som ”s i min ~/.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 

Kommentarer

  • du kan använda kommandot :diffthis och diffoff! så att du inte behöver ’ t måste ställa in alla diffalternativ själv (t.ex. cursorbind är också inställt av diffmode)

Svar

Jag har antagit av .vimrc med några användbara kommandon i diff-läge (nedre delen). Om du redigerar i normalt läge återställs inställningen (övre delen). Du kan kopiera det helt enkelt i din .vimrc-fil.

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 

Naturligtvis kan du ändra mina inställningar. Om du vill lägga till ett nytt kommando på ” 0 ”, ändra kommandot direkt efter ” Op ” t.ex. med ” za ” som växlar mellan vikning och vikning:

 nmap <Esc>Op za " 0 0 

Var medveten om den olika användningen av ” karta ” och ” nmap ” beroende på nyckel.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *