Как я могу визуализировать различия между символами в едином файле diff?
скажем, я получаю патч, созданный с git format-patch
. Файл в основном представляет собой унифицированный diff с некоторыми метаданными. Если я открою файл в Vim, я вижу, какие строки были изменены, но я не вижу, какие символы в измененных строках отличаются. Кто-нибудь знает способ (в Vim или каком-либо другом свободном программном обеспечении, которое работает на Ubuntu) визуализировать различия между символами?
пример счетчика, в котором визуализируется разница между символами, выполняется vimdiff a b
.
обновление Пт Ноя 12 22: 36: 23 UTC 2010
diffpatch полезно в случае, когда вы работаете с одним файлом.
обновление Чт 16 июня 17:56: 10 UTC 2016
проверить diff-выделите в git 2.9. Этот скрипт ровно что я изначально искал.
7 ответов:
учитывая ваши ссылки на Vim в вопросе, я не уверен, что это тот ответ, который вы хотите :) но Emacs может это сделать. Откройте файл, содержащий diff, убедитесь, что вы находитесь в
diff-mode
(Если файл с именемfoo.diff
илиfoo.patch
это происходит автоматически; в противном случае типа M-xdiff-mode
RET), перейти к ломоть вы заинтересованы в и ударил C-c C-b наrefine-hunk
. Или шаг через файл по одному куску за раз с M-n; что будет сделайте уточнение автоматически.
в git, вы можете объединить без фиксации. Сначала объедините свой патч, а затем выполните:
git diff --word-diff-regex=.
обратите внимание на точку после знака равенства.
(комментарии преобразуются в ответ на запрос)
версии с менее шумным выходом, чем
git diff --word-diff-regex=<re>
и это требует меньше ввода, чем, но эквивалентны,git diff --color-words --word-diff-regex=<re>
.простой (выделяет изменения пространства):
git diff --color-words
простой (выделяет изменения отдельных символов; не выделяет изменения пространства):
git diff --color-words=.
более сложный (выделяет изменения пространства):
git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
In генерал:
git diff --color-words=<re>
здесь
<re>
является регулярным выражением, определяющим "слова" с целью идентификации изменений.они менее шумны в том, что они окрашивают измененные "слова", тогда как использование просто
--word-diff-regex=<re>
окружает соответствующие "слова" с цветными-/+
метки.
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"
приведенное выше регулярное выражение (от Томаса раст) делает приличную работу по разделению фрагментов diff на уровне знаков препинания/символов (хотя и не так шумно, как
--word-diff-regex=.
).я опубликовал скриншот полученного вывода здесь.
обновление:
в этой статье есть несколько отличных предложений. В частности,
contrib/
дерево РЕПО git имеетdiff-highlight
Perl-скрипт, который показывает мелкозернистые блики.Быстрый старт можно использовать:
$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight $ chmod u+x diff-highlight $ git diff --color=always HEAD~10 | diff-highlight | less -R
Если вы ничего не имеете против установки NodeJS, есть пакет под названием "diff-so-fancy" (https://github.com/so-fancy/diff-so-fancy), который очень прост в установке и отлично работает:
npm install -g diff-so-fancy git diff --color | diff-so-fancy | less -R
Edit: только что узнал, что это на самом деле обертка для официального diff-highlight... По крайней мере, его проще установить для перлофобов, таких как я, и страница GitHub хорошо документирована :)
Я не знаю о разнице символов в инструменте, но есть инструмент для разности слов: wdiff.
см. примеры Top 4 File Difference Tools на UNIX / Linux-Diff, Colordiff, Wdiff, Vimdiff.
после небольшого исследования я заметил, что этот вопрос появился дважды в последнее время в основном списке рассылки Vim. Элемент плагин NrrwRgn отмечалось ивремени (сделайте две узкие области и разделите их). Использование NrrwRgn, как описано Кристианом Брабандтом, больше похоже на обходной путь, чем на решение, но, возможно, этого достаточно.
Я попробовал NrrwRgn, и это вместе с: diffthis было действительно полезно для иллюстрации каждого символа различия в один файл. Но это заняло много нажатий клавиш. Мой Vimscript довольно ржавый, но он, вероятно, может быть написан. Возможно, NrrwRgn можно было бы улучшить, чтобы обеспечить желаемую функциональность.
мысли?