Как раскрасить diff в командной строке? - PullRequest
448 голосов
/ 10 января 2012

Когда у меня есть diff, как я могу раскрасить его, чтобы он выглядел хорошо? Я хочу это для командной строки, поэтому, пожалуйста, никаких решений с графическим интерфейсом.

Ответы [ 11 ]

559 голосов
/ 10 января 2012

Справочные страницы для diff не предлагают решения для раскрашивания изнутри себя.Пожалуйста, рассмотрите возможность использования colordiff.Это оболочка diff, которая выдает тот же вывод, что и diff, за исключением того, что она увеличивает вывод, используя цветную подсветку синтаксиса для повышения читабельности:

diff old new | colordiff

или просто:

colordiff old new

Установка:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • OS X: brew install colordiff или port install colordiff
313 голосов
/ 10 января 2012

Использование Vim :

diff /path/to/a /path/to/b | vim -R -

Или, что еще лучше, VimDiff (или vim -d, что короче для ввода) покажет различия между двумя,три или четыре файла рядом.

Примеры:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
159 голосов
/ 12 ноября 2013

На самом деле, кажется, есть еще один вариант (который я заметил недавно, когда столкнулся с проблемой, описанной выше):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

Если у вас есть Git (который вы уже могли использовать в любом случае)Тогда вы сможете использовать его для сравнения, даже если сами файлы не находятся под контролем версий.Если по умолчанию эта функция не включена для вас, то включение поддержки цвета здесь, по-видимому, будет значительно проще, чем некоторые из ранее упомянутых обходных путей.

73 голосов

diff --color опция была добавлена ​​в GNU diffutils 3.4 (2016-08-08)

Это реализация по умолчанию diff на большинстве дистрибутивов, которая скоро будет получена.

Ubuntu 18.04 имеет diffutils 3.6 и, следовательно, имеет его.

На 3.5 это выглядит так:

enter image description here

Протестировано:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

По-видимому, добавлено в коммите,Не представляется возможным, запрос функции: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Связанные темы:

ydiff делает это, см. ниже.

ydiff параллельный уровень слова diff

https://github.com/ymattw/ydiff

Это Нирвана?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Результат:

enter image description here

Если строки слишком узкие (по умолчанию 80 столбцов), поместите на экран:

diff -u a b | ydiff -w 0 -s

Содержимое тестовых файлов:

a

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

b

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff Интеграция с Git

ydiff интегрируется с Git без каких-либотребуется конфигурация.

Внутри Git-репозитория вместо git diff вы можете сделать просто:

ydiff -s

и вместо git log:

ydiff -ls

Смотрите также: Как я могу получить разностное сравнение, когда я делаю "git diff"?

Протестировано на Ubuntu 16.04, git2.18.0, ydiff 1.1.

68 голосов
/ 01 июня 2013

А в тех случаях, когда yum install colordiff или apt-get install colordiff не подходит из-за каких-то безумных ограничений, находящихся вне вашего непосредственного контроля, или вы просто чувствуете сумасшествие , вы можете заново изобрестиколесо с линией sed:

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

Добавьте это в сценарии оболочки и трубу unified diff выводите через него.

Делает маркеры фрагмента синим и подсвечиваетновые / старые имена файлов и добавленные / удаленные строки на зеленом и красном фоне соответственно. 1 И это сделает завершающий пробел 2 изменения более очевидным, чем может colordiff.


1 Между прочим, причина выделения имен файлов так же, как измененных строк, заключается в том, что для правильного различения имен файлов и измененных строк требуется правильный анализ формата diff, что не является чем-то, что нужно решатьс регулярным выражениемВыделение их одинаково работает «достаточно хорошо» визуально и делает задачу тривиальной.Тем не менее, есть некоторые интересные тонкости .

2 Но нет конечных вкладок.Видимо вкладки не получают фоновый набор, по крайней мере, в моем xterm.Тем не менее, это немного выделяет изменения табуляции и пробела.

16 голосов
/ 20 сентября 2013

Вы можете изменить конфигурацию Subversion для использования colordiff

~ / .subversion / config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

через: https://gist.github.com/westonruter/846524

10 голосов
/ 05 октября 2016

Цветной, уровень слова diff выход

Вот что вы можете сделать с помощью приведенного ниже сценария и diff-highlight :

Coloured diff screenshot

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

(Кредит @ retracile's answer для выделения sed)

10 голосов
/ 10 января 2012

Я использую grc (Generic Colouriser), который позволяет раскрасить вывод ряда команд, включая diff.

Это скрипт на Python, который может бытьобернутый вокруг любой команды.Поэтому вместо того, чтобы вызывать diff file1 file2, вы бы вызывали grc diff file1 file2, чтобы увидеть цветной вывод.Я добавил псевдоним от diff до grc diff, чтобы было проще.

5 голосов
/ 14 января 2017

Поскольку wdiff принимает аргументы, указывающие строку в начале и конце вставок и удалений, в качестве этих строк можно использовать цветовые последовательности ANSI:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

Например, это выводсравнение двух файлов CSV:

diff output of CSV files

Пример из https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html

4 голосов
/ 10 марта 2019

Вот еще одно решение, которое вызывает sed для вставки соответствующих escape-последовательностей ANSI для цветов, чтобы показать строки +, - и @ в красном, зеленом и голубом цветах соответственно.

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

В отличие от других решений этого вопроса, в этом решении явно не указаны escape-последовательности ANSI. Вместо этого он вызывает команды tput setaf и tput sgr0 для генерации escape-последовательностей ANSI для установки соответствующего цвета и сброса атрибутов терминала соответственно.

Чтобы увидеть доступные цвета для каждого аргумента tput setaf, используйте эту команду:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

Вот как выглядит вывод:

enter image description here

Вот свидетельство того, что команды tput setaf и tput sgr0 генерируют соответствующие escape-последовательности ANSI:

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m
...