เมื่อคุณกดCtrl+Xเทอร์มินัลอีมูเลเตอร์ของคุณจะเขียนไบต์ 0x18 ไปที่ฝั่งมาสเตอร์ของคู่หลอก - เทอร์มินัล
สิ่งที่เกิดขึ้นต่อไปขึ้นอยู่กับวิธีการลงโทษของ tty line (โมดูลซอฟต์แวร์ในเคอร์เนลที่อยู่ระหว่างฝั่งมาสเตอร์ (ภายใต้การควบคุมของอีมูเลเตอร์) และด้านทาส (แอปพลิเคชันที่ทำงานในเทอร์มินัลโต้ตอบด้วย))
คำสั่งเพื่อกำหนดระเบียบวินัยบรรทัด ttyนั้นคือstty
คำสั่ง
เมื่อเรียกใช้โปรแกรมประยุกต์ใบ้เหมือนcat
ที่ไม่ทราบและไม่ได้สนใจว่า stdin ที่เป็นขั้วหรือไม่, terminal อยู่ในเริ่มต้นที่ยอมรับโหมดที่สาย TTY วินัยดำเนินน้ำมันดิบแก้ไขบรรทัด
แอปพลิเคชั่นแบบโต้ตอบบางอย่างที่ต้องการมากกว่าตัวแก้ไขบรรทัดหยาบนั้นมักจะเปลี่ยนการตั้งค่าเหล่านั้นเมื่อเริ่มต้นและเรียกคืนได้ Modern shells ที่พรอมต์เป็นตัวอย่างของแอปพลิเคชันดังกล่าว พวกเขาใช้เครื่องมือแก้ไขบรรทัดขั้นสูงของตนเอง
โดยทั่วไปในขณะที่คุณป้อนบรรทัดคำสั่งเชลล์จะวางระเบียบบรรทัด tty ในโหมดนั้นและเมื่อคุณกด Enter เพื่อเรียกใช้คำสั่งปัจจุบันเชลล์จะเรียกคืนโหมด tty ปกติ (เช่นเดียวกับก่อนที่จะออกพรอมต์)
ถ้าคุณเรียกใช้stty -a
คำสั่งคุณจะเห็นการตั้งค่าปัจจุบันในการใช้งานสำหรับการใช้งานที่เป็นใบ้ คุณมีแนวโน้มที่จะเห็นicanon
, echo
และechoctl
การตั้งค่าถูกเปิดใช้งาน
หมายความว่าอะไร:
icanon
: เปิดใช้งานเครื่องมือแก้ไขรายการน้ำมันดิบ
echo
: ตัวอักษรที่คุณพิมพ์ (ที่เทอร์มินัลอีมูเลเตอร์เขียนไปที่ฝั่งมาสเตอร์) ถูกสะท้อนกลับ (ทำให้พร้อมสำหรับการอ่านโดยเทอร์มินัลอีมูเลเตอร์)
echoctl
: แทนที่จะเป็นสะท้อน ASIS, ตัวควบคุมที่มีการสะท้อนความ^X
เป็น
A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Returnดังนั้นสมมติว่าคุณพิมพ์
เทอร์มินัลอีมูเลเตอร์ของคุณจะส่ง: AB\bC\x18\b\r
. วินัยเส้นจะสะท้อนกลับAB\b \bC^X\b \b\b \b\r\n
และการประยุกต์ใช้ที่อ่านข้อมูลจากด้านทาสที่ ( /dev/pts/x
) AC\n
จะอ่าน
แอปพลิเคชั่นทั้งหมดที่เห็นคือAC\n
และเฉพาะเมื่อกดของคุณEnterดังนั้นจึงไม่สามารถมีการควบคุมใด ๆ ในการส่งออก^X
มี
คุณจะสังเกตเห็นว่าสำหรับเสียงก้องแรก^H
( ^?
กับบางขั้วดูการerase
ตั้งค่า) ส่งผลให้\b \b
ถูกส่งกลับไปยังสถานี นั่นคือลำดับการเลื่อนเคอร์เซอร์ไปข้างหลังเขียนทับด้วยช่องว่างเลื่อนเคอร์เซอร์กลับมาอีกครั้งในขณะที่อันดับที่สอง^H
ส่งผล\b \b\b \b
ให้ลบทั้งสอง^
และX
ตัวอักษรเหล่านั้น
The ^X
(0x18) นั้นกำลังถูกแปล^
และX
ส่งออก เช่นเดียวกับB
มันไม่ได้ทำให้แอปพลิเคชันเกิดขึ้นเนื่องจากเราลบด้วย Backspace
\r
(aka ^M
) แปลเป็น\r\n
( ^M^J
) สำหรับ echo และ\n
( ^J
) สำหรับแอปพลิเคชัน
ดังนั้นตัวเลือกของเราสำหรับแอปพลิเคชันโง่เหล่านั้นคือ
- ปิดการใช้งาน
echo
( stty -echo
) นั่นเปลี่ยนวิธีการควบคุมตัวละครอย่างมีประสิทธิภาพโดย ... ไม่ได้สะท้อนอะไรเลย ไม่ใช่ทางออกจริงๆ
echoctl
ปิดการใช้งาน ที่เปลี่ยนวิธีการควบคุมตัวละคร (นอกเหนือจาก^H
, ^M
... และอื่น ๆ ทั้งหมดที่ใช้โดยตัวแก้ไขบรรทัด) จะถูกสะท้อน พวกเขาจะสะท้อนตามที่เป็นอยู่ ตัวอย่างเช่นตัวละคร ESC จะส่งเป็น\e
( ^[
/ 0x1b
) ไบต์ (ซึ่งได้รับการยอมรับว่าเป็นจุดเริ่มต้นของลำดับการหลบหนีโดยเทอร์มินัล) ^G
คุณส่ง\a
(เบลทำให้เสียงบี๊บปลายทางของคุณ) ... ไม่ใช่ตัวเลือก .
- ปิดการใช้งานเครื่องมือแก้ไขเส้นหยาบ (
stty -icanon
) ไม่ใช่ตัวเลือกจริงๆเนื่องจากแอปพลิเคชันที่หยาบจะกลายเป็นประโยชน์น้อยกว่ามาก
- แก้ไขรหัสเคอร์เนลเพื่อเปลี่ยนพฤติกรรมของวินัยของ tty line ดังนั้นเสียงก้องของอักขระควบคุมส่ง
\e[7m^X\e[m
แทนที่จะเป็นเพียงแค่^X
( \e[7m
โดยปกติแล้วจะเปิดใช้งานวิดีโอย้อนกลับในเทอร์มินัลส่วนใหญ่)
ตัวเลือกอาจใช้ wrapper rlwrap
ที่เป็นแฮ็คสกปรกเพื่อเพิ่มตัวแก้ไขบรรทัดแฟนซีในแอปพลิเคชันที่เป็นใบ้ wrapper นั้นจะพยายามแทนที่วิread()
จากอุปกรณ์เทอร์มินัลไปเป็นการเรียกไปยังตัวแก้ไขบรรทัด readline (ซึ่งจะเปลี่ยนโหมดของวินัยของบรรทัด tty)
ยิ่งไปกว่านั้นคุณยังสามารถลองวิธีการแก้ปัญหาเช่นนี้ได้ซึ่งจะทำการไฮแจ็คอินพุตทั้งหมดจากเทอร์มินัลเพื่อให้ผ่านตัวแก้ไขบรรทัดของ zsh (ซึ่งเกิดจากการเน้นสี^X
ในวิดีโอย้อนกลับ) โดยอาศัย:exec
คุณสมบัติของหน้าจอ GNU
ตอนนี้สำหรับแอปพลิเคชันที่ใช้ตัวแก้ไขบรรทัดของตัวเองมันขึ้นอยู่กับพวกเขาในการตัดสินใจว่าจะทำเสียงสะท้อนอย่างไร bash
ใช้ readline สำหรับสิ่งที่ไม่มีการสนับสนุนใด ๆ สำหรับการปรับแต่งวิธีการควบคุมตัวละครที่สะท้อน
สำหรับzsh
ดู:
info --index-search='highlighting, special characters' zsh
zsh
จะเน้นอักขระที่ไม่สามารถพิมพ์ได้ตามค่าเริ่มต้น คุณสามารถปรับแต่งการเน้นด้วยตัวอย่างเช่น:
zle_highlight=(special:fg=white,bg=red)
สำหรับสีขาวที่เน้นสีแดงสำหรับอักขระพิเศษเหล่านั้น
การแสดงข้อความของตัวละครเหล่านั้นไม่สามารถปรับแต่งได้
ใน UTF-8 สถานที่เกิดเหตุ, 0x18 จะกลายเป็น^X
, \u378
, \U7fffffff
(สองจุดรหัส Unicode ที่ไม่ได้กำหนด) เช่น<0378>
, <7FFFFFFF>
, \u200b
(ที่ไม่จริงๆอักขระ Unicode พิมพ์) <200B>
ในฐานะ
\x80
ใน iso8859-1 locale จะแสดงผลเป็น^�
... เป็นต้น
bash
มันคือการreadline
จัดการสิ่งนั้นและสำหรับคนอื่น ๆ ส่วนใหญ่มันเป็นไดรเวอร์ tty