2009-08-12 9 views
54

Estoy usando vim -d file1 file2 para ver las diferencias entre ellos. Esto funciona bien, pero quiero ignorar los cambios en el espacio en blanco, son irrelevantes para los archivos de código fuente.¿Hay alguna manera de configurar vimdiff para ignorar TODOS los espacios en blanco?

Vim ayudar a los estados que el siguiente comando lo hará la magia:

set diffopt+=iwhite 

Pero, por desgracia, este comando sólo se suma a la línea de comandos -b herramienta de diferencias, y que los espacios en blanco sólo ignora que se arrastran. La clave de línea de comando correcta para diff debe ser -w, para ignorar todos los cambios de espacio en blanco. Pero no puedo encontrar la forma de modificar la línea de comandos de diff directamente desde Vim. Por supuesto que puede compilar un diff de encargo, o reemplazar diff con diff.sh, pero que parece un poco feo :(.

¿Hay una mejor manera de modificar la forma en Vim interactúa con la herramienta de diferencias para mostrar diferencias entre los archivos?

.

Respuesta

23

Sí Establecer la opción iwhite como lo hizo, pero, además, hacen diffexpr vacío

En la sección correspondiente de la vim docs:.

iWhite

Ignore los cambios en la cantidad de espacio en blanco. Agrega el indicador "-b" al comando "diff" si 'diffexpr' está vacío. Compruebe la documentación del comando "diff" para saber qué es exactamente . Debe ignorar la adición de espacio en blanco , pero no espacio en blanco.

Tenga en cuenta también que puede proporcionar una línea de comando de diferencia personalizada configurando diffexpr. Véase la discusión sobre la vimdiff man page, en particular:

La opción 'diffexpr' se puede configurar para usar algo más que el programa normal "diff" para comparar dos archivos y encontrar las diferencias.

Cuando 'diffexpr' está vacía, Vim utiliza este comando para encontrar las diferencias entre archivo1 y archivo2:

diff file1 file2 > outfile 
+7

Esto no ignora todos los espacios en blanco (-w en diff) pero implementa ignorar los cambios en el espacio en blanco (-b en diff). –

31

Esto pone en práctica lo que quiere (tomado de la diffexpr docs con -b cambiado a -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 

... todavía estoy buscando una mejor ayudante diffexpr con respecto a la manipulación, que se asignan a las líneas de los cuales (GNU diff, incluso con -w en lugar de -b, está bastante desconcertado al combinar espacio en blanco adicional con ediciones menores como líneas comentadas). ¿Tal vez diffchar?

+7

Esta debería ser la respuesta aceptada, ya que es la única correcta en este momento. Es una lástima que vim no tenga una opción simple para cambiar entre "diff -b", que hace poco uso, y "diff -w". – farnsy

+0

De alguna manera mi 'vim' (versión 8, Debian Stretch) parpadea y muestra una pantalla en blanco después de': diffupdate', volviendo a pintar la pantalla correcta solo después de un 'PageUp' o' PagDown'. Muy extraño ... –

+0

@DrBeco: Este no es el lugar correcto para solucionarlo, pero comenzaría por ver si tienes ese problema con gvim (suponiendo que tengas una GUI). Si no, tal vez intente con un emulador de terminal diferente o una definición diferente de '$ TERM' (como" xterm-color "o" xterm-256color "o incluso solo" xterm "). De lo contrario, sugiero que busque en la web y, si eso no ayuda, busque y luego pregunte en [vi.SE] (https://vi.stackexchange.com/). Para una solución alternativa, Ctrl + L podría funcionar. Tal vez también experimente cambiando su resaltado de sintaxis. –

15

Gracias ire, eso me ayudó. Ahora sólo es necesario tener esto (más simple que lo que se propone por Adam K) en mi ~/.vimrc:

set diffopt+=iwhite 

set diffexpr="" 

y lo hace ...Esa sigue siendo la herramienta de diferencia más poderosa que conozco, mucho mejor que cualquier otra.

+4

No, esto implementa diff -b, no dif -w como la pregunta solicita. Adam K tiene la única respuesta correcta aquí. – farnsy

+0

Gracias! Solo "establecer diffopt + = iwhite" ya es útil, ya que se emite desde vimdiff, interactivamente. –

0

Dirigiéndose a un problema planteado en los comentarios de la solución de Adam Katz:

Dependiendo de la versión de vim y la configuración del usuario, un comando silent puede descuidar a redibujar la pantalla después de su expedición. También encontré este problema, que surgió cada vez que ejecuté :diffo después de usar el diffexpr sugerido. Mi solución fue cambiar el comando de ejecución silenciosa a lo siguiente:

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

Esto obliga a volver a dibujar después de que se emite el comando.

Cuestiones relacionadas