การแมป <Esc> ใน MacVim angers Vim อีกครั้ง


5

ฉันมีบรรทัดต่อไปนี้ในของฉัน.vimrc:

nnoremap <Esc> :noh<Cr>

ทำงานได้ดีใน MacVim เมื่อใดก็ตามที่ฉันเปิด Vim ตัวเอง "command bar" จะเริ่มต้นด้วย:

.2c

สำหรับสิ่งที่คุ้มค่า, E16: Invalid rangeป้อนเมื่อดำเนินการคำสั่งที่เป็นกลุ่มบ่นกับ

มันเป็นความรำคาญเล็กน้อย แต่ฉันจะแก้ไขปัญหานี้ได้อย่างไร


@peth ฉันไม่ได้! :( ฉันเลิกพยายามทำสิ่งนี้ชั่วคราว - ฉันเข้าและออกจาก Vim บ่อยครั้งมากดังนั้นปัญหานี้จึงกลายเป็นเรื่องที่น่ารำคาญมากฉันจะต้องขอบคุณความโปรดปรานนั้นอย่างแน่นอน :)
Closed Cowboy

คำตอบ:


3

การทำแผนที่Escมักจะยุ่งยากเล็กน้อยและมักจะเชิญปัญหาประเภทนี้แม้ว่ามันจะไม่เกิดขึ้นก็ตาม

วิธี "canonical" สำหรับการแมปของคุณคือ:

nnoremap <silent> <C-l> :nohlsearch<CR><C-l>

ด้วยวิธีนี้Ctrl+L(ซึ่งโดยปกติจะวาดหน้าจอของคุณใหม่) จะหยุดการเน้นและวาดหน้าจออีกครั้ง


ฉันคิดว่าฉันพบว่าเกิดอะไรขึ้น แต่ฉันยังไม่มีวิธีแก้ปัญหา ฉันถือว่า Vim ได้รับสตริงที่มี<ESC>และ "2c" ดังนั้นฉันจึงใช้การแมปต่อไปนี้เพื่อให้มองเห็นได้:

nnoremap <Esc> :"

มันทำให้เกิดพรอมต์ต่อไปนี้เมื่อเริ่มต้น:

:"[>0;261;0c

ซึ่งหมายความว่าสิ่งที่ส่ง<ESC>[>0;261;0cเมื่อเริ่มต้น ตอนนี้ค้นหาxtermลำดับการควบคุมเริ่มต้นเราพบว่า:

ESC [         Control Sequence Introducer (CSI is 0x9b)

และ

CSI> P s c

ส่งคุณสมบัติของอุปกรณ์ (DA รอง)

P s = 0 หรือละเว้น→ร้องขอรหัสประจำตัวของเครื่อง การตอบสนองขึ้นอยู่กับการ ตั้งค่าทรัพยากรdecTerminalID มันควรใช้กับ VT220 และสูงกว่าเท่านั้น แต่xtermขยายขอบเขตนี้เป็น VT100

→ CSI> P p ; P v ; หน้า

ที่P pหมายถึงประเภทอาคาร

P p = 0 → '' VT100 ''
P p = 1 → '' VT220 ''

และP vเป็นเวอร์ชั่นเฟิร์มแวร์ (สำหรับxtermนี่คือหมายเลขแพทช์ XFree86 เริ่มต้นด้วย 95) ในเทอร์มินัล DEC, P cระบุหมายเลขการลงทะเบียนคาร์ทริดจ์ ROM และเป็นศูนย์เสมอ

ดังนั้นในกรณีของฉันสิ่งที่ส่งCSI >ด้วยP p = 0 (→เทอร์มินัลชนิด VT100), P v = 261 (→ xtermรุ่นของฉัน) และP c = 0

ถึงกระนั้นฉันก็ไม่รู้ว่ามันมาจากไหนหรือจะหยุดมันได้อย่างไร ฉันเดาได้ดีที่สุดว่าการแลกเปลี่ยนข้อมูลระหว่างเทอร์มินัลกับ Vim นั้นล้มเหลวและมีบางสิ่งที่ไม่เหมาะสม


ขอบคุณสำหรับคำตอบของคุณ แต่การเพิ่มสิ่งนี้ไปยังฉัน.vimrcไม่ได้ช่วยแก้ปัญหา หนู! ฉันใช้ Snow Leopard
ปิดคาวบอย

การวิจัยที่ยอดเยี่ยม +1 จากฉัน เพราะฉันไม่ใช่คนที่ "ให้ทุน" เงินช่วยเหลือฉันจะรอจนกว่าพรุ่งนี้จะทำเครื่องหมายคำตอบของคุณถูกต้องโดยไม่มีใครตอบ
ปิด Cowboy

* * * * * * * * หอบผมไม่ได้สังเกตเห็นว่าคุณยังเป็นคนที่วางโปรดปราน !! ฉันรู้สึกเหมือนคนงี่เง่า! ในการป้องกันของฉันฉันได้ทำเครื่องหมายคำตอบของคุณเป็นวิธีการแก้ปัญหาก่อนหน้านี้วันนี้ - ก่อนการเปิดเผยนี้ ...
ปิด Cowboy

0

ปัญหาสำหรับเทอร์มินัลบางกลุ่มจะได้รับ [> 0; 261; 0c ด้วยวิธีนั้น และสุดท้าย "c" ทำให้ความเจ็บปวดเริ่มเป็นกลุ่ม แต่ฉันได้พบเคล็ดลับง่ายๆในการข้าม "c" ครั้งแรกเมื่อเริ่มต้น:

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