Когда у меня есть diff, как я могу его раскрасить, чтобы он выглядел хорошо? Я хочу это для командной строки, поэтому, пожалуйста, никаких графических решений.
Страницы-пользователи для diff
не предлагают решения для раскраски внутри себя. Пожалуйста, используйте colordiff
. Это оболочка вокруг diff
, которая производит тот же вывод, что и diff, за исключением того, что он увеличивает результат с помощью цветной подсветки синтаксиса для повышения удобочитаемости:
diff old new | colordiff
или просто:
colordiff old new
Установка:
sudo apt-get install colordiff
brew install colordiff
или port install colordiff
less -R
, который правильно отображает escape-последовательности для цветов.
Используйте Vim:
diff /path/to/a /path/to/b | vim -R -
Или еще лучше, VimDiff (или vim -d
, который короче для ввода) будет показывать различия между двумя, тремя или четырьмя файлы бок о бок.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
На самом деле, кажется, есть еще один вариант (который я заметил недавно, когда столкнулся с проблемой, описанной выше):
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
Если у вас есть Git (который вы уже используете), вы сможете использовать его для сравнения, даже если сами файлы не находятся под контролем версий. Если он не включен для вас по умолчанию, то включение поддержки цвета здесь, по-видимому, будет значительно проще, чем некоторые из ранее упомянутых обходных путей.
git diff <(xxd file1) <(xxd filed)
не работает.
git help diff
. Так что, если ваш git diff пуст, попробуйте cd
там, где вы находитесь.
И для тех случаев, когда 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. Тем не менее, изменения между вкладками и пространством немного выделяются.
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(хотя я ожидаю Существует лучший способ).
опция diff --color
была добавлена в GNU diffutils 3.4 (2016-08-08)
Это стандартная реализация diff
в большинстве дистрибутивов, которая скоро будет доступна.
В Ubuntu 18.04 есть diffutils
3.6 и, следовательно, он есть.
На 3.5 это выглядит так:
Проверено:
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.
There is no word-highlighting, yet
- есть обновления? Это то, для чего я пришел к этому вопросу (я хочу вывод grep --color
like diff).
Вы можете изменить конфигурацию 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
Цветной, слово-уровень diff
выход
Вот что вы можете сделать с приведенными ниже script и diff-highlight:
#!/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
)
vim
используйте плагин, например diffchar .
Я использую grc
(Generic Colouriser), который позволяет вам раскрашивать вывод нескольких команд, включая diff
.
Это python script, который может быть обернут вокруг любой команды. Поэтому вместо вызова diff file1 file2
вы вызываете grc diff file1 file2
, чтобы увидеть цветной вывод. У меня есть aliased diff
до grc diff
, чтобы сделать его проще.
Так как wdiff
принимает аргументы, указывающие строку в начале и конце обеих вставок и удалений, вы можете использовать цветовые последовательности ANSI в качестве этих строк:
wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
Например, это результат сравнения двух файлов CSV:
Пример из https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiff
сейчас (1.0.16) понимает wdiff
, так что вы также можете просто pipe: wdiff -n f1 f2 | colordiff
. wdiff
должен быть объединен с diffutils ...
Я бы посоветовал вам попробовать diff-so-fancy. Я использую его во время своей работы, и сейчас он выглядит великолепно. Он поставляется с множеством опций, и вам действительно легко настроить ваши различия так, как вы хотите.
Вы можете установить его:
sudo npm install -g diff-so-fancy