Hvordan bruger jeg vim som et diff-værktøj?

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

  • du skal prøve vim-fugitive det tilføjer kommandoerne :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 filer
  • Jeg har denne enkle funktion i min bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; } og jeg påberåber det med vd file1 file2. Det bruger diff til at afgøre, om filerne adskiller sig og kun åbner vimdiff, 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.

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 viser git 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 og diffo!.
  • Hvis du starter med en åben fil File1, kan du også bruge :vert diffs File2 til at åbne File2 i en lodret opdeling til højre og diffundere den med File1.

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 og diffoff! 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *