Есть ли способ настроить vimdiff, чтобы игнорировать все пробелы?



Я использую vim -d file1 file2 для того чтобы увидеть различия между ними. Это прекрасно работает, но я хочу игнорировать изменения пробелов - они не имеют отношения к файлам исходного кода.



Vim help утверждает, что следующая команда будет делать магию:



set diffopt+=iwhite


но, к сожалению, эта команда только добавляет -b в командной строке инструмента diff, и это только игнорирует конечные пробелы. Правильный ключ командной строки для diff должен быть -w, чтобы игнорировать все пробельные символы изменения. Но я не могу найти, как изменить командную строку diff непосредственно из Vim. Конечно, я могу скомпилировать пользовательский diff или заменить diff на diff.sh, но это выглядит довольно уродливо : (.



есть ли лучший способ изменить, как Vim взаимодействует с инструментом diff для отображения различий файлов?

626   4  

4 ответов:

да. Установите iwhite вариант, как вы сделали, но, кроме того, сделать diffexpr пустой.

из соответствующего раздела vim docs:

iwhite

игнорировать изменения в количестве пробелов. Добавляет флаг"- b "для команды "diff", если 'diffexpr' пуст. Проверьте документацию команды "diff" для того, что это делает именно так. Он должен игнорировать добавление трейлинга белое пространство, но не ведущий белый пространство.

обратите внимание также, что вы можете предоставить пользовательскую командную строку diff, установив diffexpr. Смотрите обсуждение на vimdiff man page в частности:

опция 'diffexpr' может быть установлена для использования чего-то другого, чем стандартный программа "diff" для сравнения двух файлов и поиска отличий.

когда 'diffexpr' пуст, Vim использует эту команду для поиска различий между file1 и file2:

diff file1 file2 > outfile

это реализует то, что вы хотите (взято из diffexpr docs С -b изменено на -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

... Я все еще ищу лучшего помощника diffexpr в отношении обработки того, какие строки сопоставляются с какими (GNU diff, даже -w вместо -b, скорее озадачен сочетанием дополнительных пробелов с незначительными изменениями, такими как комментируемые строки). Может быть diffchar?

спасибо Ире, что помогла мне. Теперь мне нужно только иметь это (проще, чем то, что предлагает Адам K) в моем ~/.vimrc :

set diffopt+=iwhite

set diffexpr=""

и он это делает... Это все еще самый мощный инструмент diff, о котором я знаю, намного лучше, чем любой другой.

решение проблемы, поднятой в комментариях к решению Адама Каца:

в зависимости от версии vim и настройки пользователя, a silent команда может пренебречь перерисовкой экрана после его выдачи. Я также столкнулся с этой проблемой, которая возникала всякий раз, когда я выполнял :diffo после использования предложенных diffexpr. Мое решение состояло в том, чтобы изменить команду silent execute на следующее:

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

это вызывает перерисовку после выдачи команды.

Comments

    Ничего не найдено.