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
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
visargit 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
ochdiffo!
. - Om du börjar med en öppen fil
File1
, du kan också använda:vert diffs File2
för att öppnaFile2
i en vertikal delning till höger och diffundera medFile1
.
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
ochdiffoff!
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.
: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 filervd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }
och jag åberopar det medvd file1 file2
. Den använderdiff
för att avgöra om filerna skiljer sig åt och bara öppnarvimdiff
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.