ฉันจะเปลี่ยนสีของ xterm ของฉันโดยใช้ลำดับการหลีกเลี่ยง Ansi ได้อย่างไร


25

ฉันต้องการเปลี่ยนสี (พื้นหลังแบบอักษรเบื้องหน้า) ของ xterm ของฉันจาก commandline ฉันได้ยินมาว่าสิ่งนี้สามารถทำได้โดยใช้ลำดับการหลบหนีของ ANSI

ถ้าเป็นไปได้:

  • เป็นอย่างไรบ้าง?
  • ฉันสามารถใช้ชื่อสีหรือต้องใช้รหัส RGB ได้หรือไม่

คำตอบ:


27

ANSI escape sequences ประกอบด้วยลำดับของอักขระที่เริ่มต้นด้วยอักขระ Escape, อักขระ 27. อักขระตัวถัดไปมักจะเป็น open-square-bracket

คำสั่ง echo สามารถส่งอักขระ escape หากคุณระบุ-eและใช้\eสำหรับ escape

มาตรฐาน ANSI กำหนด 8 สีรวมถึงโหมดสว่างทำให้มีความเป็นไปได้ทั้งหมด 16 ค่า ลำดับคือ:

\e[<number>m

ในกรณีที่<number>เป็นหนึ่งใน:

เบื้องหน้า:

  • 30 ดำ
  • 31 แดง
  • 32 สีเขียว
  • 33 สีเหลือง
  • 34 น้ำเงิน
  • 35 Magenta
  • 36 สีฟ้า
  • 37 สีขาว

พื้นหลัง:

  • 40 ดำ
  • 41 แดง
  • 42 สีเขียว
  • 43 สีเหลือง
  • 44 น้ำเงิน
  • 45 Magenta
  • 46 Cyan
  • 47 ขาว

  • 0 รีเซ็ตทั้งหมด

  • 1 ตัวหนา

ดังนั้นเพื่อให้พื้นหน้าของคุณมีสีแดงและพื้นหลังเป็นสีเหลือง:

$ echo -e "\e[31m\e[43m"

และเพื่อเปิดใช้งานตัวหนา:

$ echo -e "\e[1m"

แน่นอนคุณสามารถรวมทั้งหมดเข้าด้วยกัน:

$ echo -e "\e[31m\e[43m\e[1m"

มีหลายรหัสการหลบหนีอื่น ๆ สำหรับการทำสิ่งอื่น ๆ

ตัวอย่างเช่น - ล้างหน้าจอและเลื่อนเคอร์เซอร์ไปที่มุมบนซ้าย:

$ echo -e "\e[2J\e[1;1H"

ซึ่งมีประโยชน์เมื่อเปลี่ยนสี:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

ซึ่งจะเปลี่ยนสีล้างหน้าจอและวางเคอร์เซอร์ที่ด้านบนซ้าย เกือบซ้ายบน เสียงสะท้อนทำให้รถกลับคืนดังนั้นมันจึงเลื่อนลงมาตามเส้น คุณสามารถเพิ่ม-necho เพื่อป้องกันสิ่งนี้หากคุณจู้จี้จุกจิก

หากคุณเลอะทั้งหมดและไม่เห็นสิ่งที่คุณกำลังพิมพ์คุณสามารถรีเซ็ตสีของเทอร์มินัลเป็นปกติโดยกด:

Ctrl+v [ 0 m Return

สิ่งที่คุณหวังคือพรอมต์คำสั่ง มันจะเอ่ยถึงคำสั่งที่ไม่รู้จัก แต่คุณจะสามารถเห็นสิ่งที่คุณทำอีกครั้ง


ฉันจะใช้ชื่อสีแทนรหัสสีได้อย่างไร
Nathan Fellman

1
ไม่ แต่คุณสามารถกำหนดรหัสสีให้กับตัวแปรได้ FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko

3
อย่างไรก็ตามควรสังเกตว่าหมายเลขรหัสหลายสีสามารถคั่นด้วย ";" ดังนั้นเพื่อให้พื้นหน้าของคุณเป็นสีแดงและพื้นหลังสีเหลืองคุณสามารถใช้ส่วนที่สั้นกว่า: echo -ne '\e[31;43m'(แทนด้านบนecho -e "\e[31m\e[43m")
Andreas Spindler

ฉันจะเปลี่ยนสีของเคอร์เซอร์เป็น 34 Blue ได้อย่างไร
trusktr

28

โปรดทราบว่า Xterms ที่ทันสมัยรองรับสี 32 บิต!

ตัวอย่างง่ายๆ ในการตั้งค่าพื้นหลังสีม่วงเข้มที่สวยงาม (เฮ้แต่ละรายการเป็นของตัวเอง) มูลค่า # 53186f คุณต้องทำ:

echo -ne "\033]11;#53186f\007"

โปรดทราบว่าการดำเนินการนี้จะเปลี่ยนสีของทั้งหน้าต่างทันทีไม่ใช่เฉพาะข้อความที่ตามมา นี่เป็นสิ่งที่ดีโดยเฉพาะอย่างยิ่งสำหรับการทำให้หน้าต่างแตกต่างอย่างเห็นได้ชัดหลังจาก ssh'ing ไปยังเซิร์ฟเวอร์ (ตัวอย่าง) ใส่ 'echo' ด้านบนลงใน. bashrc และเทอร์มินัลของคุณจะเปลี่ยนสีโดยอัตโนมัติเมื่อคุณเข้าสู่เซิร์ฟเวอร์นั้น (แต่จะไม่เปลี่ยนกลับเมื่อคุณกด Ctrl-D)

คุณสามารถใช้เวลาเป็นชั่วโมงในการค้นหาสิ่งนี้ - เอกสารส่วนใหญ่พูดถึงสี ANSI 16 สีดั้งเดิมเท่านั้น

แหล่งที่มา: http://www.steike.com/code/xterm-colors/ และhttp://rtfm.etla.org/xterm/ctlseq.html (ดูที่ "การควบคุมระบบปฏิบัติการ")

โปรดทราบ: ลำดับการหลบหนีด้านบนนั้นใช้ได้สำหรับ XTerms และอาจใช้ไม่ได้กับการใช้งานอื่น ๆ ของ "เทอร์มินัลจำลองหน้าต่าง" XTerm-like "เลียนแบบเทอร์มินัลที่อาจ" ดู "เหมือน XTerm ตัวอย่างเช่น "gnome-terminal" หรือ "konsole" มีลำดับการหลีกเลี่ยงที่แตกต่างกันหรืออาจไม่ใช้การเปลี่ยนสีเลย


1
นี่ไม่ทำงานสำหรับฉันมันสะท้อนเส้นว่างที่ไม่มีการเปลี่ยนแปลงที่สังเกตได้ในเทอร์มินัล
Richard

1
สิ่งนี้ใช้ได้กับฉันในขณะที่คนอื่นไม่ได้ - มีประโยชน์มากขอบคุณ
vol7ron

1
+1 เปลี่ยนพื้นหลังหน้าต่างและอนุญาตชื่อสีเช่น "เขียว" แทน "# 00ff00"
Rob ฉัน

1
# 53186f เป็นอย่างไรสี 32 บิต ฉันนับ 24 บิต ...
jiggunjer

ไม่มีใครรู้วิธีการทำสิ่งเดียวกันกับ gnome-terminal หรือไม่?
wjandrea

3

ใช่. ขั้ว ANSI สนับสนุนรหัสหนี ANSI แต่ละรหัสControl Sequence Introducer( CSI) ในรูปแบบต่อไปนี้:

ESC[<<<CODE>>>

อักขระ Ascii 27( ESCอักขระ) หรือ1bเลขฐานสิบหกตามด้วยวงเล็บเหลี่ยมด้านซ้ายจากนั้นตัวอักษรแสดงถึงการดำเนินการที่จะใช้

โปรดทราบว่า;อาจมีการจัดหารายการพารามิเตอร์ที่แยกจากกันโดยตรงก่อน<<<CODE>>>พารามิเตอร์

ตอนนี้สีใช้ชุดย่อยของCSIรหัส, Select Graphic Renditionรหัส เหล่านี้อยู่ในรูปแบบ:

ESC[<<<SGR>>>m

รหัสผ่านเป็นพารามิเตอร์SGR CSIเกี่ยวข้องกับคำถามของคุณคือSGRรหัส 30-49 รหัส 30-39 ตั้งค่าสีพื้นหน้า รหัส 40-49 ตั้งค่าสีพื้นหลัง

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

รหัส 38 และ 48 เป็นรหัสพิเศษ สิ่งเหล่านี้คือสิ่งที่อนุญาตให้คุณใช้ค่า RGB รูปแบบเหล่านี้คือ:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

หมายเหตุ: ทางเลือกที่ใช้ \x1b[<3 or 4>8;5;<web safe color index>mได้แก่ ด้วยการใช้งานนี้มีการเข้ารหัสสีที่แตกต่างอย่างสิ้นเชิง ดูลิงค์ที่ด้านบนของคำตอบนี้สำหรับข้อมูลเพิ่มเติม

รหัส 39 และ 49 ตั้งค่าสีพื้นหน้าและสีพื้นหลังให้เป็นค่าเริ่มต้นซึ่งกำหนดไว้บนพื้นฐานแบบเทอร์มินัล

ในทางปฏิบัติสี 30-37 40-47 นั้นแตกต่างจากสีที่ป้ายบอกไว้เล็กน้อย

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

เพื่อให้ได้แสงสีที่คุณใช้ SGI 1สำหรับตัวหนา ตัวหนาเป็นชื่อที่ทำให้เข้าใจผิด มันไม่ได้ทำให้ตัวอักษรหนา มันเพิ่มความสว่างของข้อความ ด้วยตัวหนาที่ใช้สีจึงกลายเป็น:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

แจ้งให้ทราบล่วงหน้า: ตัวเลขสองช่วงสีสุดท้ายมีความเกี่ยวข้องกับทั้งด้านหน้าและพื้นหลัง ( <index> + (30 or 40))

หากต้องการลบสไตล์ทั้งหมด (กลับสู่โหมดปกติ / ปกติ) ให้ใช้SGR0

CSIรหัสไม่ใช่กราฟิกทั้งหมด ตัวอย่างเช่นESC[2Jจะล้างเครื่องของคุณ ESC[<y>;<x>Hตั้งค่าตำแหน่งเคอร์เซอร์ (1 ดัชนี) ดูบทความวิกิพีเดียสำหรับข้อมูลเพิ่มเติม

หมายเหตุ: ในการทดสอบเหล่านี้ใช้งานหรือecho -eprintf


2

หมายเหตุ: "^ [" เป็นตัวหนีและถูกแทรกด้วย CTRL-V, CTRL- [และ ^ G เป็นตัวอักษรระฆังซึ่งใส่ด้วย CTRL-V, CTRL-G

บล็อกต่อไปนี้อยู่ใน. bash_profile ของฉันและตรวจสอบให้แน่ใจว่า xterms ของฉันในระบบนี้เป็นสีขาว - ดำ - ดำเสมอแม้หลังจากเข้าสู่ระบบอื่นที่อาจเปลี่ยนสีของฉัน

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

ตรวจสอบโครงการScriptEchoColor
มันทำอย่างสมบูรณ์ในสคริปต์ทุบตี
มันมีแพคเกจสำหรับ Ubuntu ที่นี่
แต่สคริปต์เหล่านี้สามารถติดตั้งบน distro ใด ๆ ถ้าคุณรู้วิธี (สามารถดาวน์โหลดล่าสุดจากคอมไพล์ของมัน)

คุณสามารถใช้ชื่อสีที่สั้นลงหรือขยายได้เช่น:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

ตัวอย่าง: ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ตรวจสอบให้แน่ใจว่าได้ดูxtermcontrolเพื่อควบคุม xterm ในตัวของมันเอง (ไม่ใช่แค่ตัวละคร)


0

ในบรรดารหัส ANSI CSIจำนวนมากนั้นเรียกว่า SGR หรือ Select Rendition กราฟิค นี่คือ ESC,, [พารามิเตอร์, mโดยที่พารามิเตอร์เป็นหนึ่งหรือมากกว่าจำนวนเต็มในรูปแบบ ASCII, คั่นด้วยเครื่องหมายอัฒภาค พารามิเตอร์ SGR ที่แตกต่างกันมีการระบุไว้ในหน้าวิกิพีเดียด้านบน (แม้ว่าจะไม่ได้เข้าไปดูรายละเอียดทั้งหมดสำหรับทั้งหมด)

พารามิเตอร์บางตัวเช่น1(ตัวหนาหรือเพิ่มความเข้ม) และ31(ตัวอักษรสีแดง) เป็นแบบสแตนด์อโลนและสามารถใช้ทีละรายการหรือรวมกันได้เช่นในESC[31mหรือESC[1;31mเพื่อให้ข้อความพื้นหน้าสีแดงมาตรฐานและตัวหนาสีแดงตามลำดับ

พารามิเตอร์อื่น ๆ ใช้ตัวเองซึ่งมีให้หลังจากรหัสเป็นตัวเลขที่คั่นด้วยเครื่องหมายอัฒภาคมากขึ้น ตัวอย่างเช่นESC[38;5;219mจะแสดงข้อความเบื้องหน้าในจำนวนสีที่ขยาย 219 และESC[38;2;150;100;50mจะแสดงในสีที่มีค่า RGB 150, 100, 50 ในกรณีนี้38คือคำสั่ง "ชุดฉากหน้าสีขยาย" ซึ่งมักจะเต็มไปด้วย คำสั่งย่อย คำสั่งย่อย2ใช้พารามิเตอร์สามตัวคือค่าของส่วนประกอบสีแดงสีเขียวและสีน้ำเงิน แตกต่างกันคำสั่งย่อย5ใช้ค่าเพียงหนึ่งค่าเพิ่มเติมจำนวนตั้งแต่ 0 ถึง 255 ระบุสีจากตารางที่เทอร์มินัลถูกกำหนดค่าด้วย

ฟังก์ชั่นเชลล์ต่อไปนี้มีประโยชน์ในการใช้รหัสเหล่านี้:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

คุณสามารถใช้สิ่งนี้:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

โปรดทราบว่าหากคุณไม่มีพารามิเตอร์ให้กับsgr()ค่าเริ่มต้นเป็นรหัส SGR 0 ซึ่งหมายถึงการปิดคุณลักษณะทั้งหมดการรีเซ็ตข้อความเป็นค่าเริ่มต้นสำหรับเทอร์มินัลนั้น


1
ในทางเทคนิคแล้วESC[38... mและESC[38... mสามารถ / ควร (ขึ้นอยู่กับแหล่งข้อมูลของคุณ - สิ่งที่ดีที่สุดที่เป็นอยู่ฉันเชื่อว่าitu.int/rec/T-REC-T.416-199303-I ) ควรใช้ สงวนไว้เป็นอย่างอื่นอักขระ:(เพื่อแยกองค์ประกอบพารามิเตอร์ ) เพื่อให้;ใช้เฉพาะระหว่างสตริงพารามิเตอร์ที่สมบูรณ์- เช่นESC[38;2;150;100;50mควรจะเขียนESC[38:2::150:100:50m...
SlySven

... การใช้งานที่น่าเสียดายมักจะลืมรหัสพื้นที่สีระหว่าง2และถึง150- อย่างที่ไม่มีใครรู้ว่าได้กำหนดไว้ว่าควรใช้ค่าใดในการใช้ค่าเริ่มต้นที่ว่างเปล่า - แต่มักพลาดไป และการใช้;เป็นตัวคั่นเท่านั้นทำให้ไม่สามารถดำเนินการข้อมูลได้อย่างน่าเชื่อถือตามข้อกำหนด
SlySven
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.