เมื่อฉันมีความแตกต่างฉันจะทำสีให้มันดูดีได้อย่างไร? ฉันต้องการมันสำหรับบรรทัดคำสั่งดังนั้นโปรดไม่มีการแก้ปัญหา GUI
เมื่อฉันมีความแตกต่างฉันจะทำสีให้มันดูดีได้อย่างไร? ฉันต้องการมันสำหรับบรรทัดคำสั่งดังนั้นโปรดไม่มีการแก้ปัญหา GUI
คำตอบ:
หน้าคนสำหรับdiff
แนะนำไม่มีทางออกสำหรับ colorization จากภายในตัวเอง colordiff
โปรดพิจารณาใช้ มันเป็น wrapper รอบ ๆ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
(เช่นในสถานการณ์ที่คุณมีส่วนต่างเท่านั้นไม่ใช่ทั้งสองไฟล์ที่แตกต่างกัน)
-y
การสนับสนุนแบบเคียงข้างกัน ( )
ใช้เป็นกลุ่ม :
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
'นอกพื้นที่เก็บข้อมูลในปัจจุบันตาม ดังนั้นหากความแตกต่างของคอมไพล์ของคุณว่างเปล่าลองcd
จากที่ที่คุณอยู่
git config color.diff auto
git diff --no-index
เพื่อเปรียบเทียบสองไฟล์
diff --color
เพิ่มตัวเลือกใน GNU diffutils 3.4 (2016-08-08)
นี่คือการdiff
ใช้งานเริ่มต้นสำหรับ distros ส่วนใหญ่ซึ่งจะได้รับในไม่ช้า
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
เนื้อหาของไฟล์ทดสอบ:
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
เอาท์พุท diff- เหมือน)
git diff --color
ทำงานเกินไป มีประโยชน์เมื่อทำงานกับ ssh
diff --color=always | less -R
และสำหรับโอกาสเหล่านั้นเมื่อ a yum install colordiff
หรือa apt-get install colordiff
ไม่ใช่ตัวเลือกเนื่องจากข้อ จำกัด ที่บ้าเกินกว่าการควบคุมอย่างฉับพลันหรือคุณแค่รู้สึกบ้าคุณสามารถคิดค้นล้อใหม่ด้วยสายของ:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
โยนมันลงในเชลล์สคริปและไพพ์เอาท์พุทdiff ที่รวมเป็นหนึ่งผ่านมัน
มันทำให้ตัวทำเครื่องหมายสีน้ำเงินและเน้นชื่อไฟล์ใหม่ / เก่าและเพิ่ม / ลบบรรทัดในพื้นหลังสีเขียวและสีแดงตามลำดับ 1 และมันจะทำให้พื้นที่ต่อท้าย2เปลี่ยนแปลงได้ชัดเจนกว่า colordiff can
1 โดยบังเอิญเหตุผลในการเน้นชื่อไฟล์เหมือนกับบรรทัดที่แก้ไขคือการแยกความแตกต่างระหว่างชื่อไฟล์และบรรทัดที่แก้ไขอย่างถูกต้องต้องแยกวิเคราะห์รูปแบบ diff อย่างถูกต้องซึ่งไม่ใช่สิ่งที่ต้องจัดการกับ regex การเน้นให้เห็นผลงานชิ้นเดียวกันคือ "ดีพอ" และทำให้เกิดปัญหาเล็กน้อย ที่กล่าวว่ามีบางอย่างที่น่าสนใจรายละเอียดปลีกย่อย
2แต่ไม่ใช่แท็บต่อท้าย เห็นได้ชัดว่าแท็บไม่ได้รับชุดพื้นหลังอย่างน้อยใน xterm ของฉัน มันทำให้การเปลี่ยนแปลงของแท็บ vs space มีความโดดเด่นเล็กน้อย
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
ouput สีระดับคำ diff
นี่คือสิ่งที่คุณสามารถทำได้ด้วยสคริปต์ด้านล่างและไฮไลต์ diff :
#!/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
(ทั่วไป Colouriser) diff
ซึ่งช่วยให้คุณสามารถส่งออกสีของจำนวนคำสั่งรวมทั้ง
มันเป็นสคริปต์หลามซึ่งสามารถล้อมรอบคำสั่งใด ๆ ดังนั้นแทนที่จะกล่าวอ้างdiff file1 file2
คุณจะเรียกใช้grc diff file1 file2
เพื่อดูผลลัพธ์ colourised ฉันได้ใช้นามแฝง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 escape อย่างชัดเจน แต่จะเรียกใช้คำสั่งtput setaf
และtput sgr0
เพื่อสร้างลำดับ ANSI escape เพื่อตั้งค่าสีที่เหมาะสมและรีเซ็ตคุณสมบัติของเทอร์มินัลตามลำดับ
หากต้องการดูสีที่มีให้สำหรับแต่ละอาร์กิวเมนต์ให้tput setaf
ใช้คำสั่งนี้:
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
นี่คือลักษณะที่เอาต์พุต:
นี่คือหลักฐานที่ว่าtput setaf
และtput sgr0
คำสั่งสร้างลำดับ ANSI escape ที่เหมาะสม:
$ 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
ยอมรับ args ที่ระบุสตริงที่จุดเริ่มต้นและจุดสิ้นสุดของการแทรกและการลบคุณสามารถใช้ลำดับสี 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
ควรรวมเป็น diffutils ...wdiff -n f1 f2 | colordiff
wdiff
ฉันอยากจะแนะนำให้คุณลองทำdiff-so-fancy ฉันใช้มันในระหว่างการทำงานและมันก็ดูดีมากในตอนนี้ มันมาพร้อมกับตัวเลือกมากมายและเป็นเรื่องง่ายที่จะกำหนดค่า diffs ตามที่คุณต้องการ
คุณสามารถติดตั้งได้โดย:
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 คุณสามารถเปิดใช้งานการเน้นด้วย:
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
มีความเป็นไปได้ที่สคริปต์จะอยู่ที่อื่นใน distros อื่น ๆ คุณสามารถใช้locate diff-highlight
ค้นหาว่าอยู่ที่ไหน