Подтвердить что ты не робот

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

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

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

set diffopt+=iwhite

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

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

4b9b3361

Ответ 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!

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