ทำไม `ESC` จึงเลื่อนเคอร์เซอร์กลับเป็นกลุ่ม?


62

ในกลุ่มเมื่อฉันกดESCเพื่อกลับไปที่โหมดคำสั่งเคอร์เซอร์จะย้ายอักขระหนึ่งตัวไปทางซ้าย นี่ไม่ใช่สิ่งที่ฉันหวังหวังเป็นครั้งคราวที่ฉันกดlเพื่อย้ายกลับไปที่จุดนั้นบางทีอาจจะลบตัวละคร

มีเหตุผลสำหรับพฤติกรรมนี้หรือไม่? สะดวกสำหรับรูปแบบการใช้งานที่ฉันขาดหายไปหรือไม่?


1
ฉันไม่เคยสังเกตมาก่อนจนกระทั่งตอนนี้ ... และฉันก็ใช้เสียงเรียกเข้าทุกวัน ฉันไม่รู้ว่าทำไม แต่ฉันสนใจที่จะฟังคำตอบ
เกบ

5
เมื่อกลับไปที่โหมดแทรกคุณสามารถกด 'a' เพื่อต่อท้ายแทน 'i' เพื่อแทรก จากนั้นคุณจะย้ายกลับไปยังตำแหน่งที่คุณอยู่ก่อนกดหลบหนี
penguin359

คำตอบ:


40

ในโหมดแทรกเคอร์เซอร์อยู่ระหว่างอักขระหรือก่อนอักขระตัวแรกหรือหลัง ในโหมดปกติเคอร์เซอร์จะอยู่เหนืออักขระ (ขึ้นบรรทัดใหม่ไม่ใช่อักขระสำหรับจุดประสงค์นี้) นี่เป็นเรื่องที่ค่อนข้างแปลก: ตัวแก้ไขส่วนใหญ่มักวางเคอร์เซอร์ไว้ระหว่างตัวอักษรและให้คำสั่งส่วนใหญ่ดำเนินการกับตัวอักษรตามหลัง (ไม่ใช่พูดอย่างเคร่งครัดภายใต้ ) เคอร์เซอร์ นี่อาจเป็นส่วนหนึ่งเนื่องจากข้อเท็จจริงที่ว่าก่อนหน้า GUI เทอร์มินัลข้อความจะแสดงเคอร์เซอร์บนตัวอักขระเสมอ (ขีดเส้นใต้หรือบล็อกอาจกะพริบ) สิ่งที่เป็นนามธรรมนี้ล้มเหลวในโหมดแทรกเนื่องจากต้องมีตำแหน่งเพิ่มอีกหนึ่งโพสต์

การสลับระหว่างโหมดต่าง ๆ จะต้องเลื่อนเคอร์เซอร์ด้วยตัวละครครึ่งตัว iย้ายคำสั่งซ้ายเพื่อวางเคอร์เซอร์ก่อนตัวละครที่มันถูกกว่า aย้ายคำสั่งที่ถูกต้อง ออกไปจากโหมดแทรก (โดยการกดEsc) เลื่อนเคอร์เซอร์ไปทางซ้ายถ้าเป็นไปได้ (ถ้าอยู่ที่จุดเริ่มต้นของบรรทัดมันจะถูกย้ายไปทางขวาแทน)

ฉันคิดว่าการEscเรียงลำดับพฤติกรรมที่เหมาะสม บ่อยครั้งที่คุณพิมพ์ที่ส่วนท้ายของบรรทัดและEscสามารถไปทางซ้ายได้เท่านั้น ดังนั้นพฤติกรรมทั่วไปจึงเป็นพฤติกรรมที่พบบ่อยที่สุด

aคิดของตัวละครภายใต้เคอร์เซอร์เป็นตัวละครที่น่าสนใจที่ผ่านมาและคำสั่งแทรกเป็น คุณสามารถทำซ้ำได้a Escโดยไม่ต้องเลื่อนเคอร์เซอร์ยกเว้นว่าคุณจะถูกกระแทกหนึ่งตำแหน่งหากคุณเริ่มต้นที่จุดเริ่มต้นของบรรทัดที่ไม่ว่างเปล่า


