เหตุใดเคอร์เซอร์จึงเลื่อนไปที่จุดเริ่มต้นของบรรทัดหลัง <Esc>


12

ฉันสังเกตว่าขณะแก้ไขตามบรรทัดในไฟล์. txt ในโหมดแทรกเคอร์เซอร์จะเลื่อนไปที่จุดเริ่มต้นของบรรทัดหลังจากเขียนโดยใช้ลำดับคีย์:

<esc>:w

ฉันต้องการเปลี่ยนพฤติกรรมนี้เพื่อให้เคอร์เซอร์อยู่ในตำแหน่งต่อไปนี้: เขียน เป็นไปได้ไหม ฉันไม่ต้องการให้เคอร์เซอร์อยู่ในโหมดแทรกฉันแค่อยากให้มันรักษาตำแหน่งสุดท้ายหลังจากเขียน

ฉันใช้ gVim 7.4 บน windows . vimrc ของฉันเป็นแบบพื้นฐานมากฉันไม่เชื่อว่าการตั้งค่าใด ๆ ของฉันจะรบกวนการทำงานนี้ ฉันได้ลบการจัดหา mswin.vim และ example.vim ออกจาก. vimrc ของฉันด้วย (ซึ่งมาพร้อมกับโปรแกรมติดตั้ง windows vim.org อย่างเป็นทางการ)

หลังจากอ่านความคิดเห็นด้านล่างฉันดูที่ปัญหาอีกครั้งและตระหนักว่าเคอร์เซอร์เพียงเลื่อนไปทางซ้ายสุดหลังจากเขียนบนบรรทัดซึ่งทั้งหมดประกอบด้วยพื้นที่สีขาวต่อท้าย ในคำอื่น ๆ เคอร์เซอร์เพียงสไลด์ไปทางซ้ายไกลเมื่อ ESC-: W เมื่อสายเป็นเยื้องแขวนที่ไม่มีอักขระอื่น ๆ นอกเหนือจากช่องว่าง . vimrc กำลังจัดการพฤติกรรมเยื้องกับการตั้งค่าเหล่านี้:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

ดังนั้นบรรทัดใหม่ที่สร้างขึ้นใต้บรรทัดที่เยื้องจะมีช่องว่างสีขาวต่อท้าย 4 ช่องเป็น 4 ช่องว่างแรกของบรรทัด (ซึ่งฉันต้องการเก็บไว้) เมื่อกดปุ่ม 'esc' เคอร์เซอร์จะเลื่อนไปทางซ้ายสุดของบัฟเฟอร์

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


3
ฉันไม่เคยสังเกตเห็นพฤติกรรมนี้ใน Vim บนแพลตฟอร์มใด ๆ ... จะเกิดอะไรขึ้นถ้าคุณเริ่ม gVim เช่น: gvim -u NONE -U NONE(คุณสามารถใช้ cmd.exe หรือสร้างทางลัด) วิธีนี้จะป้องกันการโหลดไฟล์ (g) vimrc ของคุณ
Martin Tournoij

1
เป็นไฟล์ vimrc ที่สมบูรณ์ของคุณหรือไม่ ความสงสัยครั้งแรกของฉันคือ autocmd ในไฟล์ vimrc ของคุณกำลังลบช่องว่างที่ต่อท้าย พฤติกรรมนั้นเปลี่ยนไปหรือไม่เมื่อคุณเริ่ม gVim โดยไม่มีไฟล์ vimrc (ดูความคิดเห็นด้านบน)
Martin Tournoij

ข้างต้นไม่สมบูรณ์. vimrc ของฉันมีการตั้งค่าอื่น ๆ ด้วย การเรียกใช้ gVim โดยไม่มี. vimrc (: scriptnames ไม่แสดง. vimrc หรือ. gvimrc) แก้ปัญหาของฉัน คุณพูดถูกต้องฉันต้องมองผ่าน. vimrc ของฉันหรืออย่างอื่นที่มีที่มาซึ่งอาจเป็นสาเหตุของเรื่องนี้
Jim

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

นั่นคือเกี่ยวกับการเปิดบรรทัดใหม่ ... ไม่เกี่ยวกับการเขียนไฟล์หรือไม่?
Martin Tournoij

คำตอบ:


11

การดูเอกสารประกอบสำหรับ autoindent มีคำตอบว่าทำไมและวิธีแก้ไข :help 'autoindent':

คัดลอกเยื้องจากบรรทัดปัจจุบันเมื่อเริ่มต้นบรรทัดใหม่ (พิมพ์<CR> ในโหมดแทรกหรือเมื่อใช้คำสั่ง "o" หรือ "O") หากคุณไม่ได้พิมพ์อะไรในบรรทัดใหม่ยกเว้น<BS>หรือCTRL-Dแล้วพิมพ์ <Esc>, CTRL-Oหรือ<CR>เยื้องจะถูกลบออกอีกครั้ง การเลื่อนเคอร์เซอร์ไปที่อีกบรรทัดหนึ่งจะมีผลเหมือนกันยกเว้นว่ามีการตั้งค่าสถานะ 'I' ไว้ใน 'cpoptions'

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

อีกทางเลือกหนึ่งหากคุณต้องการกลับไปที่ระดับเยื้องเมื่อกลับไปที่โหมดแทรกและใช้งาน'cindent'เช่นกันให้ใช้Shift-Sแทนiซึ่งจะล้างบรรทัด (ว่างแล้ว) และเริ่มที่ระดับการเยื้องที่เหมาะสม นี่ไม่ใช่วิธีการแก้ปัญหาทั่วไปตามที่กล่าวข้างต้น แต่ฉันชอบสิ่งนี้เมื่อฉันเขียนรหัส C เพื่อให้ไฟล์ของฉันไม่ได้รับการบันทึกด้วยเส้นสีขาวพื้นที่เท่านั้น


นี่คือคำตอบที่ชัดเจนสำหรับคำถามของฉันจากเอกสารต้นฉบับ ขอบคุณสำหรับการสรุปและการบรรยาย - ฉันจะไม่คิดที่จะพิจารณา: h autoindent สำหรับข้อมูลนี้ ขอบคุณ @Carpetsmoker สำหรับการอภิปรายที่นำไปสู่การแก้ปัญหา
จิม

วิธีนี้แก้ไขปัญหาที่ฉันเกี่ยวข้องกับการแมป o และ O ใหม่เพื่อไม่ให้ออกจากโหมดแทรก แต่เพื่อรักษาการเยื้อง สามารถทำได้โดยการทำnnoremap o o <BS><Esc><DEL>และnnoremap O O <BS><Esc><DEL>
Max Coplan

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