it-swarm.com.ru

Как раскрасить diff в командной строке?

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

444
daniel kullmann

Справочные страницы для 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
553
kaji

Используйте Vim :

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

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

Примеры:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
311
Johnsyweb

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

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

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

158
Lars Baehren

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/')

По-видимому, добавлено в коммит c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (март 2015).

Различия на уровне слов

Как diff-highlight. Не представляется возможным, запрос функции: 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

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

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

б

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, git 2.18.0, ydiff 1.1.

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

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

Добавьте это в сценарий Shell и передайте через него унифицированный diff .

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


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

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

67
retracile

Вы можете изменить конфигурацию 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

16
Azd325

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

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

10
dogbane

Цветной, Уровень слова diff ouput

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

Coloured diff screenshot

#!/bin/sh -eu

# Use diff-highlight to show Word-level differences

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

(Благодарим за ответ @ retracile для выделения sed)

10
Tom Hale

Так как 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

5
jcomeau_ictx

Вот еще одно решение, которое вызывает 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
3
Susam Pal

Я бы посоветовал вам попробовать diff-so-fancy . Я использую его во время своей работы, и сейчас он выглядит великолепно Он поставляется с множеством опций, и вам действительно легко настроить ваши различия так, как вы хотите.

Вы можете установить его:

Sudo npm install -g diff-so-fancy
1
Naveen