Vim y diferencias unificadas

En mi trabajo diario, solo trato con diferencias unificadas, así que me gustaría definir el alias

alias diff='diff -puN' 

en mi .zshrc .

Este alias no se respeta cuando uso el shell desde el modo de línea de command vim, es decir, cuando ingreso :!diff file1 file2 . Creo que esto se debe a que vim no invoca un shell interactivo.

Por lo tanto, moví el alias de .zshrc a .zshenv que me permite get simples diferencias unificadas desde vim (generalmente prefiero esta salida a la de vimdiff ).

Por otro lado, al hacer esto se rompe vimdiff que aparentemente no puede analizar las diferencias unificadas (genera el Error E97 , pero ni su explicación en help E97 ni las references parecen ser útiles para mí: o parecen no estar relacionadas (por ejemplo, la opción de shell ) o están por encima de mi cabeza (la opción diferente).

¿Cómo debo hacer para tener ambos vimdiff y mi alias para el trabajo de diff al mismo time?

Cambiar la semántica del command diff hace esgulps en Vim (esto se explica en :help diff-diffexpr : La salida de "diff" debe ser una diferencia de estilo "ed" normal. NO use un diff de context ), y potencialmente otros progtwigs, también.

Un alias de shell puro con el mismo nombre está bien, ya que solo se tiene en count cuando se escriben commands de forma interactiva (o en funciones de shell, que debe tener pocas). Si necesita un command diff modificado para uso no interactivo (por ejemplo, en el command Vim's .zshenv ), Defina mejor una secuencia de commands shell wrapper / function de shell exportado / alias en .zshenv con un nombre diferente , por ejemplo, diffu .


Si realmente desea apegarse a un alias idéntico y exportado (a pesar de los riesgos de romper progtwigs), debe reconfigurar Vim para que no lo use. Desafortunadamente, no existe una opción simple para el ejecutable diff; tienes que escribir un 'diffexpr' personalizado 'diffexpr' . Afortunadamente, hay un ejemplo para eso en :help diff-diffexpr que emula el pnetworkingeterminado. Solo necesita un pequeño cambio para evitar su alias de diferencia, por ejemplo, especificando la ruta completa a diff .

 set diffexpr=MyDiff() function MyDiff() let opt = "" if &diffopt =~ "icase" let opt = opt . "-i " endif if &diffopt =~ "iwhite" let opt = opt . "-b " endif silent execute "!/usr/bin/diff -a --binary " . opt . v:fname_in . " " . v:fname_new . \ " > " . v:fname_out endfunction