Есть ли способ настроить 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!
Это вызывает перерисовку после выполнения команды.