ก่อนประวัติศาสตร์เล็กน้อย ในสมัยก่อนเมื่อคุณพิมพ์ข้อความบนเทอร์มินัลแต่ละคีย์จะส่งอักขระไปที่แอปพลิเคชัน เมื่อเครื่องที่เชื่อมต่อกับเทอร์มินัลมีประสิทธิภาพมากขึ้นเทอร์มินัลจะสร้างมาตรฐานบนปุ่มควบคุมซึ่งจะส่งอักขระพิเศษซึ่งไม่ได้พิมพ์ แต่มีฟังก์ชั่นบางอย่าง ชุดอักขระชัยชนะในที่สุดคือ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 ของคุณใหม่