เลิกทำ <CR> ในโหมดแทรก


21

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

เช่น

<div>
  <p> This is some text []</p>
</div>

เคอร์เซอร์อยู่[]และฉันก็โดน<CR>:

<div>
  <p> This is some text 
  []</p>
</div>

ตอนนี้ฉันต้องกดแบ็คสเปซสองครั้งเพื่อกลับไปที่บรรทัดก่อนหน้า (กรณีนี้ไม่เลวเลย แต่ไม่มีการเยื้องมากนัก)

คุณรู้วิธีที่ดีกว่าที่จะทำ?


1
ctrl+wดูเหมือนว่าสองครั้งที่จะทำงานและเป็นเรื่องง่าย
reergymerej

คำตอบ:


10

เกี่ยวกับ:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>จะรันคำสั่งโหมดปกติ ( :left 0) ซึ่งจะลบการเยื้องทั้งหมดซึ่งจะทำให้เคอร์เซอร์ของคุณอยู่ที่จุดเริ่มต้นของบรรทัด <BS>จะพาคุณกลับไปที่บรรทัดสุดท้าย

นี่เป็นเหมือน "ถอยหลังJ"

น่าเสียดายที่การแมป Shift + Enter หรือ Ctrl + Enter ดูเหมือนจะเป็นไปไม่ได้ดังนั้นฉันจึงเลือก<C-\>ว่า "ใกล้กับ Enter"


"ใกล้กับป้อน" ขึ้นอยู่กับแป้นพิมพ์ของคุณ: คนในสหราชอาณาจักรมี `` อยู่ถัดจากการเปลี่ยนแปลงทางซ้าย :-)
TripeHound

2
ทำไมไม่ใช้<C-u>แทน<C-o>:left 0<CR>?
jamessan

@jamessan งานนี้เป็น "ถอยหลังJ": ดังนั้นจะทำให้คุณมีfoo<CR>bar<C-\> foobarIMHO มันมีประโยชน์มากกว่า แต่ YMMV
Martin Tournoij

ถูกต้อง แต่สิ่งที่ผมพูดคือว่า<C-u>(เช่นi_CTRL-U ) <C-o>:left 0<CR>ที่ควรจะเป็นเช่นเดียวกับ
jamessan

1
@ jamessan เอ่อขึ้นอยู่กับตำแหน่งเคอร์เซอร์ การพิมพ์foo<CR>bar<C-u>จะทำให้คุณมีfoo<CR>(+ เยื้องอัตโนมัติใด ๆ ที่ Vim อาจเพิ่ม) <C-o>:left 0<CR>จะทำงานเหมือนเดิมโดยไม่คำนึงถึงตำแหน่งเคอร์เซอร์
Martin Tournoij

21

ฉันมีสิ่งนี้ในvimrcส่วนที่สองมีความเกี่ยวข้อง:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

สิ่งนี้จะทำอะไร: ทุกครั้งที่คุณกดEnterโหมดแทรกมันจะ "ทำลายลำดับการเลิกทำและเริ่มการเปลี่ยนแปลงใหม่" (ดูh: i_CTRL-G_u) ซึ่งหมายความว่าหากคุณกดEnterโดยไม่ได้ตั้งใจตอนนี้คุณสามารถยกเลิกการเปลี่ยนแปลงได้โดยไม่ต้องลบบรรทัดที่แทรกก่อนหน้านี้ไม่ว่าจะด้วยESC u aหรือCtrl-o uตามที่ Statox เสนอ โดยทั่วไปแต่ละบรรทัดสามารถยกเลิกได้แยกกัน

แหล่ง

แก้ไข / อัปเดต: หากคุณใช้ Vim emulation ใน Emacs หรือที่เรียกว่าโหมดร้ายคุณสามารถใช้แพ็คเกจนี้เพื่อเอฟเฟกต์ที่คล้ายกัน


ตอนนี้ฉันอยากรู้เกี่ยวกับส่วนแรกและวิธีการที่<c-y>เกี่ยวข้องกับเมนูป๊อปอัพ
8bittree

2
ดูคำตอบนี้: vi.stackexchange.com/a/3844/1800 Ctrl-yในโหมดแทรกจะทำให้การเลือกป๊อปอัปปัจจุบันเสร็จสมบูรณ์และการแมปข้างต้นจะทำให้Enterเสร็จสมบูรณ์ด้วย
VanLaser

เคล็ดลับดี อย่างไรก็ตามฉันอาจแทนที่ส่วนสุดท้าย"<c-g>u<cr>"ด้วย&paste ? "<cr>" : "<c-g>u<cr>"ไม่เช่นนั้นครั้งต่อไปที่คุณวาง HTML ที่ผิดพลาด 200 บรรทัดคุณจะสนุกกับการเลิกทำ :)
lcd047

2
... และคำอธิบาย: เมื่อpasteเปิดใช้งานการแมปโหมดแทรกจะปิดใช้งาน (ตามความช่วยเหลือของ Vim)
VanLaser

1
ฉันชอบโซลูชันนี้ดีกว่าเพราะโซลูชันอื่น ๆ ที่ใช้ Backspace, Ctrl-W และ Ctrl-U อาจไม่ทำงานขึ้นอยู่กับวิธีการbackspaceตั้งค่าตัวเลือก
doubleDown

4

Ctrl-wBackspaceวิธีที่ผมจะทำคือ

Ctrl-wเพื่อลบคำสุดท้าย (ฉันลืมว่านี่เป็นเสียงเรียกเข้ามาตรฐานหรือไม่) และเนื่องจากเป็นเพียงช่องว่างมันจะพาฉันกลับไปที่จุดเริ่มต้นของบรรทัด จากนั้นBackspaceจะพาฉันกลับไปยังบรรทัดก่อนหน้าว่าฉันอยู่ที่ไหน


น่ารักฉันไม่รู้เกี่ยวกับการCtrl-wใช้งานในโหมดแทรก แต่ Carpetsmoker ♦นั้นยังเร็วกว่า ดังนั้นการผูกค่าเริ่มต้นของ 'Ctrl- \' จึงไม่มีประโยชน์
nobe4

1
Ctrl + W คือ "มาตรฐานที่เป็นกลุ่ม" ;-) :help i_CTRL-Wดู: และการกดสองครั้งดูเหมือนว่าจะทำเคล็ดลับเช่นกัน?
Martin Tournoij

1
ฉันเพิ่งเห็นในหน้าความช่วยเหลือที่<C-u>อาจมีประโยชน์มากกว่าเนื่องจากมันจะลบอักขระทั้งหมดในบรรทัดใหม่
nobe4

1

ทางของฉันออกนี้คือ UpCtrl-oJDel(จากโหมดแทรก) อาจไม่ใช่ชุดค่าผสมที่มีประสิทธิภาพที่สุด แต่เป็นสิ่งที่ฉันทำโดยไม่จำเป็นต้องคิด


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