2011-01-28 4 views
8

Я пытаюсь сравнить два сборных файла, где каждый был написан все шапки, а другой в нижнем регистре. Многие строки идентичны для случая и пробела.Получение vimdiff gVim для игнорирования футляра

Я попытался следующий, в то время как два буфер в режиме дифф:

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

пробельной вещь кажется, работает хорошо, но дело игнорировать не делать свою работу. Так, например, в следующих двух строках:

  I0=R0;    // ADDRESS OF INPUT ARRAY 

    i0 = r0;   // address of input array 

[первая строка начинается с 12 пространств, второй с одной вкладки]

Почему? Что я могу сделать?

UPDATE: только что заметил, что в этих двух строках все различия были проигнорированы OK:

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

Является транспозицией двух последних символов в 'diffotp' вашей проблеме или просто опечаткой while writi Вопрос? –

+0

Это опечатка. Спасибо за исправление. – ysap

+0

Связанный: [Есть ли способ настроить vimdiff игнорировать ВСЕ пробелы?] (Http://stackoverflow.com/q/1265410) –

ответ

7

Ваше сравнение не удается из-за пробелов, а не из-за дела. Это происходит потому, что, когда вы используете опцию iwhite, в фоновом режиме vimdiff выполняет команду diff -b, которая более ограничивает то, как она сравнивает пробелы, чем то, что вы ищете. В частности, опция -b игнорирует различия в количестве пробелов , где уже есть пробел. В вашем примере i0 = r0; помечен как отличный от I0=R0;, потому что в нем нет пробелов между символами, а другой нет.

В соответствии с документацией vimdiff вы можете переопределить поведение по умолчанию параметра iwhite, установив diffexpr на непустое значение. Флаг diff, который вас интересует, это --ignore-all-space, который более гибкий в отношении пробелов. Вы можете изменить diffexpr в vimdiff использовать эту опцию вместо -b опции по умолчанию следующим образом:

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 

Смотрите документацию для получения более подробной информации:

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

+1

спасибо за ответ. Ваше замечание относительно отсутствия пробелов в 1-й строке имеет смысл. Теперь вопрос заключается в том, как я могу реализовать функциональность '--ignore-all-space' с помощью простой (возможно, одной линейки) команды в приглашении': '? Читая вашу функцию, я думаю, что структуры if-endif действительно не нужны, если я * знаю *, что мне нужно/нужно. Итак, во всяком случае из командной строки «-ignore-all-space' из командной строки, работающей с существующими открытыми буферами? – ysap

3

После работы хорошо для меня:

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