ในกลุ่มป้องกันไม่ให้คาเร็ตเคลื่อนที่กลับมาเมื่อฉันออกจากโหมดแก้ไขหรือไม่


9

ในกลุ่มถ้าฉันเข้าและออกจากโหมดแก้ไขโดยไม่ทำอะไรเลยเครื่องหมายรูปหมวกจะลงท้ายด้วยอักขระหนึ่งตัวทางด้านซ้าย และถ้าฉันเข้าและออกจากโหมดต่อท้ายเครื่องหมายรูปหมวกจะเลื่อนไปข้างหน้าแล้วถอยหลัง

มีวิธีใดบ้างในการกำหนดค่ากลุ่มให้ปล่อยเครื่องหมายรูปหมวกในกรณีเหล่านี้?

เป็นการดีที่ฉันเพียงแค่ต้องการที่จะเข้าสู่โหมดผนวก แต่ไม่มีการย้ายเครื่องหมายรูปหมวกเมื่อฉันเข้าหรือออกจากโหมด

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


1
คำตอบสำหรับคำถามนี้ดี ฉันแค่ต้องการชี้ให้เห็นว่าหากพวกเขาถูกต้องในสมมติฐานของพวกเขาที่คุณใช้ i เพื่อไปที่โหมดแก้ไขนั่นคือสิ่งที่ทำให้เกิดการเคลื่อนไหวย้อนหลัง หากคุณใช้ 'a' (ไม่ใช่ A) มันจะทำงานได้ตามที่คุณคาดหวัง
johnny

@ จอห์นนี่ฉันไม่คิดว่ามันจะ ฉันมักจะอยู่ในโหมด "ปกติ" ย้ายไปรอบ ๆ ไฟล์และสิ่งต่างๆ เมื่อฉันต้องการแก้ไขฉันวางเครื่องหมายรูปหมวกไว้ก่อนจากนั้นกด "a" แล้วพบว่าฉันวางผิดตำแหน่งเนื่องจากเลื่อนไปทางขวา เนื่องจากฉันใช้เวลาแก้ไข 99% ในเครื่องมือแก้ไขสมัยใหม่จึงไม่มีโอกาสที่ฉันจะจำตำแหน่งวางถ่านด้านซ้ายก่อนกด "a" นี่คือเหตุผลที่ฉันหวังว่าจะมีมาโครหรืออะไรบางอย่าง
RomanSt

มันเป็นคำถามของนิสัย มันน่ารำคาญจริงๆ แต่ในปีแรกเท่านั้น ในที่สุดคุณจะได้เรียนรู้ที่จะกดiหรือaโดยไม่ต้องคิดเกี่ยวกับมันและอาจจะยิ่งs, S, ci", ฯลฯแทนการ จำกัดและi a
Luc Hermitte

1
ฉันเข้าใจความคับข้องใจของคุณ แต่ ลองคิดดูว่าคุณกำลังทำอะไรอยู่ ถามตัวเองว่ามีวิธีที่ดีกว่าในการทำหรือไม่ (ใช้ Vim เป็น texteditor ปกตินั่นก็คือ) ฉันได้พบกับ Vim เสมอมีวิธีที่ดีกว่าวิธี Vim ในการทำสิ่งต่าง ๆ เราสามารถช่วยได้ แต่เราต้องรู้ว่าคุณกำลังทำอะไรเมื่อเจอปัญหา ตัวอย่างเช่นคุณเข้าสู่โหมดแก้ไขเมื่อคุณต้องการลบบางสิ่งหรือไม่? ไม่ต้องมี 'x' เพื่อลบตัวอักษร ต้องการแทนที่ตัวละครจากนั้นมี 'r' แค่คิดเกี่ยวกับสิ่งที่คุณต้องการบรรลุ
johnny

@ จอห์นนี่ฉันเข้าใจสิ่งที่คุณกำลังพูดถึง แต่มันต้องมีการเรียนรู้ที่มากเกินไปสำหรับฉัน ฉันใช้เวลาแก้ไข 99% ใน Visual Studio และฉันชอบ ฉันเพิ่งรู้ว่าฉันจะไม่เรียนรู้สิ่งนี้ดังนั้นจึงไม่มีเวลาเสียเปล่า
RomanSt

คำตอบ:


9

คำถามนี้ถูกถามบ่อยๆในหมู่ผู้ใช้ vi / Vim ใหม่และคำตอบคือในขณะที่อยู่ในโหมดปกติเคอร์เซอร์จะอยู่ที่ "กับ" ตัวละครเสมอ แต่ในโหมดแทรกเคอร์เซอร์จะอยู่ที่ "ระหว่าง" สองตัวอักษรเสมอ (จำไว้ท้าย -of-line เป็นอักขระ) คุณไม่สามารถดูภาพประกอบนี้ได้ในคอนโซล Vim แต่ใน GUI คุณจะสังเกตเห็นว่าเคอร์เซอร์กลายเป็นแท่งระหว่างอักขระสองตัวเมื่อคุณเข้าสู่โหมดแทรกแทนที่จะบล็อกมากกว่าอักขระเมื่อคุณอยู่ในโหมดปกติ

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

  • "a" เข้าสู่โหมดแทรกด้วยเคอร์เซอร์ "ระหว่าง" อักขระที่เคอร์เซอร์เปิดอยู่และอักขระถัดไปทางขวา
  • "i" เข้าสู่โหมดแทรกด้วยเคอร์เซอร์ "ระหว่าง" อักขระที่เคอร์เซอร์เปิดอยู่และอักขระก่อนหน้าทางด้านซ้าย

