Làm thế nào để tô màu khác biệt trên dòng lệnh?


503

Khi tôi có một khác biệt, làm thế nào tôi có thể tô màu nó để nó trông tốt? Tôi muốn nó cho dòng lệnh, vì vậy xin vui lòng không có giải pháp GUI.


6
Bất kỳ hệ điều hành cụ thể / shell?
Rowland Shaw

4
Hãy thử github.com/walles/riff . Là một phần thưởng bổ sung, nó làm nổi bật những phần của dòng đã thay đổi.
Johan Walles

Câu trả lời:


608

Trang man cho diffđề xuất không có giải pháp cho màu sắc từ bên trong chính nó. Hãy xem xét sử dụng colordiff. Đó là một trình bao bọc difftạo ra cùng một đầu ra như diff, ngoại trừ việc nó tăng đầu ra bằng cách sử dụng tô sáng cú pháp màu để tăng khả năng đọc:

diff old new | colordiff

hoặc chỉ:

colordiff old new

Cài đặt:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • Hệ điều hành X: brew install colordiffhoặcport install colordiff

45
Chỉ thấy rằng bản thân mình :-). Nó có thể được dẫn vào ít hơn bằng cách sử dụng less -R, hiển thị các chuỗi thoát cho màu sắc một cách chính xác.
daniel kullmann

34
Chỉ có thể sử dụng cú pháp: colordiff file1 file2
Felipe Alvarez

3
Than ôi, nó không làm việc cho side-by-side đầu ra ( -ytùy chọn để kích hoạt) ☹ Các vimdiffgợi ý dưới đây có thể là một cách tốt hơn
Hi-Thiên thần

8
colordiffhoạt động tốt cho svn diff | colordiff(nghĩa là trong trường hợp bạn chỉ có diff, không phải hai tệp bị diff).
Bắp ngô

8
Là một bản cập nhật cho nhận xét của @ Hi-Angel: colordiff đã được cập nhật và hiện bao gồm -yhỗ trợ side ( ).
Bailey Parker

333

Sử dụng Vim :

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

Hoặc tốt hơn nữa, VimDiff (hoặc vim -d, ngắn hơn để gõ) sẽ hiển thị sự khác biệt giữa hai, ba hoặc bốn tệp cạnh nhau.

Ví dụ:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao: Tôi thích học các lệnh hơn là bí danh chúng đi. Bằng cách đó tôi có thể sử dụng chúng ở bất cứ đâu, ngay cả khi dotfiles của tôi không có sẵn.
Johnsyweb

1
@AquariusPower: ctrl-cctrl-xcó những ứng dụng khác trong Vim. ctrl-qđược bắt bởi nhiều thiết bị đầu cuối. Xem Viết và bỏ để tìm cách phù hợp nhất với nhu cầu của bạn.
Johnsyweb

1
Đầu tiên, loại vỏ này là gì? zsh? Tôi không nhận ra =(...)cấu trúc. Thứ hai, tôi đã có diff -ur a btrong tâm trí.
x-yuri


1
Giải pháp này tốt hơn câu trả lời được chấp nhận, vì nó không yêu cầu bạn phải có quyền quản trị hệ thống và cài đặt bất kỳ công cụ bổ sung nào
amanzoor

173

Trên thực tế dường như có một tùy chọn khác (mà tôi chỉ nhận thấy gần đây, khi gặp vấn đề được mô tả ở trên):

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

Nếu bạn có Git xung quanh (dù sao bạn cũng có thể đang sử dụng), thì bạn sẽ có thể sử dụng nó để so sánh, ngay cả khi các tệp không nằm trong sự kiểm soát phiên bản. Nếu không được bật cho bạn theo mặc định, thì việc bật hỗ trợ màu ở đây dường như dễ dàng hơn đáng kể so với một số cách giải quyết được đề cập trước đó.


19
Điều này là gọn gàng, nhưng đáng buồn là điều này không hoạt động khi đầu vào là đường ống. Ví dụ, so sánh các tệp nhị phân thông qua git diff <(xxd file1) <(xxd filed)không hoạt động.
Michael Anderson

8
Kỳ lạ thay, ít nhất một trong số các tệp phải 'bên ngoài kho lưu trữ hiện tại', theo git help diff. Vì vậy, nếu git diff của bạn sắp hết, hãy thử cdxem bạn đang ở đâu.
Yêu cầu xấu

7
Để bật màu cho git diff:git config color.diff auto
JWhy

2
siêu đơn giản và nhanh chóng
EE33

31
Nếu cả hai tệp nằm trong kho lưu trữ hiện tại, hãy sử dụng git diff --no-indexđể so sánh hai tệp.
Olivier 'Ölbaum' Scherler

95

diff --color tùy chọn đã được thêm vào GNU diffutils 3.4 (2016-08-08)

Đây là difftriển khai mặc định trên hầu hết các bản phát hành, sẽ sớm nhận được nó.

Ubuntu 18.04 có diffutils3.6 và do đó có nó.

Trên 3.5, nó trông như thế này:

nhập mô tả hình ảnh ở đây

Thử nghiệm:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Rõ ràng được thêm vào cam kết c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (tháng 3 năm 2015).

Khác biệt cấp độ từ

Thích diff-highlight. Có vẻ như không thể, yêu cầu tính năng: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Chủ đề liên quan:

ydiff mặc dù vậy, xem bên dưới.

ydiff cấp độ từ bên cạnh

https://github.com/ymattw/ydiff

Đây có phải là Niết bàn không?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Kết quả:

nhập mô tả hình ảnh ở đây

Nếu các dòng quá hẹp (80 cột mặc định), phù hợp với màn hình với:

diff -u a b | ydiff -w 0 -s

Nội dung của các tệp thử nghiệm:

một

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 Tích hợp Git

ydiff tích hợp với Git mà không cần bất kỳ cấu hình nào.

Từ bên trong kho git, thay vì git diff, bạn có thể thực hiện:

ydiff -s

và thay vì git log:

ydiff -ls

Xem thêm: Làm thế nào tôi có thể nhận được một khác biệt bên cạnh khi tôi làm "git diff"?

Đã thử nghiệm trên Ubuntu 16.04, git 2.18.0, ydiff 1.1.


Đây là tài liệu.
Alexey

1
Trong chủ đề danh sách gửi thư: There is no word-highlighting, yet- có bản cập nhật nào không? Đây là những gì tôi đã đến với câu hỏi này cho (tôi muốn grep --color- giống như đầu ra khác).
i336_

@ i336_ không có cập nhật nào đáng tiếc, nếu tôi nhận được bất kỳ, tôi sẽ cập nhật câu hỏi. Ping tôi nếu bạn tìm thấy bất cứ điều gì.
Ciro Santilli 郝海东 冠状 病 事件

Nhân tiện git diff --colorcũng vậy. Hữu ích khi làm việc trên ssh.
Nagev

Diff quá lớn? sử dụngdiff --color=always | less -R
inetph Phantom

69

Và trong những trường hợp khi một yum install colordiffhoặc apt-get install colordiffkhông phải là một lựa chọn do một số ràng buộc điên rồ ngoài tầm kiểm soát ngay lập tức của bạn, hoặc bạn chỉ cảm thấy điên rồ , bạn có thể phát minh lại bánh xe bằng một dòng sed:

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

Ném nó trong một tập lệnh shell và đầu ra khác biệt thống nhất qua nó.

Nó làm cho các dấu hunk màu xanh lam và làm nổi bật tên tệp mới / cũ và các dòng được thêm / xóa trong nền màu xanh lá cây và đỏ, tương ứng. 1 Và nó sẽ làm cho không gian dấu 2 thay đổi dễ thấy hơn so với colordiff có thể.


1 Ngẫu nhiên, lý do làm nổi bật tên tệp giống như các dòng được sửa đổi là để phân biệt chính xác giữa tên tệp và các dòng được sửa đổi đòi hỏi phải phân tích đúng định dạng diff, đây không phải là điều cần xử lý với biểu thức chính quy. Làm nổi bật chúng cùng một tác phẩm "đủ tốt" một cách trực quan và làm cho vấn đề trở nên tầm thường. Điều đó nói rằng, có một số tinh tế thú vị .

2 Nhưng không theo dõi tab. Rõ ràng các tab không được đặt nền của chúng, ít nhất là trong xterm của tôi. Nó làm cho tab và thay đổi không gian nổi bật một chút mặc dù.


5
@Matt: Đây là một cách tiếp cận mạnh mẽ cho máy Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(mặc dù tôi mong đợi có một cách tốt hơn).
truy cứu

1
Hmm, nó hoạt động rất tốt ... đã cho 3 dấu gạch ngang giữa mỗi khối một nền màu hồng.
Matt Montag

Hướng dẫn không thể đọc được, không thể nhầm lẫn mà không có tùy chọn để dễ dàng thay đổi màu sắc chẳng hạn.

