วิธีแทรกบรรทัดใหม่โดยไม่ออกจากโหมดปกติ


24

ฉันสงสัยว่าฉันสามารถแทรกบรรทัดใหม่ได้หรือไม่โดยไม่ออกจากโหมดปกติ ตัวอย่างเช่นฉันมีสองบรรทัด:

this is line one
this is line two

และเคอร์เซอร์อยู่บนบรรทัดที่หนึ่ง ตอนนี้ฉันต้องการบรรทัดใหม่ระหว่างบรรทัดหนึ่งและสองบรรทัดดังนี้:

this is line one

this is line two

ฉันรู้ว่าเมื่อฉันอยู่ในโหมดปกติฉันสามารถกดoได้ แต่นี่จะเข้าสู่โหมดแทรก

ฉันจะแทรกบรรทัดใหม่เหมือนและอยู่ในโหมดปกติได้อย่างไร


คำตอบ:


10

ฉันใช้การทำแผนที่เพื่อ:

" Quickly insert an empty new line without entering insert mode
    nnoremap <Leader>o o<Esc>
    nnoremap <Leader>O O<Esc>

วิธีนี้คุณสามารถแทรกบรรทัดภายใต้เคอร์เซอร์ของคุณด้วยและหนึ่งในบรรทัดก่อนหน้าด้วย<Leader>o<Leader>O

หมายเหตุ:อาจมีการยืนยันว่าต้องใช้การกดแป้นหลายครั้งo<Esc>แต่หวังว่าคุณจะได้เลือกผู้นำของคุณเพื่อทำให้การทำแผนที่ประเภทนี้เป็นเรื่องง่าย ฉันก็ไม่แน่ใจเหมือนกันว่ามีวิธีในการทำ


8

โซลูชันที่ไม่ผ่านโหมดแทรกไม่ย้ายเคอร์เซอร์และอนุญาตให้คุณใช้ตัวนับเพื่อผนวกหลายบรรทัดพร้อมกัน ( 3\oฯลฯ ):

nnoremap <silent> <leader>o :<C-u>call append(line("."),   repeat([""], v:count1))<CR>
nnoremap <silent> <leader>O :<C-u>call append(line(".")-1, repeat([""], v:count1))<CR>

5

ผมแนะนำให้ใช้ปลั๊กอิน Unimpairedของ Tim Pope เป็นการส่วนตัว มันมีการแมปจำนวนมาก แต่สิ่งที่คุณจะมองหา[<space>และ]<space>ที่สร้างบรรทัดว่างด้านบนและด้านล่างบรรทัดปัจจุบันตามลำดับ Unimpaired ยังให้การแมปที่ดีสำหรับการเคลื่อนย้ายผ่านรายการ quickfix รายการบัฟเฟอร์ตัวเลือกสลับและอื่น ๆ อีกมากมาย ดู:h unimpairedเพิ่มเติม

หากคุณไม่ต้องการใช้ปลั๊กอินที่ไม่ได้รับการซ่อมแซม แต่เช่นเดียวกับการแมปด้านล่างนี้คือการแม็พแบบย่อส่วนที่จะใส่ใน~/.vimrcไฟล์ของคุณ:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>

5

หากคุณไม่ต้องการเพิ่มการแมปคุณสามารถดึงyyเส้นว่างแล้ววางลงpใต้เคอร์เซอร์ด้านล่างและPเหนือเคอร์เซอร์


นี่อาจเป็นคำตอบที่ดีที่สุดโดยไม่มีการแมป
Willem van Ketwich

หรือบันทึกไว้ไปoลงทะเบียนกับและวางจากที่นั่นเมื่อใดก็ตามที่จำเป็นต้องมี"oyy "op
mike23

4

Shift-Enterการทำแผนที่การใช้งานของฉัน มันแตกต่างจากคนอื่น ๆ ที่เคอร์เซอร์จะถูกส่งกลับไปยังบรรทัดและคอลัมน์เดียวกันโดยใช้เครื่องหมาย o

" Insert new line above without going into insert mode
" (uses mark o to return to the previous cursor column)
nnoremap <S-Enter> moO<Esc>`o

5
โปรดทราบว่าการทำแผนที่<S-Enter>ไม่ทำงานในเทอร์มินัลอีมูเลเตอร์ (ใช้ได้เฉพาะใน gVim) ดังนั้นคุณจะต้องเลือกชุดคีย์ที่แตกต่างกันเพื่อจับคู่กับ ;-)
Martin Tournoij

2

คำตอบโดย Maxim Kim นี้เปลี่ยนแปลงชีวิต:

noremap <silent> <space> :exe "normal i".nr2char(getchar())<CR>

และฉัน riff บนมัน:

noremap <silent> <s-space> :exe "normal a".nr2char(getchar())<CR>

vimrcใส่เส้นผู้ที่อยู่ในของคุณ จากนั้นไปที่จุดเริ่มต้นของบรรทัดที่สองของไฟล์และตีของคุณSpace, Enterหรือไปที่ท้ายบรรทัดแรกและตี,Shift+Space Enterทั้งสองจะเพิ่มบรรทัดว่างระหว่างบรรทัดแรกและบรรทัดที่สองและปล่อยให้คุณอยู่ในโหมดปกติ

คุณยังสามารถใช้ปุ่มเหล่านี้สำหรับคีย์เดี่ยวอื่น ๆ - กดSpaceหรือShift+Spaceตามด้วยคีย์ที่คุณต้องการและมันจะแทรกหรือต่อท้ายตามลำดับ


2

การแมปเหล่านี้จะทำสิ่งที่คุณต้องการอย่างแน่นอน

nnoremap <c-n> @="m`o\eg``"<cr>
nnoremap <c-p> @="m`O\eg``"<cr>   

จำนวนแทรกใหม่ของจำนวนบรรทัดใหม่ก่อนหรือหลังเคอร์เซอร์ รักษาเคอร์เซอร์ตรงที่มันอยู่โดยไม่ต้องเปลี่ยนรายการข้าม

วิธีแก้ปัญหาอื่นคือเพียงสร้างทางลัดที่จะเติมการลงทะเบียนที่ไม่มีชื่อด้วยการขึ้นบรรทัดใหม่ จากนั้นคุณสามารถใช้คำสั่ง put, p หรือ P เพื่อแทรกบรรทัดใหม่ ตัวอย่างเช่น:

nnoremap "<cr> :let @@="\n"<cr>

1

แผนที่ของฉันสำหรับสิ่งนี้

 " Create Blank Newlines and stay in Normal mode
nnoremap <silent> zj o<Esc>k
nnoremap <silent> zk O<Esc>j

แตกต่างจากของ statoxเพราะจะทำให้เคอร์เซอร์อยู่ในตำแหน่งเดียวกัน


สิ่งที่ไม่<silent>หมายถึง?
อเล็กซ์

มันป้องกันการสะท้อนสิ่งใด ๆ กับบรรทัดสถานะ ฉันค่อนข้างแน่ใจว่ามันไม่ได้ทำอะไรในกรณีเฉพาะนี้มันอยู่ที่นั่นทุกที่ที่ฉันคัดลอกมาจากเมื่อนานมาแล้ว :h map-silentดู
Kevin

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