ก่อนประวัติศาสตร์เล็กน้อย ในสมัยก่อนเมื่อคุณพิมพ์ข้อความบนเทอร์มินัลแต่ละคีย์จะส่งอักขระไปที่แอปพลิเคชัน เมื่อเครื่องที่เชื่อมต่อกับเทอร์มินัลมีประสิทธิภาพมากขึ้นเทอร์มินัลจะสร้างมาตรฐานบนปุ่มควบคุมซึ่งจะส่งอักขระพิเศษซึ่งไม่ได้พิมพ์ แต่มีฟังก์ชั่นบางอย่าง ชุดอักขระชัยชนะในที่สุดคือASCIIโดยที่มี 128 อักขระจาก 32 ตัวซึ่งเป็นอักขระควบคุม การกดCtrlตัวอักษรหรือสัญลักษณ์อื่น ๆ พร้อมกับเขียน10xxxxx₂ (สัญลักษณ์เลขฐานสอง) ส่งอักขระควบคุมที่มีรหัสคือ00xxxxx₂เช่นCtrl+ [ส่งหมายเลขอักขระ27₁₀ = 0011011₂เนื่องจาก[
91 is = 1011011₂
ปุ่มฟังก์ชันสองสามตัวบนเทอร์มินัลส่งตัวควบคุม:
- Backspace=
Ctrl-H
(BS = BackSpace) ¹
- Tab=
Ctrl-I
(HT = แท็บแนวนอน)
- Linefeed=
Ctrl-J
(LF = ตัวดึงข้อมูลบรรทัด) (เทอร์มินัลไม่กี่แห่งที่มีคีย์นี้)
- ReturnหรือEnter=
Ctrl-M
(CR = Carriage Return)
- Escape=
Ctrl-[
(ESC = Escape)
เมื่อเทอร์มินัลมีปุ่มฟังก์ชั่นเพิ่มเติมจำนวนอักขระควบคุมไม่เพียงพอที่จะเป็นตัวแทนของพวกเขาทั้งหมด ดังนั้นพวกเขาจึงส่งลำดับCtrl-[
ของตัวละครและการประชุมสากลว่าสิ่งเหล่านี้ลำดับตัวอักษรขึ้นต้นด้วยตัวอักษรหนี
เมื่อเวลาผ่านไปฮาร์ดแวร์เทอร์มินัลก็หายากและยากขึ้น ทุกวันนี้มีการแปลหลายระดับระหว่างคีย์บอร์ดและแอพพลิเคชั่น ข้อ จำกัด เกี่ยวกับจำนวนของอักขระที่มีอยู่และความสอดคล้องของรหัสตายตัวระหว่างชุดคีย์และชุดควบคุมบางชุดไม่เกี่ยวข้องกันอีกต่อไป อย่างไรก็ตามแอปพลิเคชันยังคงเข้ากันได้กับเทอร์มินัลที่มีอยู่และเทอร์มินัลยังคงเข้ากันได้กับแอปพลิเคชันที่มีอยู่ซึ่งทำให้ยากต่อการเปลี่ยนแปลงอะไร
ดังนั้นแม้กระทั่งทุกวันนี้ในระบบที่คล้าย Unix แอปพลิเคชั่นที่ทำงานใน terminal emulator จะได้รับตัวอักษรCtrl-I
เมื่อผู้ใช้กดTabปุ่มตัวละครCtrl-[
เมื่อผู้ใช้กดEscเป็นต้นหาก Vim ทำงานใน terminal Unix จะไม่สามารถแยกความแตกต่างระหว่าง<Esc>
และ<Ctrl-[>
เนื่องจากเทอร์มินัลส่งข้อมูลเดียวกัน
เสียงเรียกใช้ในสภาพแวดล้อมอื่น ๆ ไม่มีข้อ จำกัด นี้ดังนั้นโดยหลักการแล้วมันเป็นไปได้สำหรับพวกเขาที่จะส่งข้อมูลที่แตกต่างกัน ระบุว่าเป็นกลุ่มที่ใช้Ctrl-[
ตัวละครเพื่อเป็นตัวแทน<Esc>
ในหลาย ๆ สถานที่การเปลี่ยนแปลงที่จะทำไม่ได้; แทนCtrl+ [อาจจะทำเพื่อส่งเหตุการณ์การป้อนข้อมูลที่แตกต่างกัน
ฉันไม่ทราบว่า Vim รุ่นใดที่มีความแตกต่างระหว่างEscและCtrl+ [(แต่ไม่เหมือนที่ฉันเคยใช้) gvim, หนึ่ง, ดูเหมือนว่าจะเลียนแบบขั้วสวนหลากหลาย
กระแทกแดกดันทางออกที่ดีที่สุดของคุณอาจเป็นกลุ่มที่ทำงานใน terminal emulator เทอร์มินัลอีมูเลเตอร์บางตัวอนุญาตให้คุณปรับแต่งลำดับการหลบหลีกที่ส่งโดยคีย์และคีย์เชน ดังนั้นคุณอาจจัดให้มีCtrl+ [เพื่อส่งCtrl-[
ตัวอักษร␛ ( ) ไม่ได้ แต่เป็นบางลำดับหนี Xterm เครื่องจำลองเทอร์มินัล "อ้างอิง" สำหรับระบบ Unix ที่เหมือนกันรองรับสองรูปแบบดังกล่าว ตัวอย่างเช่น:
- Escส่ง
␛
และTabส่ง␉
ในการกำหนดค่าทั้งหมด
- ด้วย
?.VT100.modifyOtherKeys: 0
(เริ่มต้น) หรือ?.VT100.modifyOtherKeys: 1
, Ctrl+ [ส่ง␛
และCtrl+ ส่งI มีผลกับชุดค่าเมตาและชุดควบคุมที่ไม่มีอักขระ ASCII เท่านั้น␉
?.VT100.modifyOtherKeys: 1
- ด้วย
?.VT100.modifyOtherKeys: 2
และ?.VT100.formatOtherKeys: 0
(ค่าเริ่มต้น) Ctrl+ [ส่ง␛[27;5;91~
และCtrl+ ส่งI␛[27;5;105~
- ด้วย
?.VT100.modifyOtherKeys: 2
และ?.VT100.formatOtherKeys: 1
, Ctrl+ [ส่ง␛[91;5u
และCtrl+ ส่งI␛[105;5u
การสนับสนุนสามารถเปิดได้โดยการตั้งค่าmodifyOtherKeys
ทรัพยากรเมื่อเริ่ม xterm (และformatOtherKeys
เพื่อเลือกระหว่างสองโครงร่าง) หรือสามารถเปิดและปิดแบบไดนามิกโดยแอปพลิเคชัน
Vim ไม่มีการสนับสนุนในตัวที่ฉันรู้ คุณสามารถเขียนการโยงของคุณเองสำหรับลำดับการหลีกเลี่ยงเหล่านี้ อาจเป็นไปได้ที่จะให้ Vim ตั้งค่าเทอร์มินัลโดยอัตโนมัติในmodifyOtherKeys
โหมดโดยป้อนคำนิยามเทอร์มินัลที่แก้ไขแล้ว แต่การทำเช่นนั้นอยู่นอกเหนือขอบเขตของคำตอบนี้
Neovim มีการสนับสนุนในตัวสำหรับหนึ่งในสายพันธุ์ เท่าที่ฉันเข้าใจมันไม่ได้เปิดการสนับสนุนหากเทอร์มินัลรองรับมันขึ้นอยู่กับผู้ใช้ที่จะทำ
¹มากขึ้นเรื่อย ๆ ในปัจจุบันBackspaceส่งตัวละคร 127
Esc
หรือC-[
ดังนั้นคุณจึงโชคไม่ดี แต่คุณอาจทำอะไรบางอย่างกับ Vim ใน GUI หรือโดยการกำหนดค่า Terminal ของคุณใหม่