1
Anh bạn này thật tuyệt! Con đường để đi! Đó là một số phù thủy sed tốt đẹp.
fthinker

6
sed 's / ^ - / \ x1b [31m - /; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /' trông cũng rất tuyệt
Yura

16

Bạn có thể thay đổi cấu hình lật đổ để sử dụng 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

thông qua: https://gist.github.com/westonruter/846524


svn: Không thể bắt đầu quá trình 'colordiff': Tài nguyên tạm thời không có sẵn
niken

Bạn đã cài đặt colordiff?
Azd325

Vâng, tôi cũng đã cố gắng mã hóa đường dẫn (chạy trong cygwin)
niken


12

Màu, từ cấp diff ouput

Đây là những gì bạn có thể làm với đoạn script bên dưới và diff-highlight :

Ảnh chụp màn hình khác màu

#!/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

(Tín dụng cho câu trả lời của @ retracile cho phần sedtô sáng)


Làm cách nào để sử dụng đầu ra này trong GVim?
Hemant Sharma

Đối với vim, sử dụng một plugin, ví dụ như diffchar .
Tom Hale

10

Tôi sử dụng grc(Generic Colouriser), cho phép bạn tô màu đầu ra của một số lệnh bao gồm diff.

Nó là một kịch bản python có thể được bọc xung quanh bất kỳ lệnh nào. Vì vậy, thay vì gọi diff file1 file2, bạn sẽ gọi grc diff file1 file2để xem đầu ra màu. Tôi đã aliased diffđể grc diffđể làm cho nó dễ dàng hơn.


Không hoạt động trên Windows với mingw / cygwin do fork()các cuộc gọi, mặc dù có khả năng hoạt động với WSL.
Gabriel Devillers

6

Dưới đây là một giải pháp mà gọi sedđể chèn chuỗi ANSI thoát phù hợp với màu sắc hiển thị +, -@dòng màu đỏ, xanh lá cây, và màu lục lam, tương ứng.

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

Không giống như các giải pháp khác cho câu hỏi này, giải pháp này không đánh vần rõ ràng các chuỗi thoát ANSI. Thay vào đó, nó gọi các lệnh tput setaftput sgr0lệnh để tạo các chuỗi thoát ANSI để đặt màu tương ứng và đặt lại các thuộc tính đầu cuối tương ứng.

Để xem các màu có sẵn cho mỗi đối số tput setaf, hãy sử dụng lệnh này:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

Đây là cách đầu ra trông:

nhập mô tả hình ảnh ở đây

Dưới đây là bằng chứng cho thấy các lệnh tput setaftput sgr0lệnh tạo ra các chuỗi thoát ANSI thích hợp:

$ 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

5

wdiffchấp nhận các đối số chỉ định chuỗi ở đầu và cuối của cả chèn và xóa, nên bạn có thể sử dụng các chuỗi màu ANSI làm các chuỗi đó:

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

Ví dụ: đây là đầu ra của việc so sánh hai tệp CSV:

đầu ra khác nhau của các tệp CSV

Ví dụ từ https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html


1
colordiffbây giờ (1.0.16) đã hiểu wdiff, vì vậy bạn cũng có thể chỉ cần ống : wdiff -n f1 f2 | colordiff. wdiffnên được sáp nhập vào diffutils ...
Ciro Santilli 郝海东 冠状 病 六四

3

Tôi sẽ đề nghị bạn thử diff-so-Fancy . Tôi sử dụng nó trong công việc của tôi và nó chắc chắn có vẻ tuyệt vời như bây giờ. Nó đi kèm với nhiều tùy chọn và thật dễ dàng để cấu hình khác biệt của bạn theo cách bạn muốn.

Bạn có thể cài đặt nó bằng cách:

sudo npm install -g diff-so-fancy

hoặc trên máy Mac:

brew install diff-so-fancy

Sau đó, bạn có thể làm nổi bật các khác biệt của bạn như thế này:

diff -u file1 file2 | diff-so-fancy


0

Trên các phiên bản gần đây của git trên Ubuntu, bạn có thể bật tính năng làm nổi bật khác với:

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

Và sau đó thêm nó vào .gitconfig:

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

Có thể tập lệnh được đặt ở một nơi khác trong các bản phát hành khác, bạn có thể sử dụng locate diff-highlightđể tìm ra nơi.


0

Màu sắc cấp độ nhân vật: Cài đặt ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Đầu ra của ccdiff

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.