Есть ли способ настроить vimdiff для игнорирования всех пробелов?

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

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

set diffopt+=iwhite

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

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

4 ответов


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

из соответствующего раздела ВИМ документы:

iwhite

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

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

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

когда "diffexpr" пуст, Vim использует эту команду, чтобы найти различия между file1 и файл2:

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, это, скорее, сбит с толку, комбинируя дополнительный пробел с незначительных правок, таких как строки комментариев). Может быть!--13-->diffchar?


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

set diffopt+=iwhite

set diffexpr=""

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


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

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

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

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