Jeg bruger vim som min primære editor.
Jeg vil også gerne bruge vim til at diff filer og ændre filerne, mens jeg laver diff for at rette nemme ændringer (snarere end de fleste diff-teknikker, der er en cyklus af diff / fix / diff / fix).
Der er desuden nemme måder at integrere vim i diff-værktøjer, der bruges af kildekontrolværktøjer / -sites (Jeg tænker specifikt på git, men jeg er sikker på, at andre mennesker ville være interesserede i integration med andre kildekontrolværktøjer / -sites).
Kommentarer
Svar
vim har denne funktion indbygget (med det korrekte kommandolinjeflag ).
vim -d <file1> <file2>
Dette åbner hver fil i en visning og fremhæver forskellene.
Enhver kode, der er identisk, er folded
væk, så du ikke behøver at se på identisk kode eller rulle gennem store klumper med identisk kode.
Men der er også en indpakningsprogram vimdiff
, der korrekt påkalder vim med de korrekte flag.
vimdiff source1.cpp source2.cpp
Hvis du bruger git, kan du oprette et eksternt diff-værktøj. Så det er let at indstille vimdiff til at være diff-værktøjet til git.
git config --global diff.tool vimdiff
Når du bruger vimdiff, kan du redigere begge sider, og diff-fremhævning holder tempoet for at vise dig forskellene.
Bemærk: Når du redigerer fra en git diff. Hvis du prøver at redigere arkivlagret version af filen, vil dine ændringer blive kasseret, når du afslutter (git stoler ikke på originalen, så du adskiller dig fra en tmp-kopi), men du kan redigere den lokale kopi efter dit hjerte og gem det over din nuværende version.
Nogle grundlæggende kommandoer, der er nyttige 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
Andre vim-indstillinger, jeg bruger til at arbejde med highliting med vimdiff
if &diff highlight! link DiffText MatchParen endif
Dette slukker for fremhævning på de bit af kode, der ændres. Så linjen, der er ændret, er fremhævet, så jeg kan få øje på ændringerne, men den aktuelle tekst, der er ændret, skiller sig ud på linjen (da den ikke er fremhævet).
Kommentarer
- Håndterer også op til 4 buffere, hvilket gør det godt til sammenligning af konfigurationsfiler
- Du kan også bruge kommandoen
:diffthis
til at starte en diff når Vim allerede kører. - Og: diffoff for at slå det fra. Jeg tror, at et link til vim ‘ s dokumentation ville være gavnligt: vimdoc.sourceforge.net/htmldoc/diff.html
- For mig selv efter
git config --global diff.tool vimdiff
visergit diff
stadig alt som hvis jeg ikke ændrer noget. - prøv
git difftool
Svar
Hvis du er redigering af en åben fil og ønsker at sammenligne den med en anden fil uden at lukke den aktuelle:
Åbn den nye fil i delt skærmbillede:
For lodret opdeling:
:vs otherFile
eller vandret split:
:split otherFile
Skift markører til forskellige splitskærme:
ctrl+w ctrl+w
Påkald “diff mode” i fil:
:diffthis
Skift til anden fil og påkald “diff mode”:
:diffthis
Sådan deaktiveres “diff mode”:
:diffoff
Kommentarer
- For at undgå at skifte mellem to n bufferne kan du også bruge
:windo diffthis
- @statox: fungerer også til
diffoff
, så:windo diffthis
og:windo diffoff
til start og stop diff for to åbne vinduer. Eller forkortet:windo difft
ogdiffo!
. - Hvis du starter med en åben fil
File1
, kan du også bruge:vert diffs File2
til at åbneFile2
i en lodret opdeling til højre og diffundere den medFile1
.
Svar
Du kan placere nedenstående indstilling i .gitconfig
fil fundet i %homepath%
(eller %userprofile%
) for den aktuelt loggede bruger:
[diff] tool = vimdiff
Dette gør det muligt for git bash-værktøjet også at begynde at bruge vimdiff som det eksterne diff-værktøj.
Svar
Følgende er 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
For NeoVim kan du konfigurere dit ~/.gitconfig
med følgende kommandoer
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\""
Din ~/.gitconfig
skal så se ud:
[merge] tool = nvim [mergetool] keepBackup = false [mergetool "nvim"] cmd = nvim -d $LOCAL $REMOTE $MERGED -c "$wincmd w" -c "wincmd J"
Se Nvim-dokumentation: diff for mere info om, hvordan du konfigurerer det efter din smag.
Svar
Jeg kan kun se tre sidde uationer til at bruge vim som en difftool. De er kort beskrevet nedenfor:
-
For git difftool skal du sætte følgende i din
~/.gitconfig
:[core] editor = vim [diff] tool = vimdiff [merge] tool = vimdiff conflictstyle = diff3
-
For at åbne vim som et diff-værktøj til to filer kan du gøre følgende:
vimdiff file1.ext file2.ext # for vim nvim -d file1.ext file2.ext # for neovim
-
For at få diff-visning for de buffere, der er aktive i øjeblikket, dvs. alle buffere, der har et vindue tildelt dem på den aktuelt aktive fane, kan du gøre følgende:
:windo diffthis " to get diff view :windo diffoff " to remove diff view
For flere oplysninger, se :h diff
Kommentarer
- hvis kun en fil er åben endnu:
:vert diffs File2
for at adskille sig med File2.
Svar
her er hvad jeg gør:
- åbner et vindue med første fil (eller tekstindhold, hvis du indsætter data)
- åbn næste fil / vindue ved hjælp af
:vnew
(for at have begge vinduer side om side) eller:new
( at have vinduerne øverst og b ottom). hvis du har en bestemt fil at åbne i det andet vindue, kan du medtage stien som denne::vnew /path/to/secondfile.txt
- brug F8 til at skifte en brugerdefineret funktion, der bliver diff tilstand til og fra
her “er den brugerdefinerede funktion, som” er 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 bruge kommandoen
:diffthis
ogdiffoff!
så du behøver ikke ‘ ikke skal indstille alle diff-indstillinger selv (f.eks. er cursorbind også indstillet af diffmode)
Svar
Jeg har vedtaget af .vimrc med nogle nyttige kommandoer i diff-tilstand (nederste del). Hvis du redigerer i normal tilstand, nulstilles indstillingen (øverste del). Du kan kopiere den simpelthen 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
Du kan selvfølgelig ændre mine indstillinger. Hvis du vil placere en anden kommando på ” 0 “, skal du ændre kommandoen lige efter ” Op ” f.eks med ” za ” som skifter mellem foldning og udfoldning:
nmap <Esc>Op za " 0 0
Vær opmærksom på den forskellige brug af ” map ” og ” nmap ” afhængigt af nøglen.
:Gdiff
og:Gvdiff
begge kommandoer giver dig mulighed for at se side om side diff af den aktuelle buffer, hvis din nuværende buffer styres af git. Det beder dig også om at løse konflikter i et layout med tre vinduer, når du har flette konflikter på nogle filervd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }
og jeg påberåber det medvd file1 file2
. Det brugerdiff
til at afgøre, om filerne adskiller sig og kun åbnervimdiff
, hvis det er sådan. Ellers bliver jeg i skallen. Jeg deaktiverer også syntaksfremhævning i Vim, fordi jeg finder det distraherende, når det adskiller sig. Fungerer kun med to filer.