Come uso vim come strumento diff?


102

Uso vim come editor principale.

Vorrei anche usare vim per diff file e modificare i file mentre si fa il diff per correggere facili cambiamenti (piuttosto che la maggior parte delle tecniche diff che sono un ciclo di diff / fix / diff / fix).

Inoltre, ci sono modi semplici per integrare vim negli strumenti diff utilizzati dagli strumenti / siti di controllo del codice sorgente (sto pensando specificamente a git ma sono sicuro che altre persone sarebbero interessate all'integrazione con altri strumenti / siti di controllo del codice sorgente).


1
dovresti provare vim-fugitive che aggiunge i comandi :Gdiffed :Gvdiffentrambi i comandi ti permettono di vedere le differenze affiancate del buffer corrente se il tuo buffer corrente è gestito da git. Ti aiuta anche a risolvere i conflitti in un layout a tre finestre quando hai conflitti di unione su alcuni file
rbernabe

Ho questa semplice funzione nel mio bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }e la invoco con vd file1 file2. Usa diffper determinare se i file differiscono e si apre solo vimdiffse è così. Altrimenti, rimango nel guscio. Disattivo anche l'evidenziazione della sintassi in Vim perché trovo che distragga quando distraggo. Funziona solo con due file.
Rolf,

Risposte:


122

vim ha questa funzionalità integrata (con il flag della riga di comando corretto).

vim -d <file1> <file2>

Questo apre ogni file in una vista ed evidenzia le differenze.
Qualsiasi codice identico è foldedassente, quindi non è necessario guardare codice identico o scorrere enormi blocchi di codice identico.

Ma c'è anche un'applicazione wrapper vimdiffche invoca correttamente vim con i flag corretti.

vimdiff source1.cpp source2.cpp

Se stai usando git puoi configurare uno strumento diff esterno. Quindi è facile configurare vimdiff come strumento diff per git.

git config --global diff.tool vimdiff

Quando usi vimdiff puoi modificare entrambi i lati e l'evidenziazione diff tiene il passo per mostrarti le differenze.

Nota: quando si modifica da un git diff. Se provi a modificare la versione archiviata del repository del file, le tue modifiche verranno ignorate quando esci (git non si fida di te con l'originale, quindi stai differendo rispetto a una copia tmp) ma puoi modificare la copia locale nel contenuto del tuo cuore e salvalo sulla tua versione attuale.

Alcuni comandi di base che sono utili 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

Altre impostazioni di vim che utilizzo per evidenziare con vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Questo disattiva l'evidenziazione sui bit di codice che vengono modificati. Quindi la linea che viene modificata viene evidenziata in modo che io possa individuare le modifiche, ma il testo reale che è cambiato spicca sulla linea (in quanto non è evidenziato).


Gestisce anche fino a 4 buffer, rendendolo
perfetto

34
Puoi anche usare il :diffthiscomando per avviare un diff quando Vim è già in esecuzione.
Ricco

11
E: diffoff per spegnerlo. Penso che un link alla documentazione di Vim sarebbe utile: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll

1
Per me anche dopo git config --global diff.tool vimdiff, git diffmostra ancora tutto come se non cambio nulla.
Ciao Angelo

2
provagit difftool
Martin York,

13

Se stai modificando un file aperto e desideri confrontarlo con un altro file senza chiudere quello corrente:

Apri il nuovo file in schermo diviso:

Per la divisione verticale:

:vs otherFile

o divisione orizzontale:

:split otherFile

Passa i cursori a diversi schermi divisi:

ctrl+w ctrl+w

Richiamare "modalità diff" nel file:

:diffthis

Passa a un altro file e invoca la "modalità diff":

:diffthis

Per disattivare la "modalità diff":

:diffoff

5
Per evitare di passare da un buffer :windo diffthis
all'altro

4

È possibile inserire le impostazioni di seguito indicate nel .gitconfigfile trovato nella directory %homepath%(o %userprofile%) dell'utente attualmente connesso:

[diff]
    tool = vimdiff

Ciò consentirà allo strumento git bash di iniziare a utilizzare vimdiff anche come strumento diff esterno.



2

Vedo solo tre situazioni per usare vim come difftool. Di seguito sono brevemente descritti:

  • Per git difftool, inserisci quanto segue nel tuo ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Per aprire vim come diff-tool per due file, puoi fare quanto segue:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Per ottenere la visualizzazione diff per i buffer attualmente attivi, ovvero tutti i buffer a cui è stata assegnata una finestra nella scheda attualmente attiva, è possibile effettuare le seguenti operazioni:

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

Per ulteriori informazioni, vedere :h diff


1

ecco cosa faccio:

  • apri una finestra con il primo file (o contenuti di testo se stai incollando i dati)
  • apri il file / finestra successivo usando :vnew(per avere entrambe le finestre affiancate) o :new(per avere le finestre in alto e in basso). se hai un file specifico da aprire nella seconda finestra, puoi includere il percorso in questo modo::vnew /path/to/secondfile.txt
  • usa F8 per attivare o disattivare una funzione personalizzata che attiva e disattiva la modalità diff

ecco la funzione personalizzata che è nel mio ~/.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

puoi usare il comando :diffthise diffoff!quindi non devi impostare tu stesso tutte le opzioni diff (es. cursorbind è impostato anche da diffmode)
Christian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.