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