ลำดับประเภทใดบ้างที่เป็นลำดับ escape ที่เริ่มต้นด้วย“ \ 033]”


19

ผมพบว่าลำดับหนีจำนวนมากในทุบตีเริ่มต้นด้วย\033]แต่สิ่งที่เป็นลำดับเหล่านี้และทำไมพวกเขาเริ่มต้นด้วย\033]?

คำตอบ:


25

สตริงเป็นจริง\033[และนั่นไม่ใช่สิ่งทั้งหมด

หลังจากเครื่องหมายวงเล็บเปิดนั้นมีชุดของตัวเลขและสัญลักษณ์ สายนี้เป็นที่รู้จักกันเป็นลำดับหนีและใช้ในการควบคุมเคอร์เซอร์คอนโซลและสีข้อความเหนือสิ่งอื่นใด

ลำดับการหลีกเลี่ยงการพิมพ์จะต้องอยู่ใน \[\033[ and \]

mหากลำดับหนีการควบคุมสีข้อความแล้วมันจะตามมาด้วยการ

นี่คือตารางสำหรับลำดับสี:

Black       0;30     Dark Gray     1;30  
Blue        0;34     Light Blue    1;34  
Green       0;32     Light Green   1;32  
Cyan        0;36     Light Cyan    1;36  
Red         0;31     Light Red     1;31  
Purple      0;35     Light Purple  1;35  
Brown       0;33     Yellow        1;33  
Light Gray  0;37     White         1;37   

ดังนั้นหากคุณต้องการให้พรอมต์คอนโซลของคุณเป็นสีน้ำเงินคุณจะต้องใช้ escape sequence ต่อไปนี้ (ในชื่อไฟล์ที่ฉันลืม):

\[\033[34m\]

(สังเกตเห็นm)

ลำดับการยกเว้นนี้ไม่เพียงควบคุมสีเท่านั้น นอกจากนี้ยังสามารถควบคุมการเคลื่อนไหวของเคอร์เซอร์ นี่คือตาราง / รายการพร้อมรหัสเคลื่อนไหวและวิธีการทำงาน:

  • วางตำแหน่งเคอร์เซอร์:

    \033[<L>;<C>H

    หรือ

    \033[<L>;<C>f

    วางเคอร์เซอร์ที่บรรทัด L และคอลัมน์ C

  • เลื่อนเคอร์เซอร์ขึ้น N บรรทัด:

    \033[<N>A
  • เลื่อนเคอร์เซอร์ลง N บรรทัด:

    \033[<N>B
  • เลื่อนเคอร์เซอร์ไปข้างหน้าคอลัมน์ N:

    \033[<N>C
  • เลื่อนเคอร์เซอร์ไปข้างหลังคอลัมน์ N:

    \033[<N>D
  • ล้างหน้าจอย้ายไปที่ (0,0):

    \033[2J
  • ลบถึงจุดสิ้นสุดบรรทัด:

    \033[K
  • บันทึกตำแหน่งเคอร์เซอร์:

    \033[s
  • คืนค่าตำแหน่งเคอร์เซอร์:

    \033[u

เพิ่งทราบว่าสองรายการสุดท้ายอาจไม่ทำงานในเทอร์มินัลอีมูเลเตอร์ที่คุณใช้ เห็นได้ชัดเพียงxtermและnxtermใช้ทั้งสองลำดับ

และตัวอย่างการใช้หนึ่งใน escape sequences เหล่านี้: บอกว่าฉันต้องการวางเคอร์เซอร์ของฉันที่บรรทัด 3, คอลัมน์ (ตัวอักษร) 9. สำหรับฉันจะใช้

\[033\[3;9H]

(ฉันสมมติว่าคอลัมน์ 0 เป็นตำแหน่งแรกดังนั้นจะเป็นอักขระตัวที่ 8)

แหล่งที่มา: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (อ่าน 6.2)

การอ่านทั่วไปเพิ่มเติม: http://ascii-table.com/ansi-escape-sequences.php

Wikipedia: https://en.wikipedia.org/wiki/ANSI_escape_code


2
พิจารณาเชื่อมโยงไปยังen.wikipedia.org/wiki/ANSI_escape_code
cat

2
โปรดทราบว่า '\ 033' เป็นอักขระ ESCAPE ในฐานแปดดังนั้นจึงสามารถกำหนดเป็นทศนิยม (27) หรือฐานสิบหก (0x1B) มีวิธีการอื่น ๆ ทั่วไปการเขียน ESCAPE เป็นเช่น '^ [' ในสคริปต์เปลือก "\ E" ใน bindkey ฯลฯ
jamesqf

1
โปรดทราบว่าจำนวนรายการในตารางนั้นทำให้เข้าใจผิดหรือไม่ถูกต้อง: ตัวหนา, จาง, ขีดเส้นใต้ ฯลฯ สามารถตั้งค่าและรีเซ็ตเป็นอิสระจากสีและยังตั้งค่าเป็น 0 พร้อมด้วยสี; มีชุดรหัสแยกต่างหาก (40–49) สำหรับพื้นหลังและ 7 ชุดจะสลับกับพื้นหน้าและพื้นหลังแทน ESC [2Kจะลบทั้งบรรทัดทั้งก่อนและหลังเคอร์เซอร์ เป็นแหล่งที่ดีมากที่จะเป็นบทความวิกิพีเดียหรือคุณอาจจะไปECMA-48ส่วน 8.3.117 SGR - เลือกกราฟิก Rendition
deltab

ตัวอักษรวลี'' m 'ที่ท้ายประโยคแต่ละประโยคต่อไปนี้ถูกใช้เป็นอักขระหยุด "ในโพสต์ cplusplus.com ก็ค่อนข้างสับสนเนื่องจากตารางด้านล่างมีคำสั่งที่เห็นได้ชัดว่าไม่ได้ถูกยกเลิกโดย "m" ที่จริงแล้วดูเหมือนว่าจะทำให้เข้าใจผิดมากขึ้นที่นี่เมื่อนำเสนอที่ด้านบนขวา
ilkkachu

1
ในทางเทคนิคการเป็นผู้นำ0;ในลำดับสีนั้นไม่จำเป็น ที่เพิ่งทำให้สีพื้นหลังเป็นค่าเริ่มต้นก่อนที่จะตั้งฉากหน้า 4xนอกจากนี้คุณยังสามารถตั้งค่าพื้นหลังด้วย
คดีกองทุนของโมนิกา

17

พวกมันควบคุมคำสั่งสำหรับเทอร์มินัล

แต่เดิมเทอร์มินัลเป็นอุปกรณ์ที่ค่อนข้างโง่ที่เชื่อมต่อกับพอร์ตอนุกรมไม่ใช่ซอฟต์แวร์ GUI หลายแท็บที่มีเมนูที่เรามีอยู่ตอนนี้ เนื่องจากพวกเขาได้รับกระแสข้อมูลของตัวอักขระ (ไบต์) เท่านั้นจึงไม่มีการแบ่งแยกที่ชัดเจนระหว่างข้อมูล (สิ่งที่จะพิมพ์บนหน้าจอ) และคำสั่ง (วิธีการพิมพ์) แต่คำสั่งจะถูกแทนด้วยอักขระควบคุมพิเศษ

อักขระควบคุมที่เห็นได้ชัดคือสิ่งต่าง ๆ เช่นตัวดึงข้อมูลบรรทัด (ขึ้นบรรทัดใหม่), backspace และเสียงบี๊บ แต่คำสั่งที่เฉพาะเจาะจงมากขึ้นจะได้รับเป็นลำดับของตัวอักษรเริ่มต้นด้วยESCตัวละคร (รหัส 27 ในทศนิยม 0x1b ในฐานสิบหกหรือ 033 แปด) มันมักจะแสดงเป็น^[หรือ\033ในตัวอย่างของคุณ

ลำดับที่ESC [เรียกว่า CSI หรือผู้แนะนำลำดับการควบคุมและจะเริ่มคำสั่งด้วยพารามิเตอร์ตัวเลขที่เป็นตัวเลือกซึ่งมักลงท้ายด้วยตัวอักษรที่กำหนดคำสั่งหลัก escape sequences ทั่วไปส่วนใหญ่จะอยู่ในคลาสนี้

รายชื่อรหัสหนีที่สามารถพบได้เช่นในconsole_codes(4)หน้าคนและในหน้าวิกิพีเดียรหัสหนี ANSI

ตัวอย่างบางส่วน:

ESC [ 4 A             move cursor 4 lines up (4 can be any number)
ESC [ 5 B             move cursor 5 lines down
ESC [ 2 K             erase current line 
ESC [ 30;46 m         set black text (30) on cyan background (46)
ESC [ 0 m             reset color and attributes

คุณสามารถทดสอบคำสั่งด้วยเช่น Bash การใช้-eแฟล็กechoคำสั่งbuiltin ยอมรับ\033ว่าเป็นตัวแทนของESCอักขระ

เช่นนี้จะพิมพ์คำทักทายสีตรงกลางของหน้าจอและอื่น ๆ ตามปกติในตำแหน่งเคอร์เซอร์เดิม:

echo -e '\033[s\033[12;30f\033[30;46m  Hello!  \033[0m\033[uhello'

ลำดับESC ]ที่คุณกล่าวถึงคือคำสั่ง OSC หรือระบบปฏิบัติการซึ่งส่วนใหญ่จะใช้ในคำสั่งเพื่อตั้งชื่อหน้าต่างในxtermและอื่น ๆ เช่น:

echo -e '\033]0;new window title\a'

จากนั้นยังมีESC ( A(และตัวอักษรอื่น ๆ ) ที่ตั้งชุดตัวอักษรระดับชาติเกี่ยวกับขั้วบางกับผลกระทบที่อาจเกิดขึ้นเฮฮา


8

Escape ตามด้วยวงเล็บเหลี่ยมด้านขวาescape]ใช้เพื่อแนะนำคำสั่งระบบปฏิบัติการ ( OSC)

มันอยู่ในECMA-48และคุณสามารถอ่านบทสรุปของลำดับการควบคุมที่ใช้โดย xterm ในลำดับการควบคุม XTermเช่นสำหรับการเปลี่ยนชื่อของหน้าต่างเทอร์มินัล

ลำดับ Escape สามารถเริ่มต้นด้วยตัวละครที่แตกต่างกัน C1 (8 บิต) การควบคุมตัวละครในส่วน XTerm ควบคุมลำดับกล่าวไม่กี่ของเหล่านั้นCSI(ซึ่งคุณเห็นว่าเป็นescape[, APC, DCS, PM. เหตุผลที่แตกต่างกัน (สอง) ตัวละครเป็นเพราะคู่ (หลบหนีและ]) มีความเกี่ยวข้องกับ อักขระควบคุมไบต์เดียวที่ใช้สำหรับประเภทลำดับหนีที่แตกต่างกัน

หากคุณอ่านข้อกำหนดคุณจะสังเกตเห็นว่าCSIใช้สำหรับการควบคุมด้วยพารามิเตอร์ตัวเลขในขณะที่OSCอนุญาตให้สตริง กว่าเพียงแค่ไวยากรณ์คณะกรรมการซึ่งสร้างมาตรฐานนี้มีในใจสำหรับการใช้งานAPCและPMที่แตกต่างจากและDCSOSC


7

เหล่านี้เรียกว่ารหัสหนี ANSIและพวกเขามีการระบุไว้ในหน้าคนสำหรับ console_codes พวกเขาไม่ได้เฉพาะทุบตี แต่ทำงานได้ในแอปพลิเคชันคอนโซลใด ๆ ตราบเท่าที่เทอร์มินัลสนับสนุนพวกเขา (ส่วนใหญ่เทอร์มินัลอีมูเลเตอร์ทำ)


1

"ลำดับการหลบหนี" ที่อธิบายไว้ในคำตอบอื่น ๆ นั้นขึ้นอยู่กับประเภทของเทอร์มินัลที่คุณมี

$ echo $TERM  
xterm

หากคุณต้องการที่จะเขียนสคริปต์ที่มี (ค่อนข้าง) เป็นอิสระจาก termninal แต่ยังคงใช้สีเช่นและคุณสมบัติพิเศษอื่น ๆ man terminfoแล้วได้ดูในเนื้อหาของการ

เช่น

$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."

จะพิมพ์.test.โดยtestมีพื้นหลังสีเหลืองและสีพื้นหน้าสีแดงและสิ่งนี้จะทำงานกับเทอร์มินัลใด ๆ ที่สามารถใช้สีในลักษณะเดียวกันได้

เพื่อดูว่ามีการพิมพ์จริงท่อมันลงไปod -t x1zในขณะที่

$ tput sgr0 | od -t x1z  
0000000 1b 28 42 1b 5b 6d                                >.(B.[m<  
0000006

... โดยที่ค่าจะแสดงเป็นเลขฐานสิบหก (เนื่องจาก "x")

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