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

413

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

  • 5
    Любая конкретная операционная система / оболочка?
  • 3
    Попробуйте github.com/walles/riff . В качестве дополнительного бонуса он показывает, какие части линий изменились.
Теги:
colors
diff
command-line

10 ответов

490
Лучший ответ

Страницы-пользователи для 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
  • 40
    Просто нашел это сам :-). Он может быть передан в less с помощью less -R , который правильно отображает escape-последовательности для цветов.
  • 32
    Можно просто использовать синтаксис: colordiff file1 file2
Показать ещё 8 комментариев
300

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

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

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

Примеры:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
  • 20
    vim -d отлично работает, спасибо!
  • 0
    function ddiff () {diff $ 1 $ 2 | vim -R -} export -f ddiff
Показать ещё 13 комментариев
150

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

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

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

  • 17
    Это аккуратно, но, к сожалению, это не работает, когда входные данные представляют собой каналы. Например, сравнение двоичных файлов с помощью git diff <(xxd file1) <(xxd filed) не работает.
  • 8
    Как ни странно, по крайней мере один из файлов должен быть «вне текущего репозитория», согласно git help diff . Так что, если ваш git diff пуст, попробуйте cd там, где вы находитесь.
Показать ещё 9 комментариев
67

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

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

Выбросьте это в оболочку script и выведите через него унифицированный diff.

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


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

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

  • 0
    Есть ли простой способ заставить это работать на Mac?
  • 5
    @Matt: Вот подход грубой силы для Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/" (хотя я ожидаю Существует лучший способ).
Показать ещё 11 комментариев
51

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

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

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

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

Изображение 7817

Проверено:

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.

  • 0
    Вот документация.
  • 1
    В этой ветке списка рассылки: There is no word-highlighting, yet - есть обновления? Это то, для чего я пришел к этому вопросу (я хочу вывод grep --color like diff).
Показать ещё 3 комментария
16

Вы можете изменить конфигурацию 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 internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

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

  • 0
    svn: невозможно запустить процесс 'colordiff': ресурс временно недоступен
  • 0
    Вы установили colordiff?
Показать ещё 2 комментария
10

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

Вот что вы можете сделать с приведенными ниже script и diff-highlight:

Изображение 7818

#!/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 answer для выделения sed)

  • 0
    Как мне использовать этот вывод в GVim?
  • 0
    Для vim используйте плагин, например diffchar .
10

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

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

  • 0
    По некоторым причинам, это не окрашивает вывод для меня ..
5

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

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

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

Изображение 7819

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

  • 0
    colordiff сейчас (1.0.16) понимает wdiff , так что вы также можете просто pipe: wdiff -n f1 f2 | colordiff . wdiff должен быть объединен с diffutils ...
2

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

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

sudo npm install -g diff-so-fancy

Ещё вопросы

Сообщество Overcoder
Наверх
Меню