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

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

Справка Vim утверждает, что следующая команда сделает волшебство:

set diffopt+=iwhite

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

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

6 ответов

Решение

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

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

iwhite

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

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

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

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

diff file1 file2 > outfile

Это реализует то, что вы хотите (взято из diffexpr документы с -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

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

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

set diffopt+=iwhite

set diffexpr=""

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

Я знаю, что это древний вопрос, но для других, таких как я, которые не знали, теперь это доступно:

:set diffopt+=iwhiteall

Добавляет флаг «-w» к команде «diff», если «diffexpr» пуст.

Видеть:h 'diffopt'

Для тех, кто ударил "Недействительный аргумент", выполняя set diffopt+=iwhite, попробуйте без + вот так:

      set diffopt=iwhite

Однако более надежным подходом будет установка игнорирования пробелов с сохранением существующих параметров. Однако помните, что ошибка «Недопустимый аргумент», скорее всего, вызвана тем, что одна из существующих опций не поддерживается. В моем случае это была «внутренняя» опция, поэтому мне нужно было установить опции в следующем порядке:

      set diffopt-=internal
set diffopt+=iwhite

Или добавьте в свой .vimrc следующее:

      if &diff
    set diffopt-=internal
    set diffopt+=iwhite
endif

Кредит на https://www.micahsmith.com/blog/2019/11/fixing-vim-invalid-argument-diffopt-iwhite/

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

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

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

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

Другие вопросы по тегам