2011-01-28 16 views
8

Estoy tratando de comparar dos archivos de ensamblaje donde uno fue escrito con mayúsculas y el otro en minúsculas. Muchas líneas son idénticas hasta el caso y el espacio en blanco.Obtención de vimdiff de gVim para ignorar el caso

He intentado lo siguiente, mientras que dos tampones en modo de diferencias:

:set diffopt+=icase 
:set diffopt+=iwhite 
:diffupdate 

Lo espacios en blanco parece funcionar bien, pero ignorar el caso no hace su trabajo. Por ejemplo, en las siguientes dos líneas:

  I0=R0;    // ADDRESS OF INPUT ARRAY 

    i0 = r0;   // address of input array 

[la primera línea comienza con 12 espacios, la segunda con una sola pestaña]

¿Por qué? ¿Que puedo hacer?

ACTUALIZACIÓN: Acabo de notar que en estas dos líneas se ignoraron Aceptar todas las diferencias:

       // MULTIPLY R1 BY 4 TO FETCH DATA OF WORD LENGTH 
         // multiply r1 by 4 to fetch data of word length 
+0

Es la transposición de los dos últimos caracteres en 'diffotp' su problema o simplemente un error al escribir preguntando? –

+0

Eso es un error tipográfico. Gracias por la corrección. – ysap

+0

Relacionado: [¿Hay alguna manera de configurar vimdiff para ignorar TODOS los espacios en blanco?] (Http://stackoverflow.com/q/1265410) –

Respuesta

7

Su comparación está fallando debido al espacio en blanco, no por el caso. Esto sucede porque cuando utiliza la opción iwhite, en segundo plano, vimdiff está ejecutando un diff -b que es más restrictivo acerca de cómo se compara el espacio en blanco de lo que está buscando. Más específicamente, la opción -b solo ignora las diferencias en la cantidad de espacios en blanco donde ya hay espacios en blanco. En su ejemplo, i0 = r0; se marca como diferente de I0=R0; porque uno contiene espacios en blanco entre los caracteres y el otro no.

De acuerdo con la documentación de vimdiff, puede anular el comportamiento predeterminado de la opción iwhite configurando diffexpr en un valor no vacío. La bandera de diferencia que le interesa es --ignore-all-space, que es más flexible sobre espacios en blanco. Se puede cambiar el diffexpr en vimdiff utilizar esta opción en lugar de la opción por defecto -b de la siguiente manera:

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

Consulte la documentación para más detalles:

http://vimdoc.sourceforge.net/htmldoc/options.html#%27diffopt%27

+1

gracias por la respuesta. Su observación con respecto a la falta de espacios en la primera línea tiene mucho sentido. Ahora, la pregunta es ¿cómo puedo lograr la funcionalidad '-ignore-all-space' con un comando simple (tal vez un trazador) en el indicador': '? Al leer su función, supongo que las estructuras if-endif no son realmente necesarias si * sé * lo que necesito/quiero. Entonces, ¿de todos modos, hacer '--ignore-all-space' desde el símbolo del sistema, trabajando en los búferes abiertos existentes? – ysap

3

siguiente funciona bien para mí:

vimdiff +"set diffopt+=icase" file_1.txt file_2.txt 
Cuestiones relacionadas