Как я могу визуализировать различия между символами в едином файле 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 93

7 ответов:

учитывая ваши ссылки на Vim в вопросе, я не уверен, что это тот ответ, который вы хотите :) но Emacs может это сделать. Откройте файл, содержащий diff, убедитесь, что вы находитесь в diff-mode (Если файл с именем foo.diff или foo.patch это происходит автоматически; в противном случае типа M-xdiff-modeRET), перейти к ломоть вы заинтересованы в и ударил 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 можно было бы улучшить, чтобы обеспечить желаемую функциональность.

мысли?