วิธีการกำหนดสีปัจจุบันของเอาท์พุทคอนโซล?


14

ฉันรู้ว่าถ้าขั้วสีใช้ได้หนึ่งสามารถสีการส่งออกของมันโดยใช้ตัวหนี

แต่มีความเป็นไปได้ที่จะทราบว่าสีใดที่กำลังแสดงอยู่ในขณะนี้ หรือดีกว่าว่าข้อความจะเป็นสีอะไรถ้าฉันจะเอาท์พุทตอนนี้?

ฉันขอให้ไม่ทำลายการตั้งค่าสีก่อนหน้านี้เมื่อใช้อักขระเลี่ยงเหล่านี้ อักขระ escape 'เบื้องหน้าสีเริ่มต้น' กำลังรับข้อมูลจากชุดรูปแบบสีแทนที่จะเป็นสีข้อความก่อนที่จะเปลี่ยน


การดูตัวแปร termcap และ terminfo ดูเหมือนว่าเป็นไปไม่ได้ ตัวอย่างเช่นคุณสามารถรับจำนวนสีที่เทอร์มินัลของคุณรองรับด้วยechotc Coหรือechoti colorsแต่ไม่มีตัวแปรที่เก็บข้อกำหนดรหัสสีปัจจุบัน
jimmij

@jimmij ฉันคิดอย่างนั้นและหวังว่าฉันจะพลาดบางสิ่งบางอย่าง หากคุณแน่ใจว่าเกี่ยวกับเรื่องนี้เป็นไปไม่ได้ให้ตอบคำถามและในที่สุดฉันก็จะยอมรับได้หากไม่มีสิ่งใดตามมา ขอบคุณที่สละเวลา.
Minix

คำตอบ:


11

โดยทั่วไปแล้วการได้รับสีในปัจจุบันนั้นเป็นไปไม่ได้ การประมวลผลลำดับการควบคุมของเทอร์มินัลเกิดขึ้น "ภายใน" เทอร์มินัลไม่ว่าจะเกิดอะไรขึ้นก็ตาม ด้วยเทอร์มินัลอีมูเลเตอร์เช่นxtermหรือสิ่งที่สร้างไว้ในเคอร์เนลระบบปฏิบัติการที่จัดเตรียมเทอร์มินัลเสมือนของเคอร์เนลสถานะภายในของอีมูเลเตอร์รวมถึงแนวคิดของ "การเรนเดอร์กราฟิก" ในปัจจุบัน (เช่นสีและคุณสมบัติ) ตัวเองและสามารถเข้าถึงได้ในทางทฤษฎี แต่สำหรับเทอร์มินัลตัวจริงข้อมูลนี้อยู่ในตำแหน่ง RAM บางแห่งบนเครื่องแยกทางกายภาพที่เชื่อมต่อผ่านการเชื่อมต่อแบบอนุกรม

ที่กล่าวว่าอาคารบางแห่งมีกลไกสำหรับการอ่านข้อมูลดังกล่าวเป็นส่วนหนึ่งของโปรโตคอลเทอร์มินัลของพวกเขาที่ถูกส่งไปที่ลิงค์อนุกรมที่ พวกเขาจัดเตรียมลำดับการควบคุมที่โปรแกรมสามารถส่งไปยังเทอร์มินัลซึ่งทำให้ส่งข้อมูลเกี่ยวกับสถานะภายในกลับไปเป็นเทอร์มินัลอินพุต mikeservได้แสดงลำดับการควบคุมที่xtermเทอร์มินัลอีมูเลเตอร์ตอบกลับไปแล้ว xtermแต่เหล่านี้เป็นที่เฉพาะเจาะจงเพื่อ เทอร์มินัลอีมูเลเตอร์ในตัวในเคอร์เนล Linux และเมล็ด BSD ต่างๆเป็นประเภทเทอร์มินัลที่แตกต่างกันตัวอย่างเช่นและไม่ใช้ลำดับการควบคุมใด ๆ เลย เช่นเดียวกันสำหรับทั้งครอบครัวของเทอร์มินัลจริง

