So che la modalità diff di Vim ( vimdiff
) ci consente di confrontare i contenuti di due (o più) file.
Ma è possibile confrontare il contenuto di più file tra le directory per unire ricorsivamente due directory (come DiffMerge e strumenti simili)?
So che la modalità diff di Vim ( vimdiff
) ci consente di confrontare i contenuti di due (o più) file.
Ma è possibile confrontare il contenuto di più file tra le directory per unire ricorsivamente due directory (come DiffMerge e strumenti simili)?
Risposte:
C'è un plugin DirDiff.vim ( GitHub ) per diff e unire due directory in modo ricorsivo.
Esegue una diff ricorsiva su due directory e genera una "finestra" diff. Sulla base di quella finestra è possibile eseguire varie operazioni diff come l'apertura di due file in modalità diff di Vim, copiare il file o la directory in modo ricorsivo sull'altro o rimuovere l'albero della directory dalla directory di origine.
Uso:
:DirDiff <dir1> <dir2>
Per maggiori informazioni / aiuto: :help dirdiff
Guarda lo screenshot:
Guarda anche:
Confrontare ricorsivamente e unire le directory? sul blog dedm
Uso uno script wrapper python
per unire i file (vedi sotto). Questa è una versione semplificata di ciò che uso per unire i miei ~/.vim
dir e simili.
Dovrebbe funzionare in Python 2 e 3; ma probabilmente non nelle versioni molto vecchie di Python fornite con CentOS e altre distro.
Essere consapevoli del fatto che alcuni controlli (come quello per i file binari, o se i file sono gli stessi) non sono molto veloci (legge l'intero file); potresti rimuoverli se vuoi.
Inoltre non segnala se a è presente solo in una delle directory ...
#!/usr/bin/env python
from __future__ import print_function
import hashlib, os, subprocess, sys
if len(sys.argv) < 3:
print('Usage: {} dir1 dir2'.format(sys.argv[0]))
sys.exit(1)
dir1 = os.path.realpath(sys.argv[1])
dir2 = os.path.realpath(sys.argv[2])
for root, dirs, files in os.walk(dir1):
for f in files:
f1 = '{}/{}'.format(root, f)
f2 = f1.replace(dir1, dir2, 1)
# Don't diff files over 1MiB
if os.stat(f1).st_size > 1048576 or os.stat(f2).st_size > 1048576: continue
# Check if files are the same; in which case a diff is useless
h1 = hashlib.sha256(open(f1, 'rb').read()).hexdigest()
h2 = hashlib.sha256(open(f2, 'rb').read()).hexdigest()
if h1 == h2: continue
# Don't diff binary files
if open(f1, 'rb').read().find(b'\000') >= 0: continue
subprocess.call(['vimdiff', f1, f2])
Ho voluto lo stesso per un po '. La migliore soluzione che ho trovato è stata usare vdwrap , che funziona incredibilmente bene. Tutto ciò che fa è avvolgere git difftool --dir-diff
per vimdiff
. Non richiede alcun plugin vim.
Tutto quello che devi fare è dire git difftool
di usare vdwrap
:
git config --global difftool.vdwrap.cmd '/full/path/vdwrap $LOCAL $REMOTE'
git config --global diff.tool vdwrap
La prossima volta che usi git difftool, aprirà Vim con schede Vim separate per ogni coppia di file.
Un avvertimento è che si tratta di uno script Zsh. Dovrebbe essere abbastanza semplice convertirlo in uno script bash ma non ci ho provato.
Se vuoi semplicemente usare vimdiff senza installare nulla in più, il seguente comando aprirà in successione tutti i file diversi, consentendoti di esaminare le modifiche con vimdiff:
for files in $(diff -rq dir1 dir2|grep 'differ$'|sed "s/^Files //g;s/ differ$//g;s/ and /:/g"); do
vimdiff ${files%:*} ${files#*:};
done
C'è una soluzione leggera per questo:
diff dir1 dir2 | vim -R -
a shell.Aggiungerà pieghe e confronti affiancati per i file modificati.