Как я могу визуализировать различия в одном символе в едином файле 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-highlight в git 2.9. Этот script делает именно то, что я изначально искал.

Ответ 1

Учитывая ваши ссылки на Vim в вопросе, я не уверен, что это ответ, который вы хотите:), но Emacs может это сделать. Откройте файл, содержащий diff, убедитесь, что вы находитесь в diff-mode (если файл имеет имя foo.diff или foo.patch, это происходит автоматически, в противном случае введите M-x diff-mode RET), перейдите к hunk, который вас интересует, и нажмите C-c C-b для refine-hunk. Или пройдите через файл по одному куску за раз с помощью M-n; который автоматически выполнит очистку.

Ответ 2

В git вы можете объединиться без фиксации. Сначала слейте патч, затем выполните:

git diff --word-diff-regex=.

Обратите внимание на точку после знака равенства.

Ответ 3

(Комментарии, преобразованные в ответ на запрос)

Версии с менее шумным выходом, чем 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)+'

В общем:

git diff --color-words=<re>

где <re> является регулярным выражением, определяющим "слова" с целью идентификации изменений.

Они менее шумны в том, что они окрашивают измененные слова, тогда как использование только --word-diff-regex=<re> окружает совпадающие слова с цветными маркерами -/+.

Ответ 4

git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

Вышеупомянутое регулярное выражение (от Thomas Rast) делает достойную работу по отделению фрагментов diff на уровне пунктуации/символа (хотя и не является таким шумным как --word-diff-regex=.).

Я опубликовал снимок экрана полученного результата здесь.


Обновление:

В этой статье есть несколько замечательных предложений. В частности, дерево contrib/ репо git имеет diff-highlight perl script, который показывает мелкозернистые блики.

Быстрое начало использования:

$ 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

Ответ 5

Если у вас нет ничего против установки 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

Изменить: только что узнал об этом на обертке для официального отличия... По крайней мере, проще установить для таких перлофоб, как я и страница GitHub, хорошо документировано:)

Ответ 7

После небольшого исследования, я заметил, что этот вопрос появился дважды в основном списке рассылки Vim. Плагин NrrwRgn упоминался как times (создайте две узкие области и разделите их). Использование NrrwRgn, как описано Christian Brabandt, скорее похоже на обходное решение, чем решение, но, возможно, это достаточно хорошо.

Я опробовал NrrwRgn, и он, вместе с: diffthis, был действительно полезен для иллюстрации различий между персонажами внутри частей одного файла. Но потребовалось много нажатий клавиш. Мой Vimscript довольно ржавый, но, скорее всего, он будет написан по сценарию. Возможно, NrrwRgn можно было бы улучшить, чтобы обеспечить желаемую функциональность.

Мысли?