Когда у меня есть различия, как я могу раскрасить их так, чтобы они хорошо выглядели? Я хочу это для командной строки, поэтому, пожалуйста, никаких решений с графическим интерфейсом.
Когда у меня есть различия, как я могу раскрасить их так, чтобы они хорошо выглядели? Я хочу это для командной строки, поэтому, пожалуйста, никаких решений с графическим интерфейсом.
Ответы:
Страницы руководства для 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-последовательности для цветов.
-y
опция включена ) below vimdiff
Предложение ниже, вероятно, лучший способ
colordiff
хорошо работает svn diff | colordiff
(например, в ситуациях, когда у вас есть только diff, а не два файла diffd).
-y
).
Используйте Vim :
diff /path/to/a /path/to/b | vim -R -
Или, что еще лучше, VimDiff (или vim -d
, что короче, чтобы печатать) будет показывать различия между двумя, тремя или четырьмя файлами рядом.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
ctrl-c
и ctrl-x
для других целей в Vim. ctrl-q
захвачено многими терминалами. См. Написание и выход, чтобы найти способ, который наилучшим образом соответствует вашим потребностям.
zsh
? Я не узнаю =(...)
конструкт. Во-вторых, я имел diff -ur a b
в виду.
На самом деле, кажется, есть еще один вариант (который я заметил недавно, когда столкнулся с проблемой, описанной выше):
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
выйти туда, где вы находитесь.
git config color.diff auto
git diff --no-index
для сравнения двух файлов.
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
Связанные темы:
ydiff
хотя, смотрите ниже.
ydiff
параллельный уровень слова diff
https://github.com/ymattw/ydiff
Это Нирвана?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s
Результат:
Если линии слишком узкие (по умолчанию 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
б
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.
There is no word-highlighting, yet
- есть обновления? Это то, для чего я пришел к этому вопросу (я хочу получить grep --color
аналогичный вывод).
git diff --color
тоже работает. Полезно при работе над ssh.
diff --color=always | less -R
И в тех случаях, когда yum install colordiff
или или apt-get install colordiff
не вариант из-за какого-то безумного ограничения вне вашего непосредственного контроля, или вы просто чувствуете себя сумасшедшим , вы можете заново изобрести колесо с помощью строки sed:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
Добавьте это в сценарий оболочки и передайте через него унифицированный вывод diff .
Он делает маркеры фрагментов синим цветом и выделяет новые / старые имена файлов и добавленные / удаленные строки на зеленом и красном фоне соответственно. 1 И это сделает изменения в конце 2 более заметными, чем может сделать colordiff.
1 Кстати, причина для выделения имен файлов , так же , как модифицированные линии является то , что правильно различать имена файлов и модифицированные строки требует правильно разбор формата различия, который не является чем - то решать с регулярным выражением. Выделение их одинаково работает «достаточно хорошо» визуально и делает задачу тривиальной. Тем не менее, есть некоторые интересные тонкости .
2 Но не конечные вкладки. Видимо вкладки не получают фоновый набор, по крайней мере, в моем xterm. Это делает изменения табуляции и пространства немного выделяющимися.
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(хотя я ожидаю, что есть лучший способ).
Вы можете изменить конфигурацию 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
Цветной вывод на уровне слов diff
Вот что вы можете сделать с помощью приведенного ниже сценария и 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 за sed
выделение)
я использую grc
(Generic Colouriser), который позволяет раскрасить вывод ряда команд, в том числе diff
.
Это скрипт на python, который можно обернуть вокруг любой команды. Таким образом, вместо того diff file1 file2
, чтобы вызывать, вы бы вызывали, grc diff file1 file2
чтобы увидеть цветной вывод. Я псевдонимы , diff
чтобы grc diff
сделать его проще.
fork()
вызовов, хотя, скорее всего, будет работать с WSL.
Вот еще одно решение , которое вызывает sed
вставить соответствующие последовательности 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
команды для генерации последовательностей ANSI побега для установки соответствующего цвета и сброса атрибутов терминала, соответственно.
Чтобы увидеть доступные цвета для каждого аргумента tput setaf
, используйте эту команду:
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
Вот как выглядит результат:
Вот доказательство того , что tput setaf
и tput sgr0
команды генерируют соответствующие управляющие последовательности 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
Так как 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
, так что вы можете просто труба: wdiff -n f1 f2 | colordiff
. wdiff
должны быть объединены в diffutils ...
Я бы посоветовал вам сделать разницу попробовать . Я использую его во время своей работы, и сейчас он кажется великолепным. Он поставляется с множеством опций, и вам действительно легко настроить ваши различия так, как вы хотите.
Вы можете установить его:
sudo npm install -g diff-so-fancy
или на Mac:
brew install diff-so-fancy
После этого вы можете выделить свои различия следующим образом:
diff -u file1 file2 | diff-so-fancy
С командой летучей мыши :
diff file1 file2 | bat -l diff
В последних версиях git на Ubuntu вы можете включить подсветку diff с помощью:
sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
И затем добавив это к вашему .gitconfig
:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
Возможно, скрипт находится где-то еще в других дистрибутивах, вы можете использовать, locate diff-highlight
чтобы узнать где.