web-dev-qa-db-fra.com

Existe-t-il un moyen de configurer vimdiff pour qu’il ignore TOUS les espaces blancs?

J'utilise vim -d file1 file2 afin de voir les différences entre eux. Cela fonctionne bien, mais je veux ignorer les modifications d’espace, elles ne sont pas pertinentes pour les fichiers de code source. 

L'aide de Vim indique que la commande suivante fera la magie:

set diffopt+=iwhite

Mais malheureusement, cette commande n’ajoute que -b à la ligne de commande de l’outil diff, ce qui n’ignore que les espaces finaux. La clé de ligne de commande correcte pour diff doit être -w, pour ignorer tous les changements d'espaces. Mais je ne trouve pas comment modifier la ligne de commande diff directement à partir de Vim. Bien sûr, je peux compiler un diff personnalisé, ou remplacer diff par diff.sh, mais ça a l'air un peu moche :(.

Existe-t-il un meilleur moyen de modifier la manière dont Vim interagit avec l'outil de comparaison pour afficher les différences de fichiers?

59
grigoryvp

Oui. Définissez l'option iwhite comme vous l'avez fait, mais en plus, faites diffexpr vide.

Dans la section appropriée de la vim docs :

iwhite 

Ignorer les changements dans la quantité d'espace blanc. Ajoute l'indicateur "-b" à la commande "diff" si 'diffexpr' est vide. Consultez la documentation de la commande "diff" pour ce que cela fait exactement. Il devrait ignorer l’ajout de la fin espace blanc, mais pas d’espace blanc.

Notez également que vous pouvez fournir une ligne de commande diff personnalisée en définissant diffexpr. Voir la discussion sur la page de manuel vimdiff , en particulier:

L'option 'diffexpr' peut être configurée pour utiliser autre chose que le standard "diff" programme pour comparer deux fichiers et trouver les différences.

Lorsque 'diffexpr' est vide, Vim utilise cette commande pour trouver les différences entre fichier1 et fichier2:

diff file1 file2 > outfile
26
ire_and_curses

Cela implémente ce que vous voulez (extrait du diffexpr docs avec -b remplacé par -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

... Je cherche toujours un meilleur assistant diffexpr en ce qui concerne le traitement des lignes sur lesquelles ( GNU diff , même avec -w au lieu de -b, est plutôt déroutant en combinant des espaces édite comme des lignes commentées). Peut-être diffchar ?

35
Adam Katz

Merci ire, ça m'a aidé. Il me suffit maintenant d’avoir ceci (plus simple que ce qui est proposé par Adam K) dans mon ~/.vimrc: 

set diffopt+=iwhite

set diffexpr=""

Et ça le fait ... C’est toujours l’outil de diff le plus puissant que je connaisse, bien meilleur que tout autre.

16
greg

Aborder un problème soulevé dans les commentaires de la solution d'Adam Katz:

En fonction de la version de vim et de la configuration de l'utilisateur, une commande silent peut négliger de redessiner l'écran après son émission. J'ai également rencontré ce problème, qui se présentait à chaque fois que j'exécutais :diffo après avoir utilisé le diffexpr suggéré. Ma solution était de changer la commande d'exécution silencieuse comme suit:

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

Cela force un rafraîchissement après que la commande est émise.

0
Brian Pollack