คุณจะสังเกตเห็นว่าเมื่อคุณรันcat
ที่ shell prompt บนเทอร์มินัลcat
ควรจะเขียนไปยัง stdout สิ่งที่มันอ่านจาก stdin และกดaคุณจะเห็นa
เสียงสะท้อนกลับโดยไดรเวอร์เทอร์มินัล แต่cat
ไม่ได้เขียนa
(คุณเห็น มีเพียงอันเดียวอันa
ที่สะท้อนจากไดรเวอร์เทอร์มินัล)
อย่างไรก็ตามหากคุณพิมพ์ a Backspace b Enterคุณจะไม่เห็นcat
ผลลัพธ์a\010b\015
แต่b\012
( b
และขึ้นบรรทัดใหม่)
นั่นเป็นเพราะไดรเวอร์เทอร์มินัล (เรากำลังพูดถึงซอฟต์แวร์ในเคอร์เนลไม่ใช่ในเทอร์มินัลอีมูเลเตอร์xterm
) นำเครื่องมือแก้ไขบรรทัดขั้นพื้นฐานมาใช้เมื่ออยู่ในโหมดบัญญัติ เทอร์มินัลไดรเวอร์สามารถกำหนดค่าโดยใช้การioctl()
เรียกของระบบเช่นเมื่อใช้stty
คำสั่ง stty -icanon
ตัวอย่างเช่นหากต้องการออกจากโหมดบัญญัติที่คุณสามารถทำได้ ถ้าคุณทำ:
stty -icanon; cat
จากนั้นคุณจะเห็นทั้งecho
(ซึ่งคุณสามารถปิดการใช้งานด้วยstty -echo
) และcat
เอาท์พุทในเวลาเดียวกัน
ตัวแก้ไขนั้นเป็นตัวแก้ไขบรรทัด Enterนั่นคือมันเป็นสำหรับผู้ใช้เพื่อแก้ไขหนึ่งบรรทัดของข้อความจนกว่าจะมีการส่งไปยังแอพลิเคชันอ่านอุปกรณ์ปลายทางเมื่อกด
ความสามารถในการแก้ไขของตัวแก้ไขนั้นมี จำกัด มาก ในการใช้งานส่วนใหญ่มีเพียงปุ่มแก้ไข 4 ปุ่มเท่านั้น (จริง ๆ ตัวอักษร) สามารถกำหนดค่าได้ด้วยstty
:
- ลบ (
^H
หรือ^?
โดยปกติ): ลบอักขระก่อนหน้า
- ฆ่า (
^U
ปกติ): ว่างเปล่า (ฆ่า) บรรทัดที่ป้อนจนถึง
- werase (
^W
): ลบคำก่อนหน้า
- lnext (
^V
): ป้อนอักขระถัดไปตามตัวอักษร (ยกเลิกความหมายพิเศษของทั้งหมดข้างต้น)
ย้อนกลับไปในสมัยก่อนมันคิดว่าเทอร์มินัลบรรทัดตัวแก้ไขโปรแกรมควบคุมจะขยายด้วยความสามารถนักเล่น นั่นเป็นเหตุผลว่าทำไมเชลล์รุ่นแรก ๆ ไม่มีความสามารถในการแก้ไขบรรทัดคำสั่งใด ๆ (คุณจะได้รับความสามารถในการแก้ไขบรรทัดเดียวกันที่เชลล์พรอมต์กว่าเมื่อทำงานcat
เหมือนที่เราทำด้านบน)
อย่างไรก็ตามนั่นไม่เคยเกิดขึ้นจริงอาจเป็นส่วนหนึ่งของสาเหตุที่ทำให้เกิดความวุ่นวายกับเทอร์มินัลที่แตกต่างกันซึ่งไม่ได้ส่งตัวอักษรเดียวกันกับการกดปุ่มบางปุ่มซึ่งทำให้เห็นได้ชัดว่า
ดังนั้นเชลล์บางตัวก็เริ่มดรอปโหมดcanonicalของเทอร์มินัลไดรเวอร์และใช้ตัวแก้ไขบรรทัดของตัวเอง ในเวลานั้นemacs
และvi
เป็นบรรณาธิการข้อความภาพที่เป็นที่นิยมที่สุดที่มีการเชื่อมโยงคีย์และโหมดการทำงานที่แตกต่างอย่างสิ้นเชิง ในvi
คุณมีหนึ่งโหมดสำหรับการป้อนข้อความและอีกโหมดหนึ่งสำหรับการแก้ไข ในemacs
คุณจะเข้าสู่โหมดข้อความเสมอแต่การแก้ไขทำได้โดยการกดคีย์ผสม (เช่น^b
เลื่อนตัวอักษรไปด้านหลัง)
ในตอนนั้นไม่มีประเด็นใดที่หอยจะมาพร้อมกับการผูกกุญแจที่แตกต่างกัน นั่นจะทำให้เกิดความหงุดหงิดสำหรับคนที่จะต้องเรียนรู้ที่แตกต่างกัน อย่างไรก็ตามการเลือกสไตล์หนึ่ง ( emacs
หรือvi
) มากกว่าอีกสไตล์จะเป็นวิธีที่แน่นอนในการโอนผู้ใช้ของอีกคนหนึ่งบรรณาธิการ
ตามhttps://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
คุณสมบัติการแก้ไขแบบอินไลน์ยอดนิยม (โหมด vi และ emacs) ของ ksh ถูกสร้างขึ้นโดยนักพัฒนาซอฟต์แวร์ที่ Bell Laboratories; โหมดแก้ไขบรรทัด vi โดย Pat Sullivan และโหมดแก้ไขบรรทัด emacs โดย Mike Veach แต่ละคนมีการปรับเปลี่ยนเชลล์เป้าหมายเพื่อเพิ่มคุณสมบัติเหล่านี้และทั้งสองอยู่ในองค์กรที่ต้องการใช้ ksh เฉพาะเมื่อ ksh มีเครื่องมือแก้ไขอินไลน์ตามลำดับ เดิมแนวคิดของการเพิ่มการแก้ไขบรรทัดคำสั่งไปยัง ksh ถูกปฏิเสธด้วยความหวังว่าการแก้ไขบรรทัดจะย้ายเข้าสู่ไดรเวอร์เทอร์มินัล อย่างไรก็ตามเมื่อเห็นได้ชัดว่าสิ่งนี้ไม่น่าจะเกิดขึ้นในไม่ช้าทั้งสองโหมดแก้ไขบรรทัดจะรวมเข้ากับ ksh และทำให้เป็นทางเลือกเพื่อให้สามารถปิดการใช้งานบนระบบที่ให้การแก้ไขเป็นส่วนหนึ่งของเทอร์มินัลอินเตอร์เฟส
ดังนั้นพวกเขาจึงติดตั้งทั้งสองและอินเทอร์เฟซสำหรับผู้ใช้เพื่อเลือกระหว่างสอง ksh
อาจเป็นครั้งแรกในช่วงต้นยุค 80 (การใช้รหัสซ้ำที่เขียนแยกต่างหากเพื่อเพิ่มโหมด vi และโหมด emacs ไปยังบอร์นเชลล์ดังที่เห็นด้านบน) ตามด้วยtcsh
( tcsh
ตอนแรกมีเพียงการemacs
เชื่อมโยงคีย์เท่านั้นvi
โหมดเพิ่มในภายหลัง) bash
และzsh
ในช่วงต้นยุค 90
คุณสลับระหว่างสองโหมดbash
, zsh
หรือksh
ด้วยset -o vi
หรือset -o emacs
และด้วยbindkey -e
หรือbindkey -v
ในหรือtcsh
zsh
POSIX ระบุvi
โหมดจริงและไม่ใช่emacs
โหมดสำหรับsh
(เรื่องราวมีRichard Stallman คัดค้าน POSIX เพื่อระบุemacs
โหมดสำหรับsh
)
โหมดเริ่มต้นสำหรับbash
โดเมนสาธารณะสายพันธุ์ของksh
(pdksh, mksh, oksh) tcsh
และzsh
เป็นโหมด emacs (แม้ว่าจะมีzsh
ก็vi
ถ้า$EDITOR
มีvi
) ในขณะที่ AT & T ksh
ก็เป็นใบ้โหมดเว้นแต่$EDITOR
หรือ$VISUAL
กล่าวถึงหรือvi
emacs
ksh
ภายหลังได้เพิ่มgmacs
โหมดเพื่อรองรับผู้ใช้ Gosling emacs
ที่จัดการCtrl+Tแตกต่างกัน
ตอนนี้จัดการของ^W
ในemacs
หรือtcsh
emacs โหมดอาจถือกำเนิดwerase
ตัวละครในบรรณาธิการสายขั้วดังนั้นเราจึงไม่สามารถจริงๆตำหนิพวกเขาสำหรับการที่และคำสั่งของฉันเกี่ยวกับ"แยกย้ายกัน ..."อาจจะถูกมองว่าเป็นความเข้าใจผิด มันเป็นแค่ที่ฉันคิดว่ามันเกิดการระคายเคืองเมื่อสิ่งที่ชอบemacs
, tcsh
หรือมีพฤติกรรมที่แตกต่างจากทุกอย่างอื่นเมื่อคุณพิมพ์info
คุณสามารถจินตนาการผมพบว่ามันเกิดการระคายเคืองมากขึ้นเมื่อใช้งานบางอย่างเริ่มที่จะปิดหน้าต่างของพวกเขาเมื่อคุณพิมพ์Ctrl-W Ctrl-W