Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting gVim's vimdiff to ignore case

I am trying to compare two assembly files where one was written all caps and the other in lowercase. Many lines are identical up to case and whitespace.

I tried the following, while two buffers in diff mode:

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

The whitespace thing seems to work well, but the ignore case does not do its work. For example, in the following two lines:

            I0=R0;              // ADDRESS OF INPUT ARRAY

    i0 = r0;            // address of input array

[the first line begins with 12 spaces, the second with a single tab]

Why? What can I do?

UPDATE: just noticed that in these two lines all differences were ignored OK:

                                // MULTIPLY R1 BY 4 TO FETCH DATA OF WORD LENGTH
                        // multiply r1 by 4 to fetch data of word length
like image 386
ysap Avatar asked Jan 28 '11 15:01

ysap


1 Answers

Your comparison is failing because of the whitespace, not because of the case. This is happening because when you use the iwhite option, in the background, vimdiff is executing a diff -b which is more restrictive about how it compares whitespace than what you're looking for. More specifically, the -b option only ignores differences in the amount of whitespace where there already is whitespace. In your example, i0 = r0; is being flagged as different than I0=R0; because one contains whitespace between the characters and the other doesn't.

According to the vimdiff documentation, you can override the default behavior of the iwhite option by setting diffexpr to a non-empty value. The diff flag that you're interested in is --ignore-all-space, which is more flexible about whitespace. You can change the diffexpr in vimdiff to use this option instead of the default -b option as follows:

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

See the documentation for more details:

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

like image 163
Mansoor Siddiqui Avatar answered Sep 22 '22 19:09

Mansoor Siddiqui