บางคนพยายามที่จะระงับ "การเคลื่อนไหว" นี้ที่พวกเขาไม่ชอบ แต่มันก็มีส่วนเกี่ยวข้องกับปลั๊กอินและสคริปต์ Vim อื่น ๆ ที่พวกเขาต้องการเรียกใช้ในอนาคตอย่างหลีกเลี่ยงไม่ได้

คำแนะนำของฉันคือทำความคุ้นเคยกับการใช้คำสั่ง "a" และ "i" (และ "A" และ "I") ในสถานการณ์ที่เหมาะสม

คำสั่ง "o" และ "O" ก็มีประโยชน์เช่นกันในการเรียนรู้ ดู:

:help a
:help i
:help A
:help I
:help o
:help O

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


1
ฉันเข้าใจสิ่งที่คุณพูด แต่ "i" / "Esc" / "i" / "Esc" ทำให้เกิดการเคลื่อนที่สุทธิโดยรวมของคาเร็ต ฉันคิดว่า VIM นั้นไม่ใช่สำหรับฉัน
RomanSt

2
@romkyns: ผมคิดว่าสิ่งที่คุณควรทำคือการใช้แทนa i
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
@Dennis เห็นด้วยว่า "a" นั้นค่อนข้างดีกว่าเพราะมันจะช่วยให้เครื่องหมายรูปหมวกอยู่ตรงหน้าตัวอักษรตัวแรกและหลังตัวอักษรตัวสุดท้ายในบรรทัด - ซึ่ง "i" ไม่อนุญาตโดยพลการ แต่ฉันพยายามอย่างนั้น สิ่งที่เกิดขึ้นคือฉันมักวางรูปคาเร็ตไว้ก่อนที่จะกด "a" - ดังนั้นฉันต้องย้ายคาเร็ตหนึ่งตำแหน่งไปทางซ้ายทันที ทุกครั้ง มันเหนื่อยดังนั้นฉันจึงเปลี่ยนเป็น "ฉัน"
RomanSt

@ Heptite คุณอาจชี้ให้ฉันเห็นถึงการดำเนินการที่ไม่สมบูรณ์ของสิ่งที่ระงับการเคลื่อนไหวหรือไม่? โอกาสที่ฉันต้องการใช้ปลั๊กอินหรือสคริปต์อื่น ๆ ในอนาคตนั้นเป็นศูนย์
RomanSt

1
@romkyns มัน (ไม่) ใช้ได้ทั้งสองวิธี Remapping <esc>แน่นอนจะป้องกันไม่ให้มากที่สุดปลั๊กอินที่ใช้<esc>ในการทำงานได้อย่างถูกต้อง แต่ยังก็จะยังคงรบกวนคุณเมื่อคุณจะใช้มาตรฐานอื่น ๆ มีการกลับมาสู่โหมดปกติเช่นเดียวกับที่<esc>ไม่ การเรียนรู้ที่จะใช้คีย์ที่ถูกต้องในทันทีคือวิธีการแก้ปัญหาที่ชั่ง / ทำงานในระยะยาว
Luc Hermitte

1

ฉันคิดว่ากะรัตคุณหมายถึงเคอร์เซอร์ของคุณและหากคุณใช้ "i" สิ่งนี้จะแทรกตรงที่เคอร์เซอร์อยู่ "a" (ซึ่งฉันเชื่อว่าคุณกำลังมองหา) จะย้ายเคอร์เซอร์หนึ่งตัวไปทางขวา นอกจากนี้ shift-i (I) จะไปที่จุดเริ่มต้นของบรรทัดและ shift-a (A) จะไปตลอดทางจนถึงจุดสิ้นสุดของบรรทัด

หากฉันเข้าใจผิดคำถามของคุณฉันขอโทษ


1

เนื่องจากการแมปใหม่<ESC>ถือว่าเป็น 'ความเสี่ยง' ฉันเพิ่งรวมกับหนึ่งในวิธีเลี่ยงคีย์ Escapeและมีสิ่งต่อไปนี้ใน.vimrc:

 inoremap ii <ESC>l

หมายเหตุ: ตรวจสอบให้แน่ใจว่าไม่มีอักขระเว้นวรรคที่ท้ายบรรทัด

เรียบง่าย แต่ได้รับการรับรองอย่างเต็มที่ว่า "ใช้งานได้ดีสำหรับฉัน" เพราะนั่นคือสิ่งที่ฉันต้องพิมพ์ด้วยมือ

ไม่ว่าฉันจะใช้aหรือiฉันยังคงได้รับเครื่องหมายรูปหมวกกลับพฤติกรรมและมันก็บั่นทอนนรกจากฉันบ่อยกว่าสิ่งต่อไปที่ฉันต้องการพิมพ์คือd$การลบที่ส่วนท้ายของบรรทัด ฯลฯ


ทางออกที่ง่ายอย่างน่าอัศจรรย์ ดีที่สุดฉันเจอแล้ว
Tyler Collier

1

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

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

มันสนุกมาก. คำถามเดียวกันนี้มีอยู่ในทั้งสามไซต์: SO, SU, Unix + Linux


ฉันไม่คิดว่ามันตลก :) โชคดีที่ฉันพบบรรณาธิการที่ไม่ทำให้ฉันคลั่งไคล้ (diakonos) ดังนั้นนี่จึงไม่ใช่ปัญหาอีกต่อไป ยังคง upvoted สำหรับผู้ที่ชอบเป็นกลุ่ม
RomanSt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.