21

สายตามันทำให้รู้สึกใน gvim มากขึ้น:

เมื่อทำการแก้ไขเคอร์เซอร์ของคุณจะอยู่ระหว่างอักขระ:
ป้อนคำอธิบายรูปภาพที่นี่

เมื่ออยู่ในโหมดปกติมันจะอยู่ด้านบนของอักขระตัวสุดท้าย:
ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นมันไม่ได้โดดกลับไปตัวละครเพียงจากการระหว่าง rและsจะเป็นบน r


1
รูปภาพสวย ๆ พูดตามตรงฉันอยู่ในค่ายที่บอกว่าตัวละครmควรจะยังคงเน้นอยู่เมื่อกลับสู่โหมดปกติ ...
Steven Lu

อุ่ย ลิงค์รูปภาพตายแล้ว
Steven Lu

1
ลิงก์รูปภาพตายแล้ว
Steven Lu

1
ใช่การโฮสต์รูปภาพของคุณด้วยตนเองนั้นมีทั้งการทำงานมากขึ้นและเชื่อถือได้น้อยกว่าเพียงแค่ใช้เครื่องมือในตัวแก้ไข markdown บนเว็บไซต์นี้
Steven Lu

1
มีทุกอย่างตกลงกับพวกเขาอีกครั้ง? มันคือ "เคอร์เซอร์" สิ่งที่พวกเขาพิมพ์และข้อความของคุณพูดถึง "j"
poige

15

พฤติกรรมนี้สามารถแก้ไขได้ตามคำตอบที่นี่แต่หยุดและคิดเกี่ยวกับสิ่งที่เกิดขึ้นเป็นครั้งที่สอง เมื่อคุณอยู่ในโหมดแทรกคุณจะไม่ได้อยู่เหนือตัวละคร แต่อยู่ระหว่างพวกเขา เมื่อคุณแทรกบางสิ่งเคอร์เซอร์จะกระโดดไปที่ส่วนท้ายของสิ่งที่คุณแทรกเพื่อที่สิ่งต่อไปที่แทรกไว้จะเป็นหลังจากนั้น ทีนี้ลองคิดดูว่าคุณเพิ่งพิมพ์จดหมายแล้วอยากทำอะไรกับมัน การกดปุ่มEscจะทำให้เคอร์เซอร์เลือกโดยตรงเหนืออักขระตัวสุดท้ายที่คุณแทรก ถ้ามันไม่ได้ทำสิ่งนี้มันจะค่อนข้างอึดอัด

สถานการณ์ที่คุณอาจคิดว่าเป็นเมื่อคุณอยู่ในโหมดแทรกย้ายไปรอบ ๆ ราวกับว่าคุณเป็นโหมดปกติแล้วเปลี่ยน ในกรณีนี้เคอร์เซอร์จะปรากฏขึ้นเพื่อย้อนกลับไปหนึ่งอักขระ แต่ถ้าคุณคิดว่าวิธีนั้นแสดงว่าคุณอยู่ในโหมดแทรกและสิ่งสุดท้ายที่คุณทำไม่ได้แทรก บางทีคุณควรใช้เวลามากขึ้นในโหมดปกติ?


15
นั่นไม่สมเหตุสมผลสำหรับฉัน คุณอธิบายพฤติกรรมการเดินย้อนหลังของการทำซ้ำiและการESCกดคีย์ได้อย่างไร
Warren Young

4
เข้าสู่โหมดแทรกไม่ต้องแทรกอะไรแล้วปล่อยให้มันไม่ใช่การทดสอบที่ยุติธรรม ทำไมคุณถึงอยู่ในโหมดแทรกหากคุณไม่ได้ใส่อะไรลงไป หากคุณแทรกบางอย่างกลับไปที่โหมดปกติจะทำให้คุณมีอักขระที่คุณเลือกไว้ ใช้งานง่ายมาก
Caleb