ขั้วธันวาคม VT525 ใช้กลไกการอ่านออก xtermแต่มีชุดของลำดับการควบคุมที่หมีความสัมพันธ์กับผู้ใช้โดยไม่มี หนึ่งส่งลำดับ DECRQSS (ร้องขอการเลือกหรือการตั้งค่า) เพื่อร้องขอการเรนเดอร์กราฟิกปัจจุบันและเทอร์มินัลตอบสนองโดยการส่ง DECRPSS (การเลือกรายงานหรือการตั้งค่า) โดยเฉพาะ:

  1. โฮสต์ส่ง: DCS $ q mST (DECRQSS พร้อมส่วนฟังก์ชันการควบคุมของ SGR เป็นการตั้งค่า)
  2. เทอร์มินัลตอบสนอง: DCS 0 $ r 0 ; 3 3 ; 4 4 mST (DECRPSS พร้อมพารามิเตอร์และส่วนควบคุมฟังก์ชั่นของลำดับการควบคุม SGR ที่ตั้งค่าสีพื้นหน้าและพื้นหลังปัจจุบัน)

แน่นอนว่าการอ่านคำถามของคุณอย่างระมัดระวังแสดงให้เห็นว่าคุณกำลังโบกกล้วยช็อกโกแลตที่ระบบสกุลเงินในยุโรปอีกครั้ง สิ่งที่คุณพยายามทำจริงซึ่งคุณได้เลือกวิธีการแก้ปัญหาแล้วถามวิธีการเป็นส่วนหนึ่งของการแก้ปัญหานั้นคือการรักษาสถานะก่อนหน้าในขณะที่คุณเขียนเอาท์พุท colourized บางส่วน ไม่เพียง แต่จะมีลำดับการควบคุม DEC VT สำหรับการทำเช่นนี้ แต่ยังมีลำดับเทอร์มินัลคอนโซล SCO สำหรับการรับรู้โดยxtermและตัวจำลองเทอร์มินัลเคอร์เนลในตัวและรายการ termcap / terminfo ที่บอกคุณว่ามันคืออะไร

รายการ termcap มีและsc rcรายการ terminfo มีและsave_cursor restore_cursorชื่อค่อนข้างทำให้เข้าใจผิดว่ามีผลกระทบ (แม้ว่าพวกเขาจะทำหน้าที่เป็นคำเตือนว่าคุณกำลังพึ่งพาสิ่งที่เป็นจริงมากกว่าทางนิตินัย ) ลำดับการควบคุม DECSC, DECRC, SCOSC และ SCORC จริงจะบันทึกและกู้คืนการเรนเดอร์กราฟิกปัจจุบันเช่นกัน

ระบุว่าบทความที่คุณชี้ไปคือทั้งหมดที่เกี่ยวกับการสร้างลำดับการควบคุมจากเชลล์สคริปต์คำสั่งที่คุณกำลังตอนนี้tputมองหา

อ่านเพิ่มเติม


คำตอบที่ดี ดีใจที่ฉันกลับไปหามัน ขอบคุณมาก.
Minix

@Minix - นอกจากscและrcคุณอาจยังต้องการที่จะมองเข้าไปในบัฟเฟอร์สำรองถ้าสนับสนุนขั้วของคุณ และใช่นี่คือคำตอบที่ดี มินิกซ์อาจจะยังดูที่นี้: วิธีการใช้ / dev / fb0 คอนโซลจาก userspace noshชุดเขาแนะนำมีของตัวเอง
mikeserv

@mikeserv ฉันจะลองดูขอบคุณสำหรับการเชื่อมโยง :)
มินิกซ์

2
สังเกตว่า "ไม่มีความสัมพันธ์กับ xterm ที่ใช้" - อย่างไรก็ตาม DECTERQSS สนับสนุน xterm อยู่พักหนึ่ง ชิ้นส่วนที่มีการตอบสนอง SGR รวมถึงวันที่สีถึงปี 1996
Thomas Dickey

2
ดูการอ่านเพิ่มเติมในเอกสารควบคุมลำดับของ xterm ซึ่งชี้ให้เห็นว่าเอกสาร VT520 / etc ไม่สามารถใช้ได้เมื่อ xterm เริ่มให้สีในDECRQSS(ประมาณ 7 ปีล่าช้า ... )
Thomas Dickey

10

