ปิดใช้งาน <Esc> แต่เก็บ <C - [>


24

<Esc>สำหรับการเปลี่ยนกลับจากโหมดแทรกฉันใช้ ตอนนี้ฉันกำลังมองหาที่จะฝึกตัวเองให้แทน<C-[> <Esc>เพื่อที่ฉันจะต้องปิดการใช้งาน<Esc>เพื่อช่วยในการอบรมขึ้นใหม่

ปัญหาคือ

:inoremap <Esc> <Nop>

<C-[>ยังพิการ สำหรับเสียงเรียกเข้าพวกเขาดูเหมือนจะเป็นสิ่งเดียวกัน

มีวิธีการปิดการใช้งานอย่างใดอย่างหนึ่งโดยไม่ต้องอื่น ๆ ?


13
ขึ้นอยู่กับสภาพแวดล้อมที่คุณใช้งานอยู่ เทอร์มินัลข้อความส่วนใหญ่ส่งข้อมูลเดียวกันไปยังแอปพลิเคชันเมื่อคุณกดEscหรือC-[ดังนั้นคุณจึงโชคไม่ดี แต่คุณอาจทำอะไรบางอย่างกับ Vim ใน GUI หรือโดยการกำหนดค่า Terminal ของคุณใหม่
Gilles 'หยุดความชั่วร้าย' Gilles

ขวา! ไม่ใช่ปัญหาที่เป็นกลุ่ม ฉันจะหาวิธีแก้ปัญหาด้วยการแมปแป้นพิมพ์ ขอบคุณ
mxlian

3
@Gilles ทำไมคุณไม่ตอบคำถามนั้น? จะดีกว่าสำหรับชาว Google และสถิติเว็บไซต์ของเรา
Robbie Wxyz

2
@ SuperScript ฉันได้วิจัยนี้อีกเล็กน้อยและโพสต์คำตอบ
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

คำตอบ:


35

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.