4
มันไม่เกี่ยวกับ "ยุติธรรม" มันเกี่ยวกับพลังในการอธิบาย หากทฤษฎีการปฏิบัติงานของคุณไม่ได้อธิบายพฤติกรรมทั้งหมดแสดงว่าไม่สมบูรณ์หรือพฤติกรรมของ vi ไม่สอดคล้องกัน ฉันชอบที่จะเชื่อว่า vi นั้นสมบูรณ์แบบในทุก ๆ ด้านและสอดคล้องกัน :)
Warren Young

9
@Warren พฤติกรรม "เดินไปข้างหลัง" ที่iตามมาESCเป็นหน้าที่ของiและเป็นอิสระอย่างเต็มที่จากESC; โดยเฉพาะอย่างยิ่งเมื่อคุณกดiคุณจะขอให้กลุ่มที่จะแทรกตัวอักษรซึ่งตามนิยามหมายถึง "แทรกตัวละครก่อนที่ฉันเป็นหนึ่ง" ซึ่งตรงข้ามกับaที่เป็น "ผนวกตัวละครหลังจากที่นี้"
Kromey

3
โดยทั่วไปหลังจากการเปลี่ยนแปลงแต่ละครั้งเมื่อฉันออกจากการเปลี่ยนแปลงฉันทำกับการเปลี่ยนแปลงนั้นและสิ่งต่อไปที่ฉันอยากจะทำอาจเกี่ยวข้องกับการเปลี่ยนแปลงที่แตกต่างกัน ดังนั้นสำหรับฉันเมื่อออกจากโหมดแทรก (ไม่ว่าฉันจะป้อนยังไง) โดยทั่วไปฉันต้องการเคอร์เซอร์เป็นตัวละครตัวต่อไปดังนั้นฉันจึงพร้อมสำหรับการเปลี่ยนแปลงครั้งต่อไปแทนที่จะพร้อมที่จะเปลี่ยนแปลงสิ่งที่ฉันเพิ่งทำ แทรก
Kyle Strand

6

พิมพ์Alt+ Lเพื่อกลับสู่โหมดคำสั่ง

มันไม่จำเป็นต้องมีการเปลี่ยนการตั้งค่าใหม่หรือ vim มันทำงานได้เพราะบนเทอร์มินัลอีมูเลเตอร์Alt+ KEYส่งEscตามด้วยKEY(ใน xterm คุณอาจต้องเพิ่มXterm*metaSendsEscape: trueบรรทัดลงในไฟล์ ~ / .Xdefaults ของคุณ) พฤติกรรมที่ช่วยให้คุณสามารถแม้แต่ "สร้าง" รวมกันโหมดแทรกอื่น ๆ ที่ทำงานขวาออกจากกล่องที่ชอบ - Alt+ ไปSBackspace

โดยวิธีการมีเคอร์เซอร์อยู่ด้านบนของตัวละครที่คุณเพิ่งเขียนอาจไม่สะดวกมาก ตัวอย่างเช่นEscdwจะไม่ลบคำที่ตามหลังข้อความที่คุณเพิ่งแทรก


ความไม่สะดวกที่คุณอ้างอิงสามารถหลีกเลี่ยงได้โดยการพิมพ์ช่องว่างในโหมดแทรกก่อนที่จะหลบหนี จากนั้นเคอร์เซอร์ที่ออกจากโหมดแทรกจะถูกวางไว้บนพื้นที่และคุณสามารถพิมพ์Esc d eเพื่อลบคำที่อยู่ข้างหน้า ฉันหวนกลับไปสู่พฤติกรรมเริ่มต้นเพราะฉันรู้สึกว่ามันเปลี่ยนพฤติกรรมอื่น ๆ ที่เข้ารหัสไว้ในหัวแล้ว
mljrg

4

นี่คือทางออกของฉัน

มันเป็นรุ่นสั้นมากขึ้นของการแก้ปัญหาที่นำเสนอบนหน้า Wikia เกี่ยวกับเรื่องนี้

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

+1 ที่นี่เช่นกันสำหรับการอ้างถึงหน้า wiki แม้ว่าผู้ใช้จะไม่ได้ขอวิธีในการเปลี่ยนพฤติกรรมนี้
Kyle Strand

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