ในการที่xtermคุณจะได้รับรหัสสี RGB สีปัจจุบันรายงานโดยการเปลี่ยนการเปลี่ยนสีหลบหนีไปยังแบบสอบถาม ใช้ESC ] Ps m- แต่เพิ่ม?เครื่องหมายคำถาม จากเอกสาร :

  • หากมีการ"?"ให้มากกว่าชื่อหรือสเปค RGB xtermตอบกลับด้วยลำดับการควบคุมของรูปแบบเดียวกันซึ่งสามารถใช้ในการตั้งค่าสีแบบไดนามิกที่สอดคล้องกัน เนื่องจากสามารถระบุหมายเลขสีและสเปคได้มากกว่าหนึ่งคู่ในลำดับการควบคุมเดียวxtermสามารถตอบได้มากกว่าหนึ่งครั้ง
    • P s = 1 0 →เปลี่ยนสีพื้นหน้าข้อความ VT100 เป็น P t
    • P s = 1 1 →เปลี่ยนสีพื้นหลังข้อความ VT100 เป็น P t
    • P s = 1 2 →เปลี่ยนสีเคอร์เซอร์ข้อความเป็น P t
    • P s = 1 3 →เปลี่ยนสีพื้นหน้าของเมาส์เป็น P t
    • P s = 1 4 →เปลี่ยนสีพื้นหลังของเมาส์เป็น P t
    • P s = 1 5 →เปลี่ยนสีพื้นหน้าของ Tektronix เป็น P t
    • P s = 1 6 →เปลี่ยนสีพื้นหลังของ Tektronix เป็น P t
    • P s = 1 7 →เปลี่ยนสีพื้นหลังไฮไลต์เป็น P t
    • P s = 1 8 →เปลี่ยนสีเคอร์เซอร์ Tektronix เป็น P t
    • P s = 1 9 →เปลี่ยนสีพื้นหน้าของไฮไลต์เป็น P t

ฉันมีข้อสงสัยอย่างมากหากนี่น่าจะทำงานในโปรแกรมจำลองเทอร์มินัลเครื่องอื่น แต่xtermถ้าคุณใช้ ...

printf '\033]11;?\007'

... สิ่งที่xtermจะผลักกลับเข้าไปในบัฟเฟอร์อินพุตของเทอร์มินัลตามลำดับดังต่อไปนี้ ...

11;rgb:ffff/ffff/ffff

... สำหรับพื้นหลังหรือพื้นหน้า:

printf '\033]10;?\007'

10;rgb:0000/0000/0000

ดังนั้นเมื่อฉันเรียกใช้printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007ข้อความทั้งหมดในเทอร์มินัลที่ก่อนหน้านี้ "ปกติ" จะเปลี่ยนเป็นสีน้ำเงินอ่อน จากนั้นการเรียกใช้printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'จะเปลี่ยนข้อความสีน้ำเงินทั้งหมดกลับเป็น "ปกติ" ฉันจะใช้ค่านี้เพื่อเปลี่ยนสีของข้อความที่ก้าวไปข้างหน้าได้อย่างไร
fourpastmidnight

@ fourpastmidnight: อาจจะclearก่อน?
mikeserv

ฉันคิดว่าฉันไม่เข้าใจเอกสาร มันพูดอย่างชัดเจนว่า "P s = 1 0 -> เปลี่ยนสีพื้นหน้า VT100" และนั่นคือสิ่งที่ดูเหมือนว่าจะทำ ;) แต่นั่นไม่ใช่สิ่งที่ฉันคาดไว้ ฉันอาจต้องใช้ค่า RGB ที่ดึงมาจาก "P s = 1 0; Pt =?" ด้วยคำสั่งอื่นที่ใช้ Escape เพื่อให้ได้สิ่งที่ฉันต้องการ
fourpastmidnight

ตกลงดังนั้นจึงprintf '\033]10;?\007'สอบถาม xterm สำหรับสีพื้นหน้าปัจจุบันของเทอร์มินัล หากเทอร์มินัลของคุณเริ่มต้นด้วย "ปกติ" (เช่น 7 เป็นสีพื้นหน้า) แต่คุณรันtput setaf 3ก่อนที่จะรันprintfคำprintfสั่งคำสั่งด้านบนจะส่งกลับ "ปกติ" - และนั่นถูกต้องเพราะนั่นคือสีพื้นหน้าปัจจุบันของเทอร์มินัล สิ่งที่ฉันหวังคือเป็นวิธีที่จะดึงสีปัจจุบันของตำแหน่งเคอร์เซอร์ปัจจุบันดังนั้นฉันสามารถบันทึกมันออกเป็น "คืนค่า" ในภายหลัง - ตาม OP
fourpastmidnight

1
@fourpastmidnight - คุณติดตามลิงก์ในคำตอบที่นี่หรือไม่ โทมัสผ้ากันเปื้อน - (เขาแสดงความเห็นในคำตอบของคำถามนี้)เป็นxtermผู้ดูแลและเป็นสมาชิกที่แข็งขันที่นี่ (ลิงก์ไปยังเว็บไซต์ของเขา - xtermเอกสารการหลบหนีนั้นกว้างขวาง - และโดยทั่วไปแล้วการอ้างอิงมาตรฐานสำหรับโปรแกรมเมอร์อื่น ๆ ที่ต้องการจะเขียนเทอร์มินัล)
mikeserv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.