Ketika saya memiliki diff, bagaimana saya bisa mewarnainya sehingga terlihat bagus? Saya menginginkannya untuk baris perintah, jadi tolong jangan ada solusi GUI.
Ketika saya memiliki diff, bagaimana saya bisa mewarnainya sehingga terlihat bagus? Saya menginginkannya untuk baris perintah, jadi tolong jangan ada solusi GUI.
Jawaban:
Halaman manual untuk diff
menyarankan tidak ada solusi untuk pewarnaan dari dalam dirinya sendiri. Silakan pertimbangkan untuk menggunakan colordiff
. Ini adalah pembungkus diff
yang menghasilkan output yang sama dengan diff, kecuali bahwa itu menambah output menggunakan highlight sintaks berwarna untuk meningkatkan keterbacaan:
diff old new | colordiff
atau hanya:
colordiff old new
Instalasi:
sudo apt-get install colordiff
brew install colordiff
atauport install colordiff
less -R
, yang menampilkan urutan pelarian untuk warna dengan benar.
-y
opsi untuk mengaktifkan) ☹ vimdiff
Saran di bawah ini mungkin cara yang lebih baik
colordiff
berfungsi dengan baik untuk svn diff | colordiff
(yaitu dalam situasi di mana Anda hanya memiliki diff, bukan dua file yang sedang di-diff).
-y
dukungan berdampingan ( ).
Gunakan Vim :
diff /path/to/a /path/to/b | vim -R -
Atau lebih baik lagi, VimDiff (atau vim -d
, yang lebih pendek untuk mengetik) akan menunjukkan perbedaan antara dua, tiga atau empat file berdampingan.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
ctrl-c
dan ctrl-x
memiliki kegunaan lain di Vim. ctrl-q
ditangkap oleh banyak terminal. Lihat Menulis dan berhenti untuk menemukan cara yang paling sesuai dengan kebutuhan Anda.
zsh
? Saya tidak mengenali =(...)
konstruk. Kedua, ada diff -ur a b
dalam pikiran saya.
Sebenarnya sepertinya ada pilihan lain (yang baru saya perhatikan baru-baru ini, ketika mengalami masalah yang dijelaskan di atas):
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
Jika Anda memiliki Git (yang mungkin sudah Anda gunakan), maka Anda dapat menggunakannya untuk perbandingan, bahkan jika file itu sendiri tidak di bawah kontrol versi. Jika tidak diaktifkan untuk Anda secara default, mengaktifkan dukungan warna di sini tampaknya jauh lebih mudah daripada beberapa solusi yang disebutkan sebelumnya.
git diff <(xxd file1) <(xxd filed)
tidak berfungsi.
git help diff
. Jadi jika git diff Anda kosong, coba cd
keluar dari tempat Anda berada.
git config color.diff auto
git diff --no-index
untuk membandingkan dua file.
diff --color
opsi ditambahkan ke GNU diffutils 3.4 (2016-08-08)
Ini adalah diff
implementasi default pada sebagian besar distro, yang akan segera mendapatkannya.
Ubuntu 18.04 memiliki diffutils
3.6 dan karenanya memilikinya.
Pada 3.5 terlihat seperti ini:
Diuji:
diff --color -u \
<(seq 6 | sed 's/$/ a/') \
<(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
Rupanya ditambahkan di commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015).
Perbedaan tingkat kata
Seperti diff-highlight
. Sepertinya tidak mungkin, permintaan fitur: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html
Utas terkait:
ydiff
meskipun begitu, lihat di bawah.
ydiff
perbedaan level kata berdampingan
https://github.com/ymattw/ydiff
Apakah ini Nirvana?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s
Hasil:
Jika garis terlalu sempit (default 80 kolom), paskan layar dengan:
diff -u a b | ydiff -w 0 -s
Isi file uji:
Sebuah
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
b
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
Integrasi git
ydiff
terintegrasi dengan Git tanpa konfigurasi apa pun yang diperlukan.
Dari dalam repositori git, alih-alih git diff
, Anda bisa melakukannya:
ydiff -s
dan bukannya git log
:
ydiff -ls
Lihat juga: Bagaimana saya bisa mendapatkan diff berdampingan ketika saya melakukan "git diff"?
Diuji pada Ubuntu 16.04, git 2.18.0, ydiff 1.1.
There is no word-highlighting, yet
- ada pembaruan? Inilah yang saya datangi untuk pertanyaan ini (saya ingin- grep --color
seperti keluaran diff).
git diff --color
juga bekerja. Berguna saat bekerja di ssh.
diff --color=always | less -R
Dan untuk saat-saat ketika sebuah yum install colordiff
atau apt-get install colordiff
bukan merupakan pilihan karena kendala gila di luar kendali langsung Anda, atau Anda hanya merasa gila , Anda dapat menciptakan kembali roda dengan sederet:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
Lemparkan itu dalam skrip shell dan pipa un diff output melaluinya.
Ini membuat marka biru dan menyoroti nama file baru / lama dan menambahkan / menghapus garis di latar belakang hijau dan merah, masing-masing. 1 Dan itu akan membuat spasi tambahan 2 perubahan lebih mudah terlihat daripada yang bisa dilakukan colordiff.
1 Secara kebetulan, alasan untuk menyorot nama file sama dengan baris yang dimodifikasi adalah bahwa untuk membedakan antara nama file dan baris yang dimodifikasi secara tepat membutuhkan penguraian format diff, yang bukan sesuatu untuk ditangani dengan regex. Menyoroti mereka sama berfungsi "cukup baik" secara visual dan membuat masalah sepele. Yang mengatakan, ada beberapa seluk-beluk yang menarik .
2 Tapi tidak mengeklik tab. Rupanya tab tidak mendapatkan latar belakang mereka, setidaknya di xterm saya. Itu membuat perubahan tab vs ruang sedikit menonjol.
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(meskipun saya berharap ada cara yang lebih baik).
Anda dapat mengubah konfigurasi subversi untuk menggunakan 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
Berwarna, ouput tingkat kata diff
Inilah yang dapat Anda lakukan dengan skrip di bawah ini dan sorot berbeda :
#!/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
( Terima kasih atas jawaban @ retracile untuk sed
sorotan)
Saya menggunakan grc
(Generic Colouriser), yang memungkinkan Anda untuk mewarnai keluaran dari sejumlah perintah termasuk diff
.
Ini adalah skrip python yang dapat membungkus perintah apa pun. Jadi, alih-alih memohon diff file1 file2
, Anda akan meminta grc diff file1 file2
untuk melihat output berwarna. Saya telah alias diff
untuk grc diff
untuk membuatnya lebih mudah.
fork()
panggilan, meskipun kemungkinan bekerja dengan WSL.
Berikut ini adalah solusi lain yang memanggil sed
untuk memasukkan urutan ANSI escape sesuai untuk warna untuk menunjukkan +
, -
dan @
garis-garis merah, hijau, dan cyan masing-masing.
diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"
Berbeda dengan solusi lain untuk pertanyaan ini, solusi ini tidak menguraikan urutan pelarian ANSI secara eksplisit. Sebagai gantinya, ia memanggil tput setaf
dan tput sgr0
memerintahkan untuk menghasilkan urutan pelarian ANSI masing-masing untuk mengatur warna yang sesuai dan mengatur ulang atribut terminal.
Untuk melihat warna yang tersedia untuk setiap argumen tput setaf
, gunakan perintah ini:
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
Berikut tampilan hasilnya:
Berikut adalah bukti bahwa perintah tput setaf
dan tput sgr0
menghasilkan urutan pelarian ANSI yang sesuai:
$ 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
Karena wdiff
accepts args menentukan string di awal dan akhir dari kedua penyisipan dan penghapusan, Anda dapat menggunakan urutan warna ANSI sebagai string tersebut:
wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
Sebagai contoh, ini adalah hasil dari membandingkan dua file CSV:
Contoh dari https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiff
sekarang (1.0.16) mengerti wdiff
, sehingga Anda juga dapat hanya pipa: wdiff -n f1 f2 | colordiff
. wdiff
harus digabung menjadi diffutils ...
Saya sarankan Anda untuk mencoba diff-so-fancy . Saya menggunakannya selama pekerjaan saya dan itu tampak hebat seperti sekarang. Itu datang dikemas dengan banyak pilihan dan sangat mudah untuk mengkonfigurasi diff Anda seperti yang Anda inginkan.
Anda dapat menginstalnya dengan:
sudo npm install -g diff-so-fancy
atau di Mac:
brew install diff-so-fancy
Setelah itu, Anda dapat menyorot diff Anda seperti ini:
diff -u file1 file2 | diff-so-fancy
Dengan perintah kelelawar :
diff file1 file2 | bat -l diff
Pada git versi terbaru di Ubuntu, Anda dapat mengaktifkan diff-highlighting dengan:
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
Dan kemudian menambahkan ini ke Anda .gitconfig
:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
Mungkin saja skrip tersebut berada di tempat lain di distro lain, bisa Anda gunakan locate diff-highlight
untuk mencari tahu di mana.