2009-08-12 5 views
54

Sto usando vim -d file1 file2 per vedere le differenze tra di loro. Funziona bene, ma voglio ignorare le modifiche agli spazi bianchi: sono irrilevanti per i file del codice sorgente.C'è un modo per configurare vimdiff per ignorare TUTTI gli spazi bianchi?

Vim aiuto afferma che il seguente comando farà la magia:

set diffopt+=iwhite 

Ma, purtroppo, questo comando non fa che aumentare -b per diff strumento da riga di comando, e che gli spazi bianchi solo ignora finali. Il corretto tasto della riga di comando per diff dovrebbe essere -w, per ignorare tutte le modifiche di spazi bianchi. Ma non riesco a trovare come modificare la linea di comando diff direttamente da Vim. Certo che posso compilare un diff personalizzato, o sostituire diff con diff.sh, ma che sembra un pò brutto :(.

c'è un modo migliore per modificare il modo in Vim interagisce con lo strumento diff per la visualizzazione di file di differenze?

.

risposta

23

Sì Impostare l'opzione iwhite come avete fatto, ma in aggiunta, fanno diffexpr vuoto

Dalla sezione dedicata del vim docs:.

iWhite

Ignora le variazioni di quantità di spazio bianco. Aggiunge il flag "-b" al comando "diff" se 'diffexpr' è vuoto. Controllare la documentazione del comando "diff" per ciò che fa esattamente . Dovrebbe ignorare l'aggiunta dello spazio bianco iniziale tra , ma non lo spazio bianco iniziale.

Nota anche che è possibile fornire una linea di comando di diff personalizzata impostando diffexpr. Vedere la discussione sulla vimdiff man page, in particolare:

L'opzione 'diffexpr' può essere impostato per utilizzare qualcosa di diverso rispetto allo standard programma di "diff" per confrontare due file e trovare le differenze.

Quando 'diffexpr' non è, Vim usa questo comando per trovare le differenze tra file1 e file2:

diff file1 file2 > outfile 
+7

Questo non ignora tutti gli spazi bianchi (-w in diff), ma implementa ignorare le modifiche allo spazio bianco (-b in diff). –

31

Questo implementa quello che vuoi (tratto dal diffexpr docs con -b cambiato in -w) :

set diffopt+=iwhite 
set diffexpr=DiffW() 
function DiffW() 
    let opt = "" 
    if &diffopt =~ "icase" 
    let opt = opt . "-i " 
    endif 
    if &diffopt =~ "iwhite" 
    let opt = opt . "-w " " swapped vim's -b with -w 
    endif 
    silent execute "!diff -a --binary " . opt . 
    \ v:fname_in . " " . v:fname_new . " > " . v:fname_out 
endfunction 

... sto ancora cercando una migliore aiutante diffexpr rispetto alla movimentazione quali linee mappa a cui (GNU diff, anche con -w anziché -b, è piuttosto sconcertante combinando spazi bianchi extra con modifiche minori come le linee commentate). Forse diffchar?

+7

Questa dovrebbe essere la risposta accettata, poiché al momento è l'unica corretta. È troppo brutto. Vim non ha una semplice opzione per passare da "diff -b", che fa poco uso, e "diff -w". – farnsy

+0

In qualche modo il mio 'vim' (versione 8, Debian Stretch) lampeggia e mostra uno schermo vuoto dopo': diffupdate', ridisegnando lo schermo corretto solo dopo un 'PageUp' o' PagDown'. Molto strano ... –

+0

@DrBeco: Questo non è il posto giusto per risolvere il problema, ma inizierei a vedere se hai quel problema con gvim (supponendo che tu abbia una GUI). Altrimenti, provate un emulatore di terminale diverso o una definizione diversa di $ TERM (come "xterm-color" o "xterm-256color" o anche solo "xterm"). Altrimenti, ti suggerisco di effettuare ricerche sul Web e se ciò non è di aiuto, esegui una ricerca e richiedi in [vi.SE] (https://vi.stackexchange.com/). Per una soluzione alternativa, Ctrl + L potrebbe funzionare. Forse anche sperimentare con la modifica dell'evidenziazione della sintassi. –

15

Grazie ire, questo mi ha aiutato. Ora solo bisogno di avere questo (più semplice di quanto proposto da Adam K) nel mio ~/.vimrc:

set diffopt+=iwhite 

set diffexpr="" 

e lo fa ...Questo è ancora lo strumento diff più potente che io conosca, molto meglio di qualsiasi altro.

+4

No, questo implementa diff -b, non diff -w come la domanda richiede. Adam K ha l'unica risposta corretta qui. – farnsy

+0

Grazie! Solo "set diffopt + = iwhite" è già utile, perché viene emesso da vimdiff stesso, in modo interattivo. –

0

Affrontare un problema cresciuto nei commenti di soluzione di Adam Katz:

A seconda della versione vim e la configurazione degli utenti, un comando silent può trascurare per ridisegnare lo schermo dopo che è stato emesso. Ho anche riscontrato questo problema, che si verificava ogni volta che eseguivo :diffo dopo aver utilizzato il suggerimento diffexpr. La mia soluzione era di cambiare il comando silent execute al seguente:

silent execute "!diff -a --binary " . opt . 
\ v:fname_in . " " . v:fname_new . " > " . v:fname_out | redraw! 

Ciò impone un nuovo aggiornamento dopo l'emissione del comando.