Якщо у мене є різниця, як я можу розфарбувати його так, щоб він добре виглядав? Я хочу, щоб це було в командному рядку, тому, будь ласка, ніяких GUI-рішень.
Якщо у мене є різниця, як я можу розфарбувати його так, щоб він добре виглядав? Я хочу, щоб це було в командному рядку, тому, будь ласка, ніяких GUI-рішень.
Відповіді:
Сторінки для diff
чоловіків не пропонують рішення для колоризації всередині себе. Подумайте про використання colordiff
. Це обгортка, diff
яка дає такий же вихід, як і diff, за винятком того, що він збільшує вихід, використовуючи кольорове виділення синтаксису для підвищення читабельності:
diff old new | colordiff
або просто:
colordiff old new
Установка:
sudo apt-get install colordiff
brew install colordiff
абоport install colordiff
less -R
, можна відобразити послідовність евакуації кольорів у менший розмір.
-y
опція для включення) ☹ vimdiff
Пропозиція нижче, мабуть, кращий спосіб
colordiff
добре працює svn diff | colordiff
(тобто в ситуаціях, коли у вас є лише diff, а не два файли, що відрізняються).
-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 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
побічний рівень слів розл
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
Зміст тестових файлів:
а
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/'
Додайте, що в сценарії оболонки та трубі уніфікований різний вихід через нього.
Це робить маркери синього кольору блакитним кольором та виділяє нові / старі назви файлів та додає / видаляє лінії відповідно до зеленого та червоного фону. 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/"
(хоча я сподіваюся, що є кращий спосіб).
Ви можете змінити конфігурацію підриву, щоб використовувати 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
Ouput
Ось що можна зробити із наведеним нижче сценарієм та розмежуванням розрізнень :
#!/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
.
Це сценарій пітона, який можна обернути навколо будь-якої команди. Отже, замість виклику 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)/"
На відміну від інших рішень цього питання, це рішення не чітко викладає послідовності відходу 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
повинні бути об'єднані в дифузори ...
Я б запропонував вам спробувати розмаїті настільки фантазії . Я використовую його під час своєї роботи, і це впевнено здається чудовим, як зараз. Він оснащений багатьма варіантами, і налаштувати діффайс так, як ви хочете, дуже просто.
Ви можете встановити його:
sudo npm install -g diff-so-fancy
або на Mac:
brew install diff-so-fancy
Після цього ви можете виділити свої відмінності так:
diff -u file1 file2 | diff-so-fancy
З командою bat :
diff file1 file2 | bat -l diff
В останніх версіях git на Ubuntu ви можете ввімкнути різне підсвічування за допомогою:
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
щоб дізнатися, де.