Есть ли способ настроить vimdiff игнорировать ВСЕ пробелы?
Я использую vim -d file1 file2
, чтобы увидеть различия между ними. Это отлично работает, но я хочу игнорировать переменные пробелов - они не имеют отношения к файлам исходного кода.
Vim help заявляет, что следующая команда выполнит магию:
set diffopt+=iwhite
Но, к сожалению, эта команда добавляет -b
в командную строку diff tool и игнорирует только пробелы в пробелах. Правильный ключ командной строки для diff должен быть -w
, чтобы игнорировать все изменения пробелов. Но я не могу найти, как изменить командную строку diff непосредственно из Vim. Конечно, я могу скомпилировать пользовательский diff или заменить diff на diff.sh, но это выглядит как-то уродливо: (.
Есть ли лучший способ изменить, как Vim взаимодействует с инструментом diff для отображения различий файлов?
Ответы
Ответ 1
Да. Задайте опцию iwhite
, как и вы, но дополнительно сделайте diffexpr
пустым.
В соответствующем разделе vim docs:
iwhite
Игнорировать изменения в количестве пробелов. Добавляет флаг "-b" для команды "diff" , если 'diffexpr' пуст. Проверьте документацию команды "diff" для того, что это делает в точку. Он должен игнорировать добавление завершающего пробел, но не ведущее белое пространство.
Отметим также, что вы можете предоставить пользовательскую командную строку diff, установив diffexpr
. См. Обсуждение страницы vimdiff man, в частности:
Параметр "diffexpr" может быть настроен на использование чего-то другого, кроме стандартного "diff" для сравнения двух файлов и поиска различий.
Когда "diffexpr" пуст, Vim использует эту команду для поиска различий между file1 и file2:
diff file1 file2 > outfile
Ответ 2
Это реализует то, что вы хотите (взято из 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 -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?
Ответ 3
Спасибо, это помогло мне. Мне теперь нужно только это (проще, чем это было предложено Адамом К.) в моем ~/.vimrc:
set diffopt+=iwhite
set diffexpr=""
И он делает это... Это все еще самый мощный инструмент, который я знаю, намного лучше, чем любой другой.
Ответ 4
Решение проблемы, возникшей в комментариях решения Адама Каца:
В зависимости от версии vim и настройки пользователя команда silent
может игнорировать перерисовку экрана после его выпуска. Я также столкнулся с этой проблемой, которая возникла всякий раз, когда я выполнял :diffo
после использования предложенного diffexpr
. Мое решение состояло в том, чтобы сменить команду молчания на следующее:
silent execute "!diff -a --binary " . opt .
\ v:fname_in . " " . v:fname_new . " > " . v:fname_out | redraw!
Это приводит к перерисовке после выдачи команды.